@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.
package/dist/index.mjs CHANGED
@@ -173,9 +173,27 @@ function getWalletDisplayName(networkType) {
173
173
  return "Unknown Wallet";
174
174
  }
175
175
  }
176
+ function getAllConnectedWalletIds() {
177
+ if (typeof window === "undefined") {
178
+ return {};
179
+ }
180
+ try {
181
+ const cached = localStorage.getItem(CONNECTED_WALLET_IDS_KEY);
182
+ return cached ? JSON.parse(cached) : {};
183
+ } catch (error) {
184
+ console.error("Failed to parse connected wallet IDs:", error);
185
+ return {};
186
+ }
187
+ }
188
+ function getConnectedWalletId(networkType) {
189
+ const walletIds = getAllConnectedWalletIds();
190
+ return walletIds[networkType] || null;
191
+ }
192
+ var CONNECTED_WALLET_IDS_KEY;
176
193
  var init_wallet = __esm({
177
194
  "src/utils/wallet.ts"() {
178
195
  "use strict";
196
+ CONNECTED_WALLET_IDS_KEY = "connected_wallet_ids";
179
197
  }
180
198
  });
181
199
 
@@ -196,6 +214,51 @@ import {
196
214
  init_wallet();
197
215
 
198
216
  // src/utils/wallet-discovery.ts
217
+ init_wallet();
218
+ var SOLANA_WALLETS = [
219
+ {
220
+ id: "phantom",
221
+ name: "Phantom",
222
+ // Phantom official icon
223
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZD0iTTExMC41IDY0QzExMC41IDg5Ljk1NjggODkuMjAxIDExMSA2My41IDExMUg0MS41QzM2LjI1MzMgMTExIDMyIDEwNi43NDcgMzIgMTAxLjVWNTQuNUMzMiAzMS4wMjggNTEuMDI4IDEyIDc0LjUgMTJDOTcuOTcyIDEyIDExNyAzMS4wMjggMTE3IDU0LjVWNTUuNUMxMTcgNTguNTM3NiAxMTQuNTM4IDYxIDExMS41IDYxSDEwOS41QzEwNi40NjIgNjEgMTA0IDYzLjQ2MjQgMTA0IDY2LjVWNjhDMTA0IDcxLjg2NiAxMDcuMTM0IDc1IDExMSA3NUgxMTEuNUMxMTQuNTM4IDc1IDExNyA3Mi41Mzc2IDExNyA2OS41VjY0SDExMC41WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEyOF8xMjgpIi8+CjxwYXRoIGQ9Ik00OC41IDY3QzUxLjUzNzYgNjcgNTQgNjQuNTM3NiA1NCA2MS41QzU0IDU4LjQ2MjQgNTEuNTM3NiA1NiA0OC41IDU2QzQ1LjQ2MjQgNTYgNDMgNTguNDYyNCA0MyA2MS41QzQzIDY0LjUzNzYgNDUuNDYyNCA2NyA0OC41IDY3WiIgZmlsbD0iIzFCMUIxQiIvPgo8cGF0aCBkPSJNNzMuNSA2N0M3Ni41Mzc2IDY3IDc5IDY0LjUzNzYgNzkgNjEuNUM3OSA1OC40NjI0IDc2LjUzNzYgNTYgNzMuNSA1NkM3MC40NjI0IDU2IDY4IDU4LjQ2MjQgNjggNjEuNUM2OCA2NC41Mzc2IDcwLjQ2MjQgNjcgNzMuNSA2N1oiIGZpbGw9IiMxQjFCMUIiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xMjhfMTI4IiB4MT0iMTE3IiB5MT0iMTIiIHgyPSIxMTciIHkyPSIxMTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC44MiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPg==",
224
+ detect: () => window.phantom?.solana
225
+ },
226
+ {
227
+ id: "solflare",
228
+ name: "Solflare",
229
+ // Solflare icon
230
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiNGQzZEMDEiLz4KPHBhdGggZD0iTTk2IDY0TDY0IDMyTDMyIDY0TDY0IDk2TDk2IDY0WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+",
231
+ detect: () => window.solflare
232
+ },
233
+ {
234
+ id: "backpack",
235
+ name: "Backpack",
236
+ // Backpack icon (red coral color)
237
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiNFMzM0MzAiLz4KPHBhdGggZD0iTTQwIDQ4SDg4VjgwQzg4IDg4LjgzNjYgODAuODM2NiA5NiA3MiA5Nkg1NkM0Ny4xNjM0IDk2IDQwIDg4LjgzNjYgNDAgODBWNDhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTIgMzJINzZWNDhINTJWMzJaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4=",
238
+ detect: () => window.backpack
239
+ },
240
+ {
241
+ id: "okx-solana",
242
+ name: "OKX Wallet",
243
+ // OKX icon
244
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9ImJsYWNrIi8+CjxyZWN0IHg9IjI0IiB5PSIyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPHJlY3QgeD0iNTIiIHk9IjI0IiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI0IiBmaWxsPSJ3aGl0ZSIvPgo8cmVjdCB4PSI4MCIgeT0iMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgcng9IjQiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI0IiB5PSI1MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPHJlY3QgeD0iODAiIHk9IjUyIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI0IiBmaWxsPSJ3aGl0ZSIvPgo8cmVjdCB4PSIyNCIgeT0iODAiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgcng9IjQiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjUyIiB5PSI4MCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPHJlY3QgeD0iODAiIHk9IjgwIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI0IiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4=",
245
+ detect: () => window.okxwallet?.solana
246
+ },
247
+ {
248
+ id: "coinbase-solana",
249
+ name: "Coinbase Wallet",
250
+ // Coinbase icon (blue)
251
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiMwMDUyRkYiLz4KPGNpcmNsZSBjeD0iNjQiIGN5PSI2NCIgcj0iMzYiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjQ4IiB5PSI1NiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjE2IiByeD0iNCIgZmlsbD0iIzAwNTJGRiIvPgo8L3N2Zz4=",
252
+ detect: () => window.coinbaseSolana
253
+ },
254
+ {
255
+ id: "trust-solana",
256
+ name: "Trust Wallet",
257
+ // Trust Wallet icon
258
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiMwNTAwRkYiLz4KPHBhdGggZD0iTTY0IDI0QzY0IDI0IDk2IDQwIDk2IDY0Qzk2IDg4IDY0IDEwNCA2NCAxMDRDNjQgMTA0IDMyIDg4IDMyIDY0QzMyIDQwIDY0IDI0IDY0IDI0WiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI2IiBmaWxsPSJub25lIi8+Cjwvc3ZnPg==",
259
+ detect: () => window.trustwallet?.solana
260
+ }
261
+ ];
199
262
  var evmWallets = /* @__PURE__ */ new Map();
200
263
  var evmDiscoveryListeners = /* @__PURE__ */ new Set();
201
264
  var evmDiscoveryInitialized = false;
@@ -210,10 +273,111 @@ function initEVMWalletDiscovery() {
210
273
  }));
