@safe-stars/components
Version:
React component library for buying Telegram Stars in Telegram Mini Apps via Safe Stars.
1 lines • 66.3 kB
Source Map (JSON)
{"version":3,"file":"index-D7ExiwKc.cjs","sources":["../node_modules/@reown/appkit-pay/dist/esm/src/types/errors.js","../node_modules/@reown/appkit-pay/dist/esm/src/utils/ConstantsUtil.js","../node_modules/@reown/appkit-pay/dist/esm/src/utils/ApiUtil.js","../node_modules/@reown/appkit-pay/dist/esm/src/utils/AssetUtil.js","../node_modules/@reown/appkit-pay/dist/esm/src/utils/PaymentUtil.js","../node_modules/@reown/appkit-pay/dist/esm/src/controllers/PayController.js","../node_modules/@reown/appkit-pay/dist/esm/src/ui/w3m-pay-view/styles.js","../node_modules/@reown/appkit-pay/dist/esm/src/ui/w3m-pay-view/index.js","../node_modules/@reown/appkit-pay/dist/esm/src/ui/w3m-pay-loading-view/styles.js","../node_modules/@reown/appkit-pay/dist/esm/src/ui/w3m-pay-loading-view/index.js","../node_modules/@reown/appkit-pay/dist/esm/src/client.js","../node_modules/@reown/appkit-pay/dist/esm/src/types/assets.js"],"sourcesContent":["export const AppKitPayErrorCodes = {\n INVALID_PAYMENT_CONFIG: 'INVALID_PAYMENT_CONFIG',\n INVALID_RECIPIENT: 'INVALID_RECIPIENT',\n INVALID_ASSET: 'INVALID_ASSET',\n INVALID_AMOUNT: 'INVALID_AMOUNT',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n UNABLE_TO_INITIATE_PAYMENT: 'UNABLE_TO_INITIATE_PAYMENT',\n INVALID_CHAIN_NAMESPACE: 'INVALID_CHAIN_NAMESPACE',\n GENERIC_PAYMENT_ERROR: 'GENERIC_PAYMENT_ERROR',\n UNABLE_TO_GET_EXCHANGES: 'UNABLE_TO_GET_EXCHANGES',\n ASSET_NOT_SUPPORTED: 'ASSET_NOT_SUPPORTED',\n UNABLE_TO_GET_PAY_URL: 'UNABLE_TO_GET_PAY_URL',\n UNABLE_TO_GET_BUY_STATUS: 'UNABLE_TO_GET_BUY_STATUS'\n};\nexport const AppKitPayErrorMessages = {\n [AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG]: 'Invalid payment configuration',\n [AppKitPayErrorCodes.INVALID_RECIPIENT]: 'Invalid recipient address',\n [AppKitPayErrorCodes.INVALID_ASSET]: 'Invalid asset specified',\n [AppKitPayErrorCodes.INVALID_AMOUNT]: 'Invalid payment amount',\n [AppKitPayErrorCodes.UNKNOWN_ERROR]: 'Unknown payment error occurred',\n [AppKitPayErrorCodes.UNABLE_TO_INITIATE_PAYMENT]: 'Unable to initiate payment',\n [AppKitPayErrorCodes.INVALID_CHAIN_NAMESPACE]: 'Invalid chain namespace',\n [AppKitPayErrorCodes.GENERIC_PAYMENT_ERROR]: 'Unable to process payment',\n [AppKitPayErrorCodes.UNABLE_TO_GET_EXCHANGES]: 'Unable to get exchanges',\n [AppKitPayErrorCodes.ASSET_NOT_SUPPORTED]: 'Asset not supported by the selected exchange',\n [AppKitPayErrorCodes.UNABLE_TO_GET_PAY_URL]: 'Unable to get payment URL',\n [AppKitPayErrorCodes.UNABLE_TO_GET_BUY_STATUS]: 'Unable to get buy status'\n};\nexport class AppKitPayError extends Error {\n get message() {\n return AppKitPayErrorMessages[this.code];\n }\n constructor(code, details) {\n super(AppKitPayErrorMessages[code]);\n this.name = 'AppKitPayError';\n this.code = code;\n this.details = details;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AppKitPayError);\n }\n }\n}\nexport function createAppKitPayError(code, details) {\n const errorCode = code || AppKitPayErrorCodes.UNKNOWN_ERROR;\n return new AppKitPayError(errorCode, details);\n}\n//# sourceMappingURL=errors.js.map","export const API_URL = 'https://rpc.walletconnect.org/v1/json-rpc';\n//# sourceMappingURL=ConstantsUtil.js.map","import { OptionsController } from '@reown/appkit-controllers';\nimport { API_URL } from './ConstantsUtil.js';\nclass JsonRpcError extends Error {\n}\nexport function getApiUrl() {\n const projectId = OptionsController.getSnapshot().projectId;\n return `${API_URL}?projectId=${projectId}`;\n}\nasync function sendRequest(method, params) {\n const url = getApiUrl();\n const requestBody = {\n jsonrpc: '2.0',\n id: 1,\n method,\n params\n };\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(requestBody),\n headers: { 'Content-Type': 'application/json' }\n });\n const json = await response.json();\n if (json.error) {\n throw new JsonRpcError(json.error.message);\n }\n return json;\n}\nexport async function getExchanges(params) {\n const response = await sendRequest('reown_getExchanges', params);\n return response.result;\n}\nexport async function getPayUrl(params) {\n const response = await sendRequest('reown_getExchangePayUrl', params);\n return response.result;\n}\nexport async function getBuyStatus(params) {\n const response = await sendRequest('reown_getExchangeBuyStatus', params);\n return response.result;\n}\n//# sourceMappingURL=ApiUtil.js.map","import { ParseUtil } from '@reown/appkit-common';\nconst SUPPORT_PAY_WITH_WALLET_CHAIN_NAMESPACES = ['eip155'];\nconst CHAIN_ASSET_INFO_MAP = {\n eip155: {\n native: { assetNamespace: 'slip44', assetReference: '60' },\n defaultTokenNamespace: 'erc20'\n },\n solana: {\n native: { assetNamespace: 'slip44', assetReference: '501' },\n defaultTokenNamespace: 'token'\n }\n};\nexport function formatCaip19Asset(caipNetworkId, asset) {\n const { chainNamespace, chainId } = ParseUtil.parseCaipNetworkId(caipNetworkId);\n const chainInfo = CHAIN_ASSET_INFO_MAP[chainNamespace];\n if (!chainInfo) {\n throw new Error(`Unsupported chain namespace for CAIP-19 formatting: ${chainNamespace}`);\n }\n let assetNamespace = chainInfo.native.assetNamespace;\n let assetReference = chainInfo.native.assetReference;\n if (asset !== 'native') {\n assetNamespace = chainInfo.defaultTokenNamespace;\n assetReference = asset;\n }\n const networkPart = `${chainNamespace}:${chainId}`;\n return `${networkPart}/${assetNamespace}:${assetReference}`;\n}\nexport function isPayWithWalletSupported(networkId) {\n const { chainNamespace } = ParseUtil.parseCaipNetworkId(networkId);\n return SUPPORT_PAY_WITH_WALLET_CHAIN_NAMESPACES.includes(chainNamespace);\n}\n//# sourceMappingURL=AssetUtil.js.map","import { ConstantsUtil, ContractUtil } from '@reown/appkit-common';\nimport { ChainController, ConnectionController, CoreHelperUtil } from '@reown/appkit-controllers';\nimport { AppKitPayError } from '../types/errors.js';\nimport { AppKitPayErrorCodes } from '../types/errors.js';\nexport async function ensureCorrectNetwork(options) {\n const { paymentAssetNetwork, activeCaipNetwork, approvedCaipNetworkIds, requestedCaipNetworks } = options;\n const sortedNetworks = CoreHelperUtil.sortRequestedNetworks(approvedCaipNetworkIds, requestedCaipNetworks);\n const assetCaipNetwork = sortedNetworks.find(network => network.caipNetworkId === paymentAssetNetwork);\n if (!assetCaipNetwork) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG);\n }\n if (assetCaipNetwork.caipNetworkId === activeCaipNetwork.caipNetworkId) {\n return;\n }\n const isSupportingAllNetworks = ChainController.getNetworkProp('supportsAllNetworks', assetCaipNetwork.chainNamespace);\n const isSwitchAllowed = approvedCaipNetworkIds?.includes(assetCaipNetwork.caipNetworkId) || isSupportingAllNetworks;\n if (!isSwitchAllowed) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG);\n }\n try {\n await ChainController.switchActiveNetwork(assetCaipNetwork);\n }\n catch (error) {\n throw new AppKitPayError(AppKitPayErrorCodes.GENERIC_PAYMENT_ERROR, error);\n }\n}\nexport async function processEvmNativePayment(paymentAsset, chainNamespace, params) {\n if (chainNamespace !== ConstantsUtil.CHAIN.EVM) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_CHAIN_NAMESPACE);\n }\n if (!params.fromAddress) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG, 'fromAddress is required for native EVM payments.');\n }\n const amountValue = typeof params.amount === 'string' ? parseFloat(params.amount) : params.amount;\n if (isNaN(amountValue)) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG);\n }\n const decimals = paymentAsset.metadata?.decimals ?? 18;\n const amountBigInt = ConnectionController.parseUnits(amountValue.toString(), decimals);\n if (typeof amountBigInt !== 'bigint') {\n throw new AppKitPayError(AppKitPayErrorCodes.GENERIC_PAYMENT_ERROR);\n }\n const txResponse = await ConnectionController.sendTransaction({\n chainNamespace,\n to: params.recipient,\n address: params.fromAddress,\n value: amountBigInt,\n data: '0x'\n });\n return txResponse ?? undefined;\n}\nexport async function processEvmErc20Payment(paymentAsset, params) {\n if (!params.fromAddress) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG, 'fromAddress is required for ERC20 EVM payments.');\n }\n const tokenAddress = paymentAsset.asset;\n const recipientAddress = params.recipient;\n const decimals = Number(paymentAsset.metadata.decimals);\n const amountBigInt = ConnectionController.parseUnits(params.amount.toString(), decimals);\n if (amountBigInt === undefined) {\n throw new AppKitPayError(AppKitPayErrorCodes.GENERIC_PAYMENT_ERROR);\n }\n const txResponse = await ConnectionController.writeContract({\n fromAddress: params.fromAddress,\n tokenAddress,\n args: [recipientAddress, amountBigInt],\n method: 'transfer',\n abi: ContractUtil.getERC20Abi(tokenAddress),\n chainNamespace: ConstantsUtil.CHAIN.EVM\n });\n return txResponse ?? undefined;\n}\n//# sourceMappingURL=PaymentUtil.js.map","import { proxy, subscribe as sub } from 'valtio/vanilla';\nimport { subscribeKey as subKey } from 'valtio/vanilla/utils';\nimport { ConstantsUtil, ParseUtil } from '@reown/appkit-common';\nimport { AccountController, ChainController, CoreHelperUtil, EventsController, ModalController, RouterController, SnackController } from '@reown/appkit-controllers';\nimport { ProviderUtil } from '@reown/appkit-utils';\nimport { AppKitPayErrorCodes, AppKitPayErrorMessages } from '../types/errors.js';\nimport { AppKitPayError } from '../types/errors.js';\nimport { getBuyStatus, getExchanges, getPayUrl } from '../utils/ApiUtil.js';\nimport { formatCaip19Asset } from '../utils/AssetUtil.js';\nimport { ensureCorrectNetwork, processEvmErc20Payment, processEvmNativePayment } from '../utils/PaymentUtil.js';\nconst DEFAULT_PAGE = 0;\nconst DEFAULT_PAYMENT_ID = 'unknown';\nconst state = proxy({\n paymentAsset: {\n network: 'eip155:1',\n asset: '0x0',\n metadata: {\n name: '0x0',\n symbol: '0x0',\n decimals: 0\n }\n },\n recipient: '0x0',\n amount: 0,\n isConfigured: false,\n error: null,\n isPaymentInProgress: false,\n exchanges: [],\n isLoading: false,\n openInNewTab: true,\n redirectUrl: undefined,\n payWithExchange: undefined,\n currentPayment: undefined,\n analyticsSet: false,\n paymentId: undefined\n});\nexport const PayController = {\n state,\n subscribe(callback) {\n return sub(state, () => callback(state));\n },\n subscribeKey(key, callback) {\n return subKey(state, key, callback);\n },\n async handleOpenPay(options) {\n this.resetState();\n this.setPaymentConfig(options);\n this.subscribeEvents();\n this.initializeAnalytics();\n state.isConfigured = true;\n EventsController.sendEvent({\n type: 'track',\n event: 'PAY_MODAL_OPEN',\n properties: {\n exchanges: state.exchanges,\n configuration: {\n network: state.paymentAsset.network,\n asset: state.paymentAsset.asset,\n recipient: state.recipient,\n amount: state.amount\n }\n }\n });\n await ModalController.open({\n view: 'Pay'\n });\n },\n resetState() {\n state.paymentAsset = {\n network: 'eip155:1',\n asset: '0x0',\n metadata: { name: '0x0', symbol: '0x0', decimals: 0 }\n };\n state.recipient = '0x0';\n state.amount = 0;\n state.isConfigured = false;\n state.error = null;\n state.isPaymentInProgress = false;\n state.isLoading = false;\n state.currentPayment = undefined;\n },\n setPaymentConfig(config) {\n if (!config.paymentAsset) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG);\n }\n try {\n state.paymentAsset = config.paymentAsset;\n state.recipient = config.recipient;\n state.amount = config.amount;\n state.openInNewTab = config.openInNewTab ?? true;\n state.redirectUrl = config.redirectUrl;\n state.payWithExchange = config.payWithExchange;\n state.error = null;\n }\n catch (error) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG, error.message);\n }\n },\n getPaymentAsset() {\n return state.paymentAsset;\n },\n getExchanges() {\n return state.exchanges;\n },\n async fetchExchanges() {\n try {\n state.isLoading = true;\n const response = await getExchanges({\n page: DEFAULT_PAGE,\n asset: formatCaip19Asset(state.paymentAsset.network, state.paymentAsset.asset),\n amount: state.amount.toString()\n });\n state.exchanges = response.exchanges.slice(0, 2);\n }\n catch (error) {\n SnackController.showError(AppKitPayErrorMessages.UNABLE_TO_GET_EXCHANGES);\n throw new AppKitPayError(AppKitPayErrorCodes.UNABLE_TO_GET_EXCHANGES);\n }\n finally {\n state.isLoading = false;\n }\n },\n async getAvailableExchanges(params) {\n try {\n const asset = params?.asset && params?.network\n ? formatCaip19Asset(params.network, params.asset)\n : undefined;\n const response = await getExchanges({\n page: params?.page ?? DEFAULT_PAGE,\n asset,\n amount: params?.amount?.toString()\n });\n return response;\n }\n catch (error) {\n throw new AppKitPayError(AppKitPayErrorCodes.UNABLE_TO_GET_EXCHANGES);\n }\n },\n async getPayUrl(exchangeId, params, headless = false) {\n try {\n const numericAmount = Number(params.amount);\n const response = await getPayUrl({\n exchangeId,\n asset: formatCaip19Asset(params.network, params.asset),\n amount: numericAmount.toString(),\n recipient: `${params.network}:${params.recipient}`\n });\n EventsController.sendEvent({\n type: 'track',\n event: 'PAY_EXCHANGE_SELECTED',\n properties: {\n exchange: {\n id: exchangeId\n },\n configuration: {\n network: params.network,\n asset: params.asset,\n recipient: params.recipient,\n amount: numericAmount\n },\n currentPayment: {\n type: 'exchange',\n exchangeId\n },\n headless\n }\n });\n if (headless) {\n this.initiatePayment();\n EventsController.sendEvent({\n type: 'track',\n event: 'PAY_INITIATED',\n properties: {\n paymentId: state.paymentId || DEFAULT_PAYMENT_ID,\n configuration: {\n network: params.network,\n asset: params.asset,\n recipient: params.recipient,\n amount: numericAmount\n },\n currentPayment: {\n type: 'exchange',\n exchangeId\n }\n }\n });\n }\n return response;\n }\n catch (error) {\n if (error instanceof Error && error.message.includes('is not supported')) {\n throw new AppKitPayError(AppKitPayErrorCodes.ASSET_NOT_SUPPORTED);\n }\n throw new Error(error.message);\n }\n },\n async openPayUrl(openParams, params, headless = false) {\n try {\n const payUrl = await this.getPayUrl(openParams.exchangeId, params, headless);\n if (!payUrl) {\n throw new AppKitPayError(AppKitPayErrorCodes.UNABLE_TO_GET_PAY_URL);\n }\n const shouldOpenInNewTab = openParams.openInNewTab ?? true;\n const target = shouldOpenInNewTab ? '_blank' : '_self';\n CoreHelperUtil.openHref(payUrl.url, target);\n return payUrl;\n }\n catch (error) {\n if (error instanceof AppKitPayError) {\n state.error = error.message;\n }\n else {\n state.error = AppKitPayErrorMessages.GENERIC_PAYMENT_ERROR;\n }\n throw new AppKitPayError(AppKitPayErrorCodes.UNABLE_TO_GET_PAY_URL);\n }\n },\n subscribeEvents() {\n if (state.isConfigured) {\n return;\n }\n ProviderUtil.subscribeProviders(async (_) => {\n const chainNamespace = ChainController.state.activeChain;\n const provider = ProviderUtil.getProvider(chainNamespace);\n if (!provider) {\n return;\n }\n await this.handlePayment();\n });\n AccountController.subscribeKey('caipAddress', async (caipAddress) => {\n if (!caipAddress) {\n return;\n }\n await this.handlePayment();\n });\n },\n async handlePayment() {\n state.currentPayment = {\n type: 'wallet',\n status: 'IN_PROGRESS'\n };\n const caipAddress = AccountController.state.caipAddress;\n if (!caipAddress) {\n return;\n }\n const { chainId, address } = ParseUtil.parseCaipAddress(caipAddress);\n const chainNamespace = ChainController.state.activeChain;\n if (!address || !chainId || !chainNamespace) {\n return;\n }\n const provider = ProviderUtil.getProvider(chainNamespace);\n if (!provider) {\n return;\n }\n const caipNetwork = ChainController.state.activeCaipNetwork;\n if (!caipNetwork) {\n return;\n }\n if (state.isPaymentInProgress) {\n return;\n }\n try {\n this.initiatePayment();\n const requestedCaipNetworks = ChainController.getAllRequestedCaipNetworks();\n const approvedCaipNetworkIds = ChainController.getAllApprovedCaipNetworkIds();\n await ensureCorrectNetwork({\n paymentAssetNetwork: state.paymentAsset.network,\n activeCaipNetwork: caipNetwork,\n approvedCaipNetworkIds,\n requestedCaipNetworks\n });\n await ModalController.open({\n view: 'PayLoading'\n });\n switch (chainNamespace) {\n case ConstantsUtil.CHAIN.EVM:\n if (state.paymentAsset.asset === 'native') {\n state.currentPayment.result = await processEvmNativePayment(state.paymentAsset, chainNamespace, {\n recipient: state.recipient,\n amount: state.amount,\n fromAddress: address\n });\n }\n if (state.paymentAsset.asset.startsWith('0x')) {\n state.currentPayment.result = await processEvmErc20Payment(state.paymentAsset, {\n recipient: state.recipient,\n amount: state.amount,\n fromAddress: address\n });\n }\n state.currentPayment.status = 'SUCCESS';\n break;\n default:\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_CHAIN_NAMESPACE);\n }\n }\n catch (error) {\n if (error instanceof AppKitPayError) {\n state.error = error.message;\n }\n else {\n state.error = AppKitPayErrorMessages.GENERIC_PAYMENT_ERROR;\n }\n state.currentPayment.status = 'FAILED';\n SnackController.showError(state.error);\n }\n finally {\n state.isPaymentInProgress = false;\n }\n },\n getExchangeById(exchangeId) {\n return state.exchanges.find(exchange => exchange.id === exchangeId);\n },\n validatePayConfig(config) {\n const { paymentAsset, recipient, amount } = config;\n if (!paymentAsset) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_PAYMENT_CONFIG);\n }\n if (!recipient) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_RECIPIENT);\n }\n if (!paymentAsset.asset) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_ASSET);\n }\n if (amount === undefined || amount === null || amount <= 0) {\n throw new AppKitPayError(AppKitPayErrorCodes.INVALID_AMOUNT);\n }\n },\n handlePayWithWallet() {\n const caipAddress = AccountController.state.caipAddress;\n if (!caipAddress) {\n RouterController.push('Connect');\n return;\n }\n const { chainId, address } = ParseUtil.parseCaipAddress(caipAddress);\n const chainNamespace = ChainController.state.activeChain;\n if (!address || !chainId || !chainNamespace) {\n RouterController.push('Connect');\n return;\n }\n this.handlePayment();\n },\n async handlePayWithExchange(exchangeId) {\n try {\n state.currentPayment = {\n type: 'exchange',\n exchangeId\n };\n const { network, asset } = state.paymentAsset;\n const payUrlParams = {\n network,\n asset,\n amount: state.amount,\n recipient: state.recipient\n };\n const payUrl = await this.getPayUrl(exchangeId, payUrlParams);\n if (!payUrl) {\n throw new AppKitPayError(AppKitPayErrorCodes.UNABLE_TO_INITIATE_PAYMENT);\n }\n state.currentPayment.sessionId = payUrl.sessionId;\n state.currentPayment.status = 'IN_PROGRESS';\n state.currentPayment.exchangeId = exchangeId;\n this.initiatePayment();\n return {\n url: payUrl.url,\n openInNewTab: state.openInNewTab\n };\n }\n catch (error) {\n if (error instanceof AppKitPayError) {\n state.error = error.message;\n }\n else {\n state.error = AppKitPayErrorMessages.GENERIC_PAYMENT_ERROR;\n }\n state.isPaymentInProgress = false;\n SnackController.showError(state.error);\n return null;\n }\n },\n async getBuyStatus(exchangeId, sessionId) {\n try {\n const status = await getBuyStatus({ sessionId, exchangeId });\n if (status.status === 'SUCCESS' || status.status === 'FAILED') {\n EventsController.sendEvent({\n type: 'track',\n event: status.status === 'SUCCESS' ? 'PAY_SUCCESS' : 'PAY_ERROR',\n properties: {\n paymentId: state.paymentId || DEFAULT_PAYMENT_ID,\n configuration: {\n network: state.paymentAsset.network,\n asset: state.paymentAsset.asset,\n recipient: state.recipient,\n amount: state.amount\n },\n currentPayment: {\n type: 'exchange',\n exchangeId: state.currentPayment?.exchangeId,\n sessionId: state.currentPayment?.sessionId,\n result: status.txHash\n }\n }\n });\n }\n return status;\n }\n catch (error) {\n throw new AppKitPayError(AppKitPayErrorCodes.UNABLE_TO_GET_BUY_STATUS);\n }\n },\n async updateBuyStatus(exchangeId, sessionId) {\n try {\n const status = await this.getBuyStatus(exchangeId, sessionId);\n if (state.currentPayment) {\n state.currentPayment.status = status.status;\n state.currentPayment.result = status.txHash;\n }\n if (status.status === 'SUCCESS' || status.status === 'FAILED') {\n state.isPaymentInProgress = false;\n }\n }\n catch (error) {\n throw new AppKitPayError(AppKitPayErrorCodes.UNABLE_TO_GET_BUY_STATUS);\n }\n },\n initiatePayment() {\n state.isPaymentInProgress = true;\n state.paymentId = crypto.randomUUID();\n },\n initializeAnalytics() {\n if (state.analyticsSet) {\n return;\n }\n state.analyticsSet = true;\n this.subscribeKey('isPaymentInProgress', _ => {\n if (state.currentPayment?.status && state.currentPayment.status !== 'UNKNOWN') {\n const eventType = {\n IN_PROGRESS: 'PAY_INITIATED',\n SUCCESS: 'PAY_SUCCESS',\n FAILED: 'PAY_ERROR'\n }[state.currentPayment.status];\n EventsController.sendEvent({\n type: 'track',\n event: eventType,\n properties: {\n paymentId: state.paymentId || DEFAULT_PAYMENT_ID,\n configuration: {\n network: state.paymentAsset.network,\n asset: state.paymentAsset.asset,\n recipient: state.recipient,\n amount: state.amount\n },\n currentPayment: {\n type: state.currentPayment.type,\n exchangeId: state.currentPayment.exchangeId,\n sessionId: state.currentPayment.sessionId,\n result: state.currentPayment.result\n }\n }\n });\n }\n });\n }\n};\n//# sourceMappingURL=PayController.js.map","import { css } from 'lit';\nexport default css `\n wui-separator {\n margin: var(--wui-spacing-m) calc(var(--wui-spacing-m) * -1) var(--wui-spacing-xs)\n calc(var(--wui-spacing-m) * -1);\n width: calc(100% + var(--wui-spacing-s) * 2);\n }\n\n .token-display {\n padding: var(--wui-spacing-s) var(--wui-spacing-m);\n border-radius: var(--wui-border-radius-s);\n background-color: var(--wui-color-bg-125);\n margin-top: var(--wui-spacing-s);\n margin-bottom: var(--wui-spacing-s);\n }\n\n .token-display wui-text {\n text-transform: none;\n }\n\n wui-loading-spinner {\n padding: var(--wui-spacing-xs);\n }\n`;\n//# sourceMappingURL=styles.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html } from 'lit';\nimport { state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { AccountController, ChainController, ConnectionController, CoreHelperUtil, ModalController, SnackController } from '@reown/appkit-controllers';\nimport { customElement } from '@reown/appkit-ui';\nimport '@reown/appkit-ui/wui-button';\nimport '@reown/appkit-ui/wui-flex';\nimport '@reown/appkit-ui/wui-icon';\nimport '@reown/appkit-ui/wui-icon-button';\nimport '@reown/appkit-ui/wui-icon-link';\nimport '@reown/appkit-ui/wui-image';\nimport '@reown/appkit-ui/wui-list-item';\nimport '@reown/appkit-ui/wui-loading-spinner';\nimport '@reown/appkit-ui/wui-network-image';\nimport '@reown/appkit-ui/wui-separator';\nimport '@reown/appkit-ui/wui-text';\nimport '@reown/appkit-ui/wui-wallet-image';\nimport { PayController } from '../../controllers/PayController.js';\nimport { isPayWithWalletSupported } from '../../utils/AssetUtil.js';\nimport styles from './styles.js';\nlet W3mPayView = class W3mPayView extends LitElement {\n constructor() {\n super();\n this.unsubscribe = [];\n this.amount = '';\n this.tokenSymbol = '';\n this.networkName = '';\n this.exchanges = PayController.state.exchanges;\n this.isLoading = PayController.state.isLoading;\n this.loadingExchangeId = null;\n this.connectedWalletInfo = AccountController.state.connectedWalletInfo;\n this.initializePaymentDetails();\n this.unsubscribe.push(PayController.subscribeKey('exchanges', val => (this.exchanges = val)));\n this.unsubscribe.push(PayController.subscribeKey('isLoading', val => (this.isLoading = val)));\n this.unsubscribe.push(AccountController.subscribe(newState => (this.connectedWalletInfo = newState.connectedWalletInfo)));\n PayController.fetchExchanges();\n }\n get isWalletConnected() {\n return AccountController.state.status === 'connected';\n }\n render() {\n return html `\n <wui-flex flexDirection=\"column\">\n <wui-flex flexDirection=\"column\" .padding=${['0', 'l', 'l', 'l']} gap=\"s\">\n ${this.renderPaymentHeader()}\n\n <wui-flex flexDirection=\"column\" gap=\"s\">\n ${this.renderPayWithWallet()} ${this.renderExchangeOptions()}\n </wui-flex>\n </wui-flex>\n </wui-flex>\n `;\n }\n initializePaymentDetails() {\n const paymentAsset = PayController.getPaymentAsset();\n this.networkName = paymentAsset.network;\n this.tokenSymbol = paymentAsset.metadata.symbol;\n this.amount = PayController.state.amount.toString();\n }\n renderPayWithWallet() {\n if (!isPayWithWalletSupported(this.networkName)) {\n return html ``;\n }\n return html `<wui-flex flexDirection=\"column\" gap=\"s\">\n ${this.isWalletConnected ? this.renderConnectedView() : this.renderDisconnectedView()}\n </wui-flex>\n <wui-separator text=\"or\"></wui-separator>`;\n }\n renderPaymentHeader() {\n let displayNetworkName = this.networkName;\n if (this.networkName) {\n const allNetworks = ChainController.getAllRequestedCaipNetworks();\n const targetNetwork = allNetworks.find(net => net.caipNetworkId === this.networkName);\n if (targetNetwork) {\n displayNetworkName = targetNetwork.name;\n }\n }\n return html `\n <wui-flex flexDirection=\"column\" alignItems=\"center\">\n <wui-flex alignItems=\"center\" gap=\"xs\">\n <wui-text variant=\"large-700\" color=\"fg-100\">${this.amount || '0.0000'}</wui-text>\n <wui-flex class=\"token-display\" alignItems=\"center\" gap=\"xxs\">\n <wui-text variant=\"paragraph-600\" color=\"fg-100\">\n ${this.tokenSymbol || 'Unknown Asset'}\n </wui-text>\n ${displayNetworkName\n ? html `\n <wui-text variant=\"small-500\" color=\"fg-200\"> on ${displayNetworkName} </wui-text>\n `\n : ''}\n </wui-flex>\n </wui-flex>\n </wui-flex>\n `;\n }\n renderConnectedView() {\n const walletName = this.connectedWalletInfo?.name || 'connected wallet';\n return html `\n <wui-list-item\n @click=${this.onWalletPayment}\n ?chevron=${true}\n data-testid=\"wallet-payment-option\"\n >\n <wui-flex alignItems=\"center\" gap=\"s\">\n <wui-wallet-image\n size=\"sm\"\n imageSrc=${ifDefined(this.connectedWalletInfo?.icon)}\n name=${ifDefined(this.connectedWalletInfo?.name)}\n ></wui-wallet-image>\n <wui-text variant=\"paragraph-500\" color=\"inherit\">Pay with ${walletName}</wui-text>\n </wui-flex>\n </wui-list-item>\n\n <wui-list-item\n variant=\"icon\"\n iconVariant=\"overlay\"\n icon=\"disconnect\"\n @click=${this.onDisconnect}\n data-testid=\"disconnect-button\"\n ?chevron=${false}\n >\n <wui-text variant=\"paragraph-500\" color=\"fg-200\">Disconnect</wui-text>\n </wui-list-item>\n `;\n }\n renderDisconnectedView() {\n return html `<wui-list-item\n variant=\"icon\"\n iconVariant=\"overlay\"\n icon=\"walletPlaceholder\"\n @click=${this.onWalletPayment}\n ?chevron=${true}\n data-testid=\"wallet-payment-option\"\n >\n <wui-text variant=\"paragraph-500\" color=\"inherit\">Pay from wallet</wui-text>\n </wui-list-item>`;\n }\n renderExchangeOptions() {\n if (this.isLoading) {\n return html `<wui-flex justifyContent=\"center\" alignItems=\"center\">\n <wui-spinner size=\"md\"></wui-spinner>\n </wui-flex>`;\n }\n if (this.exchanges.length === 0) {\n return html `<wui-flex justifyContent=\"center\" alignItems=\"center\">\n <wui-text variant=\"paragraph-500\" color=\"fg-100\">No exchanges available</wui-text>\n </wui-flex>`;\n }\n return this.exchanges.map(exchange => html `\n <wui-list-item\n @click=${() => this.onExchangePayment(exchange.id)}\n data-testid=\"exchange-option-${exchange.id}\"\n ?chevron=${true}\n ?disabled=${this.loadingExchangeId !== null}\n >\n <wui-flex alignItems=\"center\" gap=\"s\">\n ${this.loadingExchangeId === exchange.id\n ? html `<wui-loading-spinner color=\"accent-100\" size=\"md\"></wui-loading-spinner>`\n : html `<wui-wallet-image\n size=\"sm\"\n imageSrc=${ifDefined(exchange.imageUrl)}\n name=${exchange.name}\n ></wui-wallet-image>`}\n <wui-text flexGrow=\"1\" variant=\"paragraph-500\" color=\"inherit\"\n >Pay with ${exchange.name} <wui-spinner size=\"sm\" color=\"fg-200\"></wui-spinner\n ></wui-text>\n </wui-flex>\n </wui-list-item>\n `);\n }\n onWalletPayment() {\n PayController.handlePayWithWallet();\n }\n async onExchangePayment(exchangeId) {\n try {\n this.loadingExchangeId = exchangeId;\n const result = await PayController.handlePayWithExchange(exchangeId);\n if (result) {\n await ModalController.open({\n view: 'PayLoading'\n });\n CoreHelperUtil.openHref(result.url, result.openInNewTab ? '_blank' : '_self');\n }\n }\n catch (error) {\n console.error('Failed to pay with exchange', error);\n SnackController.showError('Failed to pay with exchange');\n }\n finally {\n this.loadingExchangeId = null;\n }\n }\n async onDisconnect(e) {\n e.stopPropagation();\n try {\n await ConnectionController.disconnect();\n ModalController.close();\n }\n catch {\n console.error('Failed to disconnect');\n SnackController.showError('Failed to disconnect');\n }\n }\n disconnectedCallback() {\n this.unsubscribe.forEach(unsubscribe => unsubscribe());\n }\n};\nW3mPayView.styles = styles;\n__decorate([\n state()\n], W3mPayView.prototype, \"amount\", void 0);\n__decorate([\n state()\n], W3mPayView.prototype, \"tokenSymbol\", void 0);\n__decorate([\n state()\n], W3mPayView.prototype, \"networkName\", void 0);\n__decorate([\n state()\n], W3mPayView.prototype, \"exchanges\", void 0);\n__decorate([\n state()\n], W3mPayView.prototype, \"isLoading\", void 0);\n__decorate([\n state()\n], W3mPayView.prototype, \"loadingExchangeId\", void 0);\n__decorate([\n state()\n], W3mPayView.prototype, \"connectedWalletInfo\", void 0);\nW3mPayView = __decorate([\n customElement('w3m-pay-view')\n], W3mPayView);\nexport { W3mPayView };\n//# sourceMappingURL=index.js.map","import { css } from 'lit';\nexport default css `\n :host {\n display: block;\n height: 100%;\n width: 100%;\n }\n`;\n//# sourceMappingURL=styles.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html } from 'lit';\nimport { state } from 'lit/decorators.js';\nimport { ConnectionController, ModalController, ThemeController } from '@reown/appkit-controllers';\nimport { customElement } from '@reown/appkit-ui';\nimport '@reown/appkit-ui/wui-flex';\nimport '@reown/appkit-ui/wui-icon';\nimport '@reown/appkit-ui/wui-loading-thumbnail';\nimport '@reown/appkit-ui/wui-text';\nimport { PayController } from '../../controllers/PayController.js';\nimport styles from './styles.js';\nconst EXCHANGE_STATUS_CHECK_INTERVAL = 4000;\nlet W3mPayLoadingView = class W3mPayLoadingView extends LitElement {\n constructor() {\n super();\n this.loadingMessage = '';\n this.subMessage = '';\n this.paymentState = 'in-progress';\n this.paymentState = PayController.state.isPaymentInProgress ? 'in-progress' : 'completed';\n this.updateMessages();\n this.setupSubscription();\n this.setupExchangeSubscription();\n }\n disconnectedCallback() {\n clearInterval(this.exchangeSubscription);\n }\n render() {\n return html `\n <wui-flex\n flexDirection=\"column\"\n alignItems=\"center\"\n .padding=${['xl', 'xl', 'xl', 'xl']}\n gap=\"xl\"\n >\n <wui-flex justifyContent=\"center\" alignItems=\"center\"> ${this.getStateIcon()} </wui-flex>\n <wui-flex flexDirection=\"column\" alignItems=\"center\" gap=\"xs\">\n <wui-text align=\"center\" variant=\"paragraph-500\" color=\"fg-100\">\n ${this.loadingMessage}\n </wui-text>\n <wui-text align=\"center\" variant=\"small-400\" color=\"fg-200\">\n ${this.subMessage}\n </wui-text>\n </wui-flex>\n </wui-flex>\n `;\n }\n updateMessages() {\n switch (this.paymentState) {\n case 'completed':\n this.loadingMessage = 'Payment completed';\n this.subMessage = 'Your transaction has been successfully processed';\n break;\n case 'error':\n this.loadingMessage = 'Payment failed';\n this.subMessage = 'There was an error processing your transaction';\n break;\n case 'in-progress':\n default:\n if (PayController.state.currentPayment?.type === 'exchange') {\n this.loadingMessage = 'Payment initiated';\n this.subMessage = `Please complete the payment on the exchange`;\n }\n else {\n this.loadingMessage = 'Awaiting payment confirmation';\n this.subMessage = 'Please confirm the payment transaction in your wallet';\n }\n break;\n }\n }\n getStateIcon() {\n switch (this.paymentState) {\n case 'completed':\n return this.successTemplate();\n case 'error':\n return this.errorTemplate();\n case 'in-progress':\n default:\n return this.loaderTemplate();\n }\n }\n setupExchangeSubscription() {\n if (PayController.state.currentPayment?.type !== 'exchange') {\n return;\n }\n this.exchangeSubscription = setInterval(async () => {\n const exchangeId = PayController.state.currentPayment?.exchangeId;\n const sessionId = PayController.state.currentPayment?.sessionId;\n if (exchangeId && sessionId) {\n await PayController.updateBuyStatus(exchangeId, sessionId);\n if (PayController.state.currentPayment?.status === 'SUCCESS') {\n clearInterval(this.exchangeSubscription);\n }\n }\n }, EXCHANGE_STATUS_CHECK_INTERVAL);\n }\n setupSubscription() {\n PayController.subscribeKey('isPaymentInProgress', (inProgress) => {\n if (!inProgress && this.paymentState === 'in-progress') {\n if (PayController.state.error || !PayController.state.currentPayment?.result) {\n this.paymentState = 'error';\n }\n else {\n this.paymentState = 'completed';\n }\n this.updateMessages();\n setTimeout(() => {\n if (ConnectionController.state.status === 'disconnected') {\n return;\n }\n ModalController.close();\n }, 3000);\n }\n });\n PayController.subscribeKey('error', (error) => {\n if (error && this.paymentState === 'in-progress') {\n this.paymentState = 'error';\n this.updateMessages();\n }\n });\n }\n loaderTemplate() {\n const borderRadiusMaster = ThemeController.state.themeVariables['--w3m-border-radius-master'];\n const radius = borderRadiusMaster ? parseInt(borderRadiusMaster.replace('px', ''), 10) : 4;\n return html `<wui-loading-thumbnail radius=${radius * 9}></wui-loading-thumbnail>`;\n }\n successTemplate() {\n return html `<wui-icon size=\"xl\" color=\"success-100\" name=\"checkmark\"></wui-icon>`;\n }\n errorTemplate() {\n return html `<wui-icon size=\"xl\" color=\"error-100\" name=\"close\"></wui-icon>`;\n }\n};\nW3mPayLoadingView.styles = styles;\n__decorate([\n state()\n], W3mPayLoadingView.prototype, \"loadingMessage\", void 0);\n__decorate([\n state()\n], W3mPayLoadingView.prototype, \"subMessage\", void 0);\n__decorate([\n state()\n], W3mPayLoadingView.prototype, \"paymentState\", void 0);\nW3mPayLoadingView = __decorate([\n customElement('w3m-pay-loading-view')\n], W3mPayLoadingView);\nexport { W3mPayLoadingView };\n//# sourceMappingURL=index.js.map","import { PayController } from './controllers/PayController.js';\nexport async function openPay(options) {\n return PayController.handleOpenPay(options);\n}\nexport function getAvailableExchanges(params) {\n return PayController.getAvailableExchanges(params);\n}\nexport function getPayUrl(exchangeId, params) {\n return PayController.getPayUrl(exchangeId, params, true);\n}\nexport function openPayUrl(exchangeId, params, openInNewTab) {\n return PayController.openPayUrl({ exchangeId, openInNewTab }, params, true);\n}\nexport function getExchanges() {\n return PayController.getExchanges();\n}\nexport function getPayResult() {\n return PayController.state.currentPayment?.result;\n}\nexport function getPayError() {\n return PayController.state.error;\n}\nexport function getIsPaymentInProgress() {\n return PayController.state.isPaymentInProgress;\n}\nexport function subscribeStateKey(key, callback) {\n return PayController.subscribeKey(key, callback);\n}\n//# sourceMappingURL=client.js.map","export const baseETH = {\n network: 'eip155:8453',\n asset: 'native',\n metadata: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18\n }\n};\nexport const baseUSDC = {\n network: 'eip155:8453',\n asset: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n metadata: {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6\n }\n};\nexport const baseSepoliaETH = {\n network: 'eip155:84532',\n asset: 'native',\n metadata: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18\n }\n};\n//# sourceMappingURL=assets.js.map"],"names":["AppKitPayErrorCodes","AppKitPayErrorMessages","AppKitPayError","code","details","API_URL","JsonRpcError","getApiUrl","projectId","OptionsController","sendRequest","method","params","url","json","getExchanges","getPayUrl","getBuyStatus","SUPPORT_PAY_WITH_WALLET_CHAIN_NAMESPACES","CHAIN_ASSET_INFO_MAP","formatCaip19Asset","caipNetworkId","asset","chainNamespace","chainId","ParseUtil","chainInfo","assetNamespace","assetReference","isPayWithWalletSupported","networkId","ensureCorrectNetwork","options","paymentAssetNetwork","activeCaipNetwork","approvedCaipNetworkIds","requestedCaipNetworks","assetCaipNetwork","CoreHelperUtil","network","isSupportingAllNetworks","ChainController","error","processEvmNativePayment","paymentAsset","ConstantsUtil","amountValue","decimals","_a","amountBigInt","ConnectionController","processEvmErc20Payment","tokenAddress","recipientAddress","ContractUtil","DEFAULT_PAGE","DEFAULT_PAYMENT_ID","state","proxy","PayController","callback","sub","key","subKey","EventsController","ModalController","config","response","SnackController","exchangeId","headless","numericAmount","openParams","payUrl","target","ProviderUtil","_","AccountController","caipAddress","address","caipNetwork","exchange","recipient","amount","RouterController","payUrlParams","sessionId","status","_b","eventType","css","__decorate","decorators","desc","c","r","d","i","W3mPayView","LitElement","val","newState","html","displayNetworkName","targetNetwork","net","walletName","ifDefined","_c","result","unsubscribe","styles","customElement","EXCHANGE_STATUS_CHECK_INTERVAL","W3mPayLoadingView","inProgress","borderRadiusMaster","ThemeController","radius","openPay","getPayResult","getPayError","getIsPaymentInProgress","baseETH","baseUSDC","baseSepoliaETH"],"mappings":"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