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.
- package/dist/adapters/index.js +16 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +16 -0
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/backend/index.js +16 -0
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/index.mjs +16 -0
- package/dist/backend/index.mjs.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -0
- package/dist/index.mjs.map +1 -1
- package/dist/providers/algorand/index.d.mts +31 -10
- package/dist/providers/algorand/index.d.ts +31 -10
- package/dist/providers/algorand/index.js +125 -13
- package/dist/providers/algorand/index.js.map +1 -1
- package/dist/providers/algorand/index.mjs +125 -13
- package/dist/providers/algorand/index.mjs.map +1 -1
- package/dist/providers/evm/index.js +16 -0
- package/dist/providers/evm/index.js.map +1 -1
- package/dist/providers/evm/index.mjs +16 -0
- package/dist/providers/evm/index.mjs.map +1 -1
- package/dist/providers/near/index.js +16 -0
- package/dist/providers/near/index.js.map +1 -1
- package/dist/providers/near/index.mjs +16 -0
- package/dist/providers/near/index.mjs.map +1 -1
- package/dist/providers/solana/index.js +16 -0
- package/dist/providers/solana/index.js.map +1 -1
- package/dist/providers/solana/index.mjs +16 -0
- package/dist/providers/solana/index.mjs.map +1 -1
- package/dist/providers/stellar/index.js +16 -0
- package/dist/providers/stellar/index.js.map +1 -1
- package/dist/providers/stellar/index.mjs +16 -0
- package/dist/providers/stellar/index.mjs.map +1 -1
- package/dist/react/index.js +16 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +16 -0
- package/dist/react/index.mjs.map +1 -1
- package/dist/utils/index.js +16 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +16 -0
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +6 -1
- package/src/chains/index.ts +14 -0
- 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 = "
|
|
682
|
-
name = "
|
|
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
|
|
691
|
-
*
|
|
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
|
-
*
|
|
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
|
|
830
|
+
* Disconnect from wallet
|
|
735
831
|
*/
|
|
736
832
|
async disconnect() {
|
|
737
|
-
if (this.
|
|
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.
|
|
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
|
-
|
|
809
|
-
if (
|
|
810
|
-
|
|
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,
|