uvd-x402-sdk 2.10.0 → 2.11.1

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.
Files changed (45) hide show
  1. package/dist/adapters/index.js +16 -0
  2. package/dist/adapters/index.js.map +1 -1
  3. package/dist/adapters/index.mjs +16 -0
  4. package/dist/adapters/index.mjs.map +1 -1
  5. package/dist/backend/index.js +16 -0
  6. package/dist/backend/index.js.map +1 -1
  7. package/dist/backend/index.mjs +16 -0
  8. package/dist/backend/index.mjs.map +1 -1
  9. package/dist/index.js +16 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +16 -0
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/providers/algorand/index.d.mts +31 -10
  14. package/dist/providers/algorand/index.d.ts +31 -10
  15. package/dist/providers/algorand/index.js +125 -13
  16. package/dist/providers/algorand/index.js.map +1 -1
  17. package/dist/providers/algorand/index.mjs +125 -13
  18. package/dist/providers/algorand/index.mjs.map +1 -1
  19. package/dist/providers/evm/index.js +16 -0
  20. package/dist/providers/evm/index.js.map +1 -1
  21. package/dist/providers/evm/index.mjs +16 -0
  22. package/dist/providers/evm/index.mjs.map +1 -1
  23. package/dist/providers/near/index.js +16 -0
  24. package/dist/providers/near/index.js.map +1 -1
  25. package/dist/providers/near/index.mjs +16 -0
  26. package/dist/providers/near/index.mjs.map +1 -1
  27. package/dist/providers/solana/index.js +16 -0
  28. package/dist/providers/solana/index.js.map +1 -1
  29. package/dist/providers/solana/index.mjs +16 -0
  30. package/dist/providers/solana/index.mjs.map +1 -1
  31. package/dist/providers/stellar/index.js +16 -0
  32. package/dist/providers/stellar/index.js.map +1 -1
  33. package/dist/providers/stellar/index.mjs +16 -0
  34. package/dist/providers/stellar/index.mjs.map +1 -1
  35. package/dist/react/index.js +16 -0
  36. package/dist/react/index.js.map +1 -1
  37. package/dist/react/index.mjs +16 -0
  38. package/dist/react/index.mjs.map +1 -1
  39. package/dist/utils/index.js +16 -0
  40. package/dist/utils/index.js.map +1 -1
  41. package/dist/utils/index.mjs +16 -0
  42. package/dist/utils/index.mjs.map +1 -1
  43. package/package.json +6 -1
  44. package/src/chains/index.ts +14 -0
  45. package/src/providers/algorand/index.ts +155 -19
@@ -470,6 +470,22 @@ var SUPPORTED_CHAINS = {
470
470
  name: "USD Coin",
471
471
  version: "1"
472
472
  },
