{"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["import type { Network, SettleResponse } from \"@bankofai/x402-core/types\";\nimport { isHash, toHex } from \"viem\";\n\n/**\n * Extract chain ID from a CAIP-2 network identifier (eip155:CHAIN_ID).\n *\n * @param network - The network identifier in CAIP-2 format (e.g., \"eip155:8453\")\n * @returns The numeric chain ID\n * @throws Error if the network format is invalid\n */\nexport function getEvmChainId(network: string): number {\n  if (network.startsWith(\"eip155:\")) {\n    const idStr = network.split(\":\")[1];\n    const chainId = parseInt(idStr, 10);\n    if (isNaN(chainId)) {\n      throw new Error(`Invalid CAIP-2 chain ID: ${network}`);\n    }\n    return chainId;\n  }\n\n  throw new Error(`Unsupported network format: ${network} (expected eip155:CHAIN_ID)`);\n}\n\n/**\n * Get the crypto object from the global scope.\n *\n * @returns The crypto object\n * @throws Error if crypto API is not available\n */\nfunction getCrypto(): Crypto {\n  const cryptoObj = globalThis.crypto as Crypto | undefined;\n  if (!cryptoObj) {\n    throw new Error(\"Crypto API not available\");\n  }\n  return cryptoObj;\n}\n\n/**\n * Create a random 32-byte nonce for EIP-3009 authorization.\n *\n * @returns A hex-encoded 32-byte nonce\n */\nexport function createNonce(): `0x${string}` {\n  return toHex(getCrypto().getRandomValues(new Uint8Array(32)));\n}\n\n/**\n * Creates a random 256-bit nonce for Permit2.\n * Permit2 uses uint256 nonces (not bytes32 like EIP-3009).\n *\n * @returns A string representation of the random nonce\n */\nexport function createPermit2Nonce(): string {\n  const randomBytes = getCrypto().getRandomValues(new Uint8Array(32));\n  return BigInt(toHex(randomBytes)).toString();\n}\n\n/** Matches the truncation length used by the Go and Python SDKs. */\nexport const MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Bounds raw error text (e.g. from an RPC client) before it is placed in a settle/verify\n * errorMessage. RPC/transport errors can carry node URLs, request bodies, or other verbose\n * data that should not be echoed to callers unbounded.\n *\n * @param message - Raw error text to bound.\n * @returns `message`, truncated to {@link MAX_ERROR_MESSAGE_LENGTH} characters.\n */\nexport function truncateErrorMessage(message: string): string {\n  return message.slice(0, MAX_ERROR_MESSAGE_LENGTH);\n}\n\n/**\n * Last hash from a two-request extension-signer broadcast (e.g. approve + settle/deposit).\n * Conforming signers return one hash (atomic bundle) or two (sequential); any other\n * count means a partial execution.\n *\n * @param txHashes - Hashes returned by the signer for the two-request broadcast\n * @returns The final transaction hash, or undefined if the hash count is invalid\n */\nexport function finalHashFromTwoRequestSend<T extends string>(\n  txHashes: readonly T[],\n): T | undefined {\n  if (txHashes.length !== 1 && txHashes.length !== 2) {\n    return undefined;\n  }\n  return txHashes[txHashes.length - 1];\n}\n\n/**\n * Checks that a signer-supplied transaction hash is usable for a receipt wait. The all-zero\n * hash is rejected because it reconciles to nothing, so a signer reporting success with a\n * placeholder fails terminally instead of as settlement_pending.\n *\n * @param hash - Transaction hash returned by the signer\n * @returns True if the hash is a well-formed, non-zero 32-byte hash\n */\nexport function isValidTxHash(hash: string): boolean {\n  return isHash(hash) && !/^0x0+$/.test(hash);\n}\n\n/**\n * Terminal failure when a signer reports success without a usable transaction hash.\n *\n * @param tx - Value returned in place of a valid transaction hash\n * @param errorReason - Scheme/action-specific terminal error reason\n * @param network - Network the transaction was broadcast to\n * @param payer - Payer address, when known\n * @returns Failed {@link SettleResponse} with no transaction hash\n */\nexport function invalidBroadcastHashResponse(\n  tx: unknown,\n  errorReason: string,\n  network: Network,\n  payer?: string,\n): SettleResponse {\n  return {\n    success: false,\n    errorReason,\n    errorMessage: `signer returned an invalid transaction hash: ${typeof tx === \"string\" ? tx : JSON.stringify(tx)}`,\n    transaction: \"\",\n    network,\n    payer,\n  };\n}\n"],"mappings":";AACA,SAAS,QAAQ,aAAa;AASvB,SAAS,cAAc,SAAyB;AACrD,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,CAAC;AAClC,UAAM,UAAU,SAAS,OAAO,EAAE;AAClC,QAAI,MAAM,OAAO,GAAG;AAClB,YAAM,IAAI,MAAM,4BAA4B,OAAO,EAAE;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,+BAA+B,OAAO,6BAA6B;AACrF;AAQA,SAAS,YAAoB;AAC3B,QAAM,YAAY,WAAW;AAC7B,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,SAAO;AACT;AAOO,SAAS,cAA6B;AAC3C,SAAO,MAAM,UAAU,EAAE,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC;AAC9D;AAQO,SAAS,qBAA6B;AAC3C,QAAM,cAAc,UAAU,EAAE,gBAAgB,IAAI,WAAW,EAAE,CAAC;AAClE,SAAO,OAAO,MAAM,WAAW,CAAC,EAAE,SAAS;AAC7C;AAGO,IAAM,2BAA2B;AAUjC,SAAS,qBAAqB,SAAyB;AAC5D,SAAO,QAAQ,MAAM,GAAG,wBAAwB;AAClD;AAUO,SAAS,4BACd,UACe;AACf,MAAI,SAAS,WAAW,KAAK,SAAS,WAAW,GAAG;AAClD,WAAO;AAAA,EACT;AACA,SAAO,SAAS,SAAS,SAAS,CAAC;AACrC;AAUO,SAAS,cAAc,MAAuB;AACnD,SAAO,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;AAC5C;AAWO,SAAS,6BACd,IACA,aACA,SACA,OACgB;AAChB,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,cAAc,gDAAgD,OAAO,OAAO,WAAW,KAAK,KAAK,UAAU,EAAE,CAAC;AAAA,IAC9G,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;","names":[]}