@voyage_ai/v402-web-ts 0.3.0 → 1.0.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.
@@ -103,17 +103,21 @@ __export(wallet_exports, {
103
103
  clearAllWalletAddresses: () => clearAllWalletAddresses,
104
104
  clearWalletDisconnection: () => clearWalletDisconnection,
105
105
  formatAddress: () => formatAddress,
106
+ getAllConnectedWalletIds: () => getAllConnectedWalletIds,
106
107
  getAllWalletAddresses: () => getAllWalletAddresses,
107
108
  getCachedWalletAddress: () => getCachedWalletAddress,
108
109
  getConnectedNetworkType: () => getConnectedNetworkType,
110
+ getConnectedWalletId: () => getConnectedWalletId,
109
111
  getWalletDisplayName: () => getWalletDisplayName,
110
112
  getWalletInstallUrl: () => getWalletInstallUrl,
111
113
  getWalletProvider: () => getWalletProvider,
112
114
  isWalletInstalled: () => isWalletInstalled,
113
115
  isWalletManuallyDisconnected: () => isWalletManuallyDisconnected,
114
116
  markWalletDisconnected: () => markWalletDisconnected,
117
+ removeConnectedWalletId: () => removeConnectedWalletId,
115
118
  removeWalletAddress: () => removeWalletAddress,
116
119
  saveConnectedNetworkType: () => saveConnectedNetworkType,
120
+ saveConnectedWalletId: () => saveConnectedWalletId,
117
121
  saveWalletAddress: () => saveWalletAddress
118
122
  });
119
123
  function isWalletInstalled(networkType) {
@@ -266,7 +270,39 @@ function clearAllWalletAddresses() {
266
270
  localStorage.removeItem(WALLET_ADDRESSES_KEY);
267
271
  }
268
272
  }