473
+ tokens: {
474
+ usdc: {
475
+ address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
476
+ // USDC SPL token mint
477
+ decimals: 6,
478
+ name: "USD Coin",
479
+ version: "1"
480
+ },
481
+ ausd: {
482
+ address: "AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9",
483
+ // AUSD Token2022 mint
484
+ decimals: 6,
485
+ name: "Agora Dollar",
486
+ version: "1"
487
+ }
488
+ },
473
489
  x402: {
474
490
  facilitatorUrl: DEFAULT_FACILITATOR_URL,
475
491
  enabled: true
@@ -668,36 +684,113 @@ function uint8ArrayToBase64(bytes) {
668
684
  }
669
685
  var algosdk = null;
670
686
  var PeraWalletConnect = null;
687
+ var LuteConnect = null;
671
688
  async function loadAlgorandDeps() {
672
689
  if (!algosdk) {
673
690
  algosdk = await import('algosdk');
674
691
  }
692
+ }
693
+ async function loadPeraWallet() {
675
694
  if (!PeraWalletConnect) {
676
695
  const peraModule = await import('@perawallet/connect');
677
696
  PeraWalletConnect = peraModule.PeraWalletConnect;
678
697
  }
679
698
  }
699
+ async function loadLuteWallet() {
700
+ if (!LuteConnect) {
701
+ try {
702
+ const luteModule = await import('lute-connect');
703
+ LuteConnect = luteModule.default;
704
+ } catch {
705
+ LuteConnect = null;
706
+ }
707
+ }
708
+ }
709
+ function isLuteAvailable() {
710
+ if (typeof window === "undefined") return false;
711
+ const win = window;
712
+ return !!(win.algorand || win.lute);
713
+ }
680
714
  var AlgorandProvider = class {
681
- id = "pera";
682
- name = "Pera Wallet";
715
+ id = "algorand";
716
+ name = "Algorand Wallet";
683
717
  networkType = "algorand";
718
+ // Active wallet type
719
+ walletType = null;
720
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
721
+ luteWallet = null;
684
722
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
685
723
  peraWallet = null;
686
724
  address = null;
687
725
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
688
726
  algodClients = /* @__PURE__ */ new Map();
689
727
  /**
690
- * Check if Pera Wallet is available
691
- * Note: Pera works as a WalletConnect modal, so it's always "available"
728
+ * Check if any Algorand wallet is available
729
+ * Returns true if Lute extension is installed OR we can use Pera (always available via WalletConnect)
692
730
  */
693
731
  isAvailable() {
694
732
  return typeof window !== "undefined";
695
733
  }
696
734
  /**
697
- * Connect to Pera Wallet
735
+ * Get the name of the currently connected wallet
736
+ */
737
+ getWalletName() {
738
+ if (this.walletType === "lute") return "Lute Wallet";
739
+ if (this.walletType === "pera") return "Pera Wallet";
740
+ return "Algorand Wallet";
741
+ }
742
+ /**
743
+ * Connect to Algorand wallet
744
+ * Priority: Lute (desktop extension) > Pera (mobile via WalletConnect)
698
745
  */
699
746
  async connect(_chainName) {
700
747
  await loadAlgorandDeps();
748
+ if (isLuteAvailable()) {
749
+ try {
750
+ return await this.connectLute();
751
+ } catch (error) {
752
+ console.warn("Lute connection failed, falling back to Pera:", error);
753
+ }
754
+ }
755
+ return await this.connectPera();
756
+ }
757
+ /**
758
+ * Connect to Lute Wallet (desktop browser extension)
759
+ */
760
+ async connectLute() {
761
+ await loadLuteWallet();
762
+ if (!LuteConnect) {
763
+ throw new X402Error("Lute Wallet SDK not available", "WALLET_NOT_FOUND");
764
+ }
765
+ try {
766
+ this.luteWallet = new LuteConnect("402milly");
767
+ const genesisId = "mainnet-v1.0";
768
+ const accounts = await this.luteWallet.connect(genesisId);
769
+ if (!accounts || accounts.length === 0) {
770
+ throw new X402Error("No accounts returned from Lute Wallet", "WALLET_CONNECTION_REJECTED");
771
+ }
772
+ this.address = accounts[0];
773
+ this.walletType = "lute";
774
+ return accounts[0];
775
+ } catch (error) {
776
+ if (error instanceof X402Error) throw error;
777
+ if (error instanceof Error) {
778
+ if (error.message.includes("rejected") || error.message.includes("cancelled")) {
779
+ throw new X402Error("Connection rejected by user", "WALLET_CONNECTION_REJECTED");
780
+ }
781
+ }
782
+ throw new X402Error(
783
+ `Failed to connect Lute Wallet: ${error instanceof Error ? error.message : "Unknown error"}`,
784
+ "UNKNOWN_ERROR",
785
+ error
786
+ );
787
+ }
788
+ }
789
+ /**
790
+ * Connect to Pera Wallet (mobile via WalletConnect)
791
+ */
792
+ async connectPera() {
793
+ await loadPeraWallet();
701
794
  if (!PeraWalletConnect) {
702
795
  throw new X402Error("Failed to load Pera Wallet SDK", "WALLET_NOT_FOUND");
703
796
  }
@@ -706,6 +799,7 @@ var AlgorandProvider = class {
706
799
  const accounts = await this.peraWallet.reconnectSession();
707
800
  if (accounts.length > 0) {
708
801
  this.address = accounts[0];
802
+ this.walletType = "pera";
709
803
  return accounts[0];
710
804
  }
711
805
  const newAccounts = await this.peraWallet.connect();
@@ -713,8 +807,10 @@ var AlgorandProvider = class {
713
807
  throw new X402Error("No accounts returned from Pera Wallet", "WALLET_CONNECTION_REJECTED");
714
808
  }
715
809
  this.address = newAccounts[0];
810
+ this.walletType = "pera";
716
811
  this.peraWallet.connector?.on("disconnect", () => {
717
812
  this.address = null;
813
+ this.walletType = null;
718
814
  });
719
815
  return newAccounts[0];
720
816
  } catch (error) {
@@ -731,17 +827,21 @@ var AlgorandProvider = class {
731
827
  }
732
828
  }
733
829
  /**
734
- * Disconnect from Pera Wallet
830
+ * Disconnect from wallet
735
831
  */
736
832
  async disconnect() {
737
- if (this.peraWallet) {
833
+ if (this.walletType === "lute" && this.luteWallet) {
834
+ this.luteWallet = null;
835
+ }
836
+ if (this.walletType === "pera" && this.peraWallet) {
738
837
  try {
739
838
  await this.peraWallet.disconnect();
740
839
  } catch {
741
840
  }
841
+ this.peraWallet = null;
742
842
  }
743
- this.peraWallet = null;
744
843
  this.address = null;
844
+ this.walletType = null;
745
845
  this.algodClients.clear();
746
846
  }
747
847
  /**
@@ -785,7 +885,7 @@ var AlgorandProvider = class {
785
885
  */
786
886
  async signPayment(paymentInfo, chainConfig) {
787
887
  await loadAlgorandDeps();
788
- if (!this.peraWallet || !this.address) {
888
+ if (!this.address || !this.walletType) {
789
889
  throw new X402Error("Wallet not connected", "WALLET_NOT_CONNECTED");
790
890
  }
791
891
  if (!algosdk) {
@@ -805,11 +905,23 @@ var AlgorandProvider = class {
805
905
  suggestedParams,
806
906
  note: new TextEncoder().encode("x402 payment via uvd-x402-sdk")
807
907
  });
808
- const signedTxns = await this.peraWallet.signTransaction([[{ txn }]]);
809
- if (!signedTxns || signedTxns.length === 0) {
810
- throw new X402Error("No signed transaction returned", "SIGNATURE_REJECTED");
908
+ let signedTxn;
909
+ if (this.walletType === "lute" && this.luteWallet) {
910
+ const txnBase64 = uint8ArrayToBase64(txn.toByte());
911
+ const signedTxns = await this.luteWallet.signTxns([{ txn: txnBase64 }]);
912
+ if (!signedTxns || signedTxns.length === 0 || !signedTxns[0]) {
913
+ throw new X402Error("No signed transaction returned", "SIGNATURE_REJECTED");
914
+ }
915
+ signedTxn = Uint8Array.from(atob(signedTxns[0]), (c) => c.charCodeAt(0));
916
+ } else if (this.walletType === "pera" && this.peraWallet) {
917
+ const signedTxns = await this.peraWallet.signTransaction([[{ txn }]]);
918
+ if (!signedTxns || signedTxns.length === 0) {
919
+ throw new X402Error("No signed transaction returned", "SIGNATURE_REJECTED");
920
+ }
921
+ signedTxn = signedTxns[0];
922
+ } else {
923
+ throw new X402Error("No wallet available for signing", "WALLET_NOT_CONNECTED");
811
924
  }
812
- const signedTxn = signedTxns[0];
813
925
  const payload = {
814
926
  from: this.address,
815
927
  to: recipient,