@team-oozoo/oozoo-pay 0.2.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.

Potentially problematic release.


This version of @team-oozoo/oozoo-pay might be problematic. Click here for more details.

@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/constants.ts","../src/window.ts","../src/client.ts","../src/chain/evm/constants/addresses.ts","../src/chain/evm/constants/chains.ts","../src/chain/evm/utils/token.ts","../src/chain/evm/encode.ts","../src/chain/evm/constants/abis/PaymentRouterAbi.ts","../src/chain/evm/constants/abis/mainnetUSDTAbi.ts","../src/chain/evm/provider.ts","../src/chain/provider.ts"],"sourcesContent":["export class OozooPayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OozooPayError';\n }\n}\n\nexport class ApiError extends OozooPayError {\n public readonly statusCode: number;\n public readonly code: string;\n\n constructor(statusCode: number, code: string, message: string) {\n super(message);\n this.name = 'ApiError';\n this.statusCode = statusCode;\n this.code = code;\n }\n}\n\nexport class ConfigError extends OozooPayError {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n","const CHECKOUT_URL = {\n DEV: 'https://web-checkout.dev.oozoopay.com',\n PROD: 'https://checkout.oozoopay.com',\n} as const;\n\nexport function resolveCheckoutUrl(clientKey: string): string {\n if (clientKey.startsWith('pk_dev_')) return CHECKOUT_URL.DEV;\n return CHECKOUT_URL.PROD;\n}\n","import type { OozooPostMessage, PostMessageSnackbar } from './types';\n\nconst WINDOW_ID = 'oozoopay-window';\nconst SNACKBAR_ID = 'oozoopay-snackbar';\n\nconst backdropBaseStyles = `\n position: fixed;\n inset: 0;\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst desktopBackdropStyles = `\n ${backdropBaseStyles}\n background-color: rgba(0, 0, 0, 0.5);\n`;\n\nconst mobileBackdropStyles = `\n ${backdropBaseStyles}\n background-color: rgba(0, 0, 0, 0.3);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n`;\n\nconst desktopStyles = `\n border: none;\n width: 420px;\n height: 650px;\n max-height: 90vh;\n background: transparent;\n`;\n\nconst mobileStyles = `\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: 20px;\n overflow: hidden;\n width: 80%;\n max-height: 85vh;\n background: transparent;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5);\n`;\n\nfunction isMobile(): boolean {\n return typeof window !== 'undefined' && window.innerWidth < 640;\n}\n\nexport interface OozooWindow {\n backdrop: HTMLDivElement;\n iframe: HTMLIFrameElement;\n}\n\nexport function openWindow(url: string): OozooWindow {\n closeWindow();\n\n const mobile = isMobile();\n\n const backdrop = document.createElement('div');\n backdrop.id = WINDOW_ID;\n backdrop.style.cssText = mobile ? mobileBackdropStyles : desktopBackdropStyles;\n\n // Pass device type to checkout via query param\n const iframeUrl = new URL(url);\n if (mobile) iframeUrl.searchParams.set('mobile', '1');\n\n const iframe = document.createElement('iframe');\n iframe.src = iframeUrl.toString();\n iframe.style.cssText = mobile ? mobileStyles : desktopStyles;\n iframe.allow = 'clipboard-write; payment; web-share';\n iframe.setAttribute('allowtransparency', 'true');\n iframe.setAttribute('scrolling', 'no');\n\n backdrop.appendChild(iframe);\n document.body.appendChild(backdrop);\n\n document.body.style.overflow = 'hidden';\n\n return { backdrop, iframe };\n}\n\nexport function closeWindow(): void {\n const existing = document.getElementById(WINDOW_ID);\n if (existing) {\n existing.remove();\n }\n document.body.style.overflow = '';\n}\n\nexport function postMessage(oozooWindow: OozooWindow, message: OozooPostMessage): void {\n oozooWindow.iframe.contentWindow?.postMessage(message, '*');\n}\n\n// --- Snackbar ---\n\nconst VARIANT_CONFIG: Record<PostMessageSnackbar['variant'], { color: string; icon: string }> = {\n success: { color: '#0FAA36', icon: '\\u2713' },\n error: { color: '#7A80E9', icon: '\\u26A0' },\n info: { color: '#7A80E9', icon: '\\u26A0' },\n};\n\nlet snackbarTimer: ReturnType<typeof setTimeout> | null = null;\nlet currentOozooWindow: OozooWindow | null = null;\n\nexport function setCurrentWindow(oozooWindow: OozooWindow | null): void {\n currentOozooWindow = oozooWindow;\n}\n\nexport function showSnackbar(\n message: string,\n variant: PostMessageSnackbar['variant'],\n action?: { label: string; id: string },\n): void {\n dismissSnackbar();\n\n const backdrop = document.getElementById(WINDOW_ID);\n if (!backdrop) return;\n\n const iframe = backdrop.querySelector('iframe');\n if (!iframe) return;\n\n const { color, icon } = VARIANT_CONFIG[variant];\n const mobile = isMobile();\n\n const snackbar = document.createElement('div');\n snackbar.id = SNACKBAR_ID;\n snackbar.style.cssText = `\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n z-index: 100000;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 8px;\n background-color: #3D3D3D;\n border: 1px solid ${color};\n color: ${color};\n font-size: 13px;\n font-weight: 500;\n font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n pointer-events: auto;\n opacity: 0;\n transition: opacity 0.2s ease;\n width: ${mobile ? '80%' : '420px'};\n box-sizing: border-box;\n `;\n\n // Icon\n const iconEl = document.createElement('span');\n iconEl.textContent = icon;\n iconEl.style.cssText = 'flex-shrink: 0; text-align: center;';\n snackbar.appendChild(iconEl);\n\n // Content wrapper\n const content = document.createElement('div');\n content.style.cssText = 'flex: 1; min-width: 0;';\n\n // Message text\n const messageEl = document.createElement('div');\n messageEl.textContent = message;\n messageEl.style.cssText = 'line-height: 1.4; word-wrap: break-word;';\n content.appendChild(messageEl);\n\n // Action link\n if (action) {\n const actionEl = document.createElement('div');\n actionEl.textContent = action.label;\n actionEl.style.cssText = `\n cursor: pointer;\n text-decoration: underline;\n margin-top: 4px;\n font-weight: 500;\n `;\n actionEl.addEventListener('click', () => {\n dismissSnackbar();\n if (currentOozooWindow) {\n postMessage(currentOozooWindow, { type: 'OOZOO_SNACKBAR_ACTION', id: action.id });\n }\n });\n content.appendChild(actionEl);\n }\n\n snackbar.appendChild(content);\n\n // Position below the iframe\n const iframeRect = iframe.getBoundingClientRect();\n snackbar.style.top = `${iframeRect.bottom + 12}px`;\n\n backdrop.appendChild(snackbar);\n\n requestAnimationFrame(() => {\n snackbar.style.opacity = '1';\n });\n\n snackbarTimer = setTimeout(\n () => {\n dismissSnackbar();\n },\n action ? 8000 : 4000,\n );\n}\n\nfunction dismissSnackbar(): void {\n if (snackbarTimer) {\n clearTimeout(snackbarTimer);\n snackbarTimer = null;\n }\n const existing = document.getElementById(SNACKBAR_ID);\n if (existing) {\n existing.remove();\n }\n}\n\n// --- Message handling ---\n\nconst OOZOO_MESSAGE_TYPES = new Set([\n 'OOZOO_READY',\n 'OOZOO_CREATE_INVOICE',\n 'OOZOO_CREATE_INVOICE_RESULT',\n 'OOZOO_SUCCESS',\n 'OOZOO_CANCEL',\n 'OOZOO_ERROR',\n 'OOZOO_RESIZE',\n 'OOZOO_SNACKBAR',\n 'OOZOO_SNACKBAR_ACTION',\n]);\n\nfunction isOozooMessage(data: unknown): data is OozooPostMessage {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n OOZOO_MESSAGE_TYPES.has((data as { type: string }).type)\n );\n}\n\nexport type MessageHandlers = {\n [K in OozooPostMessage['type']]?: (msg: Extract<OozooPostMessage, { type: K }>) => void;\n};\n\nexport function listenMessages(handlers: MessageHandlers): () => void {\n const listener = (event: MessageEvent) => {\n if (!isOozooMessage(event.data)) return;\n const handler = handlers[event.data.type] as ((msg: OozooPostMessage) => void) | undefined;\n if (handler) handler(event.data);\n };\n window.addEventListener('message', listener);\n return () => window.removeEventListener('message', listener);\n}\n","import type { PriceUnit, PayOptions, PayInvoiceParams, TransferOptions, PostMessageCreateInvoice } from './types';\nimport { ConfigError } from './errors';\nimport { resolveCheckoutUrl } from './constants';\nimport { openWindow, closeWindow, postMessage, showSnackbar, setCurrentWindow, listenMessages } from './window';\n\nconst SUPPORTED_UNITS: PriceUnit[] = ['usd'];\n\nexport class OozooPayClient {\n private readonly clientKey: string;\n private readonly checkoutUrl: string;\n\n constructor(clientKey: string) {\n if (!clientKey) {\n throw new ConfigError('clientKey is required');\n }\n this.clientKey = clientKey;\n this.checkoutUrl = resolveCheckoutUrl(clientKey);\n }\n\n /**\n * Open checkout window to collect payment from user.\n */\n async pay(options: PayOptions): Promise<void> {\n this.validateOptions(options);\n\n const unit: PriceUnit = options.unit ?? 'usd';\n\n const url = new URL('/pay', this.checkoutUrl);\n url.searchParams.set('clientKey', this.clientKey);\n url.searchParams.set('price', options.price.toString());\n url.searchParams.set('unit', unit);\n\n return this.openFlow(url.toString(), options, 'sender');\n }\n\n /**\n * Open checkout window to send payout to user.\n */\n async transfer(options: TransferOptions): Promise<void> {\n this.validateOptions(options);\n\n const unit: PriceUnit = options.unit ?? 'usd';\n\n const url = new URL('/transfer', this.checkoutUrl);\n url.searchParams.set('clientKey', this.clientKey);\n url.searchParams.set('price', options.price.toString());\n url.searchParams.set('unit', unit);\n\n return this.openFlow(url.toString(), options, 'receiver');\n }\n\n private openFlow(\n url: string,\n options: PayOptions | TransferOptions,\n addressField: 'sender' | 'receiver',\n ): Promise<void> {\n return new Promise<void>((resolve) => {\n const oozooWindow = openWindow(url);\n setCurrentWindow(oozooWindow);\n\n // Close on backdrop click\n oozooWindow.backdrop.addEventListener('click', (e) => {\n if (e.target === oozooWindow.backdrop) {\n close();\n this.handleCancel(options);\n resolve();\n }\n });\n\n // Close on ESC\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n this.handleCancel(options);\n resolve();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n const close = () => {\n cleanup();\n document.removeEventListener('keydown', handleKeyDown);\n setCurrentWindow(null);\n closeWindow();\n };\n\n const cleanup = listenMessages({\n OOZOO_CREATE_INVOICE: async (msg: PostMessageCreateInvoice) => {\n try {\n const base = {\n price: msg.params.price,\n unit: msg.params.unit,\n chainId: msg.params.chainId,\n tokenAddress: msg.params.tokenAddress,\n };\n const invoiceId =\n addressField === 'sender'\n ? await (options as PayOptions).onCreateInvoice({ ...base, sender: msg.params.sender ?? '' })\n : await (options as TransferOptions).onCreateInvoice({ ...base, receiver: msg.params.receiver ?? '' });\n postMessage(oozooWindow, {\n type: 'OOZOO_CREATE_INVOICE_RESULT',\n requestId: msg.requestId,\n invoiceId,\n });\n } catch (err) {\n postMessage(oozooWindow, {\n type: 'OOZOO_CREATE_INVOICE_RESULT',\n requestId: msg.requestId,\n error: err instanceof Error ? err.message : 'Invoice creation failed',\n });\n }\n },\n OOZOO_RESIZE: (msg) => {\n oozooWindow.iframe.style.height = `${msg.height}px`;\n },\n OOZOO_SNACKBAR: (msg) => {\n showSnackbar(msg.message, msg.variant, msg.action);\n },\n OOZOO_SUCCESS: (msg) => {\n close();\n this.handleSuccess(options, msg.invoiceId);\n resolve();\n },\n OOZOO_ERROR: (msg) => {\n close();\n this.handleError(options, msg.code, msg.message);\n resolve();\n },\n OOZOO_CANCEL: () => {\n close();\n this.handleCancel(options);\n resolve();\n },\n });\n });\n }\n\n private validateOptions(options: PayOptions | TransferOptions): void {\n if (!options.price || options.price <= 0) throw new ConfigError('price is required');\n if (!options.onCreateInvoice) throw new ConfigError('onCreateInvoice is required');\n if (!options.successUrl) throw new ConfigError('successUrl is required');\n if (!options.failUrl) throw new ConfigError('failUrl is required');\n\n const unit: PriceUnit = options.unit ?? 'usd';\n if (!SUPPORTED_UNITS.includes(unit)) throw new ConfigError(`unsupported unit: ${unit}`);\n }\n\n private handleSuccess(options: PayOptions | TransferOptions, invoiceId: string): void {\n const url = new URL(resolveUrl(options.successUrl));\n url.searchParams.set('invoiceId', invoiceId);\n window.location.href = url.toString();\n }\n\n private handleError(options: PayOptions | TransferOptions, code: string, message: string): void {\n const url = new URL(resolveUrl(options.failUrl));\n url.searchParams.set('code', code);\n url.searchParams.set('message', message);\n window.location.href = url.toString();\n }\n\n private handleCancel(options: PayOptions | TransferOptions): void {\n const url = new URL(resolveUrl(options.failUrl));\n url.searchParams.set('code', 'CANCELLED');\n window.location.href = url.toString();\n }\n\n // Deprecated method aliases\n /** @deprecated Use pay() instead */\n async requestPayment(options: PayOptions): Promise<void> {\n return this.pay(options);\n }\n\n /** @deprecated Use transfer() instead */\n async requestWithdrawal(options: TransferOptions): Promise<void> {\n return this.transfer(options);\n }\n}\n\nfunction resolveUrl(path: string): string {\n return new URL(path, window.location.origin).toString();\n}\n\n/**\n * Initialize OozooPay SDK.\n */\nexport async function loadOozooPay(clientKey: string): Promise<OozooPayClient> {\n return new OozooPayClient(clientKey);\n}\n","/** ERC7528 ETH address */\nexport const ETH = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';\n\n/**\n * USDT addresses\n * @see Tether deployed USDT (only mainnets) https://tether.to/en/supported-protocols\n */\nexport const USDT_ADDRESSES: Record<number, string> = {\n /** sepolia (USDT deployed by aave) */\n 11155111: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0',\n /** arbitrum sepolia (bridged sepolia USDT) */\n 421614: '0x6a41aBbDc90A273c72364fB20A65E37F72Fad7EB',\n /** bsc testnet (binance-peg USDT) */\n 97: '0x337610d27c682E347C9cD60BD4b3b107C9d34dDd',\n /** mainnet (native USDT) */\n 1: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n /** arbitrum (bridged mainnet USDT) */\n 42161: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n /** bsc (binance-peg USDT) */\n 56: '0x55d398326f99059fF775485246999027B3197955',\n};\n\n/**\n * USDC addresses\n * @see https://developers.circle.com/stablecoins/usdc-contract-addresses\n */\nexport const USDC_ADDRESSES: Record<number, string> = {\n /** sepolia (native USDC) */\n 11155111: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n /** arbitrum sepolia (native USDC) */\n 421614: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d',\n /** bsc testnet (binance-peg USDC) */\n 97: '0x64544969ed7EBf5f083679233325356EbE738930',\n /** mainnet (native USDC) */\n 1: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n /** arbitrum (native USDC) */\n 42161: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n /** bsc (binance-peg USDC) */\n 56: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n};\n\n/**\n * PaymentRouter deployed by prod-deployer `0xB6bB80d3737Bd98A07d424e7fdde95EAE40DbaB8`\n * salt: `bytes32(keccak256(\"PaymentRouterCheckpointOne\"))`\n */\nexport const PAYMENT_ROUTER = '0xe50342E06Ab270dfecc69C3B1EE6Da7E2e2D02f0';\n","/** Chain IDs supported by OozooPay */\n\nexport const MAINNET_CHAIN_IDS = [\n 1, // Ethereum\n 42161, // Arbitrum\n 8453, // Base\n 56, // BSC\n 137, // Polygon\n 8217, // Kaia\n] as const;\n\nexport const TESTNET_CHAIN_IDS = [\n 31337, // Anvil\n 11155111, // Sepolia\n 421614, // Arbitrum Sepolia\n 84532, // Base Sepolia\n 97, // BSC Testnet\n 80002, // Polygon Amoy\n 1001, // Kairos\n] as const;\n\n/** Ethereum mainnet chain ID */\nexport const ETHEREUM_MAINNET_ID = 1;\n","import { ETH, USDT_ADDRESSES } from '../constants/addresses';\nimport { ETHEREUM_MAINNET_ID } from '../constants/chains';\n\n/** Check if token address is the native coin (ETH) sentinel address */\nexport function isNativeCoin(tokenAddress: string): boolean {\n return tokenAddress.toLowerCase() === ETH.toLowerCase();\n}\n\n/**\n * Check if the token is Ethereum mainnet USDT (non-standard ERC20).\n * Mainnet USDT requires special handling: revoke to 0 before re-approving.\n */\nexport function isMainnetUSDT(chainId: number, tokenAddress: string): boolean {\n const mainnetUSDT = USDT_ADDRESSES[ETHEREUM_MAINNET_ID];\n return chainId === ETHEREUM_MAINNET_ID && !!mainnetUSDT && tokenAddress.toLowerCase() === mainnetUSDT.toLowerCase();\n}\n","import { isNativeCoin } from './utils/token';\nimport type { PaymentData } from '../../types';\n\nexport interface EncodedTransaction {\n chainId: number;\n to: string;\n data: string;\n value: string;\n}\n\n// Pre-computed function selectors (keccak256 of function signature, first 4 bytes)\n// payETH(uint256,address,uint256,uint256,bytes)\nconst PAY_ETH_SELECTOR = 'a25a7b55';\n// payERC20(uint256,address,address,uint256,uint256,uint256,bytes)\nconst PAY_ERC20_SELECTOR = '90dbfa61';\n\n/** Encode uint256 as 32-byte hex (left-padded) */\nfunction encodeUint256(value: bigint): string {\n return value.toString(16).padStart(64, '0');\n}\n\n/** Encode address as 32-byte hex (left-padded) */\nfunction encodeAddress(address: string): string {\n return address.replace('0x', '').toLowerCase().padStart(64, '0');\n}\n\n/** Encode dynamic bytes with offset, length, and padded data */\nfunction encodeBytes(hex: string): string {\n const data = hex.replace('0x', '');\n const byteLength = data.length / 2;\n const paddedData = data.padEnd(Math.ceil(data.length / 64) * 64, '0');\n return encodeUint256(BigInt(byteLength)) + paddedData;\n}\n\n/**\n * Encode a payment router transaction from payment data and signature.\n * Returns ready-to-send transaction data (to, data, value).\n *\n * Zero-dependency: uses manual ABI encoding instead of viem.\n */\nexport function encodePaymentTransaction(\n routerAddress: string,\n chainId: string,\n paymentData: PaymentData,\n signature: string,\n): EncodedTransaction {\n const isNative = isNativeCoin(paymentData.erc20);\n\n let data: string;\n let value: string;\n\n if (isNative) {\n // payETH(uint256 id, address receiver, uint256 feeRate, uint256 expirationTimestamp, bytes signature)\n // Static params: 5 slots (id, receiver, feeRate, expiration, offset)\n const offsetToSignature = 5 * 32; // 160 bytes — offset to dynamic data\n const params =\n encodeUint256(BigInt(paymentData.id)) +\n encodeAddress(paymentData.receiver) +\n encodeUint256(BigInt(paymentData.feeRate)) +\n encodeUint256(BigInt(paymentData.expirationTimestamp)) +\n encodeUint256(BigInt(offsetToSignature)) +\n encodeBytes(signature);\n\n data = '0x' + PAY_ETH_SELECTOR + params;\n value = `0x${BigInt(paymentData.amount).toString(16)}`;\n } else {\n // payERC20(uint256 id, address erc20, address receiver, uint256 amount, uint256 feeRate, uint256 expirationTimestamp, bytes signature)\n // Static params: 7 slots (id, erc20, receiver, amount, feeRate, expiration, offset)\n const offsetToSignature = 7 * 32; // 224 bytes — offset to dynamic data\n const params =\n encodeUint256(BigInt(paymentData.id)) +\n encodeAddress(paymentData.erc20) +\n encodeAddress(paymentData.receiver) +\n encodeUint256(BigInt(paymentData.amount)) +\n encodeUint256(BigInt(paymentData.feeRate)) +\n encodeUint256(BigInt(paymentData.expirationTimestamp)) +\n encodeUint256(BigInt(offsetToSignature)) +\n encodeBytes(signature);\n\n data = '0x' + PAY_ERC20_SELECTOR + params;\n value = '0x0';\n }\n\n return {\n chainId: parseInt(chainId),\n to: routerAddress,\n data,\n value,\n };\n}\n","export const PaymentRouterAbi = [\n {\n type: 'constructor',\n inputs: [\n {\n name: 'owner_',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'signer_',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'feeRecipient_',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'ETH',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'FEE_RATE_UNIT_DIVISOR',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'PAYMENT_DATA_TYPE_HASH',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'changeFeeRecipient',\n inputs: [\n {\n name: 'newFeeRecipient',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'changeSigner',\n inputs: [\n {\n name: 'newSigner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'eip712Domain',\n inputs: [],\n outputs: [\n {\n name: 'fields',\n type: 'bytes1',\n internalType: 'bytes1',\n },\n {\n name: 'name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'version',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'verifyingContract',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'extensions',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'feeRecipient',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'hashPaymentData',\n inputs: [\n {\n name: 'id',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'erc20',\n type: 'address',\n internalType: 'contract IERC20',\n },\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'feeRate',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'expirationTimestamp',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pay',\n inputs: [\n {\n name: 'paramsList',\n type: 'tuple[]',\n internalType: 'struct IPaymentRouter.PaymentParams[]',\n components: [\n {\n name: 'id',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'erc20',\n type: 'address',\n internalType: 'contract IERC20',\n },\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'feeRate',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'expirationTimestamp',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'payERC20',\n inputs: [\n {\n name: 'id',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'erc20',\n type: 'address',\n internalType: 'contract IERC20',\n },\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'feeRate',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'expirationTimestamp',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'payETH',\n inputs: [\n {\n name: 'id',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'feeRate',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'expirationTimestamp',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'recover',\n inputs: [\n {\n name: 'structHash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'signer',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'EIP712DomainChanged',\n inputs: [],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Payment',\n inputs: [\n {\n name: 'id',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n {\n name: 'erc20',\n type: 'address',\n indexed: true,\n internalType: 'contract IERC20',\n },\n {\n name: 'sender',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n {\n name: 'receiver',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'feeRecipient',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n {\n name: 'feeRate',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'fee',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'amountAfterFee',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'ECDSAInvalidSignature',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ECDSAInvalidSignatureLength',\n inputs: [\n {\n name: 'length',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ECDSAInvalidSignatureS',\n inputs: [\n {\n name: 's',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n {\n type: 'error',\n name: 'ETHTransferFailed',\n inputs: [],\n },\n {\n type: 'error',\n name: 'Expired',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InsufficientETH',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidAddress',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidFeeRate',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidId',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidShortString',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidSignature',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ReentrancyGuardReentrantCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'StringTooLong',\n inputs: [\n {\n name: 'str',\n type: 'string',\n internalType: 'string',\n },\n ],\n },\n] as const;\n","/**\n * The ABI of (ethereum) `mainnet` USDT (copied from etherscan).\n * @note Only use it with the old & non-standard (ethereum) `mainnet` USDT contract `0xdAC17F958D2ee523a2206206994597C13D831ec7`.\n * @see https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7#code\n */\nexport const mainnetUSDTAbi = [\n {\n constant: true,\n inputs: [],\n name: 'name',\n outputs: [{ name: '', type: 'string' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [{ name: '_upgradedAddress', type: 'address' }],\n name: 'deprecate',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_spender', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'approve',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'deprecated',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [{ name: '_evilUser', type: 'address' }],\n name: 'addBlackList',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'totalSupply',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_from', type: 'address' },\n { name: '_to', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'transferFrom',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'upgradedAddress',\n outputs: [{ name: '', type: 'address' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '', type: 'address' }],\n name: 'balances',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'maximumFee',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: '_totalSupply',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [],\n name: 'unpause',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '_maker', type: 'address' }],\n name: 'getBlackListStatus',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n { name: '', type: 'address' },\n { name: '', type: 'address' },\n ],\n name: 'allowed',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'paused',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: 'who', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [],\n name: 'pause',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'getOwner',\n outputs: [{ name: '', type: 'address' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'owner',\n outputs: [{ name: '', type: 'address' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'symbol',\n outputs: [{ name: '', type: 'string' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_to', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'transfer',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: 'newBasisPoints', type: 'uint256' },\n { name: 'newMaxFee', type: 'uint256' },\n ],\n name: 'setParams',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: false,\n inputs: [{ name: 'amount', type: 'uint256' }],\n name: 'issue',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: false,\n inputs: [{ name: 'amount', type: 'uint256' }],\n name: 'redeem',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n { name: '_owner', type: 'address' },\n { name: '_spender', type: 'address' },\n ],\n name: 'allowance',\n outputs: [{ name: 'remaining', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'basisPointsRate',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '', type: 'address' }],\n name: 'isBlackListed',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [{ name: '_clearedUser', type: 'address' }],\n name: 'removeBlackList',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'MAX_UINT',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [{ name: 'newOwner', type: 'address' }],\n name: 'transferOwnership',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: false,\n inputs: [{ name: '_blackListedUser', type: 'address' }],\n name: 'destroyBlackFunds',\n outputs: [],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { name: '_initialSupply', type: 'uint256' },\n { name: '_name', type: 'string' },\n { name: '_symbol', type: 'string' },\n { name: '_decimals', type: 'uint256' },\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, name: 'amount', type: 'uint256' }],\n name: 'Issue',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, name: 'amount', type: 'uint256' }],\n name: 'Redeem',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, name: 'newAddress', type: 'address' }],\n name: 'Deprecate',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: false, name: 'feeBasisPoints', type: 'uint256' },\n { indexed: false, name: 'maxFee', type: 'uint256' },\n ],\n name: 'Params',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: false, name: '_blackListedUser', type: 'address' },\n { indexed: false, name: '_balance', type: 'uint256' },\n ],\n name: 'DestroyedBlackFunds',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, name: '_user', type: 'address' }],\n name: 'AddedBlackList',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, name: '_user', type: 'address' }],\n name: 'RemovedBlackList',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'owner', type: 'address' },\n { indexed: true, name: 'spender', type: 'address' },\n { indexed: false, name: 'value', type: 'uint256' },\n ],\n name: 'Approval',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'from', type: 'address' },\n { indexed: true, name: 'to', type: 'address' },\n { indexed: false, name: 'value', type: 'uint256' },\n ],\n name: 'Transfer',\n type: 'event',\n },\n { anonymous: false, inputs: [], name: 'Pause', type: 'event' },\n { anonymous: false, inputs: [], name: 'Unpause', type: 'event' },\n] as const;\n","/**\n * Raw EIP-1193 provider functions for environments without viem PublicClient.\n * Use these with Privy embedded wallets or other EIP-1193 providers.\n */\n\nexport type EIP1193Provider = {\n request: (args: { method: string; params: any[] }) => Promise<any>;\n};\n\nconst ERC20_BALANCE_OF_SELECTOR = '0x70a08231';\n\n/**\n * Get native coin balance (ETH, BNB, MATIC, etc.) via raw EIP-1193 provider.\n */\nexport async function getNativeBalance(provider: EIP1193Provider, address: string): Promise<bigint> {\n const result = await provider.request({\n method: 'eth_getBalance',\n params: [address, 'latest'],\n });\n return BigInt(result);\n}\n\n/**\n * Get ERC-20 token balance via raw EIP-1193 provider.\n */\nexport async function getTokenBalance(\n provider: EIP1193Provider,\n tokenAddress: string,\n walletAddress: string,\n): Promise<bigint> {\n const paddedAddress = walletAddress.slice(2).toLowerCase().padStart(64, '0');\n const data = `${ERC20_BALANCE_OF_SELECTOR}${paddedAddress}`;\n\n const result = await provider.request({\n method: 'eth_call',\n params: [{ to: tokenAddress, data }, 'latest'],\n });\n return BigInt(result);\n}\n\n/**\n * Estimate gas cost in wei via raw EIP-1193 provider.\n * @param gasUnits - Gas units to estimate for (default: 21000n for standard transfer)\n */\nexport async function estimateGasCost(provider: EIP1193Provider, gasUnits: bigint = 21000n): Promise<bigint> {\n const gasPrice = await provider.request({\n method: 'eth_gasPrice',\n params: [],\n });\n return gasUnits * BigInt(gasPrice);\n}\n","/**\n * Chain-agnostic provider functions.\n * Currently only EVM is supported.\n */\n\nimport type { EIP1193Provider } from './evm/provider';\nimport {\n getNativeBalance as evmGetNativeBalance,\n getTokenBalance as evmGetTokenBalance,\n estimateGasCost as evmEstimateGasCost,\n} from './evm/provider';\n\nexport type ChainType = 'evm' | 'svm';\n\n/**\n * Get native coin balance (ETH, etc.).\n */\nexport async function getNativeBalance(\n chainType: ChainType,\n provider: EIP1193Provider,\n address: string,\n): Promise<bigint> {\n if (chainType !== 'evm') {\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n return evmGetNativeBalance(provider, address);\n}\n\n/**\n * Get token balance (ERC-20, etc.).\n */\nexport async function getTokenBalance(\n chainType: ChainType,\n provider: EIP1193Provider,\n tokenAddress: string,\n walletAddress: string,\n): Promise<bigint> {\n if (chainType !== 'evm') {\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n return evmGetTokenBalance(provider, tokenAddress, walletAddress);\n}\n\n/**\n * Estimate gas/fee cost in native token units.\n */\nexport async function estimateGasCost(\n chainType: ChainType,\n provider: EIP1193Provider,\n gasUnits?: bigint,\n): Promise<bigint> {\n if (chainType !== 'evm') {\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n return evmEstimateGasCost(provider, gasUnits);\n}\n"],"mappings":"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","names":["getNativeBalance","getTokenBalance","estimateGasCost"]}
@@ -0,0 +1,57 @@
1
+ "use strict";var OozooPay=(()=>{var f=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var N=(o,e)=>{for(var t in e)f(o,t,{get:e[t],enumerable:!0})},W=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of L(e))!Z.call(o,s)&&s!==t&&f(o,s,{get:()=>e[s],enumerable:!(n=M(e,s))||n.enumerable});return o};var D=o=>W(f({},"__esModule",{value:!0}),o);var Y={};N(Y,{OozooPayClient:()=>u,load:()=>G});var g=class extends Error{constructor(e){super(e),this.name="OozooPayError"}};var d=class extends g{constructor(e){super(e),this.name="ConfigError"}};var P={DEV:"https://web-checkout.dev.oozoopay.com",PROD:"https://checkout.oozoopay.com"};function k(o){return o.startsWith("pk_dev_")?P.DEV:P.PROD}var v="oozoopay-window",S="oozoopay-snackbar",I=`
2
+ position: fixed;
3
+ inset: 0;
4
+ z-index: 99999;
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ `,K=`
9
+ ${I}
10
+ background-color: rgba(0, 0, 0, 0.5);
11
+ `,q=`
12
+ ${I}
13
+ background-color: rgba(0, 0, 0, 0.3);
14
+ backdrop-filter: blur(8px);
15
+ -webkit-backdrop-filter: blur(8px);
16
+ `,B=`
17
+ border: none;
18
+ width: 420px;
19
+ height: 650px;
20
+ max-height: 90vh;
21
+ background: transparent;
22
+ `,F=`
23
+ border: 1px solid rgba(255, 255, 255, 0.12);
24
+ border-radius: 20px;
25
+ overflow: hidden;
26
+ width: 80%;
27
+ max-height: 85vh;
28
+ background: transparent;
29
+ box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5);
30
+ `;function R(){return typeof window<"u"&&window.innerWidth<640}function T(o){b();let e=R(),t=document.createElement("div");t.id=v,t.style.cssText=e?q:K;let n=new URL(o);e&&n.searchParams.set("mobile","1");let s=document.createElement("iframe");return s.src=n.toString(),s.style.cssText=e?F:B,s.allow="clipboard-write; payment; web-share",s.setAttribute("allowtransparency","true"),s.setAttribute("scrolling","no"),t.appendChild(s),document.body.appendChild(t),document.body.style.overflow="hidden",{backdrop:t,iframe:s}}function b(){let o=document.getElementById(v);o&&o.remove(),document.body.style.overflow=""}function y(o,e){o.iframe.contentWindow?.postMessage(e,"*")}var V={success:{color:"#0FAA36",icon:"\u2713"},error:{color:"#7A80E9",icon:"\u26A0"},info:{color:"#7A80E9",icon:"\u26A0"}},h=null,E=null;function x(o){E=o}function U(o,e,t){w();let n=document.getElementById(v);if(!n)return;let s=n.querySelector("iframe");if(!s)return;let{color:a,icon:O}=V[e],l=R(),c=document.createElement("div");c.id=S,c.style.cssText=`
31
+ position: absolute;
32
+ left: 50%;
33
+ transform: translateX(-50%);
34
+ z-index: 100000;
35
+ display: flex;
36
+ align-items: center;
37
+ gap: 8px;
38
+ padding: 8px 16px;
39
+ border-radius: 8px;
40
+ background-color: #3D3D3D;
41
+ border: 1px solid ${a};
42
+ color: ${a};
43
+ font-size: 13px;
44
+ font-weight: 500;
45
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
46
+ pointer-events: auto;
47
+ opacity: 0;
48
+ transition: opacity 0.2s ease;
49
+ width: ${l?"80%":"420px"};
50
+ box-sizing: border-box;
51
+ `;let r=document.createElement("span");r.textContent=O,r.style.cssText="flex-shrink: 0; text-align: center;",c.appendChild(r);let i=document.createElement("div");i.style.cssText="flex: 1; min-width: 0;";let p=document.createElement("div");if(p.textContent=o,p.style.cssText="line-height: 1.4; word-wrap: break-word;",i.appendChild(p),t){let m=document.createElement("div");m.textContent=t.label,m.style.cssText=`
52
+ cursor: pointer;
53
+ text-decoration: underline;
54
+ margin-top: 4px;
55
+ font-weight: 500;
56
+ `,m.addEventListener("click",()=>{w(),E&&y(E,{type:"OOZOO_SNACKBAR_ACTION",id:t.id})}),i.appendChild(m)}c.appendChild(i);let z=s.getBoundingClientRect();c.style.top=`${z.bottom+12}px`,n.appendChild(c),requestAnimationFrame(()=>{c.style.opacity="1"}),h=setTimeout(()=>{w()},t?8e3:4e3)}function w(){h&&(clearTimeout(h),h=null);let o=document.getElementById(S);o&&o.remove()}var $=new Set(["OOZOO_READY","OOZOO_CREATE_INVOICE","OOZOO_CREATE_INVOICE_RESULT","OOZOO_SUCCESS","OOZOO_CANCEL","OOZOO_ERROR","OOZOO_RESIZE","OOZOO_SNACKBAR","OOZOO_SNACKBAR_ACTION"]);function H(o){return typeof o=="object"&&o!==null&&"type"in o&&$.has(o.type)}function _(o){let e=t=>{if(!H(t.data))return;let n=o[t.data.type];n&&n(t.data)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}var j=["usd"],u=class{constructor(e){if(!e)throw new d("clientKey is required");this.clientKey=e,this.checkoutUrl=k(e)}async pay(e){this.validateOptions(e);let t=e.unit??"usd",n=new URL("/pay",this.checkoutUrl);return n.searchParams.set("clientKey",this.clientKey),n.searchParams.set("price",e.price.toString()),n.searchParams.set("unit",t),this.openFlow(n.toString(),e,"sender")}async transfer(e){this.validateOptions(e);let t=e.unit??"usd",n=new URL("/transfer",this.checkoutUrl);return n.searchParams.set("clientKey",this.clientKey),n.searchParams.set("price",e.price.toString()),n.searchParams.set("unit",t),this.openFlow(n.toString(),e,"receiver")}openFlow(e,t,n){return new Promise(s=>{let a=T(e);x(a),a.backdrop.addEventListener("click",r=>{r.target===a.backdrop&&(l(),this.handleCancel(t),s())});let O=r=>{r.key==="Escape"&&(l(),this.handleCancel(t),s())};document.addEventListener("keydown",O);let l=()=>{c(),document.removeEventListener("keydown",O),x(null),b()},c=_({OOZOO_CREATE_INVOICE:async r=>{try{let i={price:r.params.price,unit:r.params.unit,chainId:r.params.chainId,tokenAddress:r.params.tokenAddress},p=n==="sender"?await t.onCreateInvoice({...i,sender:r.params.sender??""}):await t.onCreateInvoice({...i,receiver:r.params.receiver??""});y(a,{type:"OOZOO_CREATE_INVOICE_RESULT",requestId:r.requestId,invoiceId:p})}catch(i){y(a,{type:"OOZOO_CREATE_INVOICE_RESULT",requestId:r.requestId,error:i instanceof Error?i.message:"Invoice creation failed"})}},OOZOO_RESIZE:r=>{a.iframe.style.height=`${r.height}px`},OOZOO_SNACKBAR:r=>{U(r.message,r.variant,r.action)},OOZOO_SUCCESS:r=>{l(),this.handleSuccess(t,r.invoiceId),s()},OOZOO_ERROR:r=>{l(),this.handleError(t,r.code,r.message),s()},OOZOO_CANCEL:()=>{l(),this.handleCancel(t),s()}})})}validateOptions(e){if(!e.price||e.price<=0)throw new d("price is required");if(!e.onCreateInvoice)throw new d("onCreateInvoice is required");if(!e.successUrl)throw new d("successUrl is required");if(!e.failUrl)throw new d("failUrl is required");let t=e.unit??"usd";if(!j.includes(t))throw new d(`unsupported unit: ${t}`)}handleSuccess(e,t){let n=new URL(C(e.successUrl));n.searchParams.set("invoiceId",t),window.location.href=n.toString()}handleError(e,t,n){let s=new URL(C(e.failUrl));s.searchParams.set("code",t),s.searchParams.set("message",n),window.location.href=s.toString()}handleCancel(e){let t=new URL(C(e.failUrl));t.searchParams.set("code","CANCELLED"),window.location.href=t.toString()}async requestPayment(e){return this.pay(e)}async requestWithdrawal(e){return this.transfer(e)}};function C(o){return new URL(o,window.location.origin).toString()}async function A(o){return new u(o)}var G=A;return D(Y);})();
57
+ //# sourceMappingURL=standalone.global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/standalone.ts","../src/errors.ts","../src/constants.ts","../src/window.ts","../src/client.ts"],"sourcesContent":["/**\n * Standalone entry for non-framework environments.\n * Lightweight — no React or wallet dependencies.\n *\n * @example\n * ```html\n * <script src=\"https://cdn.oozoopay.com/sdk.js\"></script>\n * <script>\n * async function handlePay() {\n * const oozoopay = await OozooPay.load('pk_xxx');\n * await oozoopay.pay({\n * price: 100,\n * onCreateInvoice: async (params) => {\n * const res = await fetch('/api/create-invoice', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify(params),\n * });\n * const data = await res.json();\n * return data.invoiceId;\n * },\n * successUrl: '/payment/success',\n * failUrl: '/payment/fail',\n * });\n * }\n * </script>\n * ```\n */\nimport { loadOozooPay, OozooPayClient } from './client';\n\nexport { OozooPayClient };\nexport const load = loadOozooPay;\n","export class OozooPayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OozooPayError';\n }\n}\n\nexport class ApiError extends OozooPayError {\n public readonly statusCode: number;\n public readonly code: string;\n\n constructor(statusCode: number, code: string, message: string) {\n super(message);\n this.name = 'ApiError';\n this.statusCode = statusCode;\n this.code = code;\n }\n}\n\nexport class ConfigError extends OozooPayError {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n","const CHECKOUT_URL = {\n DEV: 'https://web-checkout.dev.oozoopay.com',\n PROD: 'https://checkout.oozoopay.com',\n} as const;\n\nexport function resolveCheckoutUrl(clientKey: string): string {\n if (clientKey.startsWith('pk_dev_')) return CHECKOUT_URL.DEV;\n return CHECKOUT_URL.PROD;\n}\n","import type { OozooPostMessage, PostMessageSnackbar } from './types';\n\nconst WINDOW_ID = 'oozoopay-window';\nconst SNACKBAR_ID = 'oozoopay-snackbar';\n\nconst backdropBaseStyles = `\n position: fixed;\n inset: 0;\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst desktopBackdropStyles = `\n ${backdropBaseStyles}\n background-color: rgba(0, 0, 0, 0.5);\n`;\n\nconst mobileBackdropStyles = `\n ${backdropBaseStyles}\n background-color: rgba(0, 0, 0, 0.3);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n`;\n\nconst desktopStyles = `\n border: none;\n width: 420px;\n height: 650px;\n max-height: 90vh;\n background: transparent;\n`;\n\nconst mobileStyles = `\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: 20px;\n overflow: hidden;\n width: 80%;\n max-height: 85vh;\n background: transparent;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5);\n`;\n\nfunction isMobile(): boolean {\n return typeof window !== 'undefined' && window.innerWidth < 640;\n}\n\nexport interface OozooWindow {\n backdrop: HTMLDivElement;\n iframe: HTMLIFrameElement;\n}\n\nexport function openWindow(url: string): OozooWindow {\n closeWindow();\n\n const mobile = isMobile();\n\n const backdrop = document.createElement('div');\n backdrop.id = WINDOW_ID;\n backdrop.style.cssText = mobile ? mobileBackdropStyles : desktopBackdropStyles;\n\n // Pass device type to checkout via query param\n const iframeUrl = new URL(url);\n if (mobile) iframeUrl.searchParams.set('mobile', '1');\n\n const iframe = document.createElement('iframe');\n iframe.src = iframeUrl.toString();\n iframe.style.cssText = mobile ? mobileStyles : desktopStyles;\n iframe.allow = 'clipboard-write; payment; web-share';\n iframe.setAttribute('allowtransparency', 'true');\n iframe.setAttribute('scrolling', 'no');\n\n backdrop.appendChild(iframe);\n document.body.appendChild(backdrop);\n\n document.body.style.overflow = 'hidden';\n\n return { backdrop, iframe };\n}\n\nexport function closeWindow(): void {\n const existing = document.getElementById(WINDOW_ID);\n if (existing) {\n existing.remove();\n }\n document.body.style.overflow = '';\n}\n\nexport function postMessage(oozooWindow: OozooWindow, message: OozooPostMessage): void {\n oozooWindow.iframe.contentWindow?.postMessage(message, '*');\n}\n\n// --- Snackbar ---\n\nconst VARIANT_CONFIG: Record<PostMessageSnackbar['variant'], { color: string; icon: string }> = {\n success: { color: '#0FAA36', icon: '\\u2713' },\n error: { color: '#7A80E9', icon: '\\u26A0' },\n info: { color: '#7A80E9', icon: '\\u26A0' },\n};\n\nlet snackbarTimer: ReturnType<typeof setTimeout> | null = null;\nlet currentOozooWindow: OozooWindow | null = null;\n\nexport function setCurrentWindow(oozooWindow: OozooWindow | null): void {\n currentOozooWindow = oozooWindow;\n}\n\nexport function showSnackbar(\n message: string,\n variant: PostMessageSnackbar['variant'],\n action?: { label: string; id: string },\n): void {\n dismissSnackbar();\n\n const backdrop = document.getElementById(WINDOW_ID);\n if (!backdrop) return;\n\n const iframe = backdrop.querySelector('iframe');\n if (!iframe) return;\n\n const { color, icon } = VARIANT_CONFIG[variant];\n const mobile = isMobile();\n\n const snackbar = document.createElement('div');\n snackbar.id = SNACKBAR_ID;\n snackbar.style.cssText = `\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n z-index: 100000;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 8px;\n background-color: #3D3D3D;\n border: 1px solid ${color};\n color: ${color};\n font-size: 13px;\n font-weight: 500;\n font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n pointer-events: auto;\n opacity: 0;\n transition: opacity 0.2s ease;\n width: ${mobile ? '80%' : '420px'};\n box-sizing: border-box;\n `;\n\n // Icon\n const iconEl = document.createElement('span');\n iconEl.textContent = icon;\n iconEl.style.cssText = 'flex-shrink: 0; text-align: center;';\n snackbar.appendChild(iconEl);\n\n // Content wrapper\n const content = document.createElement('div');\n content.style.cssText = 'flex: 1; min-width: 0;';\n\n // Message text\n const messageEl = document.createElement('div');\n messageEl.textContent = message;\n messageEl.style.cssText = 'line-height: 1.4; word-wrap: break-word;';\n content.appendChild(messageEl);\n\n // Action link\n if (action) {\n const actionEl = document.createElement('div');\n actionEl.textContent = action.label;\n actionEl.style.cssText = `\n cursor: pointer;\n text-decoration: underline;\n margin-top: 4px;\n font-weight: 500;\n `;\n actionEl.addEventListener('click', () => {\n dismissSnackbar();\n if (currentOozooWindow) {\n postMessage(currentOozooWindow, { type: 'OOZOO_SNACKBAR_ACTION', id: action.id });\n }\n });\n content.appendChild(actionEl);\n }\n\n snackbar.appendChild(content);\n\n // Position below the iframe\n const iframeRect = iframe.getBoundingClientRect();\n snackbar.style.top = `${iframeRect.bottom + 12}px`;\n\n backdrop.appendChild(snackbar);\n\n requestAnimationFrame(() => {\n snackbar.style.opacity = '1';\n });\n\n snackbarTimer = setTimeout(\n () => {\n dismissSnackbar();\n },\n action ? 8000 : 4000,\n );\n}\n\nfunction dismissSnackbar(): void {\n if (snackbarTimer) {\n clearTimeout(snackbarTimer);\n snackbarTimer = null;\n }\n const existing = document.getElementById(SNACKBAR_ID);\n if (existing) {\n existing.remove();\n }\n}\n\n// --- Message handling ---\n\nconst OOZOO_MESSAGE_TYPES = new Set([\n 'OOZOO_READY',\n 'OOZOO_CREATE_INVOICE',\n 'OOZOO_CREATE_INVOICE_RESULT',\n 'OOZOO_SUCCESS',\n 'OOZOO_CANCEL',\n 'OOZOO_ERROR',\n 'OOZOO_RESIZE',\n 'OOZOO_SNACKBAR',\n 'OOZOO_SNACKBAR_ACTION',\n]);\n\nfunction isOozooMessage(data: unknown): data is OozooPostMessage {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n OOZOO_MESSAGE_TYPES.has((data as { type: string }).type)\n );\n}\n\nexport type MessageHandlers = {\n [K in OozooPostMessage['type']]?: (msg: Extract<OozooPostMessage, { type: K }>) => void;\n};\n\nexport function listenMessages(handlers: MessageHandlers): () => void {\n const listener = (event: MessageEvent) => {\n if (!isOozooMessage(event.data)) return;\n const handler = handlers[event.data.type] as ((msg: OozooPostMessage) => void) | undefined;\n if (handler) handler(event.data);\n };\n window.addEventListener('message', listener);\n return () => window.removeEventListener('message', listener);\n}\n","import type { PriceUnit, PayOptions, PayInvoiceParams, TransferOptions, PostMessageCreateInvoice } from './types';\nimport { ConfigError } from './errors';\nimport { resolveCheckoutUrl } from './constants';\nimport { openWindow, closeWindow, postMessage, showSnackbar, setCurrentWindow, listenMessages } from './window';\n\nconst SUPPORTED_UNITS: PriceUnit[] = ['usd'];\n\nexport class OozooPayClient {\n private readonly clientKey: string;\n private readonly checkoutUrl: string;\n\n constructor(clientKey: string) {\n if (!clientKey) {\n throw new ConfigError('clientKey is required');\n }\n this.clientKey = clientKey;\n this.checkoutUrl = resolveCheckoutUrl(clientKey);\n }\n\n /**\n * Open checkout window to collect payment from user.\n */\n async pay(options: PayOptions): Promise<void> {\n this.validateOptions(options);\n\n const unit: PriceUnit = options.unit ?? 'usd';\n\n const url = new URL('/pay', this.checkoutUrl);\n url.searchParams.set('clientKey', this.clientKey);\n url.searchParams.set('price', options.price.toString());\n url.searchParams.set('unit', unit);\n\n return this.openFlow(url.toString(), options, 'sender');\n }\n\n /**\n * Open checkout window to send payout to user.\n */\n async transfer(options: TransferOptions): Promise<void> {\n this.validateOptions(options);\n\n const unit: PriceUnit = options.unit ?? 'usd';\n\n const url = new URL('/transfer', this.checkoutUrl);\n url.searchParams.set('clientKey', this.clientKey);\n url.searchParams.set('price', options.price.toString());\n url.searchParams.set('unit', unit);\n\n return this.openFlow(url.toString(), options, 'receiver');\n }\n\n private openFlow(\n url: string,\n options: PayOptions | TransferOptions,\n addressField: 'sender' | 'receiver',\n ): Promise<void> {\n return new Promise<void>((resolve) => {\n const oozooWindow = openWindow(url);\n setCurrentWindow(oozooWindow);\n\n // Close on backdrop click\n oozooWindow.backdrop.addEventListener('click', (e) => {\n if (e.target === oozooWindow.backdrop) {\n close();\n this.handleCancel(options);\n resolve();\n }\n });\n\n // Close on ESC\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n this.handleCancel(options);\n resolve();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n const close = () => {\n cleanup();\n document.removeEventListener('keydown', handleKeyDown);\n setCurrentWindow(null);\n closeWindow();\n };\n\n const cleanup = listenMessages({\n OOZOO_CREATE_INVOICE: async (msg: PostMessageCreateInvoice) => {\n try {\n const base = {\n price: msg.params.price,\n unit: msg.params.unit,\n chainId: msg.params.chainId,\n tokenAddress: msg.params.tokenAddress,\n };\n const invoiceId =\n addressField === 'sender'\n ? await (options as PayOptions).onCreateInvoice({ ...base, sender: msg.params.sender ?? '' })\n : await (options as TransferOptions).onCreateInvoice({ ...base, receiver: msg.params.receiver ?? '' });\n postMessage(oozooWindow, {\n type: 'OOZOO_CREATE_INVOICE_RESULT',\n requestId: msg.requestId,\n invoiceId,\n });\n } catch (err) {\n postMessage(oozooWindow, {\n type: 'OOZOO_CREATE_INVOICE_RESULT',\n requestId: msg.requestId,\n error: err instanceof Error ? err.message : 'Invoice creation failed',\n });\n }\n },\n OOZOO_RESIZE: (msg) => {\n oozooWindow.iframe.style.height = `${msg.height}px`;\n },\n OOZOO_SNACKBAR: (msg) => {\n showSnackbar(msg.message, msg.variant, msg.action);\n },\n OOZOO_SUCCESS: (msg) => {\n close();\n this.handleSuccess(options, msg.invoiceId);\n resolve();\n },\n OOZOO_ERROR: (msg) => {\n close();\n this.handleError(options, msg.code, msg.message);\n resolve();\n },\n OOZOO_CANCEL: () => {\n close();\n this.handleCancel(options);\n resolve();\n },\n });\n });\n }\n\n private validateOptions(options: PayOptions | TransferOptions): void {\n if (!options.price || options.price <= 0) throw new ConfigError('price is required');\n if (!options.onCreateInvoice) throw new ConfigError('onCreateInvoice is required');\n if (!options.successUrl) throw new ConfigError('successUrl is required');\n if (!options.failUrl) throw new ConfigError('failUrl is required');\n\n const unit: PriceUnit = options.unit ?? 'usd';\n if (!SUPPORTED_UNITS.includes(unit)) throw new ConfigError(`unsupported unit: ${unit}`);\n }\n\n private handleSuccess(options: PayOptions | TransferOptions, invoiceId: string): void {\n const url = new URL(resolveUrl(options.successUrl));\n url.searchParams.set('invoiceId', invoiceId);\n window.location.href = url.toString();\n }\n\n private handleError(options: PayOptions | TransferOptions, code: string, message: string): void {\n const url = new URL(resolveUrl(options.failUrl));\n url.searchParams.set('code', code);\n url.searchParams.set('message', message);\n window.location.href = url.toString();\n }\n\n private handleCancel(options: PayOptions | TransferOptions): void {\n const url = new URL(resolveUrl(options.failUrl));\n url.searchParams.set('code', 'CANCELLED');\n window.location.href = url.toString();\n }\n\n // Deprecated method aliases\n /** @deprecated Use pay() instead */\n async requestPayment(options: PayOptions): Promise<void> {\n return this.pay(options);\n }\n\n /** @deprecated Use transfer() instead */\n async requestWithdrawal(options: TransferOptions): Promise<void> {\n return this.transfer(options);\n }\n}\n\nfunction resolveUrl(path: string): string {\n return new URL(path, window.location.origin).toString();\n}\n\n/**\n * Initialize OozooPay SDK.\n */\nexport async function loadOozooPay(clientKey: string): Promise<OozooPayClient> {\n return new OozooPayClient(clientKey);\n}\n"],"mappings":"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","names":["standalone_exports","__export","OozooPayClient","load","OozooPayError","message","ConfigError","OozooPayError","message","CHECKOUT_URL","resolveCheckoutUrl","clientKey","WINDOW_ID","SNACKBAR_ID","backdropBaseStyles","desktopBackdropStyles","mobileBackdropStyles","desktopStyles","mobileStyles","isMobile","openWindow","url","closeWindow","mobile","backdrop","iframeUrl","iframe","existing","postMessage","oozooWindow","message","VARIANT_CONFIG","snackbarTimer","currentOozooWindow","setCurrentWindow","showSnackbar","variant","action","dismissSnackbar","color","icon","snackbar","iconEl","content","messageEl","actionEl","iframeRect","OOZOO_MESSAGE_TYPES","isOozooMessage","data","listenMessages","handlers","listener","event","handler","SUPPORTED_UNITS","OozooPayClient","clientKey","ConfigError","resolveCheckoutUrl","options","unit","url","addressField","resolve","oozooWindow","openWindow","setCurrentWindow","e","close","handleKeyDown","cleanup","closeWindow","listenMessages","msg","base","invoiceId","postMessage","err","showSnackbar","resolveUrl","code","message","path","loadOozooPay","load","loadOozooPay"]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@team-oozoo/oozoo-pay",
3
+ "version": "0.2.0",
4
+ "description": "OozooPay JavaScript SDK for browser-based crypto payments",
5
+ "license": "MIT",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.mts",
13
+ "default": "./dist/index.mjs"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsup",
26
+ "typecheck": "tsc --noEmit",
27
+ "clean": "rm -rf dist",
28
+ "npm:publish": "pnpm build && npm publish --access public"
29
+ },
30
+ "devDependencies": {
31
+ "tsup": "^8.3.0",
32
+ "typescript": "^5.7.0"
33
+ }
34
+ }