211
274
  window.dispatchEvent(new Event("eip6963:requestProvider"));
212
275
  }
276
+ function getEVMWallets() {
277
+ const wallets = [];
278
+ const detectedNames = /* @__PURE__ */ new Set();
279
+ evmWallets.forEach((detail, uuid) => {
280
+ if (!detectedNames.has(detail.info.name)) {
281
+ wallets.push({
282
+ id: uuid,
283
+ name: detail.info.name,
284
+ icon: detail.info.icon,
285
+ networkType: "evm" /* EVM */,
286
+ provider: detail.provider,
287
+ installed: true
288
+ });
289
+ detectedNames.add(detail.info.name);
290
+ }
291
+ });
292
+ if (wallets.length === 0 && typeof window !== "undefined" && window.ethereum) {
293
+ const ethereum = window.ethereum;
294
+ const walletName = ethereum.isMetaMask ? "MetaMask" : ethereum.isCoinbaseWallet ? "Coinbase Wallet" : ethereum.isOkxWallet ? "OKX Wallet" : "Browser Wallet";
295
+ if (!detectedNames.has(walletName)) {
296
+ wallets.push({
297
+ id: "injected",
298
+ name: walletName,
299
+ icon: "",
300
+ // Will use first letter as avatar
301
+ networkType: "evm" /* EVM */,
302
+ provider: ethereum,
303
+ installed: true
304
+ });
305
+ }
306
+ }
307
+ return wallets;
308
+ }
309
+ function getSolanaWallets() {
310
+ if (typeof window === "undefined") return [];
311
+ const wallets = [];
312
+ const detectedProviders = /* @__PURE__ */ new Set();
313
+ const detectedNames = /* @__PURE__ */ new Set();
314
+ for (const wallet of SOLANA_WALLETS) {
315
+ const provider = wallet.detect();
316
+ if (provider && !detectedNames.has(wallet.name)) {
317
+ wallets.push({
318
+ id: wallet.id,
319
+ name: wallet.name,
320
+ icon: wallet.icon,
321
+ networkType: "solana" /* SOLANA */,
322
+ provider,
323
+ installed: true
324
+ });
325
+ detectedProviders.add(provider);
326
+ detectedNames.add(wallet.name);
327
+ }
328
+ }
329
+ const windowSolana = window.solana;
330
+ if (windowSolana && !detectedProviders.has(windowSolana)) {
331
+ const walletName = windowSolana.isPhantom ? "Phantom" : windowSolana.isSolflare ? "Solflare" : windowSolana.isBackpack ? "Backpack" : windowSolana.walletName || "Solana Wallet";
332
+ if (!detectedNames.has(walletName)) {
333
+ wallets.push({
334
+ id: "solana-unknown",
335
+ name: walletName,
336
+ icon: "",
337
+ // Will use first letter as avatar
338
+ networkType: "solana" /* SOLANA */,
339
+ provider: windowSolana,
340
+ installed: true
341
+ });
342
+ }
343
+ }
344
+ return wallets;
345
+ }
346
+ function getWalletsForNetwork(networkType) {
347
+ switch (networkType) {
348
+ case "evm" /* EVM */:
349
+ return getEVMWallets();
350
+ case "solana" /* SOLANA */:
351
+ case "svm" /* SVM */:
352
+ return getSolanaWallets();
353
+ default:
354
+ return [];
355
+ }
356
+ }
357
+ function getWalletByName(name, networkType) {
358
+ const wallets = getWalletsForNetwork(networkType);
359
+ return wallets.find((w) => w.name === name) || null;
360
+ }
361
+ function restoreConnectedWallet(networkType) {
362
+ const savedWalletName = getConnectedWalletId(networkType);
363
+ if (!savedWalletName) return null;
364
+ const wallet = getWalletByName(savedWalletName, networkType);
365
+ if (wallet) {
366
+ currentConnectedWallet = wallet;
367
+ console.log(`\u2705 Restored wallet provider: ${wallet.name}`);
368
+ return wallet;
369
+ }
370
+ console.warn(`\u26A0\uFE0F Could not find wallet with name: ${savedWalletName}`);
371
+ return null;
372
+ }
213
373
  function getWalletProviderForPayment(networkType) {
214
374
  if (currentConnectedWallet && currentConnectedWallet.networkType === networkType) {
215
375
  return currentConnectedWallet.provider;
216
376
  }
377
+ const restoredWallet = restoreConnectedWallet(networkType);
378
+ if (restoredWallet) {
379
+ return restoredWallet.provider;
380
+ }
217
381
  if (typeof window === "undefined") return null;
218
382
  switch (networkType) {
219
383
  case "evm" /* EVM */:
@@ -491,7 +655,7 @@ function createEvmPaymentFetch(config) {
491
655
  // src/utils/payment-helpers.ts
492
656
  init_common();
493
657
  import { ethers as ethers2 } from "ethers";
494
- async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, additionalParams) {
658
+ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, additionalParams, expectedAddress) {
495
659
  const fullEndpoint = `${endpoint}/${merchantId}`;
496
660
  let response;
497
661
  const requestInit = additionalParams && Object.keys(additionalParams).length > 0 ? {
@@ -503,11 +667,19 @@ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, ad
503
667
  if (networkType === "solana" /* SOLANA */ || networkType === "svm" /* SVM */) {
504
668
  const solana = getWalletProviderForPayment(networkType);
505
669
  if (!solana) {
506
- throw new Error("\u8BF7\u5148\u8FDE\u63A5 Solana \u94B1\u5305");
670
+ throw new Error("Please connect your Solana wallet first.");
507
671
  }
508
672
  if (!solana.isConnected) {
509
673
  await solana.connect();
510
674
  }
675
+ if (expectedAddress && solana.publicKey) {
676
+ const currentAddress = solana.publicKey.toString();
677
+ if (currentAddress !== expectedAddress) {
678
+ throw new Error(
679
+ `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.`
680
+ );
681
+ }
682
+ }
511
683
  response = await handleSvmPayment(fullEndpoint, {
512
684
  wallet: solana,
513
685
  network: "solana"
@@ -516,12 +688,18 @@ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, ad
516
688
  } else if (networkType === "evm" /* EVM */) {
517
689
  const ethereum = getWalletProviderForPayment(networkType);
518
690
  if (!ethereum) {
519
- throw new Error("\u8BF7\u5148\u8FDE\u63A5 EVM \u94B1\u5305");
691
+ throw new Error("Please connect the EVM wallet first");
520
692
  }
521
693
  const provider = new ethers2.BrowserProvider(ethereum);
522
694
  const signer = await provider.getSigner();
695
+ const currentAddress = await signer.getAddress();
696
+ if (expectedAddress && currentAddress.toLowerCase() !== expectedAddress.toLowerCase()) {
697
+ throw new Error(
698
+ `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.`
699
+ );
700
+ }
523
701
  const wallet = {
524
- address: await signer.getAddress(),
702
+ address: currentAddress,
525
703
  signTypedData: async (domain, types, message) => {
526
704
  return await signer.signTypedData(domain, types, message);
527
705
  },
@@ -544,7 +722,7 @@ async function makePayment(networkType, merchantId, endpoint = PROD_BACK_URL, ad
544
722
  // Will use backend's network configuration
545
723
  }, requestInit);
546
724
  } else {
547
- throw new Error(`\u4E0D\u652F\u6301\u7684\u7F51\u7EDC\u7C7B\u578B: ${networkType}`);
725
+ throw new Error(`Unsupported network types: ${networkType}`);
548
726
  }
549
727
  return response;
550
728
  }