269
- var WALLET_DISCONNECTED_KEY, WALLET_DISCONNECTED_NETWORKS_KEY, CONNECTED_NETWORK_TYPE_KEY, WALLET_ADDRESSES_KEY;
273
+ function getAllConnectedWalletIds() {
274
+ if (typeof window === "undefined") {
275
+ return {};
276
+ }
277
+ try {
278
+ const cached = localStorage.getItem(CONNECTED_WALLET_IDS_KEY);
279
+ return cached ? JSON.parse(cached) : {};
280
+ } catch (error) {
281
+ console.error("Failed to parse connected wallet IDs:", error);
282
+ return {};
283
+ }
284
+ }
285
+ function saveConnectedWalletId(networkType, walletId) {
286
+ if (typeof window === "undefined") {
287
+ return;
288
+ }
289
+ const walletIds = getAllConnectedWalletIds();
290
+ walletIds[networkType] = walletId;
291
+ localStorage.setItem(CONNECTED_WALLET_IDS_KEY, JSON.stringify(walletIds));
292
+ }
293
+ function getConnectedWalletId(networkType) {
294
+ const walletIds = getAllConnectedWalletIds();
295
+ return walletIds[networkType] || null;
296
+ }
297
+ function removeConnectedWalletId(networkType) {
298
+ if (typeof window === "undefined") {
299
+ return;
300
+ }
301
+ const walletIds = getAllConnectedWalletIds();
302
+ delete walletIds[networkType];
303
+ localStorage.setItem(CONNECTED_WALLET_IDS_KEY, JSON.stringify(walletIds));
304
+ }
305
+ var WALLET_DISCONNECTED_KEY, WALLET_DISCONNECTED_NETWORKS_KEY, CONNECTED_NETWORK_TYPE_KEY, WALLET_ADDRESSES_KEY, CONNECTED_WALLET_IDS_KEY;
270
306
  var init_wallet = __esm({
271
307
  "src/utils/wallet.ts"() {
272
308
  "use strict";
@@ -274,18 +310,24 @@ var init_wallet = __esm({
274
310
  WALLET_DISCONNECTED_NETWORKS_KEY = "wallet_disconnected_networks";
275
311
  CONNECTED_NETWORK_TYPE_KEY = "connected_network_type";
276
312
  WALLET_ADDRESSES_KEY = "wallet_addresses_cache";
313
+ CONNECTED_WALLET_IDS_KEY = "connected_wallet_ids";
277
314
  }
278
315
  });
279
316
 
280
317
  // src/react/index.ts
281
318
  var index_exports = {};
282
319
  __export(index_exports, {
320
+ AnimationStyles: () => AnimationStyles,
321
+ Toast: () => Toast,
283
322
  V402Checkout: () => V402Checkout,
323
+ V402CheckoutV2: () => V402CheckoutV2,
284
324
  WalletConnect: () => WalletConnect,
285
325
  WalletSelectModal: () => WalletSelectModal,
326
+ checkoutAnimations: () => checkoutAnimations,
286
327
  usePageNetwork: () => usePageNetwork,
287
328
  usePayment: () => usePayment,
288
329
  usePaymentInfo: () => usePaymentInfo,
330
+ useToast: () => useToast,
289
331
  useWallet: () => useWallet
290
332
  });
291
333
  module.exports = __toCommonJS(index_exports);
@@ -301,13 +343,13 @@ init_wallet();
301
343
  init_wallet();
302
344
  async function connectWallet(networkType, forceSelect = false) {
303
345
  if (typeof window === "undefined") {
304
- throw new Error("\u8BF7\u5728\u6D4F\u89C8\u5668\u73AF\u5883\u4E2D\u4F7F\u7528");
346
+ throw new Error("Please use in browser environment");
305
347
  }
306
348
  let address;
307
349
  switch (networkType) {
308
350
  case "evm" /* EVM */: {
309
351
  if (!window.ethereum) {
310
- throw new Error("\u8BF7\u5B89\u88C5 MetaMask \u6216\u5176\u4ED6\u4EE5\u592A\u574A\u94B1\u5305");
352
+ throw new Error("Please install MetaMask or another Ethereum wallet");
311
353
  }
312
354
  const ethereum = window.ethereum;
313
355
  if (forceSelect) {
@@ -325,7 +367,7 @@ async function connectWallet(networkType, forceSelect = false) {
325
367
  }
326
368
  } catch (err) {
327
369
  if (err.code === 4001) {
328
- throw new Error("\u7528\u6237\u53D6\u6D88\u4E86\u94B1\u5305\u8FDE\u63A5");
370
+ throw new Error("User cancelled wallet connection");
329
371
  }
330
372
  console.warn("wallet_requestPermissions failed, falling back to eth_requestAccounts");
331
373
  }
@@ -335,7 +377,7 @@ async function connectWallet(networkType, forceSelect = false) {
335
377
  params: []
336
378
  });
337
379
  if (!accounts || accounts.length === 0) {
338
- throw new Error("\u672A\u80FD\u83B7\u53D6\u5230\u94B1\u5305\u5730\u5740");
380
+ throw new Error("Failed to get wallet address");
339
381
  }
340
382
  address = accounts[0];
341
383
  break;
@@ -349,7 +391,7 @@ async function connectWallet(networkType, forceSelect = false) {
349
391
  solana = solflare;
350
392
  }
351
393
  if (!solana) {
352
- throw new Error("\u8BF7\u5B89\u88C5 Phantom \u6216\u5176\u4ED6 Solana \u94B1\u5305");
394
+ throw new Error("Please install Phantom or another Solana wallet");
353
395
  }
354
396
  if (forceSelect) {
355
397
  try {
@@ -375,7 +417,7 @@ async function connectWallet(networkType, forceSelect = false) {
375
417
  break;
376
418
  }
377
419
  default:
378
- throw new Error("\u4E0D\u652F\u6301\u7684\u7F51\u7EDC\u7C7B\u578B");
420
+ throw new Error("Unsupported network type");
379
421
  }
380
422
  clearWalletDisconnection(networkType);
381
423
  saveConnectedNetworkType(networkType);
@@ -413,8 +455,8 @@ async function disconnectWallet(networkType, clearAll = false) {
413
455
  await disconnectAllSolanaWallets();
414
456
  break;
415
457
  }
416
- // EVM 钱包(如 MetaMask)没有真正的 disconnect API
417
- // 只清除本地状态,下次连接时会重新请求权限
458
+ // EVM wallets (like MetaMask) don't have a real disconnect API
459
+ // Only clear local state, will request permissions again on next connection
418
460
  case "evm" /* EVM */:
419
461
  default:
420
462
  break;
@@ -445,36 +487,32 @@ async function getCurrentWallet(networkType) {
445
487
  return null;
446
488
  }
447
489
  const cachedAddress = getCachedWalletAddress(type);
448
- try {
449
- let currentAddress = null;
450
- switch (type) {
451
- case "evm" /* EVM */: {
452
- if (!window.ethereum) return cachedAddress;
490
+ if (type === "evm" /* EVM */) {
491
+ if (cachedAddress) {
492
+ return cachedAddress;
493
+ }
494
+ if (window.ethereum) {
495
+ try {
453
496
  const accounts = await window.ethereum.request({
454
497
  method: "eth_accounts",
455
498
  params: []
456
499
  });
457
- currentAddress = accounts && accounts.length > 0 ? accounts[0] : null;
458
- break;
459
- }
460
- case "solana" /* SOLANA */:
461
- case "svm" /* SVM */: {
462
- const solana = window.solana;
463
- if (!solana || !solana.isConnected) return cachedAddress;
464
- currentAddress = solana.publicKey?.toString() || null;
465
- break;
500
+ return accounts && accounts.length > 0 ? accounts[0] : null;
501
+ } catch (error) {
502
+ console.error("Failed to get EVM accounts:", error);
503
+ return null;
466
504
  }
467
- default:
468
- return cachedAddress;
469
505
  }
470
- if (currentAddress && currentAddress !== cachedAddress) {
471
- saveWalletAddress(type, currentAddress);
506
+ return null;
507
+ }
508
+ if (type === "solana" /* SOLANA */ || type === "svm" /* SVM */) {
509
+ const solana = window.solana;
510
+ if (!solana || !solana.isConnected) {
511
+ return cachedAddress;
472
512
  }
473
- return currentAddress || cachedAddress;
474
- } catch (error) {
475
- console.error("Failed to get current wallet:", error);
476
- return cachedAddress;
513
+ return solana.publicKey?.toString() || cachedAddress;
477
514
  }
515
+ return cachedAddress;
478
516
  }
479
517
  function onAccountsChanged(callback) {
480
518
  if (typeof window === "undefined" || !window.ethereum) {
@@ -538,6 +576,7 @@ async function switchNetwork(networkType) {
538
576
  }
539
577
 
540
578
  // src/utils/wallet-discovery.ts
579
+ init_wallet();
541
580
  var SOLANA_WALLETS = [
542
581
  {
543
582
  id: "phantom",
@@ -683,22 +722,26 @@ function getWalletsForNetwork(networkType) {
683
722
  return [];
684
723
  }
685
724
  }
725
+ function getWalletByName(name, networkType) {
726
+ const wallets = getWalletsForNetwork(networkType);
727
+ return wallets.find((w) => w.name === name) || null;
728
+ }
686
729
  async function connectEVMWallet(wallet) {
687
730
  if (!wallet.provider) {
688
- throw new Error(`\u94B1\u5305 ${wallet.name} \u4E0D\u53EF\u7528`);
731
+ throw new Error(`Wallet ${wallet.name} is not available`);
689
732
  }
690
733
  const accounts = await wallet.provider.request({
691
734
  method: "eth_requestAccounts",
692
735
  params: []
693
736
  });
694
737
  if (!accounts || accounts.length === 0) {
695
- throw new Error("\u672A\u80FD\u83B7\u53D6\u5230\u94B1\u5305\u5730\u5740");
738
+ throw new Error("Failed to get wallet address");
696
739
  }
697
740
  return accounts[0];
698
741
  }
699
742
  async function connectSolanaWallet(wallet) {
700
743
  if (!wallet.provider) {
701
- throw new Error(`\u94B1\u5305 ${wallet.name} \u4E0D\u53EF\u7528`);
744
+ throw new Error(`Wallet ${wallet.name} is not available`);
702
745
  }
703
746
  if (wallet.provider.isConnected) {
704
747
  try {
@@ -721,21 +764,41 @@ async function connectToWallet(wallet) {
721
764
  address = await connectSolanaWallet(wallet);
722
765
  break;
723
766
  default:
724
- throw new Error("\u4E0D\u652F\u6301\u7684\u7F51\u7EDC\u7C7B\u578B");
767
+ throw new Error("Unsupported network type");
725
768
  }
726
769
  currentConnectedWallet = wallet;
770
+ saveConnectedWalletId(wallet.networkType, wallet.name);
727
771
  return address;
728
772
  }
729
773
  function setCurrentConnectedWallet(wallet) {
730
774
  currentConnectedWallet = wallet;
731
775
  }
732
- function clearConnectedWallet() {
776
+ function clearConnectedWallet(networkType) {
777
+ if (networkType) {
778
+ removeConnectedWalletId(networkType);
779
+ }
733
780
  currentConnectedWallet = null;
734
781
  }
782
+ function restoreConnectedWallet(networkType) {
783
+ const savedWalletName = getConnectedWalletId(networkType);
784
+ if (!savedWalletName) return null;
785
+ const wallet = getWalletByName(savedWalletName, networkType);
786
+ if (wallet) {
787
+ currentConnectedWallet = wallet;
788
+ console.log(`\u2705 Restored wallet provider: ${wallet.name}`);
789
+ return wallet;
790
+ }
791
+ console.warn(`\u26A0\uFE0F Could not find wallet with name: ${savedWalletName}`);
792
+ return null;
793
+ }
735
794
  function getWalletProviderForPayment(networkType) {
736
795
  if (currentConnectedWallet && currentConnectedWallet.networkType === networkType) {
737
796
  return currentConnectedWallet.provider;
738
797
  }
798
+ const restoredWallet = restoreConnectedWallet(networkType);
799
+ if (restoredWallet) {
800
+ return restoredWallet.provider;
801
+ }
739
802
  if (typeof window === "undefined") return null;
740
803
  switch (networkType) {
741
804
  case "evm" /* EVM */:
@@ -1229,7 +1292,7 @@ function getSupportedNetworkTypes(paymentRequirements) {
1229
1292
  });
1230
1293
  return Array.from(networkTypes);
1231
1294
  }
1232
- async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, additionalParams) {
1295
+ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, additionalParams, expectedAddress) {
1233
1296
  const fullEndpoint = `${endpoint}/${merchantId}`;
1234
1297
  let response;
1235
1298
  const requestInit = additionalParams && Object.keys(additionalParams).length > 0 ? {
@@ -1241,11 +1304,19 @@ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, ad
1241
1304
  if (networkType === "solana" /* SOLANA */ || networkType === "svm" /* SVM */) {
1242
1305
  const solana = getWalletProviderForPayment(networkType);
1243
1306
  if (!solana) {
1244
- throw new Error("\u8BF7\u5148\u8FDE\u63A5 Solana \u94B1\u5305");
1307
+ throw new Error("Please connect your Solana wallet first.");
1245
1308
  }
1246
1309
  if (!solana.isConnected) {
1247
1310
  await solana.connect();
1248
1311
  }
1312
+ if (expectedAddress && solana.publicKey) {
1313
+ const currentAddress = solana.publicKey.toString();
1314
+ if (currentAddress !== expectedAddress) {
1315
+ throw new Error(
1316
+ `Wallet account mismatch: the current wallet account is ${currentAddress.slice(0, 8)}...\uFF0CBut the desired account is ${expectedAddress.slice(0, 8)}.... Please switch to the correct account in your wallet.`
1317
+ );
1318
+ }
1319
+ }
1249
1320
  response = await handleSvmPayment(fullEndpoint, {
1250
1321
  wallet: solana,
1251
1322
  network: "solana"
@@ -1254,12 +1325,18 @@ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, ad
1254
1325
  } else if (networkType === "evm" /* EVM */) {
1255
1326
  const ethereum = getWalletProviderForPayment(networkType);
1256
1327
  if (!ethereum) {
1257
- throw new Error("\u8BF7\u5148\u8FDE\u63A5 EVM \u94B1\u5305");
1328
+ throw new Error("Please connect the EVM wallet first");
1258
1329
  }
1259
1330
  const provider = new import_ethers2.ethers.BrowserProvider(ethereum);
1260
1331
  const signer = await provider.getSigner();
1332
+ const currentAddress = await signer.getAddress();
1333
+ if (expectedAddress && currentAddress.toLowerCase() !== expectedAddress.toLowerCase()) {
1334
+ throw new Error(
1335
+ `Wallet account mismatch: the current wallet account is ${currentAddress.slice(0, 8)}...\uFF0CBut the desired account is ${expectedAddress.slice(0, 8)}.... Please switch to the correct account in your wallet.`
1336
+ );
1337
+ }
1261
1338
  const wallet = {
1262
- address: await signer.getAddress(),
1339
+ address: currentAddress,
1263
1340
  signTypedData: async (domain, types, message2) => {
1264
1341
  return await signer.signTypedData(domain, types, message2);
1265
1342
  },
@@ -1282,7 +1359,7 @@ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, ad
1282
1359
  // Will use backend's network configuration
1283
1360
  }, requestInit);
1284
1361
  } else {
1285
- throw new Error(`\u4E0D\u652F\u6301\u7684\u7F51\u7EDC\u7C7B\u578B: ${networkType}`);
1362
+ throw new Error(`Unsupported network types: ${networkType}`);
1286
1363
  }
1287
1364
  return response;
1288
1365
  }
@@ -1625,7 +1702,7 @@ var WalletStore = class {
1625
1702
  // Disconnect wallet
1626
1703
  async disconnect() {
1627
1704
  const currentNetwork = this.state.networkType;
1628
- clearConnectedWallet();
1705
+ clearConnectedWallet(currentNetwork || void 0);
1629
1706
  if (currentNetwork) {
1630
1707
  try {
1631
1708
  await disconnectWallet(currentNetwork);
@@ -1784,12 +1861,83 @@ function usePaymentInfo(merchantId, endpoint = PROD_BACK_URL, additionalParams)
1784
1861
  };
1785
1862
  }
1786
1863
 
1787
- // src/react/components/WalletConnect.tsx
1864
+ // src/react/hooks/useToast.tsx
1788
1865
  var import_react6 = __toESM(require("react"));
1789
1866
 
1790
- // src/react/components/WalletSelectModal.tsx
1867
+ // src/react/components/ui/Toast.tsx
1791
1868
  var import_react5 = __toESM(require("react"));
1792
1869
  var import_react_dom = require("react-dom");
1870
+ var Toast = ({ message: message2, type, onClose }) => {
1871
+ (0, import_react5.useEffect)(() => {
1872
+ const timer = setTimeout(onClose, 3e3);
1873
+ return () => clearTimeout(timer);
1874
+ }, [onClose]);
1875
+ const bgColor = type === "success" ? "#22c55e" : type === "error" ? "#ef4444" : "#3b82f6";
1876
+ const icon = type === "success" ? "\u2713" : type === "error" ? "\u2717" : "\u2139";
1877
+ return (0, import_react_dom.createPortal)(
1878
+ /* @__PURE__ */ import_react5.default.createElement(
1879
+ "div",
1880
+ {
1881
+ className: "fixed top-4 right-4 z-[99999] animate-slide-in-right",
1882
+ style: {
1883
+ animation: "slideInRight 0.3s ease-out"
1884
+ }
1885
+ },
1886
+ /* @__PURE__ */ import_react5.default.createElement(
1887
+ "div",
1888
+ {
1889
+ className: "flex items-center gap-3 px-4 py-3 rounded-lg shadow-lg text-white font-mono text-sm",
1890
+ style: { backgroundColor: bgColor, minWidth: "280px" }
1891
+ },
1892
+ /* @__PURE__ */ import_react5.default.createElement("span", { className: "text-lg" }, icon),
1893
+ /* @__PURE__ */ import_react5.default.createElement("span", { className: "flex-1" }, message2),
1894
+ /* @__PURE__ */ import_react5.default.createElement(
1895
+ "button",
1896
+ {
1897
+ onClick: onClose,
1898
+ className: "text-white/80 hover:text-white transition-colors"
1899
+ },
1900
+ "\xD7"
1901
+ )
1902
+ )
1903
+ ),
1904
+ document.body
1905
+ );
1906
+ };
1907
+
1908
+ // src/react/hooks/useToast.tsx
1909
+ var useToast = () => {
1910
+ const [toasts, setToasts] = (0, import_react6.useState)([]);
1911
+ const toastIdRef = (0, import_react6.useRef)(0);
1912
+ const showToast = (0, import_react6.useCallback)((message2, type) => {
1913
+ const id = ++toastIdRef.current;
1914
+ setToasts((prev) => [...prev, { id, message: message2, type }]);
1915
+ }, []);
1916
+ const removeToast = (0, import_react6.useCallback)((id) => {
1917
+ setToasts((prev) => prev.filter((t) => t.id !== id));
1918
+ }, []);
1919
+ const ToastContainer = () => /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, toasts.map((toast, index) => /* @__PURE__ */ import_react6.default.createElement(
1920
+ "div",
1921
+ {
1922
+ key: toast.id,
1923
+ style: { top: `${16 + index * 60}px` },
1924
+ className: "fixed right-4 z-[99999]"
1925
+ },
1926
+ import_react6.default.createElement(Toast, {
1927
+ message: toast.message,
1928
+ type: toast.type,
1929
+ onClose: () => removeToast(toast.id)
1930
+ })
1931
+ )));
1932
+ return { showToast, ToastContainer };
1933
+ };
1934
+
1935
+ // src/react/components/wallet/WalletConnect.tsx
1936
+ var import_react8 = __toESM(require("react"));
1937
+
1938
+ // src/react/components/wallet/WalletSelectModal.tsx
1939
+ var import_react7 = __toESM(require("react"));
1940
+ var import_react_dom2 = require("react-dom");
1793
1941
  var overlayStyle = {
1794
1942
  position: "fixed",
1795
1943
  top: 0,
@@ -1927,8 +2075,8 @@ function WalletItem({
1927
2075
  onSelect,
1928
2076
  onHover
1929
2077
  }) {
1930
- const [iconError, setIconError] = (0, import_react5.useState)(false);
1931
- return /* @__PURE__ */ import_react5.default.createElement(
2078
+ const [iconError, setIconError] = (0, import_react7.useState)(false);
2079
+ return /* @__PURE__ */ import_react7.default.createElement(
1932
2080
  "div",
1933
2081
  {
1934
2082
  style: getWalletItemStyle(isHovered),
@@ -1936,7 +2084,7 @@ function WalletItem({
1936
2084
  onMouseEnter: () => onHover(true),
1937
2085
  onMouseLeave: () => onHover(false)
1938
2086
  },
1939
- wallet.icon && !iconError ? /* @__PURE__ */ import_react5.default.createElement(
2087
+ wallet.icon && !iconError ? /* @__PURE__ */ import_react7.default.createElement(
1940
2088
  "img",
1941
2089
  {
1942
2090
  src: wallet.icon,
@@ -1944,8 +2092,8 @@ function WalletItem({
1944
2092
  style: walletIconStyle,
1945
2093
  onError: () => setIconError(true)
1946
2094
  }
1947
- ) : /* @__PURE__ */ import_react5.default.createElement("div", { style: getWalletIconPlaceholderStyle(wallet.name) }, wallet.name.charAt(0).toUpperCase()),
1948
- /* @__PURE__ */ import_react5.default.createElement("span", { style: walletNameStyle }, wallet.name)
2095
+ ) : /* @__PURE__ */ import_react7.default.createElement("div", { style: getWalletIconPlaceholderStyle(wallet.name) }, wallet.name.charAt(0).toUpperCase()),
2096
+ /* @__PURE__ */ import_react7.default.createElement("span", { style: walletNameStyle }, wallet.name)
1949
2097
  );
1950
2098
  }
1951
2099
  function WalletSelectModal({
@@ -1954,14 +2102,14 @@ function WalletSelectModal({
1954
2102
  onSelect,
1955
2103
  onClose
1956
2104
  }) {
1957
- const [wallets, setWallets] = (0, import_react5.useState)([]);
1958
- const [hoveredWallet, setHoveredWallet] = (0, import_react5.useState)(null);
1959
- const [mounted, setMounted] = (0, import_react5.useState)(false);
1960
- (0, import_react5.useEffect)(() => {
2105
+ const [wallets, setWallets] = (0, import_react7.useState)([]);
2106
+ const [hoveredWallet, setHoveredWallet] = (0, import_react7.useState)(null);
2107
+ const [mounted, setMounted] = (0, import_react7.useState)(false);
2108
+ (0, import_react7.useEffect)(() => {
1961
2109
  setMounted(true);
1962
2110
  return () => setMounted(false);
1963
2111
  }, []);
1964
- (0, import_react5.useEffect)(() => {
2112
+ (0, import_react7.useEffect)(() => {
1965
2113
  if (!isOpen) return;
1966
2114
  initEVMWalletDiscovery();
1967
2115
  const updateWallets = () => {
@@ -1982,7 +2130,7 @@ function WalletSelectModal({
1982
2130
  }
1983
2131
  };
1984
2132
  const networkName = getNetworkDisplayName(networkType);
1985
- const modalContent = /* @__PURE__ */ import_react5.default.createElement("div", { style: overlayStyle, onClick: handleOverlayClick }, /* @__PURE__ */ import_react5.default.createElement("div", { style: modalStyle }, /* @__PURE__ */ import_react5.default.createElement("div", { style: headerStyle }, /* @__PURE__ */ import_react5.default.createElement("h3", { style: titleStyle }, "Select Wallet"), /* @__PURE__ */ import_react5.default.createElement("button", { style: closeButtonStyle, onClick: onClose }, "\xD7")), /* @__PURE__ */ import_react5.default.createElement("p", { style: subtitleStyle }, "Connect a ", networkName, " wallet"), wallets.length > 0 ? /* @__PURE__ */ import_react5.default.createElement("div", { style: walletListStyle }, wallets.map((wallet) => /* @__PURE__ */ import_react5.default.createElement(
2133
+ const modalContent = /* @__PURE__ */ import_react7.default.createElement("div", { style: overlayStyle, onClick: handleOverlayClick }, /* @__PURE__ */ import_react7.default.createElement("div", { style: modalStyle }, /* @__PURE__ */ import_react7.default.createElement("div", { style: headerStyle }, /* @__PURE__ */ import_react7.default.createElement("h3", { style: titleStyle }, "Select Wallet"), /* @__PURE__ */ import_react7.default.createElement("button", { style: closeButtonStyle, onClick: onClose }, "\xD7")), /* @__PURE__ */ import_react7.default.createElement("p", { style: subtitleStyle }, "Connect a ", networkName, " wallet"), wallets.length > 0 ? /* @__PURE__ */ import_react7.default.createElement("div", { style: walletListStyle }, wallets.map((wallet) => /* @__PURE__ */ import_react7.default.createElement(
1986
2134
  WalletItem,
1987
2135
  {
1988
2136
  key: wallet.id,
@@ -1991,9 +2139,9 @@ function WalletSelectModal({
1991
2139
  onSelect: () => onSelect(wallet),
1992
2140
  onHover: (hovered) => setHoveredWallet(hovered ? wallet.id : null)
1993
2141
  }
1994
- ))) : /* @__PURE__ */ import_react5.default.createElement("div", { style: emptyStateStyle }, /* @__PURE__ */ import_react5.default.createElement("p", { style: emptyTitleStyle }, "No wallets found"), /* @__PURE__ */ import_react5.default.createElement("p", { style: emptyDescStyle }, "Please install a ", networkName, " wallet extension."))));
2142
+ ))) : /* @__PURE__ */ import_react7.default.createElement("div", { style: emptyStateStyle }, /* @__PURE__ */ import_react7.default.createElement("p", { style: emptyTitleStyle }, "No wallets found"), /* @__PURE__ */ import_react7.default.createElement("p", { style: emptyDescStyle }, "Please install a ", networkName, " wallet extension."))));
1995
2143
  if (typeof document !== "undefined") {
1996
- return (0, import_react_dom.createPortal)(modalContent, document.body);
2144
+ return (0, import_react_dom2.createPortal)(modalContent, document.body);
1997
2145
  }
1998
2146
  return modalContent;
1999
2147
  }
@@ -2165,7 +2313,7 @@ var getErrorStyle = () => {
2165
2313
  };
2166
2314
  };
2167
2315
 
2168
- // src/react/components/WalletConnect.tsx
2316
+ // src/react/components/wallet/WalletConnect.tsx
2169
2317
  function WalletConnect({
2170
2318
  supportedNetworks = ["solana" /* SOLANA */, "evm" /* EVM */],
2171
2319
  className = "",
@@ -2174,9 +2322,9 @@ function WalletConnect({
2174
2322
  showSwitchWallet = true
2175
2323
  }) {
2176
2324
  const { address, networkType, isConnecting, error, connectWithWallet, disconnect } = useWallet();
2177
- const [hoveredButton, setHoveredButton] = (0, import_react6.useState)(null);
2178
- const [walletSelectOpen, setWalletSelectOpen] = (0, import_react6.useState)(false);
2179
- const [selectedNetworkType, setSelectedNetworkType] = (0, import_react6.useState)(null);
2325
+ const [hoveredButton, setHoveredButton] = (0, import_react8.useState)(null);
2326
+ const [walletSelectOpen, setWalletSelectOpen] = (0, import_react8.useState)(false);
2327
+ const [selectedNetworkType, setSelectedNetworkType] = (0, import_react8.useState)(null);
2180
2328
  const handleOpenWalletSelect = (network) => {
2181
2329
  setSelectedNetworkType(network);
2182
2330
  setWalletSelectOpen(true);
@@ -2198,7 +2346,7 @@ function WalletConnect({
2198
2346
  setWalletSelectOpen(true);
2199
2347
  }
2200
2348
  };
2201
- return /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, /* @__PURE__ */ import_react6.default.createElement("div", { style: { ...containerStyle, ...className ? {} : {} }, className }, !address ? /* @__PURE__ */ import_react6.default.createElement("div", { style: getSectionStyle() }, /* @__PURE__ */ import_react6.default.createElement("h3", { style: getTitleStyle() }, "Connect Wallet"), supportedNetworks.length === 0 ? /* @__PURE__ */ import_react6.default.createElement("p", { style: getHintStyle() }, "Please install a supported wallet extension") : /* @__PURE__ */ import_react6.default.createElement("div", { style: buttonsContainerStyle }, supportedNetworks.map((network) => /* @__PURE__ */ import_react6.default.createElement("div", { key: network, style: walletOptionStyle }, /* @__PURE__ */ import_react6.default.createElement(
2349
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement("div", { style: { ...containerStyle, ...className ? {} : {} }, className }, !address ? /* @__PURE__ */ import_react8.default.createElement("div", { style: getSectionStyle() }, /* @__PURE__ */ import_react8.default.createElement("h3", { style: getTitleStyle() }, "Connect Wallet"), supportedNetworks.length === 0 ? /* @__PURE__ */ import_react8.default.createElement("p", { style: getHintStyle() }, "Please install a supported wallet extension") : /* @__PURE__ */ import_react8.default.createElement("div", { style: buttonsContainerStyle }, supportedNetworks.map((network) => /* @__PURE__ */ import_react8.default.createElement("div", { key: network, style: walletOptionStyle }, /* @__PURE__ */ import_react8.default.createElement(
2202
2350
  "button",
2203
2351
  {
2204
2352
  style: getConnectButtonStyle(isConnecting, hoveredButton === network),
@@ -2208,7 +2356,7 @@ function WalletConnect({
2208
2356
  onMouseLeave: () => setHoveredButton(null)
2209
2357
  },
2210
2358
  isConnecting ? "Connecting..." : getNetworkDisplayName(network)
2211
- )))), error && /* @__PURE__ */ import_react6.default.createElement("p", { style: getErrorStyle() }, error), /* @__PURE__ */ import_react6.default.createElement("p", { style: getHintStyle() }, "Select a network to see available wallets")) : /* @__PURE__ */ import_react6.default.createElement("div", { style: getSectionStyle() }, /* @__PURE__ */ import_react6.default.createElement("div", { style: walletAddressStyle }, /* @__PURE__ */ import_react6.default.createElement("span", { style: getLabelStyle() }, "Connected ", networkType && `(${getNetworkDisplayName(networkType)})`), /* @__PURE__ */ import_react6.default.createElement("span", { style: getAddressStyle() }, formatAddress(address))), /* @__PURE__ */ import_react6.default.createElement("div", { style: walletActionsStyle }, showSwitchWallet && /* @__PURE__ */ import_react6.default.createElement(
2359
+ )))), error && /* @__PURE__ */ import_react8.default.createElement("p", { style: getErrorStyle() }, error), /* @__PURE__ */ import_react8.default.createElement("p", { style: getHintStyle() }, "Select a network to see available wallets")) : /* @__PURE__ */ import_react8.default.createElement("div", { style: getSectionStyle() }, /* @__PURE__ */ import_react8.default.createElement("div", { style: walletAddressStyle }, /* @__PURE__ */ import_react8.default.createElement("span", { style: getLabelStyle() }, "Connected ", networkType && `(${getNetworkDisplayName(networkType)})`), /* @__PURE__ */ import_react8.default.createElement("span", { style: getAddressStyle() }, formatAddress(address))), /* @__PURE__ */ import_react8.default.createElement("div", { style: walletActionsStyle }, showSwitchWallet && /* @__PURE__ */ import_react8.default.createElement(
2212
2360
  "button",
2213
2361
  {
2214
2362
  style: getConnectButtonStyle(isConnecting, hoveredButton === "switch"),
@@ -2218,7 +2366,7 @@ function WalletConnect({
2218
2366
  onMouseLeave: () => setHoveredButton(null)
2219
2367
  },
2220
2368
  isConnecting ? "Switching..." : "Switch Wallet"
2221
- ), /* @__PURE__ */ import_react6.default.createElement(
2369
+ ), /* @__PURE__ */ import_react8.default.createElement(
2222
2370
  "button",
2223
2371
  {
2224
2372
  style: getDisconnectButtonStyle(hoveredButton === "disconnect"),
@@ -2227,7 +2375,7 @@ function WalletConnect({
2227
2375
  onMouseLeave: () => setHoveredButton(null)
2228
2376
  },
2229
2377
  "Disconnect"
2230
- )), /* @__PURE__ */ import_react6.default.createElement("p", { style: getHintStyle() }, 'Click "Switch Wallet" to change wallet or account'))), selectedNetworkType && /* @__PURE__ */ import_react6.default.createElement(
2378
+ )), /* @__PURE__ */ import_react8.default.createElement("p", { style: getHintStyle() }, 'Click "Switch Wallet" to change wallet or account'))), selectedNetworkType && /* @__PURE__ */ import_react8.default.createElement(
2231
2379
  WalletSelectModal,
2232
2380
  {
2233
2381
  isOpen: walletSelectOpen,
@@ -2238,16 +2386,16 @@ function WalletConnect({
2238
2386
  ));
2239
2387
  }
2240
2388
 
2241
- // src/react/components/V402Checkout.tsx
2242
- var import_react8 = __toESM(require("react"));
2389
+ // src/react/components/checkout/V402Checkout.tsx
2390
+ var import_react10 = __toESM(require("react"));
2243
2391
  var import_antd = require("antd");
2244
2392
  var import_icons = require("@ant-design/icons");
2245
2393
  init_common();
2246
2394
 
2247
2395
  // src/react/utils/CryptoIcons.tsx
2248
- var import_react7 = __toESM(require("react"));
2396
+ var import_react9 = __toESM(require("react"));
2249
2397
  var SolanaIcon = ({ width = 16, height = 16, className, style }) => {
2250
- return /* @__PURE__ */ import_react7.default.createElement(
2398
+ return /* @__PURE__ */ import_react9.default.createElement(
2251
2399
  "svg",
2252
2400
  {
2253
2401
  xmlns: "http://www.w3.org/2000/svg",
@@ -2257,14 +2405,14 @@ var SolanaIcon = ({ width = 16, height = 16, className, style }) => {
2257
2405
  className,
2258
2406
  style
2259
2407
  },
2260
- /* @__PURE__ */ import_react7.default.createElement("desc", null, "Solana SOL Fill Streamline Icon: https://streamlinehq.com"),
2261
- /* @__PURE__ */ import_react7.default.createElement("g", { fill: "none", fillRule: "evenodd" }, /* @__PURE__ */ import_react7.default.createElement(
2408
+ /* @__PURE__ */ import_react9.default.createElement("desc", null, "Solana SOL Fill Streamline Icon: https://streamlinehq.com"),
2409
+ /* @__PURE__ */ import_react9.default.createElement("g", { fill: "none", fillRule: "evenodd" }, /* @__PURE__ */ import_react9.default.createElement(
2262
2410
  "path",
2263
2411
  {
2264
2412
  d: "M16 0v16H0V0h16ZM8.395333333333333 15.505333333333333l-0.007333333333333332 0.0013333333333333333 -0.047333333333333324 0.023333333333333334 -0.013333333333333332 0.0026666666666666666 -0.009333333333333332 -0.0026666666666666666 -0.047333333333333324 -0.023333333333333334c-0.006666666666666666 -0.0026666666666666666 -0.012666666666666666 -0.0006666666666666666 -0.016 0.003333333333333333l-0.0026666666666666666 0.006666666666666666 -0.011333333333333334 0.2853333333333333 0.003333333333333333 0.013333333333333332 0.006666666666666666 0.008666666666666666 0.06933333333333333 0.049333333333333326 0.009999999999999998 0.0026666666666666666 0.008 -0.0026666666666666666 0.06933333333333333 -0.049333333333333326 0.008 -0.010666666666666666 0.0026666666666666666 -0.011333333333333334 -0.011333333333333334 -0.2846666666666666c-0.0013333333333333333 -0.006666666666666666 -0.005999999999999999 -0.011333333333333334 -0.011333333333333334 -0.011999999999999999Zm0.17666666666666667 -0.07533333333333334 -0.008666666666666666 0.0013333333333333333 -0.12333333333333332 0.062 -0.006666666666666666 0.006666666666666666 -0.002 0.007333333333333332 0.011999999999999999 0.2866666666666666 0.003333333333333333 0.008 0.005333333333333333 0.004666666666666666 0.134 0.062c0.008 0.0026666666666666666 0.015333333333333332 0 0.019333333333333334 -0.005333333333333333l0.0026666666666666666 -0.009333333333333332 -0.02266666666666667 -0.4093333333333333c-0.002 -0.008 -0.006666666666666666 -0.013333333333333332 -0.013333333333333332 -0.014666666666666665Zm-0.4766666666666666 0.0013333333333333333a0.015333333333333332 0.015333333333333332 0 0 0 -0.018 0.004l-0.004 0.009333333333333332 -0.02266666666666667 0.4093333333333333c0 0.008 0.004666666666666666 0.013333333333333332 0.011333333333333334 0.016l0.009999999999999998 -0.0013333333333333333 0.134 -0.062 0.006666666666666666 -0.005333333333333333 0.0026666666666666666 -0.007333333333333332 0.011333333333333334 -0.2866666666666666 -0.002 -0.008 -0.006666666666666666 -0.006666666666666666 -0.12266666666666666 -0.06133333333333333Z",
2265
2413
  strokeWidth: "0.6667"
2266
2414
  }
2267
- ), /* @__PURE__ */ import_react7.default.createElement(
2415
+ ), /* @__PURE__ */ import_react9.default.createElement(
2268
2416
  "path",
2269
2417
  {
2270
2418
  fill: "#000000",
@@ -2275,7 +2423,7 @@ var SolanaIcon = ({ width = 16, height = 16, className, style }) => {
2275
2423
  );
2276
2424
  };
2277
2425
  var BaseIcon = ({ width = 24, height = 24, className, style }) => {
2278
- return /* @__PURE__ */ import_react7.default.createElement(
2426
+ return /* @__PURE__ */ import_react9.default.createElement(
2279
2427
  "svg",
2280
2428
  {
2281
2429
  xmlns: "http://www.w3.org/2000/svg",
@@ -2289,8 +2437,8 @@ var BaseIcon = ({ width = 24, height = 24, className, style }) => {
2289
2437
  className,
2290
2438
  style
2291
2439
  },
2292
- /* @__PURE__ */ import_react7.default.createElement("desc", null, "Brand Coinbase Streamline Icon: https://streamlinehq.com"),
2293
- /* @__PURE__ */ import_react7.default.createElement(
2440
+ /* @__PURE__ */ import_react9.default.createElement("desc", null, "Brand Coinbase Streamline Icon: https://streamlinehq.com"),
2441
+ /* @__PURE__ */ import_react9.default.createElement(
2294
2442
  "path",
2295
2443
  {
2296
2444
  d: "M12.95 22c-4.503 0 -8.445 -3.04 -9.61 -7.413 -1.165 -4.373 0.737 -8.988 4.638 -11.25a9.906 9.906 0 0 1 12.008 1.598l-3.335 3.367a5.185 5.185 0 0 0 -7.354 0.013 5.252 5.252 0 0 0 0 7.393 5.185 5.185 0 0 0 7.354 0.013L20 19.088A9.887 9.887 0 0 1 12.95 22z",
@@ -2310,7 +2458,7 @@ var getNetworkIcon = (network) => {
2310
2458
  return BaseIcon;
2311
2459
  };
2312
2460
 
2313
- // src/react/components/V402Checkout.tsx
2461
+ // src/react/components/checkout/V402Checkout.tsx
2314
2462
  var { Title, Text } = import_antd.Typography;
2315
2463
  var notify = {
2316
2464
  success: (title, msg) => {
@@ -2348,14 +2496,14 @@ function V402Checkout({
2348
2496
  { autoSwitch: !!targetNetwork, switchOnMount: true }
2349
2497
  );
2350
2498
  const { isProcessing, setIsProcessing, result, setResult, error, setError } = usePayment();
2351
- const [paymentDetails, setPaymentDetails] = (0, import_react8.useState)(null);
2499
+ const [paymentDetails, setPaymentDetails] = (0, import_react10.useState)(null);
2352
2500
  const handleDisconnect = () => {
2353
2501
  disconnect();
2354
2502
  setResult(null);
2355
2503
  setError(null);
2356
2504
  notify.info("Wallet Disconnected", "Your wallet has been disconnected successfully.");
2357
2505
  };
2358
- (0, import_react8.useEffect)(() => {
2506
+ (0, import_react10.useEffect)(() => {
2359
2507
  if (paymentInfo && paymentInfo.length > 0) {
2360
2508
  const firstPayment = paymentInfo[0];
2361
2509
  const rawAmount = firstPayment.maxAmountRequired?.toString() || "0";
@@ -2370,7 +2518,7 @@ function V402Checkout({
2370
2518
  });
2371
2519
  }
2372
2520
  }, [paymentInfo]);
2373
- (0, import_react8.useEffect)(() => {
2521
+ (0, import_react10.useEffect)(() => {
2374
2522
  if (targetNetwork && !fetchingPaymentInfo && ensureNetwork) {
2375
2523
  ensureNetwork(targetNetwork).catch((err) => {
2376
2524
  console.error("Failed to ensure network:", err);
@@ -2386,7 +2534,7 @@ function V402Checkout({
2386
2534
  setError(null);
2387
2535
  setIsProcessing(true);
2388
2536
  try {
2389
- const response = await makePayment(networkType, checkoutId, endpoint, additionalParams);
2537
+ const response = await makePayment(networkType, checkoutId, endpoint, additionalParams, address || void 0);
2390
2538
  const data = await response.json();
2391
2539
  setResult(data);
2392
2540
  notify.success("Payment Successful!", "Your payment has been processed successfully.");
@@ -2410,12 +2558,12 @@ function V402Checkout({
2410
2558
  const networkColor = paymentDetails ? getNetworkColor(paymentDetails.network) : "#8c8c8c";
2411
2559
  const loadingColor = "#8c8c8c";
2412
2560
  const hasInvalidCheckoutId = !fetchingPaymentInfo && (!paymentInfo || paymentInfo.length === 0);
2413
- return /* @__PURE__ */ import_react8.default.createElement(
2561
+ return /* @__PURE__ */ import_react10.default.createElement(
2414
2562
  "div",
2415
2563
  {
2416
2564
  className: isModal ? "bg-white" : "h-screen bg-white flex items-center justify-center p-4 overflow-hidden"
2417
2565
  },
2418
- /* @__PURE__ */ import_react8.default.createElement(
2566
+ /* @__PURE__ */ import_react10.default.createElement(
2419
2567
  "div",
2420
2568
  {
2421
2569
  className: "flex gap-4 items-center justify-center",
@@ -2425,7 +2573,7 @@ function V402Checkout({
2425
2573
  width: "100%"
2426
2574
  }
2427
2575
  },
2428
- /* @__PURE__ */ import_react8.default.createElement(
2576
+ /* @__PURE__ */ import_react10.default.createElement(
2429
2577
  import_antd.Card,
2430
2578
  {
2431
2579
  className: "flex-shrink-0",
@@ -2441,7 +2589,7 @@ function V402Checkout({
2441
2589
  },
2442
2590
  styles: { body: { padding: isModal ? "0px" : "32px 24px" } }
2443
2591
  },
2444
- /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center gap-3 mb-4" }, /* @__PURE__ */ import_react8.default.createElement(
2592
+ /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex items-center gap-3 mb-4" }, /* @__PURE__ */ import_react10.default.createElement(
2445
2593
  "div",
2446
2594
  {
2447
2595
  className: "w-12 h-12 rounded-xl flex items-center justify-center",
@@ -2450,22 +2598,22 @@ function V402Checkout({
2450
2598
  transition: "background 0.3s ease"
2451
2599
  }
2452
2600
  },
2453
- hasInvalidCheckoutId ? /* @__PURE__ */ import_react8.default.createElement("span", { style: { fontSize: "20px", color: "white", fontWeight: "bold" } }, "\u2717") : paymentDetails && NetworkIcon ? /* @__PURE__ */ import_react8.default.createElement(NetworkIcon, { width: 24, height: 24 }) : /* @__PURE__ */ import_react8.default.createElement(import_icons.LoadingOutlined, { style: { fontSize: "20px", color: "white" }, spin: true })
2454
- ), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react8.default.createElement(Title, { level: 4, style: { margin: 0, fontSize: "18px", fontWeight: 600 } }, title || "Echo Payment OnVoyage"), !hasInvalidCheckoutId && /* @__PURE__ */ import_react8.default.createElement(
2601
+ hasInvalidCheckoutId ? /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontSize: "20px", color: "white", fontWeight: "bold" } }, "\u2717") : paymentDetails && NetworkIcon ? /* @__PURE__ */ import_react10.default.createElement(NetworkIcon, { width: 24, height: 24 }) : /* @__PURE__ */ import_react10.default.createElement(import_icons.LoadingOutlined, { style: { fontSize: "20px", color: "white" }, spin: true })
2602
+ ), /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react10.default.createElement(Title, { level: 4, style: { margin: 0, fontSize: "18px", fontWeight: 600 } }, title || "Echo Payment OnVoyage"), !hasInvalidCheckoutId && /* @__PURE__ */ import_react10.default.createElement(
2455
2603
  import_antd.Tooltip,
2456
2604
  {
2457
2605
  title: tooltipText,
2458
2606
  placement: "top"
2459
2607
  },
2460
- /* @__PURE__ */ import_react8.default.createElement(
2608
+ /* @__PURE__ */ import_react10.default.createElement(
2461
2609
  import_icons.InfoCircleOutlined,
2462
2610
  {
2463
2611
  style: { fontSize: "14px", color: "#8c8c8c", cursor: "help" }
2464
2612
  }
2465
2613
  )
2466
- )), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, subtitle))),
2467
- /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center mb-5" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "inline-flex items-center justify-center w-12 h-12 rounded-full bg-gray-50 mb-3" }, /* @__PURE__ */ import_react8.default.createElement(import_icons.LockOutlined, { style: { fontSize: "20px", color: "#595959" } })), /* @__PURE__ */ import_react8.default.createElement(Title, { level: 3, style: { margin: "0 0 6px 0", fontSize: "20px", fontWeight: 600 } }, "Payment Required"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Pay ", paymentDetails ? `$${paymentDetails.amount} ${paymentDetails.currency}` : "the required amount", " to access")),
2468
- hasInvalidCheckoutId && /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center py-6" }, /* @__PURE__ */ import_react8.default.createElement(
2614
+ )), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, subtitle))),
2615
+ /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center mb-5" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "inline-flex items-center justify-center w-12 h-12 rounded-full bg-gray-50 mb-3" }, /* @__PURE__ */ import_react10.default.createElement(import_icons.LockOutlined, { style: { fontSize: "20px", color: "#595959" } })), /* @__PURE__ */ import_react10.default.createElement(Title, { level: 3, style: { margin: "0 0 6px 0", fontSize: "20px", fontWeight: 600 } }, "Payment Required"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Pay ", paymentDetails ? `$${paymentDetails.amount} ${paymentDetails.currency}` : "the required amount", " to access")),
2616
+ hasInvalidCheckoutId && /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center py-6" }, /* @__PURE__ */ import_react10.default.createElement(
2469
2617
  "div",
2470
2618
  {
2471
2619
  className: "inline-flex items-center justify-center w-16 h-16 rounded-full mb-4",
@@ -2474,15 +2622,15 @@ function V402Checkout({
2474
2622
  boxShadow: "0 4px 20px rgba(239, 68, 68, 0.3)"
2475
2623
  }
2476
2624
  },
2477
- /* @__PURE__ */ import_react8.default.createElement("span", { style: { fontSize: "32px", color: "white" } }, "!")
2478
- ), /* @__PURE__ */ import_react8.default.createElement(
2625
+ /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontSize: "32px", color: "white" } }, "!")
2626
+ ), /* @__PURE__ */ import_react10.default.createElement(
2479
2627
  Title,
2480
2628
  {
2481
2629
  level: 4,
2482
2630
  style: { margin: "0 0 12px 0", fontSize: "18px", fontWeight: 600, color: "#262626" }
2483
2631
  },
2484
2632
  "Invalid Checkout ID"
2485
- ), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c", display: "block", marginBottom: "16px" } }, "The checkout ID you provided is invalid or has expired."), /* @__PURE__ */ import_react8.default.createElement(
2633
+ ), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c", display: "block", marginBottom: "16px" } }, "The checkout ID you provided is invalid or has expired."), /* @__PURE__ */ import_react10.default.createElement(
2486
2634
  "div",
2487
2635
  {
2488
2636
  style: {
@@ -2493,33 +2641,33 @@ function V402Checkout({
2493
2641
  marginTop: "16px"
2494
2642
  }
2495
2643
  },
2496
- /* @__PURE__ */ import_react8.default.createElement(Text, { style: {
2644
+ /* @__PURE__ */ import_react10.default.createElement(Text, { style: {
2497
2645
  fontSize: "13px",
2498
2646
  color: "#dc2626",
2499
2647
  lineHeight: "1.6",
2500
2648
  fontWeight: 500
2501
2649
  } }, "Failed to load payment information. Please check your checkout ID.")
2502
2650
  )),
2503
- !hasInvalidCheckoutId && fetchingPaymentInfo && /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center py-6" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { color: "#8c8c8c" } }, "Loading payment information...")),
2504
- !hasInvalidCheckoutId && !fetchingPaymentInfo && !address && /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement(WalletConnect, { supportedNetworks })),
2505
- !hasInvalidCheckoutId && address && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement(
2651
+ !hasInvalidCheckoutId && fetchingPaymentInfo && /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center py-6" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { color: "#8c8c8c" } }, "Loading payment information...")),
2652
+ !hasInvalidCheckoutId && !fetchingPaymentInfo && !address && /* @__PURE__ */ import_react10.default.createElement("div", null, /* @__PURE__ */ import_react10.default.createElement(WalletConnect, { supportedNetworks })),
2653
+ !hasInvalidCheckoutId && address && /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement(
2506
2654
  "div",
2507
2655
  {
2508
2656
  className: "bg-gray-50 rounded-lg p-3 mb-4",
2509
2657
  style: { border: "1px solid #f0f0f0" }
2510
2658
  },
2511
- /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center gap-3 flex-1" }, /* @__PURE__ */ import_react8.default.createElement(
2659
+ /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex items-center gap-3 flex-1" }, /* @__PURE__ */ import_react10.default.createElement(
2512
2660
  "div",
2513
2661
  {
2514
2662
  className: "w-10 h-10 rounded-full bg-black flex items-center justify-center text-white text-sm font-semibold"
2515
2663
  },
2516
2664
  address.slice(0, 2).toUpperCase()
2517
- ), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: {
2665
+ ), /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: {
2518
2666
  display: "block",
2519
2667
  fontSize: "12px",
2520
2668
  color: "#8c8c8c",
2521
2669
  marginBottom: "2px"
2522
- } }, "Connected Wallet"), /* @__PURE__ */ import_react8.default.createElement(
2670
+ } }, "Connected Wallet"), /* @__PURE__ */ import_react10.default.createElement(
2523
2671
  Text,
2524
2672
  {
2525
2673
  style: {
@@ -2529,17 +2677,17 @@ function V402Checkout({
2529
2677
  }
2530
2678
  },
2531
2679
  formatAddress(address)
2532
- ))), /* @__PURE__ */ import_react8.default.createElement(
2680
+ ))), /* @__PURE__ */ import_react10.default.createElement(
2533
2681
  import_antd.Button,
2534
2682
  {
2535
2683
  type: "text",
2536
2684
  size: "small",
2537
- icon: /* @__PURE__ */ import_react8.default.createElement(import_icons.DisconnectOutlined, null),
2685
+ icon: /* @__PURE__ */ import_react10.default.createElement(import_icons.DisconnectOutlined, null),
2538
2686
  onClick: handleDisconnect,
2539
2687
  style: { color: "#ff4d4f" }
2540
2688
  }
2541
2689
  ))
2542
- ), paymentDetails && /* @__PURE__ */ import_react8.default.createElement("div", { className: "bg-gray-50 rounded-lg p-3 mb-4", style: { border: "1px solid #f0f0f0" } }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Payment Amount"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "18px", fontWeight: 600 } }, "$", paymentDetails.amount)), /* @__PURE__ */ import_react8.default.createElement(import_antd.Divider, { style: { margin: "6px 0" } }), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Currency"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "14px", fontWeight: 500 } }, paymentDetails.currency)), /* @__PURE__ */ import_react8.default.createElement(import_antd.Divider, { style: { margin: "6px 0" } }), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Network"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "14px", fontWeight: 500 } }, paymentDetails.network)), /* @__PURE__ */ import_react8.default.createElement(import_antd.Divider, { style: { margin: "6px 0" } }), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex justify-between items-start" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Wallet Address"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: {
2690
+ ), paymentDetails && /* @__PURE__ */ import_react10.default.createElement("div", { className: "bg-gray-50 rounded-lg p-3 mb-4", style: { border: "1px solid #f0f0f0" } }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Payment Amount"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "18px", fontWeight: 600 } }, "$", paymentDetails.amount)), /* @__PURE__ */ import_react10.default.createElement(import_antd.Divider, { style: { margin: "6px 0" } }), /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Currency"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "14px", fontWeight: 500 } }, paymentDetails.currency)), /* @__PURE__ */ import_react10.default.createElement(import_antd.Divider, { style: { margin: "6px 0" } }), /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Network"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "14px", fontWeight: 500 } }, paymentDetails.network)), /* @__PURE__ */ import_react10.default.createElement(import_antd.Divider, { style: { margin: "6px 0" } }), /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex justify-between items-start" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Wallet Address"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: {
2543
2691
  fontSize: "11px",
2544
2692
  fontWeight: 500,
2545
2693
  fontFamily: "Monaco, monospace",
@@ -2547,15 +2695,15 @@ function V402Checkout({
2547
2695
  textAlign: "right",
2548
2696
  maxWidth: "60%",
2549
2697
  lineHeight: 1.4
2550
- } }, address))), /* @__PURE__ */ import_react8.default.createElement(
2698
+ } }, address))), /* @__PURE__ */ import_react10.default.createElement(
2551
2699
  "div",
2552
2700
  {
2553
2701
  className: "flex items-center justify-center gap-2 mb-3 p-2 rounded-lg",
2554
2702
  style: { background: "#f6ffed", border: "1px solid #d9f7be" }
2555
2703
  },
2556
- /* @__PURE__ */ import_react8.default.createElement(import_icons.SafetyOutlined, { style: { color: "#52c41a", fontSize: "13px" } }),
2557
- /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "12px", color: "#52c41a", fontWeight: 500 } }, "Secure payment powered by v402pay")
2558
- ), /* @__PURE__ */ import_react8.default.createElement(
2704
+ /* @__PURE__ */ import_react10.default.createElement(import_icons.SafetyOutlined, { style: { color: "#52c41a", fontSize: "13px" } }),
2705
+ /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "12px", color: "#52c41a", fontWeight: 500 } }, "Secure payment powered by v402pay")
2706
+ ), /* @__PURE__ */ import_react10.default.createElement(
2559
2707
  import_antd.Button,
2560
2708
  {
2561
2709
  type: "primary",
@@ -2577,7 +2725,7 @@ function V402Checkout({
2577
2725
  }
2578
2726
  },
2579
2727
  isProcessing ? "Processing..." : !paymentDetails ? "Loading..." : `Pay $${paymentDetails.amount} ${paymentDetails.currency}`
2580
- ), /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Don't have USDC?", " "), /* @__PURE__ */ import_react8.default.createElement(
2728
+ ), /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#8c8c8c" } }, "Don't have USDC?", " "), /* @__PURE__ */ import_react10.default.createElement(
2581
2729
  "a",
2582
2730
  {
2583
2731
  href: "https://faucet.circle.com/",
@@ -2586,26 +2734,26 @@ function V402Checkout({
2586
2734
  className: "text-blue-600 hover:text-blue-700 text-sm font-medium inline-flex items-center gap-1"
2587
2735
  },
2588
2736
  "Get it here ",
2589
- /* @__PURE__ */ import_react8.default.createElement(import_icons.LinkOutlined, { style: { fontSize: "12px" } })
2590
- )), isModal && result && /* @__PURE__ */ import_react8.default.createElement(
2737
+ /* @__PURE__ */ import_react10.default.createElement(import_icons.LinkOutlined, { style: { fontSize: "12px" } })
2738
+ )), isModal && result && /* @__PURE__ */ import_react10.default.createElement(
2591
2739
  "div",
2592
2740
  {
2593
2741
  className: "mt-4 p-4 rounded-lg",
2594
2742
  style: { background: "#f6ffed", border: "1px solid #b7eb8f" }
2595
2743
  },
2596
- /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ import_react8.default.createElement("span", { style: { fontSize: "20px" } }, "\u2713"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: {
2744
+ /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontSize: "20px" } }, "\u2713"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: {
2597
2745
  fontSize: "14px",
2598
2746
  color: "#52c41a",
2599
2747
  fontWeight: 600,
2600
2748
  marginLeft: "8px"
2601
2749
  } }, "Payment Successful!"))
2602
- ), isModal && error && /* @__PURE__ */ import_react8.default.createElement(
2750
+ ), isModal && error && /* @__PURE__ */ import_react10.default.createElement(
2603
2751
  "div",
2604
2752
  {
2605
2753
  className: "mt-4 p-4 rounded-lg",
2606
2754
  style: { background: "#fff2f0", border: "1px solid #ffccc7" }
2607
2755
  },
2608
- /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center mb-3" }, /* @__PURE__ */ import_react8.default.createElement("span", { style: { fontSize: "20px" } }, "\u2717"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: {
2756
+ /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center mb-3" }, /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontSize: "20px" } }, "\u2717"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: {
2609
2757
  fontSize: "14px",
2610
2758
  color: "#ff4d4f",
2611
2759
  fontWeight: 600,
@@ -2613,7 +2761,7 @@ function V402Checkout({
2613
2761
  display: "block",
2614
2762
  marginTop: "4px"
2615
2763
  } }, "Payment Failed")),
2616
- /* @__PURE__ */ import_react8.default.createElement(Text, { style: {
2764
+ /* @__PURE__ */ import_react10.default.createElement(Text, { style: {
2617
2765
  fontSize: "13px",
2618
2766
  color: "#ff4d4f",
2619
2767
  display: "block",
@@ -2621,11 +2769,11 @@ function V402Checkout({
2621
2769
  } }, error)
2622
2770
  ))
2623
2771
  ),
2624
- !isModal && (isProcessing || result || error) && /* @__PURE__ */ import_react8.default.createElement(
2772
+ !isModal && (isProcessing || result || error) && /* @__PURE__ */ import_react10.default.createElement(
2625
2773
  import_antd.Card,
2626
2774
  {
2627
- title: /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center gap-2" }, isProcessing && !result && !error ? /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement(import_icons.LoadingOutlined, { style: { color: "#14b8a6", fontSize: "16px" } }), /* @__PURE__ */ import_react8.default.createElement(Text, { strong: true, style: { fontSize: "16px", color: "#262626" } }, "Processing Payment")) : result ? /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement("span", { style: { color: "#52c41a", fontSize: "18px" } }, "\u2713"), /* @__PURE__ */ import_react8.default.createElement(Text, { strong: true, style: { fontSize: "16px", color: "#262626" } }, "Payment Successful")) : /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement("span", { style: { color: "#ff4d4f", fontSize: "18px" } }, "\u2717"), /* @__PURE__ */ import_react8.default.createElement(Text, { strong: true, style: { fontSize: "16px", color: "#262626" } }, "Payment Failed"))),
2628
- extra: !isProcessing && /* @__PURE__ */ import_react8.default.createElement(
2775
+ title: /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex items-center gap-2" }, isProcessing && !result && !error ? /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement(import_icons.LoadingOutlined, { style: { color: "#14b8a6", fontSize: "16px" } }), /* @__PURE__ */ import_react10.default.createElement(Text, { strong: true, style: { fontSize: "16px", color: "#262626" } }, "Processing Payment")) : result ? /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement("span", { style: { color: "#52c41a", fontSize: "18px" } }, "\u2713"), /* @__PURE__ */ import_react10.default.createElement(Text, { strong: true, style: { fontSize: "16px", color: "#262626" } }, "Payment Successful")) : /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement("span", { style: { color: "#ff4d4f", fontSize: "18px" } }, "\u2717"), /* @__PURE__ */ import_react10.default.createElement(Text, { strong: true, style: { fontSize: "16px", color: "#262626" } }, "Payment Failed"))),
2776
+ extra: !isProcessing && /* @__PURE__ */ import_react10.default.createElement(
2629
2777
  import_antd.Button,
2630
2778
  {
2631
2779
  type: "text",
@@ -2653,7 +2801,7 @@ function V402Checkout({
2653
2801
  }
2654
2802
  }
2655
2803
  },
2656
- isProcessing && !result && !error && /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center py-10" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "relative inline-block" }, /* @__PURE__ */ import_react8.default.createElement(
2804
+ isProcessing && !result && !error && /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center py-10" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "relative inline-block" }, /* @__PURE__ */ import_react10.default.createElement(
2657
2805
  "div",
2658
2806
  {
2659
2807
  className: "absolute inset-0 rounded-full blur-xl opacity-40",
@@ -2662,12 +2810,12 @@ function V402Checkout({
2662
2810
  animation: "pulse 2s ease-in-out infinite"
2663
2811
  }
2664
2812
  }
2665
- ), /* @__PURE__ */ import_react8.default.createElement(
2813
+ ), /* @__PURE__ */ import_react10.default.createElement(
2666
2814
  import_antd.Spin,
2667
2815
  {
2668
- indicator: /* @__PURE__ */ import_react8.default.createElement(import_icons.LoadingOutlined, { style: { fontSize: 56, color: "#14b8a6" } })
2816
+ indicator: /* @__PURE__ */ import_react10.default.createElement(import_icons.LoadingOutlined, { style: { fontSize: 56, color: "#14b8a6" } })
2669
2817
  }
2670
- )), /* @__PURE__ */ import_react8.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ import_react8.default.createElement(Text, { strong: true, style: { fontSize: "18px", color: "#262626", letterSpacing: "-0.02em" } }, "Verifying Payment")), /* @__PURE__ */ import_react8.default.createElement("div", { className: "mt-2 mb-6" }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c", lineHeight: "1.6" } }, "Please wait while we confirm your transaction")), /* @__PURE__ */ import_react8.default.createElement(
2818
+ )), /* @__PURE__ */ import_react10.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ import_react10.default.createElement(Text, { strong: true, style: { fontSize: "18px", color: "#262626", letterSpacing: "-0.02em" } }, "Verifying Payment")), /* @__PURE__ */ import_react10.default.createElement("div", { className: "mt-2 mb-6" }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c", lineHeight: "1.6" } }, "Please wait while we confirm your transaction")), /* @__PURE__ */ import_react10.default.createElement(
2671
2819
  "div",
2672
2820
  {
2673
2821
  className: "mt-4 p-4 rounded-xl",
@@ -2676,9 +2824,9 @@ function V402Checkout({
2676
2824
  border: "1px solid #ccfbf1"
2677
2825
  }
2678
2826
  },
2679
- /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center justify-center gap-2" }, /* @__PURE__ */ import_react8.default.createElement("span", { style: { fontSize: "16px" } }, "\u23F1\uFE0F"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "13px", color: "#0f766e", fontWeight: 500 } }, "This may take a few moments"))
2827
+ /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex items-center justify-center gap-2" }, /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontSize: "16px" } }, "\u23F1\uFE0F"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "13px", color: "#0f766e", fontWeight: 500 } }, "This may take a few moments"))
2680
2828
  )),
2681
- result && /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center mb-6" }, /* @__PURE__ */ import_react8.default.createElement(
2829
+ result && /* @__PURE__ */ import_react10.default.createElement("div", null, /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center mb-6" }, /* @__PURE__ */ import_react10.default.createElement(
2682
2830
  "div",
2683
2831
  {
2684
2832
  className: "inline-flex items-center justify-center w-16 h-16 rounded-full mb-4",
@@ -2687,13 +2835,13 @@ function V402Checkout({
2687
2835
  boxShadow: "0 4px 20px rgba(16, 185, 129, 0.3)"
2688
2836
  }
2689
2837
  },
2690
- /* @__PURE__ */ import_react8.default.createElement("span", { style: { fontSize: "32px", color: "white" } }, "\u2713")
2691
- ), /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement(Text, { strong: true, style: {
2838
+ /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontSize: "32px", color: "white" } }, "\u2713")
2839
+ ), /* @__PURE__ */ import_react10.default.createElement("div", null, /* @__PURE__ */ import_react10.default.createElement(Text, { strong: true, style: {
2692
2840
  fontSize: "20px",
2693
2841
  color: "#262626",
2694
2842
  display: "block",
2695
2843
  marginBottom: "8px"
2696
- } }, "Payment Successful!"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c" } }, "Your transaction has been confirmed"))), /* @__PURE__ */ import_react8.default.createElement(import_antd.Divider, { style: { margin: "20px 0", borderColor: "#f0f0f0" } }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "12px", color: "#8c8c8c", fontWeight: 500 } }, "RESPONSE DATA")), /* @__PURE__ */ import_react8.default.createElement(
2844
+ } }, "Payment Successful!"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c" } }, "Your transaction has been confirmed"))), /* @__PURE__ */ import_react10.default.createElement(import_antd.Divider, { style: { margin: "20px 0", borderColor: "#f0f0f0" } }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "12px", color: "#8c8c8c", fontWeight: 500 } }, "RESPONSE DATA")), /* @__PURE__ */ import_react10.default.createElement(
2697
2845
  "pre",
2698
2846
  {
2699
2847
  style: {
@@ -2713,7 +2861,7 @@ function V402Checkout({
2713
2861
  },
2714
2862
  JSON.stringify(result, null, 2)
2715
2863
  )),
2716
- error && /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-center mb-6" }, /* @__PURE__ */ import_react8.default.createElement(
2864
+ error && /* @__PURE__ */ import_react10.default.createElement("div", null, /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center mb-6" }, /* @__PURE__ */ import_react10.default.createElement(
2717
2865
  "div",
2718
2866
  {
2719
2867
  className: "inline-flex items-center justify-center w-16 h-16 rounded-full mb-4",
@@ -2722,13 +2870,13 @@ function V402Checkout({
2722
2870
  boxShadow: "0 4px 20px rgba(239, 68, 68, 0.3)"
2723
2871
  }
2724
2872
  },
2725
- /* @__PURE__ */ import_react8.default.createElement("span", { style: { fontSize: "32px", color: "white" } }, "\u2717")
2726
- ), /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement(Text, { strong: true, style: {
2873
+ /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontSize: "32px", color: "white" } }, "\u2717")
2874
+ ), /* @__PURE__ */ import_react10.default.createElement("div", null, /* @__PURE__ */ import_react10.default.createElement(Text, { strong: true, style: {
2727
2875
  fontSize: "20px",
2728
2876
  color: "#262626",
2729
2877
  display: "block",
2730
2878
  marginBottom: "8px"
2731
- } }, "Payment Failed"), /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c" } }, "Something went wrong with your transaction"))), /* @__PURE__ */ import_react8.default.createElement(import_antd.Divider, { style: { margin: "20px 0", borderColor: "#f0f0f0" } }, /* @__PURE__ */ import_react8.default.createElement(Text, { style: { fontSize: "12px", color: "#8c8c8c", fontWeight: 500 } }, "ERROR DETAILS")), /* @__PURE__ */ import_react8.default.createElement(
2879
+ } }, "Payment Failed"), /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "14px", color: "#8c8c8c" } }, "Something went wrong with your transaction"))), /* @__PURE__ */ import_react10.default.createElement(import_antd.Divider, { style: { margin: "20px 0", borderColor: "#f0f0f0" } }, /* @__PURE__ */ import_react10.default.createElement(Text, { style: { fontSize: "12px", color: "#8c8c8c", fontWeight: 500 } }, "ERROR DETAILS")), /* @__PURE__ */ import_react10.default.createElement(
2732
2880
  "div",
2733
2881
  {
2734
2882
  style: {
@@ -2738,13 +2886,13 @@ function V402Checkout({
2738
2886
  border: "1px solid #fee2e2"
2739
2887
  }
2740
2888
  },
2741
- /* @__PURE__ */ import_react8.default.createElement(Text, { style: {
2889
+ /* @__PURE__ */ import_react10.default.createElement(Text, { style: {
2742
2890
  fontSize: "14px",
2743
2891
  color: "#dc2626",
2744
2892
  lineHeight: "1.6",
2745
2893
  fontWeight: 500
2746
2894
  } }, error)
2747
- ), /* @__PURE__ */ import_react8.default.createElement("div", { className: "mt-4 text-center" }, /* @__PURE__ */ import_react8.default.createElement(
2895
+ ), /* @__PURE__ */ import_react10.default.createElement("div", { className: "mt-4 text-center" }, /* @__PURE__ */ import_react10.default.createElement(
2748
2896
  import_antd.Button,
2749
2897
  {
2750
2898
  size: "large",
@@ -2765,7 +2913,7 @@ function V402Checkout({
2765
2913
  )))
2766
2914
  )
2767
2915
  ),
2768
- /* @__PURE__ */ import_react8.default.createElement("style", { dangerouslySetInnerHTML: {
2916
+ /* @__PURE__ */ import_react10.default.createElement("style", { dangerouslySetInnerHTML: {
2769
2917
  __html: `
2770
2918
  @keyframes slideInRight {
2771
2919
  from {
@@ -2792,14 +2940,699 @@ function V402Checkout({
2792
2940
  } })
2793
2941
  );
2794
2942
  }
2943
+
2944
+ // src/react/components/checkout/V402CheckoutV2.tsx
2945
+ var import_react15 = __toESM(require("react"));
2946
+ init_common();
2947
+
2948
+ // src/react/styles/animations.tsx
2949
+ var import_react11 = __toESM(require("react"));
2950
+ var checkoutAnimations = `
2951
+ @keyframes spin {
2952
+ from { transform: rotate(0deg); }
2953
+ to { transform: rotate(360deg); }
2954
+ }
2955
+
2956
+ @keyframes receiptShake {
2957
+ 0%, 100% { transform: rotate(-0.3deg); }
2958
+ 50% { transform: rotate(0.3deg); }
2959
+ }
2960
+
2961
+ @keyframes slideInRight {
2962
+ from {
2963
+ opacity: 0;
2964
+ transform: translateX(100px);
2965
+ }
2966
+ to {
2967
+ opacity: 1;
2968
+ transform: translateX(0);
2969
+ }
2970
+ }
2971
+
2972
+ @keyframes pulse {
2973
+ 0%, 100% { opacity: 1; }
2974
+ 50% { opacity: 0.4; }
2975
+ }
2976
+ `;
2977
+ var AnimationStyles = () => /* @__PURE__ */ import_react11.default.createElement("style", { dangerouslySetInnerHTML: { __html: checkoutAnimations } });
2978
+
2979
+ // src/react/components/checkout/Receipt.tsx
2980
+ var import_react12 = __toESM(require("react"));
2981
+ var Receipt = ({
2982
+ isLoading,
2983
+ isVisible,
2984
+ result,
2985
+ error,
2986
+ paymentDetails,
2987
+ address,
2988
+ onClose,
2989
+ primaryColor,
2990
+ receiptTitle,
2991
+ tempReceiptId
2992
+ }) => {
2993
+ const [animationState, setAnimationState] = (0, import_react12.useState)("hidden");
2994
+ (0, import_react12.useEffect)(() => {
2995
+ if (isLoading) {
2996
+ setAnimationState("printing");
2997
+ } else if (isVisible && (result || error)) {
2998
+ setAnimationState("visible");
2999
+ const timer = setTimeout(() => setAnimationState("bounce"), 50);
3000
+ return () => clearTimeout(timer);
3001
+ } else if (!isVisible) {
3002
+ setAnimationState("hidden");
3003
+ }
3004
+ }, [isLoading, isVisible, result, error]);
3005
+ (0, import_react12.useEffect)(() => {
3006
+ if (animationState === "bounce") {
3007
+ const timer = setTimeout(() => setAnimationState("visible"), 150);
3008
+ return () => clearTimeout(timer);
3009
+ }
3010
+ }, [animationState]);
3011
+ const now = /* @__PURE__ */ new Date();
3012
+ const dateStr = `${String(now.getMonth() + 1).padStart(2, "0")}/${String(now.getDate()).padStart(2, "0")}/${String(now.getFullYear()).slice(-2)}`;
3013
+ const timeStr = `${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
3014
+ const receiptId = result?.transactionHash ? result.transactionHash.slice(-8).toUpperCase() : tempReceiptId;
3015
+ const getAnimationStyles = () => {
3016
+ const baseTransition = animationState === "bounce" ? "all 0.15s cubic-bezier(0.34, 1.56, 0.64, 1)" : "all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1)";
3017
+ switch (animationState) {
3018
+ case "hidden":
3019
+ return {
3020
+ opacity: 0,
3021
+ transform: "translateY(50px)",
3022
+ marginBottom: 0,
3023
+ transition: baseTransition
3024
+ };
3025
+ case "printing":
3026
+ return {
3027
+ opacity: 1,
3028
+ transform: "translateY(0)",
3029
+ marginBottom: "-4px",
3030
+ // 负边距让小票贴着机器,还没撕开的感觉
3031
+ animation: "receiptShake 0.12s ease-in-out infinite",
3032
+ transition: baseTransition
3033
+ };
3034
+ case "visible":
3035
+ return {
3036
+ opacity: 1,
3037
+ transform: "translateY(0)",
3038
+ marginBottom: "8px",
3039
+ transition: baseTransition
3040
+ };
3041
+ case "bounce":
3042
+ return {
3043
+ opacity: 1,
3044
+ transform: "translateY(-8px)",
3045
+ marginBottom: "8px",
3046
+ transition: baseTransition
3047
+ };
3048
+ default:
3049
+ return {};
3050
+ }
3051
+ };
3052
+ const getContentStyles = () => {
3053
+ const baseTransition = "all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1)";
3054
+ switch (animationState) {
3055
+ case "hidden":
3056
+ return {
3057
+ maxHeight: 0,
3058
+ overflow: "hidden",
3059
+ transition: baseTransition
3060
+ };
3061
+ case "printing":
3062
+ return {
3063
+ maxHeight: "80px",
3064
+ overflow: "hidden",
3065
+ transition: baseTransition
3066
+ };
3067
+ case "visible":
3068
+ case "bounce":
3069
+ return {
3070
+ maxHeight: "600px",
3071
+ overflow: "visible",
3072
+ transition: baseTransition
3073
+ };
3074
+ default:
3075
+ return {};
3076
+ }
3077
+ };
3078
+ if (animationState === "hidden" && !isLoading) return null;
3079
+ return /* @__PURE__ */ import_react12.default.createElement(
3080
+ "div",
3081
+ {
3082
+ className: "w-full flex justify-center",
3083
+ style: getAnimationStyles()
3084
+ },
3085
+ /* @__PURE__ */ import_react12.default.createElement(
3086
+ "div",
3087
+ {
3088
+ className: "relative bg-white shadow-2xl",
3089
+ style: {
3090
+ width: "75%",
3091
+ maxWidth: "280px",
3092
+ backgroundImage: `
3093
+ repeating-linear-gradient(
3094
+ 0deg,
3095
+ transparent,
3096
+ transparent 1px,
3097
+ rgba(0,0,0,0.02) 1px,
3098
+ rgba(0,0,0,0.02) 2px
3099
+ )
3100
+ `
3101
+ }
3102
+ },
3103
+ /* @__PURE__ */ import_react12.default.createElement(
3104
+ "div",
3105
+ {
3106
+ className: "absolute top-0 left-0 right-0",
3107
+ style: {
3108
+ height: "8px",
3109
+ transform: "translateY(-100%)",
3110
+ background: `radial-gradient(circle at 50% 100%, white 5px, transparent 5px)`,
3111
+ backgroundSize: "12px 8px",
3112
+ backgroundPosition: "6px 0",
3113
+ backgroundRepeat: "repeat-x"
3114
+ }
3115
+ }
3116
+ ),
3117
+ /* @__PURE__ */ import_react12.default.createElement(
3118
+ "div",
3119
+ {
3120
+ className: "absolute left-0 right-0 bg-white",
3121
+ style: {
3122
+ height: "4px",
3123
+ top: "-4px"
3124
+ }
3125
+ }
3126
+ ),
3127
+ !isLoading && /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement(
3128
+ "div",
3129
+ {
3130
+ className: "absolute bottom-0 left-0 right-0",
3131
+ style: {
3132
+ height: "8px",
3133
+ transform: "translateY(100%)",
3134
+ background: `radial-gradient(circle at 50% 0%, white 5px, transparent 5px)`,
3135
+ backgroundSize: "12px 8px",
3136
+ backgroundPosition: "6px 0",
3137
+ backgroundRepeat: "repeat-x"
3138
+ }
3139
+ }
3140
+ ), /* @__PURE__ */ import_react12.default.createElement(
3141
+ "div",
3142
+ {
3143
+ className: "absolute left-0 right-0 bg-white",
3144
+ style: {
3145
+ height: "4px",
3146
+ bottom: "-4px"
3147
+ }
3148
+ }
3149
+ )),
3150
+ !isLoading && (result || error) && /* @__PURE__ */ import_react12.default.createElement(
3151
+ "button",
3152
+ {
3153
+ onClick: onClose,
3154
+ className: "absolute top-3 right-3 text-gray-300 hover:text-gray-500 transition-colors bg-transparent border-none outline-none p-0 cursor-pointer",
3155
+ style: { background: "none", border: "none" }
3156
+ },
3157
+ /* @__PURE__ */ import_react12.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" }, /* @__PURE__ */ import_react12.default.createElement("path", { d: "M18 6L6 18M6 6l12 12" }))
3158
+ ),
3159
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "p-4 font-mono text-sm", style: getContentStyles() }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-center mb-3" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-base font-bold tracking-wider text-gray-800" }, receiptTitle), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex justify-between text-xs text-gray-500 mt-1" }, /* @__PURE__ */ import_react12.default.createElement("span", null, "ID: ", receiptId), /* @__PURE__ */ import_react12.default.createElement("span", null, dateStr, " ", timeStr))), /* @__PURE__ */ import_react12.default.createElement("div", { className: "border-t border-dashed border-gray-300 my-2" }), /* @__PURE__ */ import_react12.default.createElement(
3160
+ "div",
3161
+ {
3162
+ className: "max-h-64 overflow-y-auto pr-1",
3163
+ style: {
3164
+ scrollbarWidth: "thin",
3165
+ scrollbarColor: "#d1d5db transparent"
3166
+ }
3167
+ },
3168
+ isLoading ? /* @__PURE__ */ import_react12.default.createElement(LoadingContent, { primaryColor }) : error ? /* @__PURE__ */ import_react12.default.createElement(ErrorContent, { error }) : result ? /* @__PURE__ */ import_react12.default.createElement(
3169
+ SuccessContent,
3170
+ {
3171
+ result,
3172
+ paymentDetails,
3173
+ address,
3174
+ primaryColor
3175
+ }
3176
+ ) : null
3177
+ ), /* @__PURE__ */ import_react12.default.createElement("div", { className: "border-t border-dashed border-gray-300 my-2" }), /* @__PURE__ */ import_react12.default.createElement(Barcode, null), /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-center text-xs text-gray-400 mt-1 tracking-widest" }, "POWERED BY", " ", /* @__PURE__ */ import_react12.default.createElement(
3178
+ "a",
3179
+ {
3180
+ href: "https://v402pay.onvoyage.ai",
3181
+ target: "_blank",
3182
+ rel: "noopener noreferrer",
3183
+ className: "text-gray-500 hover:text-gray-700 underline transition-colors"
3184
+ },
3185
+ "V402PAY"
3186
+ )))
3187
+ )
3188
+ );
3189
+ };
3190
+ var LoadingContent = ({ primaryColor }) => /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-center py-4" }, /* @__PURE__ */ import_react12.default.createElement(
3191
+ "div",
3192
+ {
3193
+ className: "inline-block w-8 h-8 border-2 border-gray-200 rounded-full mb-2",
3194
+ style: {
3195
+ borderTopColor: primaryColor,
3196
+ animation: "spin 0.8s linear infinite"
3197
+ }
3198
+ }
3199
+ ), /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-gray-700 font-semibold text-sm" }, "Processing..."), /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-gray-400 text-xs mt-1" }, "Please wait"));
3200
+ var ErrorContent = ({ error }) => /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-center py-3" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-red-500 text-2xl mb-2" }, "\u2717"), /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-red-600 font-semibold mb-1 text-sm" }, "FAILED"), /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-red-500 text-xs break-words px-2" }, error));
3201
+ var SuccessContent = ({
3202
+ result,
3203
+ paymentDetails,
3204
+ address,
3205
+ primaryColor
3206
+ }) => {
3207
+ const [copied, setCopied] = (0, import_react12.useState)(false);
3208
+ const handleCopy = async () => {
3209
+ try {
3210
+ await navigator.clipboard.writeText(JSON.stringify(result, null, 2));
3211
+ setCopied(true);
3212
+ setTimeout(() => setCopied(false), 2e3);
3213
+ } catch (err) {
3214
+ console.error("Failed to copy:", err);
3215
+ }
3216
+ };
3217
+ return /* @__PURE__ */ import_react12.default.createElement("div", null, /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-center mb-2" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-2xl mb-1", style: { color: primaryColor } }, "\u2713"), /* @__PURE__ */ import_react12.default.createElement("div", { className: "font-semibold text-sm", style: { color: primaryColor } }, "SUCCESS")), /* @__PURE__ */ import_react12.default.createElement("div", { className: "space-y-1 text-xs" }, paymentDetails && /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex justify-between" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "text-gray-500" }, "Amount:"), /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-semibold" }, "$", paymentDetails.amount, " ", paymentDetails.currency)), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex justify-between" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "text-gray-500" }, "Network:"), /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-semibold" }, paymentDetails.network))), address && /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex justify-between" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "text-gray-500" }, "From:"), /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-semibold" }, formatAddress(address))), result.transactionHash && /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex justify-between" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "text-gray-500" }, "TX:"), /* @__PURE__ */ import_react12.default.createElement("span", { className: "font-semibold" }, formatAddress(result.transactionHash)))), /* @__PURE__ */ import_react12.default.createElement("div", { className: "border-t border-dashed border-gray-300 my-2" }), /* @__PURE__ */ import_react12.default.createElement("div", { className: "text-xs" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex justify-between items-center mb-1" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "text-gray-500" }, "Response:"), /* @__PURE__ */ import_react12.default.createElement(
3218
+ "button",
3219
+ {
3220
+ onClick: handleCopy,
3221
+ className: "text-gray-300 hover:text-gray-500 transition-colors flex items-center gap-1 bg-transparent border-none outline-none p-0 cursor-pointer",
3222
+ style: { background: "none", border: "none" }
3223
+ },
3224
+ copied ? /* @__PURE__ */ import_react12.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" }, /* @__PURE__ */ import_react12.default.createElement("path", { d: "M20 6L9 17l-5-5" })) : /* @__PURE__ */ import_react12.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }, /* @__PURE__ */ import_react12.default.createElement("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }), /* @__PURE__ */ import_react12.default.createElement("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" }))
3225
+ )), /* @__PURE__ */ import_react12.default.createElement(
3226
+ "pre",
3227
+ {
3228
+ className: "bg-gray-50 p-2 rounded text-xs overflow-auto whitespace-pre-wrap break-words",
3229
+ style: { maxHeight: "80px", fontSize: "10px" }
3230
+ },
3231
+ JSON.stringify(result, null, 2)
3232
+ )));
3233
+ };
3234
+ var Barcode = () => {
3235
+ const pattern = [2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1];
3236
+ const heights = [10, 12, 11, 13, 10, 14, 11, 12, 13, 10, 11, 14, 12, 10, 13, 11, 12, 14, 10, 11];
3237
+ return /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex items-center justify-center gap-0.5 h-4 opacity-60" }, pattern.map((width, i) => /* @__PURE__ */ import_react12.default.createElement(
3238
+ "div",
3239
+ {
3240
+ key: i,
3241
+ className: "bg-gray-800",
3242
+ style: {
3243
+ width: `${width}px`,
3244
+ height: `${heights[i]}px`
3245
+ }
3246
+ }
3247
+ )));
3248
+ };
3249
+
3250
+ // src/react/components/checkout/TerminalScreen.tsx
3251
+ var import_react13 = __toESM(require("react"));
3252
+ var TerminalScreen = ({
3253
+ title,
3254
+ tooltipText,
3255
+ hasInvalidCheckoutId,
3256
+ fetchingPaymentInfo,
3257
+ address,
3258
+ paymentDetails,
3259
+ screenText,
3260
+ supportedNetworks
3261
+ }) => {
3262
+ return /* @__PURE__ */ import_react13.default.createElement(
3263
+ "div",
3264
+ {
3265
+ className: "rounded-xl p-3 mb-3",
3266
+ style: {
3267
+ backgroundColor: "#0a1a0a",
3268
+ boxShadow: "inset 0 3px 16px rgba(0,0,0,0.5)",
3269
+ border: "3px solid rgba(0,0,0,0.3)"
3270
+ }
3271
+ },
3272
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex items-center gap-1.5 flex-1 min-w-0" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "w-2.5 h-2.5 rounded border border-green-700 flex-shrink-0" }), title ? /* @__PURE__ */ import_react13.default.createElement(
3273
+ "span",
3274
+ {
3275
+ className: "text-xs font-mono",
3276
+ style: { color: "#22c55e80" },
3277
+ title
3278
+ },
3279
+ title.length > 26 ? `${title.slice(0, 13)}...${title.slice(-13)}` : title
3280
+ ) : /* @__PURE__ */ import_react13.default.createElement("span", { className: "text-xs font-mono", style: { color: "#22c55e80" } }, "CHECKOUT")), /* @__PURE__ */ import_react13.default.createElement(
3281
+ "div",
3282
+ {
3283
+ className: "flex gap-0.5 flex-shrink-0 cursor-help",
3284
+ title: tooltipText
3285
+ },
3286
+ /* @__PURE__ */ import_react13.default.createElement(
3287
+ "div",
3288
+ {
3289
+ className: "w-1 h-1.5 rounded-sm",
3290
+ style: { backgroundColor: address ? "#22c55e80" : "#22c55e30" }
3291
+ }
3292
+ ),
3293
+ /* @__PURE__ */ import_react13.default.createElement(
3294
+ "div",
3295
+ {
3296
+ className: "w-1 h-1.5 rounded-sm",
3297
+ style: { backgroundColor: address ? "#22c55e80" : "#22c55e30" }
3298
+ }
3299
+ ),
3300
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "w-1 h-1.5 rounded-sm", style: { backgroundColor: "#22c55e80" } })
3301
+ )),
3302
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "min-h-[120px]" }, hasInvalidCheckoutId ? /* @__PURE__ */ import_react13.default.createElement(InvalidIdContent, null) : fetchingPaymentInfo ? /* @__PURE__ */ import_react13.default.createElement(LoadingContent2, null) : !address ? /* @__PURE__ */ import_react13.default.createElement(ConnectWalletContent, { supportedNetworks }) : /* @__PURE__ */ import_react13.default.createElement(
3303
+ PaymentInfoContent,
3304
+ {
3305
+ screenText,
3306
+ paymentDetails,
3307
+ address
3308
+ }
3309
+ ))
3310
+ );
3311
+ };
3312
+ var InvalidIdContent = () => /* @__PURE__ */ import_react13.default.createElement("div", { className: "text-center py-3" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "text-red-500 text-xl mb-1" }, "\u2717"), /* @__PURE__ */ import_react13.default.createElement("div", { className: "text-red-500 font-mono text-sm mb-1" }, "INVALID ID"), /* @__PURE__ */ import_react13.default.createElement("div", { className: "text-red-400 font-mono text-xs" }, "Check your checkout ID"));
3313
+ var LoadingContent2 = () => /* @__PURE__ */ import_react13.default.createElement("div", { className: "text-center py-4" }, /* @__PURE__ */ import_react13.default.createElement(
3314
+ "div",
3315
+ {
3316
+ className: "inline-block w-5 h-5 border-2 rounded-full mb-2",
3317
+ style: {
3318
+ borderColor: "#22c55e40",
3319
+ borderTopColor: "#22c55e",
3320
+ animation: "spin 1s linear infinite"
3321
+ }
3322
+ }
3323
+ ), /* @__PURE__ */ import_react13.default.createElement("div", { className: "font-mono text-sm", style: { color: "#22c55e" } }, "LOADING..."));
3324
+ var ConnectWalletContent = ({ supportedNetworks }) => /* @__PURE__ */ import_react13.default.createElement("div", null, /* @__PURE__ */ import_react13.default.createElement(
3325
+ "div",
3326
+ {
3327
+ className: "font-mono text-base mb-3 tracking-wider",
3328
+ style: { color: "#f97316", textShadow: "0 0 10px #f9731640" }
3329
+ },
3330
+ "CONNECT WALLET..."
3331
+ ), /* @__PURE__ */ import_react13.default.createElement(WalletConnect, { supportedNetworks, showSwitchWallet: false }));
3332
+ var PaymentInfoContent = ({
3333
+ screenText,
3334
+ paymentDetails,
3335
+ address
3336
+ }) => /* @__PURE__ */ import_react13.default.createElement("div", null, /* @__PURE__ */ import_react13.default.createElement(
3337
+ "div",
3338
+ {
3339
+ className: "font-mono text-base mb-3 tracking-wider",
3340
+ style: { color: "#f97316", textShadow: "0 0 10px #f9731640" }
3341
+ },
3342
+ screenText
3343
+ ), paymentDetails && /* @__PURE__ */ import_react13.default.createElement("div", { className: "text-xs font-mono" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "grid grid-cols-2 gap-1.5 mb-1.5" }, /* @__PURE__ */ import_react13.default.createElement("div", null, /* @__PURE__ */ import_react13.default.createElement("div", { style: { color: "#22c55e60" } }, "AMOUNT"), /* @__PURE__ */ import_react13.default.createElement("div", { style: { color: "#22c55e" } }, "$", paymentDetails.amount)), /* @__PURE__ */ import_react13.default.createElement("div", null, /* @__PURE__ */ import_react13.default.createElement("div", { style: { color: "#22c55e60" } }, "CURRENCY"), /* @__PURE__ */ import_react13.default.createElement("div", { style: { color: "#22c55e" } }, paymentDetails.currency))), /* @__PURE__ */ import_react13.default.createElement("div", null, /* @__PURE__ */ import_react13.default.createElement("div", { style: { color: "#22c55e60" } }, "WALLET"), /* @__PURE__ */ import_react13.default.createElement("div", { style: { color: "#22c55e", wordBreak: "break-all" } }, address))));
3344
+
3345
+ // src/react/components/checkout/TerminalButtons.tsx
3346
+ var import_react14 = __toESM(require("react"));
3347
+ var TerminalButtons = ({
3348
+ address,
3349
+ showReceipt,
3350
+ isProcessing,
3351
+ paymentDetails,
3352
+ hasInvalidCheckoutId,
3353
+ onDisconnect,
3354
+ onClearReceipt,
3355
+ onPayment
3356
+ }) => {
3357
+ const isPayDisabled = isProcessing || !paymentDetails || !address || hasInvalidCheckoutId;
3358
+ return /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between px-1" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ import_react14.default.createElement(
3359
+ CircleButton,
3360
+ {
3361
+ onClick: () => address && onDisconnect(),
3362
+ disabled: !address,
3363
+ title: "Disconnect",
3364
+ size: "small"
3365
+ },
3366
+ /* @__PURE__ */ import_react14.default.createElement("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "white", strokeWidth: "2" }, /* @__PURE__ */ import_react14.default.createElement("path", { d: "M18 6L6 18M6 6l12 12" }))
3367
+ ), /* @__PURE__ */ import_react14.default.createElement(
3368
+ CircleButton,
3369
+ {
3370
+ onClick: onClearReceipt,
3371
+ disabled: !showReceipt || isProcessing,
3372
+ title: "Clear",
3373
+ size: "small"
3374
+ },
3375
+ /* @__PURE__ */ import_react14.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "white", strokeWidth: "2" }, /* @__PURE__ */ import_react14.default.createElement("path", { d: "M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z" }))
3376
+ )), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-col gap-0.5 opacity-40" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "w-6 h-0.5 rounded", style: { backgroundColor: "rgba(0,0,0,0.3)" } }), /* @__PURE__ */ import_react14.default.createElement("div", { className: "w-6 h-0.5 rounded", style: { backgroundColor: "rgba(0,0,0,0.3)" } }), /* @__PURE__ */ import_react14.default.createElement("div", { className: "w-6 h-0.5 rounded", style: { backgroundColor: "rgba(0,0,0,0.3)" } })), /* @__PURE__ */ import_react14.default.createElement(
3377
+ "button",
3378
+ {
3379
+ onClick: onPayment,
3380
+ disabled: isPayDisabled,
3381
+ className: "px-5 py-2.5 rounded-xl font-bold text-white flex items-center gap-2 transition-all active:scale-95",
3382
+ style: {
3383
+ backgroundColor: isPayDisabled ? "#9ca3af" : "#ea580c",
3384
+ boxShadow: isPayDisabled ? "none" : "0 4px 12px rgba(234,88,12,0.4), inset 0 -2px 4px rgba(0,0,0,0.2)",
3385
+ cursor: isPayDisabled ? "not-allowed" : "pointer"
3386
+ }
3387
+ },
3388
+ isProcessing ? /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement(
3389
+ "div",
3390
+ {
3391
+ className: "w-4 h-4 border-2 border-white/30 border-t-white rounded-full",
3392
+ style: { animation: "spin 0.8s linear infinite" }
3393
+ }
3394
+ ), /* @__PURE__ */ import_react14.default.createElement("span", { className: "font-mono tracking-wider text-sm" }, "PAYING...")) : /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("span", { className: "font-mono tracking-wider text-sm" }, "PAY"), /* @__PURE__ */ import_react14.default.createElement(
3395
+ "svg",
3396
+ {
3397
+ width: "18",
3398
+ height: "18",
3399
+ viewBox: "0 0 24 24",
3400
+ fill: "none",
3401
+ stroke: "currentColor",
3402
+ strokeWidth: "2"
3403
+ },
3404
+ /* @__PURE__ */ import_react14.default.createElement("path", { d: "M12 2v20M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6" })
3405
+ ))
3406
+ ));
3407
+ };
3408
+ var CircleButton = ({ onClick, disabled, title, size = "normal", children }) => {
3409
+ const sizeClass = size === "small" ? "w-10 h-10" : "w-12 h-12";
3410
+ return /* @__PURE__ */ import_react14.default.createElement(
3411
+ "button",
3412
+ {
3413
+ onClick,
3414
+ disabled,
3415
+ className: `${sizeClass} rounded-full flex items-center justify-center transition-transform active:scale-95`,
3416
+ style: {
3417
+ backgroundColor: "#374151",
3418
+ boxShadow: "inset 0 -2px 4px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.2)",
3419
+ opacity: disabled ? 0.5 : 1
3420
+ },
3421
+ title
3422
+ },
3423
+ children
3424
+ );
3425
+ };
3426
+
3427
+ // src/react/components/checkout/V402CheckoutV2.tsx
3428
+ var generateRandomId = () => {
3429
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
3430
+ return Array.from({ length: 8 }, () => chars[Math.floor(Math.random() * chars.length)]).join("");
3431
+ };
3432
+ function V402CheckoutV2({
3433
+ checkoutId,
3434
+ headerInfo = {},
3435
+ primaryColor = "#84cc16",
3436
+ isModal = false,
3437
+ onPaymentComplete,
3438
+ additionalParams = {},
3439
+ expectedNetwork
3440
+ }) {
3441
+ const {
3442
+ title = "V402Pay Checkout",
3443
+ brandName = "V402PAY",
3444
+ receiptTitle = "V402 PAYMENT",
3445
+ tooltipText = "V402Pay - Accept Crypto Payments Easier"
3446
+ } = headerInfo;
3447
+ const endpoint = PROD_BACK_URL;
3448
+ const {
3449
+ supportedNetworks,
3450
+ isLoading: fetchingPaymentInfo,
3451
+ paymentInfo
3452
+ } = usePaymentInfo(checkoutId, endpoint, additionalParams);
3453
+ const targetNetwork = expectedNetwork || supportedNetworks[0];
3454
+ const { address, networkType, disconnect, ensureNetwork } = usePageNetwork(
3455
+ targetNetwork,
3456
+ { autoSwitch: !!targetNetwork, switchOnMount: true }
3457
+ );
3458
+ const { isProcessing, setIsProcessing, result, setResult, error, setError } = usePayment();
3459
+ const [paymentDetails, setPaymentDetails] = (0, import_react15.useState)(null);
3460
+ const [showReceipt, setShowReceipt] = (0, import_react15.useState)(false);
3461
+ const [tempReceiptId, setTempReceiptId] = (0, import_react15.useState)(() => generateRandomId());
3462
+ const handleDisconnect = () => {
3463
+ disconnect();
3464
+ setResult(null);
3465
+ setError(null);
3466
+ setShowReceipt(false);
3467
+ };
3468
+ const handlePayment = async () => {
3469
+ if (!networkType) return;
3470
+ setTempReceiptId(generateRandomId());
3471
+ setResult(null);
3472
+ setError(null);
3473
+ setIsProcessing(true);
3474
+ setShowReceipt(true);
3475
+ try {
3476
+ const response = await makePayment(networkType, checkoutId, endpoint, additionalParams, address || void 0);
3477
+ const data = await response.json();
3478
+ setResult(data);
3479
+ if (onPaymentComplete) {
3480
+ onPaymentComplete(data);
3481
+ }
3482
+ } catch (err) {
3483
+ setError(err.message || "Payment failed");
3484
+ } finally {
3485
+ setIsProcessing(false);
3486
+ }
3487
+ };
3488
+ const handleCloseReceipt = () => {
3489
+ setShowReceipt(false);
3490
+ setResult(null);
3491
+ setError(null);
3492
+ };
3493
+ (0, import_react15.useEffect)(() => {
3494
+ if (paymentInfo && paymentInfo.length > 0) {
3495
+ const firstPayment = paymentInfo[0];
3496
+ const rawAmount = firstPayment.maxAmountRequired?.toString() || "0";
3497
+ const decimals = 6;
3498
+ const humanReadableAmount = (Number(rawAmount) / Math.pow(10, decimals)).toFixed(2);
3499
+ const network = firstPayment.network || "Unknown";
3500
+ const currency = "USDC";
3501
+ setPaymentDetails({ amount: humanReadableAmount, currency, network });
3502
+ }
3503
+ }, [paymentInfo]);
3504
+ (0, import_react15.useEffect)(() => {
3505
+ if (targetNetwork && !fetchingPaymentInfo && ensureNetwork) {
3506
+ ensureNetwork(targetNetwork).catch((err) => {
3507
+ console.error("Failed to ensure network:", err);
3508
+ });
3509
+ }
3510
+ }, [targetNetwork, fetchingPaymentInfo]);
3511
+ (0, import_react15.useEffect)(() => {
3512
+ if (isProcessing || result || error) {
3513
+ setShowReceipt(true);
3514
+ }
3515
+ }, [isProcessing, result, error]);
3516
+ const hasInvalidCheckoutId = !fetchingPaymentInfo && (!paymentInfo || paymentInfo.length === 0);
3517
+ const NetworkIcon = paymentDetails ? getNetworkIcon(paymentDetails.network) : null;
3518
+ const screenText = paymentDetails ? `PAY $${paymentDetails.amount} ${paymentDetails.currency}` : "AWAITING...";
3519
+ const getStatusText = () => {
3520
+ if (hasInvalidCheckoutId) return "ERROR";
3521
+ if (fetchingPaymentInfo) return "LOADING";
3522
+ if (!address) return "CONNECT";
3523
+ if (isProcessing) return "PAYING";
3524
+ return "READY";
3525
+ };
3526
+ return /* @__PURE__ */ import_react15.default.createElement("div", { className: isModal ? "bg-transparent" : "min-h-screen bg-gray-100 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react15.default.createElement(
3527
+ "div",
3528
+ {
3529
+ className: "flex flex-col items-center",
3530
+ style: { width: isModal ? "100%" : "380px", maxWidth: "100%" }
3531
+ },
3532
+ /* @__PURE__ */ import_react15.default.createElement(
3533
+ Receipt,
3534
+ {
3535
+ isLoading: isProcessing,
3536
+ isVisible: showReceipt,
3537
+ result,
3538
+ error,
3539
+ paymentDetails,
3540
+ address,
3541
+ onClose: handleCloseReceipt,
3542
+ primaryColor,
3543
+ receiptTitle,
3544
+ tempReceiptId
3545
+ }
3546
+ ),
3547
+ /* @__PURE__ */ import_react15.default.createElement(
3548
+ "div",
3549
+ {
3550
+ className: "relative rounded-2xl p-3 shadow-2xl w-full",
3551
+ style: {
3552
+ backgroundColor: primaryColor,
3553
+ boxShadow: `0 16px 48px -8px ${primaryColor}66, 0 8px 24px -4px rgba(0,0,0,0.3);padding-bottom: 0px`
3554
+ }
3555
+ },
3556
+ /* @__PURE__ */ import_react15.default.createElement(
3557
+ "div",
3558
+ {
3559
+ className: "absolute top-0 left-1/2 -translate-x-1/2 w-1/3 h-2.5 rounded-b-lg",
3560
+ style: { backgroundColor: "rgba(0,0,0,0.4)" }
3561
+ }
3562
+ ),
3563
+ /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex justify-between items-center mb-2 mt-1 px-1" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react15.default.createElement(
3564
+ "div",
3565
+ {
3566
+ className: "w-2 h-2 rounded-full",
3567
+ style: {
3568
+ backgroundColor: address ? "#22c55e" : "#ef4444",
3569
+ animation: "pulse 2s ease-in-out infinite"
3570
+ }
3571
+ }
3572
+ ), /* @__PURE__ */ import_react15.default.createElement(
3573
+ "span",
3574
+ {
3575
+ className: "text-xs font-mono font-bold tracking-wider",
3576
+ style: { color: "rgba(0,0,0,0.7)" }
3577
+ },
3578
+ getStatusText()
3579
+ )), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-1.5" }, paymentDetails && NetworkIcon && /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react15.default.createElement(NetworkIcon, { width: 12, height: 12, style: { color: "rgba(0,0,0,0.7)" } }), /* @__PURE__ */ import_react15.default.createElement("span", { className: "text-xs font-mono font-bold", style: { color: "rgba(0,0,0,0.7)" } }, paymentDetails.network)))),
3580
+ /* @__PURE__ */ import_react15.default.createElement(
3581
+ TerminalScreen,
3582
+ {
3583
+ title,
3584
+ tooltipText,
3585
+ hasInvalidCheckoutId,
3586
+ fetchingPaymentInfo,
3587
+ address,
3588
+ paymentDetails,
3589
+ screenText,
3590
+ supportedNetworks
3591
+ }
3592
+ ),
3593
+ /* @__PURE__ */ import_react15.default.createElement(
3594
+ TerminalButtons,
3595
+ {
3596
+ address,
3597
+ showReceipt,
3598
+ isProcessing,
3599
+ paymentDetails,
3600
+ hasInvalidCheckoutId,
3601
+ onDisconnect: handleDisconnect,
3602
+ onClearReceipt: handleCloseReceipt,
3603
+ onPayment: handlePayment
3604
+ }
3605
+ ),
3606
+ brandName && /* @__PURE__ */ import_react15.default.createElement("div", { className: "text-center mt-0 mb-0" }, /* @__PURE__ */ import_react15.default.createElement(
3607
+ "div",
3608
+ {
3609
+ className: "inline-block px-2 py-0.5 rounded text-[10px] font-mono font-bold tracking-[0.2em]",
3610
+ style: {
3611
+ backgroundColor: "#1a1a1a",
3612
+ color: "#9acd32",
3613
+ boxShadow: "inset 0 1px 3px rgba(0,0,0,0.8), 0 1px 0 rgba(255,255,255,0.1)",
3614
+ border: "1px solid rgba(0,0,0,0.5)",
3615
+ textShadow: "0 0 4px #9acd3280"
3616
+ }
3617
+ },
3618
+ brandName
3619
+ ))
3620
+ )
3621
+ ), /* @__PURE__ */ import_react15.default.createElement(AnimationStyles, null));
3622
+ }
2795
3623
  // Annotate the CommonJS export names for ESM import in node:
2796
3624
  0 && (module.exports = {
3625
+ AnimationStyles,
3626
+ Toast,
2797
3627
  V402Checkout,
3628
+ V402CheckoutV2,
2798
3629
  WalletConnect,
2799
3630
  WalletSelectModal,
3631
+ checkoutAnimations,
2800
3632
  usePageNetwork,
2801
3633
  usePayment,
2802
3634
  usePaymentInfo,
3635
+ useToast,
2803
3636
  useWallet
2804
3637
  });
2805
3638
  //# sourceMappingURL=index.js.map