@txnlab/use-wallet 0.1.23 → 1.0.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/README.md +255 -95
- package/dist/cjs/algod/index.d.ts +3 -2
- package/dist/cjs/clients/algosigner/client.d.ts +35 -0
- package/dist/cjs/clients/algosigner/constants.d.ts +2 -0
- package/dist/cjs/clients/algosigner/index.d.ts +2 -0
- package/dist/cjs/clients/algosigner/types.d.ts +40 -0
- package/dist/{esm/clients → cjs/clients/base}/base.d.ts +12 -25
- package/dist/cjs/clients/base/index.d.ts +2 -0
- package/dist/cjs/clients/defly/client.d.ts +37 -0
- package/dist/cjs/clients/defly/constants.d.ts +1 -0
- package/dist/cjs/clients/defly/index.d.ts +2 -0
- package/dist/cjs/clients/defly/types.d.ts +36 -0
- package/dist/cjs/clients/exodus/client.d.ts +33 -0
- package/dist/cjs/clients/exodus/constants.d.ts +1 -0
- package/dist/cjs/clients/exodus/index.d.ts +2 -0
- package/dist/cjs/clients/exodus/types.d.ts +40 -0
- package/dist/cjs/clients/index.d.ts +11 -15
- package/dist/cjs/clients/kmd/client.d.ts +29 -0
- package/dist/cjs/clients/kmd/constants.d.ts +1 -0
- package/dist/cjs/clients/kmd/index.d.ts +2 -0
- package/dist/cjs/clients/kmd/types.d.ts +38 -0
- package/dist/cjs/clients/{myalgowallet.d.ts → myalgo/client.d.ts} +14 -17
- package/dist/cjs/clients/myalgo/constants.d.ts +1 -0
- package/dist/cjs/clients/myalgo/index.d.ts +2 -0
- package/dist/cjs/clients/myalgo/types.d.ts +23 -0
- package/dist/cjs/clients/pera/client.d.ts +35 -0
- package/dist/cjs/clients/pera/constants.d.ts +1 -0
- package/dist/cjs/clients/pera/index.d.ts +2 -0
- package/dist/cjs/clients/pera/types.d.ts +36 -0
- package/dist/cjs/clients/walletconnect/client.d.ts +37 -0
- package/dist/cjs/clients/walletconnect/constants.d.ts +2 -0
- package/dist/cjs/clients/walletconnect/index.d.ts +2 -0
- package/dist/cjs/clients/walletconnect/types.d.ts +54 -0
- package/dist/cjs/constants/constants.d.ts +12 -16
- package/dist/cjs/hooks/index.d.ts +0 -1
- package/dist/cjs/hooks/useWallet.d.ts +140 -8
- package/dist/cjs/index.d.ts +4 -2
- package/dist/cjs/index.js +736 -739
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/store/index.d.ts +1 -0
- package/dist/cjs/store/state/clientStore.d.ts +22 -0
- package/dist/cjs/types/node.d.ts +3 -0
- package/dist/cjs/types/wallet.d.ts +2 -2
- package/dist/cjs/utils/index.d.ts +2 -2
- package/dist/cjs/utils/initializeProviders.d.ts +13 -0
- package/dist/cjs/utils/reconnectProviders.d.ts +6 -0
- package/dist/esm/algod/index.d.ts +3 -2
- package/dist/esm/clients/algosigner/client.d.ts +35 -0
- package/dist/esm/clients/algosigner/constants.d.ts +2 -0
- package/dist/esm/clients/algosigner/index.d.ts +2 -0
- package/dist/esm/clients/algosigner/types.d.ts +40 -0
- package/dist/{cjs/clients → esm/clients/base}/base.d.ts +12 -25
- package/dist/esm/clients/base/index.d.ts +2 -0
- package/dist/esm/clients/defly/client.d.ts +37 -0
- package/dist/esm/clients/defly/constants.d.ts +1 -0
- package/dist/esm/clients/defly/index.d.ts +2 -0
- package/dist/esm/clients/defly/types.d.ts +36 -0
- package/dist/esm/clients/exodus/client.d.ts +33 -0
- package/dist/esm/clients/exodus/constants.d.ts +1 -0
- package/dist/esm/clients/exodus/index.d.ts +2 -0
- package/dist/esm/clients/exodus/types.d.ts +40 -0
- package/dist/esm/clients/index.d.ts +11 -15
- package/dist/esm/clients/kmd/client.d.ts +29 -0
- package/dist/esm/clients/kmd/constants.d.ts +1 -0
- package/dist/esm/clients/kmd/index.d.ts +2 -0
- package/dist/esm/clients/kmd/types.d.ts +38 -0
- package/dist/esm/clients/{myalgowallet.d.ts → myalgo/client.d.ts} +14 -17
- package/dist/esm/clients/myalgo/constants.d.ts +1 -0
- package/dist/esm/clients/myalgo/index.d.ts +2 -0
- package/dist/esm/clients/myalgo/types.d.ts +23 -0
- package/dist/esm/clients/pera/client.d.ts +35 -0
- package/dist/esm/clients/pera/constants.d.ts +1 -0
- package/dist/esm/clients/pera/index.d.ts +2 -0
- package/dist/esm/clients/pera/types.d.ts +36 -0
- package/dist/esm/clients/walletconnect/client.d.ts +37 -0
- package/dist/esm/clients/walletconnect/constants.d.ts +2 -0
- package/dist/esm/clients/walletconnect/index.d.ts +2 -0
- package/dist/esm/clients/walletconnect/types.d.ts +54 -0
- package/dist/esm/constants/constants.d.ts +12 -16
- package/dist/esm/hooks/index.d.ts +0 -1
- package/dist/esm/hooks/useWallet.d.ts +140 -8
- package/dist/esm/index.d.ts +4 -2
- package/dist/esm/index.js +724 -730
- package/dist/esm/store/index.d.ts +1 -0
- package/dist/esm/store/state/clientStore.d.ts +22 -0
- package/dist/esm/types/node.d.ts +3 -0
- package/dist/esm/types/wallet.d.ts +2 -2
- package/dist/esm/utils/index.d.ts +2 -2
- package/dist/esm/utils/initializeProviders.d.ts +13 -0
- package/dist/esm/utils/reconnectProviders.d.ts +6 -0
- package/dist/index.d.ts +669 -66
- package/package.json +6 -6
- package/dist/cjs/clients/algosigner.d.ts +0 -62
- package/dist/cjs/clients/defly.d.ts +0 -51
- package/dist/cjs/clients/exodus.d.ts +0 -52
- package/dist/cjs/clients/kmd.d.ts +0 -31
- package/dist/cjs/clients/perawallet.d.ts +0 -47
- package/dist/cjs/clients/walletconnect.d.ts +0 -47
- package/dist/cjs/hooks/useConnectWallet.d.ts +0 -30
- package/dist/cjs/providers/algosigner.d.ts +0 -2
- package/dist/cjs/providers/defly.d.ts +0 -2
- package/dist/cjs/providers/exodus.d.ts +0 -2
- package/dist/cjs/providers/index.d.ts +0 -9
- package/dist/cjs/providers/kmd.d.ts +0 -2
- package/dist/cjs/providers/myalgowallet.d.ts +0 -2
- package/dist/cjs/providers/perawallet.d.ts +0 -2
- package/dist/cjs/providers/walletconnect.d.ts +0 -2
- package/dist/esm/clients/algosigner.d.ts +0 -62
- package/dist/esm/clients/defly.d.ts +0 -51
- package/dist/esm/clients/exodus.d.ts +0 -52
- package/dist/esm/clients/kmd.d.ts +0 -31
- package/dist/esm/clients/perawallet.d.ts +0 -47
- package/dist/esm/clients/walletconnect.d.ts +0 -47
- package/dist/esm/hooks/useConnectWallet.d.ts +0 -30
- package/dist/esm/providers/algosigner.d.ts +0 -2
- package/dist/esm/providers/defly.d.ts +0 -2
- package/dist/esm/providers/exodus.d.ts +0 -2
- package/dist/esm/providers/index.d.ts +0 -9
- package/dist/esm/providers/kmd.d.ts +0 -2
- package/dist/esm/providers/myalgowallet.d.ts +0 -2
- package/dist/esm/providers/perawallet.d.ts +0 -2
- package/dist/esm/providers/walletconnect.d.ts +0 -2
package/dist/cjs/index.js
CHANGED
|
@@ -5,60 +5,25 @@ var utils = require('@json-rpc-tools/utils');
|
|
|
5
5
|
|
|
6
6
|
exports.PROVIDER_ID = void 0;
|
|
7
7
|
(function (PROVIDER_ID) {
|
|
8
|
-
PROVIDER_ID["
|
|
9
|
-
PROVIDER_ID["
|
|
10
|
-
PROVIDER_ID["
|
|
11
|
-
PROVIDER_ID["
|
|
12
|
-
PROVIDER_ID["DEFLY"] = "
|
|
13
|
-
PROVIDER_ID["EXODUS"] = "
|
|
14
|
-
PROVIDER_ID["
|
|
8
|
+
PROVIDER_ID["KMD"] = "kmd";
|
|
9
|
+
PROVIDER_ID["PERA"] = "pera";
|
|
10
|
+
PROVIDER_ID["MYALGO"] = "myalgo";
|
|
11
|
+
PROVIDER_ID["ALGOSIGNER"] = "algosigner";
|
|
12
|
+
PROVIDER_ID["DEFLY"] = "defly";
|
|
13
|
+
PROVIDER_ID["EXODUS"] = "exodus";
|
|
14
|
+
PROVIDER_ID["WALLETCONNECT"] = "walletconnect";
|
|
15
15
|
})(exports.PROVIDER_ID || (exports.PROVIDER_ID = {}));
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
process.env.NEXT_PUBLIC_NODE_URL ||
|
|
21
|
-
"https://mainnet-api.algonode.cloud";
|
|
22
|
-
const NODE_TOKEN = process.env.NODE_TOKEN ||
|
|
23
|
-
process.env.REACT_APP_NODE_TOKEN ||
|
|
24
|
-
process.env.NEXT_PUBLIC_NODE_TOKEN ||
|
|
25
|
-
"";
|
|
26
|
-
const NODE_PORT = process.env.NODE_PORT ||
|
|
27
|
-
process.env.REACT_APP_NODE_PORT ||
|
|
28
|
-
process.env.NEXT_PUBLIC_NODE_PORT ||
|
|
29
|
-
"";
|
|
30
|
-
const NODE_NETWORK = process.env.NODE_NETWORK ||
|
|
31
|
-
process.env.REACT_APP_NODE_NETWORK ||
|
|
32
|
-
process.env.NEXT_PUBLIC_NODE_NETWORK ||
|
|
33
|
-
/** @todo deprecate this env var */
|
|
34
|
-
process.env.NEXT_PUBLIC_VERCEL_ENV ||
|
|
35
|
-
"mainnet";
|
|
36
|
-
const KMD_HOST = process.env.KMD_HOST ||
|
|
37
|
-
process.env.REACT_APP_KMD_HOST ||
|
|
38
|
-
process.env.NEXT_PUBLIC_KMD_HOST ||
|
|
39
|
-
"http://localhost";
|
|
40
|
-
const KMD_TOKEN = process.env.KMD_TOKEN ||
|
|
41
|
-
process.env.REACT_APP_KMD_TOKEN ||
|
|
42
|
-
process.env.NEXT_PUBLIC_KMD_TOKEN ||
|
|
43
|
-
"a".repeat(64);
|
|
44
|
-
const KMD_PORT = process.env.KMD_PORT ||
|
|
45
|
-
process.env.REACT_APP_KMD_PORT ||
|
|
46
|
-
process.env.NEXT_PUBLIC_KMD_PORT ||
|
|
47
|
-
"4002";
|
|
48
|
-
const KMD_WALLET$1 = process.env.KMD_WALLET ||
|
|
49
|
-
process.env.REACT_APP_KMD_WALLET ||
|
|
50
|
-
process.env.NEXT_PUBLIC_KMD_WALLET ||
|
|
51
|
-
"unencrypted-default-wallet";
|
|
52
|
-
const KMD_PASSWORD = process.env.KMD_PASSWORD ||
|
|
53
|
-
process.env.REACT_APP_KMD_PASSWORD ||
|
|
54
|
-
process.env.NEXT_PUBLIC_KMD_PASSWORD ||
|
|
55
|
-
"";
|
|
16
|
+
const DEFAULT_NETWORK$1 = "mainnet";
|
|
17
|
+
const DEFAULT_NODE_BASEURL = "https://mainnet-api.algonode.cloud";
|
|
18
|
+
const DEFAULT_NODE_TOKEN = "";
|
|
19
|
+
const DEFAULT_NODE_PORT = "";
|
|
56
20
|
|
|
57
21
|
const getAlgosdk = async () => {
|
|
58
22
|
return (await import('algosdk')).default;
|
|
59
23
|
};
|
|
60
|
-
const getAlgodClient = async (algosdk) => {
|
|
61
|
-
|
|
24
|
+
const getAlgodClient = async (algosdk, algodClientOptions) => {
|
|
25
|
+
const [tokenOrBaseClient = DEFAULT_NODE_TOKEN, baseServer = DEFAULT_NODE_BASEURL, port = DEFAULT_NODE_PORT, headers,] = algodClientOptions || [];
|
|
26
|
+
return new algosdk.Algodv2(tokenOrBaseClient, baseServer, port, headers);
|
|
62
27
|
};
|
|
63
28
|
class Algod {
|
|
64
29
|
algosdk;
|
|
@@ -67,9 +32,9 @@ class Algod {
|
|
|
67
32
|
this.algosdk = algosdk;
|
|
68
33
|
this.algodClient = algodClient;
|
|
69
34
|
}
|
|
70
|
-
static async init() {
|
|
35
|
+
static async init(algodOptions) {
|
|
71
36
|
const algosdk = await getAlgosdk();
|
|
72
|
-
const algodClient = await getAlgodClient(algosdk);
|
|
37
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
73
38
|
return new Algod(algosdk, algodClient);
|
|
74
39
|
}
|
|
75
40
|
}
|
|
@@ -957,78 +922,8 @@ const useWalletStore = create()(immer(persist(devtools((set, _get) => ({
|
|
|
957
922
|
version: 0, // increment to deprecate stored data
|
|
958
923
|
})));
|
|
959
924
|
|
|
960
|
-
const
|
|
961
|
-
|
|
962
|
-
const PERA_WALLET = {
|
|
963
|
-
id: exports.PROVIDER_ID.PERA_WALLET,
|
|
964
|
-
name: "Pera Wallet",
|
|
965
|
-
icon: icon$6,
|
|
966
|
-
isWalletConnect: true,
|
|
967
|
-
};
|
|
968
|
-
|
|
969
|
-
const icon$5 = "data:image/svg+xml;base64," +
|
|
970
|
-
"PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHBhdGggZmlsbD0iIzI0NUVDNiIgZD0iTTE2LDMyYy0zLjIsMC02LjItMC45LTguOS0yLjdjLTIuNi0xLjgtNC43LTQuMy01LjktNy4yQzAsMTkuMi0wLjMsMTYsMC4zLDEyLjlDMC45LDkuOCwyLjQsNyw0LjcsNC43IEM2LjIsMy4yLDcuOSwyLDkuOSwxLjJDMTEuOCwwLjQsMTMuOSwwLDE2LDBzNC4yLDAuNCw2LjEsMS4yYzEuOSwwLjgsMy43LDIsNS4yLDMuNXMyLjcsMy4zLDMuNSw1LjJjMC44LDEuOSwxLjIsNCwxLjIsNi4xIHMtMC40LDQuMi0xLjIsNi4xYy0wLjgsMS45LTIsMy43LTMuNSw1LjJjLTEuNSwxLjUtMy4yLDIuNy01LjIsMy41QzIwLjIsMzEuNiwxOC4xLDMyLDE2LDMyTDE2LDMyeiBNMjAuMiwxMS4ybDAuMSwwLjVsMi42LDkuNWgyLjEgTDIxLjUsOC45bC0wLjEtMC4zaC0xLjlsMCwwLjFsLTEuNywzLjFMMTYsMTQuOWwwLDAuMWwwLTAuMWwtMC4yLTAuOGwtMC42LTIuNGwtMC4xLTAuMmwtMC43LTIuNmwtMC4xLTAuM2gtMS45bDAsMC4xbC0xLjcsMy4xIGwtMS44LDMuMkw3LjEsMThsLTEuOCwzLjJoMi4xTDkuMiwxOGwxLjgtMy4ybDEuOC0zLjJsMC4zLTAuNWwwLjEsMC41bDAuNSwyLjFsMC43LDIuNmwwLjIsMC45TDE0LjIsMThsLTEuOCwzLjJoMi4xbDAuOC0xLjMgbDEuMy0yLjNsMS41LTIuN2wxLjgtMy4yTDIwLjIsMTEuMkwyMC4yLDExLjJ6Ii8+Cjwvc3ZnPgo=";
|
|
971
|
-
const MYALGO_WALLET = {
|
|
972
|
-
id: exports.PROVIDER_ID.MYALGO_WALLET,
|
|
973
|
-
name: "MyAlgo Wallet",
|
|
974
|
-
icon: icon$5,
|
|
975
|
-
isWalletConnect: false,
|
|
976
|
-
};
|
|
977
|
-
|
|
978
|
-
const icon$4 = "data:image/svg+xml;base64," +
|
|
979
|
-
"PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
|
|
980
|
-
const ALGO_SIGNER = {
|
|
981
|
-
id: exports.PROVIDER_ID.ALGO_SIGNER,
|
|
982
|
-
name: "AlgoSigner",
|
|
983
|
-
icon: icon$4,
|
|
984
|
-
isWalletConnect: false,
|
|
985
|
-
};
|
|
986
|
-
|
|
987
|
-
const icon$3 = "data:image/svg+xml;base64," +
|
|
988
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
|
|
989
|
-
const DEFLY = {
|
|
990
|
-
id: exports.PROVIDER_ID.DEFLY,
|
|
991
|
-
name: "Defly Wallet",
|
|
992
|
-
icon: icon$3,
|
|
993
|
-
isWalletConnect: true,
|
|
994
|
-
};
|
|
995
|
-
|
|
996
|
-
const icon$2 = "data:image/svg+xml;base64," +
|
|
997
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
|
|
998
|
-
const EXODUS = {
|
|
999
|
-
id: exports.PROVIDER_ID.EXODUS,
|
|
1000
|
-
name: "Exodus",
|
|
1001
|
-
icon: icon$2,
|
|
1002
|
-
isWalletConnect: false,
|
|
1003
|
-
};
|
|
1004
|
-
|
|
1005
|
-
const icon$1 = "data:image/svg+xml;base64," +
|
|
1006
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+";
|
|
1007
|
-
const KMD_WALLET = {
|
|
1008
|
-
id: exports.PROVIDER_ID.KMD_WALLET,
|
|
1009
|
-
name: "KMD",
|
|
1010
|
-
icon: icon$1,
|
|
1011
|
-
isWalletConnect: false,
|
|
1012
|
-
};
|
|
1013
|
-
|
|
1014
|
-
const icon = "data:image/svg+xml;base64," +
|
|
1015
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==";
|
|
1016
|
-
const WALLET_CONNECT = {
|
|
1017
|
-
id: exports.PROVIDER_ID.WALLET_CONNECT,
|
|
1018
|
-
name: "Wallet Connect",
|
|
1019
|
-
icon,
|
|
1020
|
-
isWalletConnect: true,
|
|
1021
|
-
};
|
|
1022
|
-
|
|
1023
|
-
const providers = {
|
|
1024
|
-
[exports.PROVIDER_ID.PERA_WALLET]: PERA_WALLET,
|
|
1025
|
-
[exports.PROVIDER_ID.MYALGO_WALLET]: MYALGO_WALLET,
|
|
1026
|
-
[exports.PROVIDER_ID.DEFLY]: DEFLY,
|
|
1027
|
-
[exports.PROVIDER_ID.ALGO_SIGNER]: ALGO_SIGNER,
|
|
1028
|
-
[exports.PROVIDER_ID.EXODUS]: EXODUS,
|
|
1029
|
-
[exports.PROVIDER_ID.KMD_WALLET]: KMD_WALLET,
|
|
1030
|
-
[exports.PROVIDER_ID.WALLET_CONNECT]: WALLET_CONNECT,
|
|
1031
|
-
};
|
|
925
|
+
const ClientContext = require$$0.createContext(null);
|
|
926
|
+
var clientStore = ClientContext.Provider;
|
|
1032
927
|
|
|
1033
928
|
const audio = "data:audio/mp3;base64,SUQzBAAAAAIYBlRJVDIAAAAWAAAAMTAgU2Vjb25kcyBvZiBTaWxlbmNlVFBFMQAAABIAAABBbmFyIFNvZnR3YXJlIExMQ1RBTEIAAAAMAAAAQmxhbmsgQXVkaW9BUElDAAIPAgAAAGltYWdlL2pwZWcAAwCJUE5HDQoaCgAAAA1JSERSAAAEOAAABDgIBgAAAOwQbI8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACD0AAAg9AQWVVbYAAAAHdElNRQffCgsFHDEDbwR2AAAgAElEQVR42uzde5RVZd0H8N8wDDcBAS8o6oCJVyxTsDSxojJvgVYq3jVNUQgzaZWmpqh56+ItNa+kr4Cay9Q0DQ1DWb2WeSm8pGRy0RAEgRFhuIzz/tFbC5yZc86eOWfmPDOfz1rvemvvZz9779+zz3DOt2fvXRER9QEAAACQsE5KAAAAAKROwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8BBq9pss81i4sSJMXToUMUAAACgaCoiol4ZaA177rln3HzzzdG/f/+oqamJww8/PGbNmqUwAAAAtJgZHLSKk046Ke67777o379/RET07t07pk6dGtXV1YoDAABAi5nBQcmde+65MW7cuEbXvfjii3HIIYfE2rVrFQoAAIBmq4yIC5WBUqioqIgf/ehHceqppzbZZosttohevXrFk08+qWAAAAA0/zdomMFBCVRWVsZPfvKTGD16dEHtjzrqqJgxY4bCAQAA0CwCDoquU6dOccMNN8SoUaMK3mbOnDkxYsSIWL16tQICAACQmVtUKLoLL7wwjj766Ezb9OnTJz788MP44x//qIAAAABkZgYHRXXyySfHxRdf3Kxt16xZEyNGjIg333xTIQEAAMjEa2Ipmv333z8mTpzY7O27dOnSou0BAADouMzgoCh23333uO+++6J79+4t7utLX/pSvPLKK4oKAABAwczgoMW22mqruOOOO4oSbkREjBs3TlEBAADIxAwOWqRTp05x3333xV577VW0Puvq6uIzn/lMzJ8/X4EBAAAo7PepEtASp59+elHDjYiIysrKOO200xQXAACAgpnBQbPtuuuu8cgjj0RVVVXR+66trY0999wzlixZotAAAADkZQYHzdKtW7e4/vrrSxJu/Kf/r3/96woNAABAQQQcNMv5558f22+/fUn3MWrUKIUGAACgIAIOMvvCF74Q3/jGN0q+nz322COqq6sVHAAAgLwEHGRSVVUVl156adH7Xbp0aaPLzeIAAACgEAIOMjn22GOLPqvimWeeic997nOxaNGiBusOOeQQRQcAACAvAQcF69GjR5x55plF7fOhhx6KI488MhYvXhxTp05tsH7IkCGx3XbbKT4AAAA5CTgo2De/+c3YbLPNitbfM888E+PGjYs1a9ZERMTkyZOjvr7hW4vN4gAAACAfAQcF6dOnT4wdO7Zo/S1dujTGjh0bdXV1/1321ltvxaxZsxq0HTFihAEAAAAgJwEHBfnWt74VvXv3Llp/Z555ZrzzzjsNlj/++OMNln3iE5+Irl27GgQAAACaJOAgr/79+8dJJ51UtP5uu+22RoOMiIhp06Y1WFZVVRWf+MQnDAQAAABNEnCQ19ixY6Nbt25F6evdd9+Nyy+/vMn1s2bNanRmx5577mkgAAAAaJKAg9wXSKdOMWrUqKL199Of/jQ++OCDnG0am90h4AAAACDn71clIJe99tor+vfvX5S+3njjjZgyZUredo0FHMOGDTMYAAAANEnAQU4jR44sWl8/+tGPYt26dXnbPf3007Fq1aoNlm2yySax7bbbGhAAAAAaJeCgSZWVlXHwwQcXpa9nn302HnvssYLarl69Ol588cUGyz/1qU8ZFAAAABol4KBJe++9d2y66aZF6euiiy7K1P6VV15psGyPPfYwKAAAADRKwEGTDjnkkKL088gjj8Rzzz2XaZuXX365wbKBAwcaFAAAABol4KBRnTt3joMOOqjF/axbty4uvfTSzNs1NoNjq622MjAAAAA0SsBBo/bZZ5/o27dvi/v5n//5n3jzzTczb/faa69FfX39BssGDBhgYAAAAGiUgINGFeOBnitWrIirrrqqWduuXr063n///Q2Wde/evSihCwAAAO2PgING7brrri3u46abborFixc3e/ulS5c2WOY2FQAAABoj4KBRQ4YMadH2a9eujV/+8pct6mPZsmUNlrlNBQAAgMYIOGigT58+LQ4SHnrooViyZEmL+mgs4DCDAwAAgMYIOGhg8ODBLe6jpbM3IiI++OCDBssEHAAAADRGwEED/fr1a9H2s2bNiueee67Fx9HYA0UFHAAAADRGwEEDLX1TyaRJk4pyHJtvvnmDZZ7BAQAAQGMEHDTQkhkcy5YtiwceeKAox7HZZps1WNazZ08DBAAAQAMCDhro06dPs7e9++67o7a2tsXH0KVLl+jdu3eD5Z07dzZAAAAANCDgoIHKyspmbVdfXx933nlnUY5hu+22K+qxAQAA0L4JOGhg5cqVzdpu+vTpMWfOnKIcw/7779/ocgEHAAAAjRFw0EBzA45ivBr2Pw488MBGl7tFBQAAgMYIOGjggw8+yLzN3Llz48knnyzK/rfaaqv4+Mc/3ug6AQcAAACNEXDQQHNmcEyePDk+/PDDouz/oIMOanKdW1QAAABojICDBpoTcDz22GNF2XePHj1i7NixTa4XcAAAANAYAQcNZL1FZc6cOfGPf/yjKPseP3589O/fv8n1Ag4AAAAaI+CggawzOKZNm1aU/W699dZx2mmn5WzjGRwAAAA0RsBBA1lncDz++ONF2e95550XXbt2zdmmWM/5AAAAoH0RcNBAlhkcNTU18ac//anF+9xzzz1j1KhRedstWrTIAAEAANCAgIMG3nnnnaivry+o7fTp02PdunUt2l9FRUVMnDixoLb/+te/DBAAAAANCDhoYPXq1bFw4cKC2hbj+RuHHXZYfPKTnyyo7YIFCwwQAAAADQg4aNScOXPytlm3bl1Mnz69Rfvp0aNH/OAHPyi4vYADAACAxgg4aNTcuXPztvnzn/8cNTU1LdrPuHHjcr4W9qMEHAAAADRGwEGjCgk4Xn/99RbtY6uttorTTz890zaewQEAAEBjBBw0qpBbVJYvX96ifVx55ZXRrVu3TNuYwQEAAEBjBBw0at68eXnbtCTgOO6442LEiBGZtxNwAAAA0JjOSkBjCpnBsWzZsmb1PXDgwLjgggsyb7dmzZp47733DA4AANCqKioqmr0sa9tCt1+3bl18+OGHBmc9Ao717LTTTrHjjju2yoVbqu1b+mFaf3ltbW3OW0h233336Ny5c6Z9VVRUxJgxY6JHjx6Zx2fBggVx4oknluRcy2Vcy+EPain2laVdSuea0nWVyjXoXNvn562tx6pcz7UUY9Xevos4V99FfBfxXaRcPgPl6OSTT45HH33UD/n1xzQi6pXh3yZMmBATJkxQCAAAAMraKaecEo888ohCrMcMjiJZvHhxo7ds1Nc3nh9lWZ61j6Zk7bu6ujp69+7dZH8LFiyIxYsXF3yM3bp1ix122KHZSens2bPj/fffb9b5t8U4pDDG5VyTVMcy6z6LcZ4pjHG51NvnNYyxz6ux7EDfF4yxsWwP36E68vf7Aw44IMaNG9fk+k6dPFJTwFEi1113Xdxyyy3t6py+973vxZlnntnk+nvvvTeuuOKKgvqqqqqK3/72t80ON9asWRNf/vKXY/Xq1S42AACg3dtpp51yrk/9FptSEPnQpL/97W851/fp06fgvs4666wYMmRIs4/lL3/5i3ADAADoMPI9QNQMjkZqogQ0ZdasWTnX9+3bt6B+9thjj/jWt77VomP54x//aEAAAIAOQ8CRnYrQpLfffjvna1kLmcHRrVu3uPbaa6OysrJFxzJz5kwDAgAAdBj5ntch4GikJkpALrlmcVRXV+fd/rzzzouPfexjLTqGVatWxQsvvGAwAACADsMMjuxUhJxyPYejuro6unbt2uT64cOHxze+8Y0WH8PMmTNj7dq1BgMAAOgw8s3g8JDRhgQc5JQr4OjUqVOTszM22WSTuOaaa4ryobvzzjsNBAAA0KHkm8HR0scAtEcCDnLK96DR7bffvtEP2o033hhbbrlli/c/Z86cmD59uoEAAAA6FLeoZKci5DRv3rxYvnx5k+sbCzjOOeecGD58eFH2f8cdd+SdmgUAANDeeMhodipCXrlmcXw04Dj44INj7NixRdnvqlWrYurUqQYAAADocMzgyE5FyCvXczjWDzgGDx4cV111VdH2e//990dNTY0BAAAAOpx8AYeHjDbUWQnIJ1fAsd1220VlZWV07949br/99ujZs2fR9jtp0iTFBwAAOiQzOLJTEfLKFXB06dIlqqur46qrrorBgwcXbZ9/+tOf4pVXXlF8AACgQxJwZKci5DV37tyct4pcfvnlcfDBBxd1nzfeeKPCAwAAHZaHjGanIhT0wXrppZeaXL/vvvsWdX9PPfVUTJs2TeEBAIAO/Tss5495AUfDmigBhch1m0oxrVu3Ls4//3wFBwAAOjS3qGSnIhQk16tii+n222+P2bNnKzgAANChCTiyUxEK0hozOBYvXhw/+9nPFBsAAOjwBBzZqQgFefPNN2PFihUl3cell16a82GmAAAAHYWAIzsVoeAP18svv1yy/l988cW45557FBoAACA8ZLQ5VISCvfLKKyX74J533nl5P8AAAAAdRb4ZHBUVFYr0EQIOCjJkyJA47LDDStL3TTfdFM8//7wiAwAA/D+3qGSnIuQ1aNCgmDJlSvTq1avofb/44otx2WWXKTIAAMB6BBzZqQg59e/fP+65557YbLPNit73+++/H6effnqsXbtWoQEAANYj4MhORWjSxhtvHFOnTo1tttmmJP1/73vfi7lz5yo0AABA1h/zAo6GNVECGtO9e/e46667YqeddipJ/1OnTo0HH3xQoQEAABphBkd2KkIDVVVVceutt8bQoUNL0v/rr78e5513nkIDAAA0QcCRnYqwgYqKirjmmmtixIgRJel/9erVcdppp8WqVasUGwAAoAkCjuxUhA1ccsklceihh5as/3PPPTf+/ve/KzQAAEAOAo7sOisBEf+euXHppZfGCSecULJ93HjjjTFlyhTFBgAAyCNfwFFRUaFIHyHgIDp16hQ//elPY/To0SXbxyOPPBKXXHKJYgMAABSgvr4+7+84NiTg6OgXQOfOce2115b0tpTnn38+xo8fn/cDCgAAwL+5RaUZv2+VoOOqqqqKG2+8MQ466KCS7WPevHlx4oknRm1trYIDAABlpbHbPJq69aNYywtt27lz7p/rAo6GBBxFMmzYsFi9enWbfwgKXV5VVRWjR4+OHXbYoWQ1qa2tjYcffjgOP/zwZp9j1vMs5R+jch3LcqxJKc+znGpVLv9QpjrGqX5e29sY+7waS2NsjP0b4zthR/hO2B4JOAQcJTNy5MgYOXKkQqynW7duMXbsWIUAAAAoMgFHQwKOIlm8eHEsW7aswfLGnjvR1LMoWtq2Keu3raioiIEDB0aPHj1KWo958+bF0qVLS16HLLVpzbEo13Mrh/PNcm6pjaVza/3jNZbOrb2dm3/v2te5+Qym9z3FZ9C5ldP3lL59+8a9994r4BBwtL7rrrsubrnllrI+xt69e8eUKVNKHm5ERBx88MGxZMkSFwYAAEAzbLLJJjnXCzgaqYkSdAz9+vWL++67L/bYY49W2V9r7QcAAKA98haV7FSkA+jdu3fce++9seuuu7baPocPH67wAAAAzSTgyE5F2rlu3brFHXfcEbvsskur7lfAAQAA0Hz5ni3Skd4YUygBRzvWuXPnuOmmm+LTn/50q+97p512ik033dQgAAAANIMZHNmpSDtVUVERP/vZz2K//fZrs/2bxQEAANA8Ao7sVKSduvDCC+Owww4r6T5mzpwZNTU1Ta7fd999DQQAAEAzCDiyU5F2aPz48XHKKaeUdB/PPfdcnHjiifHXv/61yTYCDgAAgObJF3BUVlYq0kcIONqZL37xi3H22WeXdB+vvvpqHHvssbFy5cp4/vnnm2y39dZbx6BBgwwKAABARh4ymp2Aox0ZOHBg/PznPy/phT537tw4+uijY/ny5RER8cILL+Rs7zkcAAAA2blFJTsVaSe6desWt956a2y88cYl28eiRYviqKOOioULF/53Wb6Aw20qAAAA2Qk4slORduLyyy+PIUOGlKz/mpqaOOqoo2LOnDkbLH/33XfjrbfeanK7ffbZx9QpAACAjPLdoiLgaKQmSpC+448/Po444oiS9V9bWxvHH398vPrqq42uzzWLo1+/fiUNXgAAANqrXLM4BByN1EQJ0rbHHnvExRdfXLL+161bF6eeemr8+c9/brKN21QAAACKL1fAYaZ8QwKOhHXp0iWuvfbaqKqqKkn/9fX1ceaZZ8YTTzyRs12uN6lEeNAoAABAc3+TNflj3gyOhjVRgnSNHz8+Pvaxj5Ws/x/+8Idx//335203a9asWLduXZPr99prr5KFMAAAAO1VXV1d0z/mBRwNa6IEadp2221j/PjxJev/5z//edx2220FtV21alW89tprTa7v3r17DB061KABAABkkOsWlcrKSgX6CAFHoq644oro0qVLSfr+/e9/H5dffnmmbfLdpuI5HAAAANl4Bkc2nZUgPV/72tdK9lyLN998M8aNG5f3ncsf9fzzz8dxxx3X5Prhw4fHj3/844iI2GSTTWLPPfeMXXbZJfr16xd9+/bd4P/36dMnVq5cGUuWLInFixfH4sWL//uf586dGzNmzIhly5a5EAAAgHbNW1SyEXAkpnfv3nHhhReWpO8PPvggvvGNb0RNTU3mbV988cWc63fbbbf42c9+Fp/61KcKem5Iz549Y/PNN290XV1dXTz77LPx+OOPx7Rp0+KNN95wYQAAAO2Oh4xmI+BIzLnnnhubbrppST44Z5xxRrz++uvN2n727NmxYsWK6NmzZ6Pru3TpEkceeWRRjrWysjL22muv2GuvveL888+PN998Mx577LG4+eabY+HChS4SAACgXTCDIxsVScigQYPimGOOKUnf11xzTTz66KMt+uDlm8VRKttuu22cfvrpMXPmzBg/fnzJnk0CAADQmgQc2ahIQk455ZSSXMRPPPFE/OQnP2n29hUVFXHEEUfE4MGD27Q+G220UZxzzjkxY8aMOPDAA10wAABA0gQc2ahIIjbeeOMYPXp00ft9880341vf+lbmh4r+xy677BIPPvhgXH311bHFFluURa0GDhwYt912W9x7772x8847u3gAAIAkeYtKNgKORBx33HHRo0ePon9YzjjjjGY9VLRXr15x8cUXx+9+97sYNmxYWdZs+PDh8dhjj8URRxzhAgIAAJLjIaPZqEgCqqqq4uSTTy56vzfffHM899xzmbf76le/Gk8//XScfPLJUVlZWfa1u/rqq2PChAkuJAAAICluUclGRRJwyCGHRP/+/Yva5z//+c+48sorM21TWVkZl156aVx//fVNvsK1XE2YMCGuuuqqqKqqckEBAABJyBVwlPv/2NwWBBwJGDNmTNE/JN/5zneitra24G169+4dd911V5x44onJ1nH06NFx1113Ra9evVxUAABA2fMMjmwEHGVu+PDhMWTIkKL2efvtt8ezzz5bcPuBAwfGb37zm/jc5z6XfD333XffeOCBB4o+IwYAAKDY3KKSjYqUua9+9atF7W/OnDlx2WWXFdz+05/+dDzyyCOx/fbbt5ua7rzzzvHLX/4yunXr5gIDAADKloeMZtNZCcpbsWdNfPe7341Vq1YV1PaTn/xkTJ06tV0GAbvttltcddVVcfrpp7vIAICSa2oqeTGWZ52mXoy+2+J8inGe5XTcxTjPFI67PV2zbTGWuZ4hKOAQcJTMgQceGNtss01RPwQbb7xxDBgwoGjHOH/+/Bg1alSMGjUq77H07NkzDjjggHY9y+GQQw6JwYMHx9///vd2/Y9WOf3x949W+/likuoXLWNsjP0w8m9MW/2NACg2AUcjf5cjojspCGQAACAASURBVF4Z/m3ChAleJwoAAEDZW7hwYey+++4KsR4zOIrk1Vdfjblz5zZY3tg9U03dR/XR5cOGDSvawzDnz58fL7zwQt5jiPj3cze22GKLDjN2a9eujccffzyWLVtWlHErZdumlOIYWvt8s9SgXMfHuXXMczOWzs25Ff/flfb8GfT3xbm5Tp1blrZPPPFEbLfddo22N4NDwFEyd999d9xyyy1F66+qqipeeeWVov2AP/zww2PevHl5206cOLFDhRv/qfWuu+4aX/jCF2LlypUuZgAAoCzU1dU1uU7A0UhNlKA8DR06NDbaaKOi9HXXXXcVFG7svffeccopp3TIeldXV8cZZ5zhwgMAAMpGrtfEVlZWKtBHCDjK1Gc/+9mi9LNy5cq4+uqr818InTrFxIkTO3TNTzvttBg0aJCLDwAAKAteE5uNipSpYr0e9t5774133303b7vRo0fHrrvu2qFr3qVLlw4f8gAAAOUj1wwOb3JqSMBRpnbaaaei9DN58uS8bXr27Blnn322okfEfvvtF1/84hcVAgAAaHO5Ag4zOBqpiRKUn169ekX37t1b3M9f//rXePnll/O2+/a3vx2bbbaZwv+/iy66KKqqqhQCAABoUwKObFSkDG2++eZF6WfKlCl522y55ZYd9sGiTdl2223j1FNPVQgAAKBNCTiy8ZrYMtS/f/8W97Fy5cr49a9/nbfdqFGjokuXLm1ynq+++mrceuutUV1dHQMHDozq6uqorq6OTTfdtM3HYMyYMXHzzTfH2rVrXZAAAECbEHBkI+AoQ8W4XeShhx6KFStW5G138MEHF/346+rq4sknn4y+ffvG0KFDm2zXp0+fmDp1aoPlgwYNimOOOSZGjx7dZmHHpptuGgcccED85je/cUECAABtItdbVDxktCGRTxkqxgyOQn6Y9+/fP2cAkdW8efPiyiuvjD333DOOP/74eOyxx3K233LLLaNnz54Nls+ZMyd+9KMfxdChQ+PUU0+Np556KucHu1SOO+44FyMAANBmzODIRkXKUEufwbF27dp45pln8rY76KCDipL6zZo1K4488sjYe++94+qrr4533nknIiJef/31vNvusMMOOc/j4YcfjiOPPDI+85nPxOOPP96q47DPPvvEoEGDXJAAAECbEHBkoyJlqKUBx1/+8pdYtWpV3nYHHnhgi/ZTU1MT5557bhx00EGNzrJ47bXX8vax/fbbF7SvuXPnxoknnhgTJ05stediVFRUxLHHHuuCBAAA2kSugCNCyNGgHkpQflp6i8rTTz+dt02/fv1i7733bvY+fv/738dnP/vZmDRpUtTV1TXaZv78+bFy5cqc/eSawfFR9fX1cdNNN8UhhxwS8+bNa5WxGD16tFfGAgAAbULAkY1qlKGWzuAoJODYb7/9orKysln9X3vttXHCCSfEokWLcrarr6+P2bNn52yTJeD4jxdffDG+/OUvt8oDQDfZZJM44IADXJQAAECry/csQg8a3ZCAo515//3348UXX8zbbtttt83c99q1a2PMmDFx+eWX500S/yPfbSrNCTgi/n17zJgxY+Luu+8ueU332WcfFxYAANDqzODIRjXK0OLFi5u97d///vcmbxlZX9++fTP3feGFF2aeNZHvQaNbb7119OjRo9nne/bZZ8dzzz1X0vHYY489XJQAAECrE3BkoxplaMmSJc3e9o033iioXZ8+fTL1e++998akSZMyH0++GRwVFRUxePDgZp/vmjVr4pvf/GYsXLiwZOOx0047Rffu3V2YAABAqxJwZKMaZaglAcc//vGPgtplmcHxt7/9Lb7//e8363gKeZNKc29T+Y+FCxfGySefHGvWrCnJeHTu3Dl22203FyYAANCqBBzZqEYZasktKsUOOJYsWRInn3xyrF69ulnH8/bbb8cHH3yQs01LA46IiOeff77ZIUwh3KYCAAC0Ng8ZzUbAUYbK6RaVCRMmxNtvv92iD2S+53AUI+CIiLjnnnvi97//fUnGRMABAAC0tnwBR3PfjNleCTjKUHNncHz44Ycxd+7cgtr27t07b5t58+bF448/3uLzKdWbVBpz0003lWRMdt99dxcmAADQqtyiko1qlKH58+c3a7sVK1bEunXrCmq7dOnSvG2mTJmSNzEsRL6Ao7q6Orp27VqU2s2cOTNefvnloo9J1oeyAgAAtJSAIxvVKEMvv/xyQQHERy1btqzgtvPmzcu5ft26dXHPPfcU5XzyBRydOnWK7bbbrmj1K8Usji5durgwAQCAViXgyEY1yvQifvrppzNvt3z58oLb5psl8sQTTxTt1aut8SaV9T344IPxzjvvFHVMKisr3d8GAAC0Kg8ZzUbAUaZmzJiReZssAUe+Z3X89re/Ldq5LFiwIN5///2cbYoZcKxduzZuu+22oo+JWRwAAEBrMoMjG9UoU80JOIp5i8qCBQuKej6t9SaV/5g8eXJRnh+yPgEHAADQmgQc2ahGmfrXv/4Vs2fPzrRNXV1dwW3z3aJS7Fs85syZk3N9MZ/BEfHvsKclr7dtTLEehAoAAFAIAUc2qlHGss7i6NevX8FtZ8+enfONK4sWLSrqueS7JWabbbYpev0KefZHpg+LPx4AAEArEnBk/M2mBOXrySefzNQ+S8BRU1MTzzzzTKPrVq1alfeZGVnluyWmR48esckmmxR1n8UMONatWxeLFy92UQIAAK3GQ0azEXCUsaeeeirTbRZZAo6IiGnTprXahyTfDI6I4s/iyPfcjyzeeuutnDNeAAAAii3fDA5vetyQgKOM1dXVxR133FFw+6wzIJoKOLp16xabbbZZUc+lkICjurq6qPss5gyOfM8QAQAAKDa3qGTTWQnK25QpU+K73/1uQW/w6NKlS2y00UbxwQcfFNT3vHnz4tVXX42dd965wbptttkm3n333aKdx8KFC2PNmjU5z2Prrbcuau1mz54d9fX1RZmR8uabb7oYAYAWaew7SVPfU4q1vFR9l/K4i3GOKZ9Pa49lW12brtnC2vfp00fAIeBofQceeGCjt1gU4wMzb968GDx4cEHHcfXVVzf5rIjG+m7qtouzzz670VkLLTmf2tranAHHkUceGdtvv31RvySsXLkyNtpooxaP79ChQ+P6669P8o95Of2R78hfQFI+n478BcQY+5Lph1HH+jem1NcVQLH5O/SRekREvTL824QJE2LChAkKAQAAQNnbb7/94uWXX1aI/2cGR5G89NJL8cYbbzRY3thTb5t6Em6utiNGjCjoIaJLliyJ6dOnZzqGvfbaKwYOHLjB+qVLl/73GR3NOd7Glu+5556xww47NHnsNTU18dBDDxWtZhERhx12WPTs2bPF43vPPffEihUrilKH1mrblHI93izbZ6lBSufr3NI9t/b6Gcxybq5T5+bc0vn7Yiydm3Nr23PLsv1ll10WJ5xwQpPH4hYVAUdJ/OpXv4pbbrmlZP1/9atfbfIWifX17ds3Lrjggli2bFnBfe+4444xffr0DaY39e3bN3784x/Hv/71r6Kdw5gxY+KCCy5ocn3Xrl3j+9//fqY/LvmMHDmyxQHH66+/Ht/5zndc5AAAQKvykNFsVCMRDz74YLz66qv5B7RTp/jsZz+bqe/XXnstHnvssQbL999//6KeQ743qXTt2jU233zzou6zR48eLe5jxowZLkAAAKDV5fsffwUcH6mHEqThww8/jIsvvrigtiNGjMjc/9VXX91g2UknnVTU9yoX8qrYYr5JZcCAAdG9e/cW9yPgAAAA2kJdXV3uH/QCjg3roQTp+MMf/hBPPfVU3nb77bdf5h/2s2bNismTJ2+wbLvttotDDz20aMc/f/78vG2qq6uLtr/dd9+9xX2sWbMm/vd//9fFBwAAtDq3qGSjGom56KKL8l7k/fr1i+OPP75Zfb/99tsbLPv+979f0MNNC7FixYpYsmRJzjblFnD8+c9/jlWrVrnwAACAVifgyEY1EvPKK6/Efffdl7fd6aefHt26dcvU9/vvvx/f/e53N1i29dZbxxlnnFG04583b17O9dtss03R9lWMgOP+++930QEAAG3CMziyUY0EXXHFFVFbW5uzzeabbx7HHnts5r5nzJgRt99++wbLli5dWrRjzxdwFGsGR/fu3WO33XZrUR+LFy8WcAAAAG3GMziyUY0ELViwIK677rq87caNGxddu3bN3P8Pf/jDuOeee/773996662iHXu+B40W6yGjX/nKV1r8BpU77rgj1qxZ44IDAADaRL5bVCoqKhRpPQKORF133XXxt7/9LWeb/v37xzHHHNOsD9GECRNi0qRJsWbNmgbP5WiJfAHHVlttVZQU8sgjj2zR9mvWrIk777zThQYAALQZz+DIRjUStW7duvj2t7+dd4bB+PHjY+ONN27WB+ncc8+NIUOGxAsvvFC04853i0pVVVVsscUWLdrHoEGDYq+99mpRH7/+9a/j3XffdaEBAABtRsCRjWok7LXXXosrr7wyZ5v+/fvH1Vdf3ex9fPDBB7F69eqiHXO+GRwRLX8Ox+jRo1s0VWvt2rVxww03uMAAAIA2JeDIRjUS94tf/CL+8pe/5Gyz//77x6mnnloWx7tgwYJYu3ZtzjYteZNKr169mnVbzvp+/vOfx+zZs11cAABAmxJwZKMa7eCCP+OMM2LVqlU525177rlFeW1qS9XV1eV9pkdLZnBMmDAhNt1002ZvP3v27BbNeAEAACjm772cP+gFHBvWQwnSN2fOnDj//PNztqmqqopf/OIX0bt37zY/3nzP4Wjum1R23HHHOOmkk1r0x+Oss87KO8MEAACgNXhNbDaq0U5MmTIlJk+enLPNNttsUxazE/I9h2PAgAHN6vfiiy+Ozp07N/u4Jk2aFM8995yLCQAAKAv19fW5f9ALODashxK0Hz/4wQ/i+eefz9nmgAMOiEsuuaRNPwj5Ao7m3GIycuTIGD58eLOP6aWXXorLLrvMRQQAAJQNt6hkoxrtyNq1a+Ob3/xm3tebnnTSSXHjjTdGly5d2uQ4892istlmm2Xqb8cdd8z7Nplc5syZE8ccc0ysXLnSRQQAAJQNt6hkoxrtzDvvvBNjxoyJdevW5Ww3cuTImDp1aps8kyPfDI5+/foV/EHdaqutYurUqbHxxhs361gWLlwYRx55ZN5QCAAAoLXlm8FRUVGhSOsRcLRDzzzzTJxzzjl579fae++949e//nVsscUWrXp8+QKOTp06Rb9+/fL207dv35g6dWqzj7+mpiaOPvrovDNKAAAA2oJncGSjGu3U5MmT49xzz83bbuedd46HH344dthhh1Y7tpqamli+fHnONvluU+nevXvceeedMXjw4GYdw4oVK+KEE06IV1991cUCAACUJc/gyEY12rFf/vKXBYUcAwYMiN/85jcxZsyYqKqqapVja8mDRgcMGBBTpkyJoUOHNmvfc+bMia985Svxpz/9yUUCAACULc/gyEY12rlJkyYVFHL06tUrLrjggpgxY0bsv//+JT+ufAFHUzM4Dj300Jg+fXp8+tOfbtZ+Z8yYEQceeGC8/vrrLg4AAKCsmcGRjWp0AJMmTYrzzjuvoLaDBg2KSZMmxa9+9avYZZddSnZM8+fPz7n+ozM4evfuHTfccEPccMMNzX4w6k033RTHHnts3ttjAAAAyoGAIxvV6CBuv/32OP/88wtuv88++8S0adPiJz/5SebXthYiywyOz3/+8/Hkk0/GoYce2qx91dTUxPjx42PixIl5p3gBAACUCwFHNp2VoOO47bbboqKiIi666KKC2nfq1CmOPvro+PrXvx5PPfVU/O53v4snnngiFi1a1OJjyRdwDB48OE477bQ46qijYvvtt2/2fh544IG48MILi3LMAAAArUnAkY2Ao4O59dZb4/3334+LLrooevXqVdA2Xbt2jf322y/222+/qK+vj+effz6mTZsW06ZNi9dee61Zx/Huu+/mXL///vu36Fkg//znP+Pss8+OmTNnGnQAACBJAo5sBBwd0D333BNPPfVUXHHFFfGlL30p07YVFRUxdOjQGDp0aJxzzjkxZ86cePzxx+Oll16KOXPmxNy5c/POlqisrIyuXbuW5NxWr14d1157bVx//fWxZs0agw0AACRLwJGNgKODWrBgQRx//PHxta99Lb73ve9FdXV1s/oZNGhQnHLKKRssW7lyZSxYsCBWrVoVq1evjtra2qitrY2qqqqorq6Orbbaquivo62trY2pU6fGjTfeGG+99ZYBBgAAkpcv4KioqFCk9Qg4Orj7778/HnzwwRg5cmSMGzcuhgwZ0uI+e/ToEdttt12rHH9NTU1MmjQpbr311liyZIkBBQAA2g0zOLIRcBB1dXXxwAMPxAMPPBCf//zn49RTT43hw4dH587le3ksXLgwbrnllrjzzjtjxYoVBhEAAGh3BBzZCDjYwB/+8If4wx/+EP369YsDDzwwRo4cGZ/5zGfKIuxYsWJFTJ8+PR599NF49NFHPWMDAABo1+rq6nKuF3BsSMBBo957772YPHlyTJ48+b9hx7777hvDhg2LAQMGtNpxLFq0KH73u9/FY489FjNnzoy1a9caHAAAoEMwgyMbAQd5rR92RERsscUWMWzYsBg6dGgMGzYshgwZEt26dSv6fi+++OL4xS9+EfX19QYBAADocPL9FhJwbEjAQWbvvPNOPPzww/Hwww//d1m/fv1iyy23jAEDBsSWW2753//cs2fPqKura/T/dtxxxxg2bFiT+6mtrRVuAAAAJdPUW0iKsTzrG04aa58vwBBw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AAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4A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/+MYxPkNE2IkGABNSVOQ7HM+7DuUt3Q7mjpUFmcjr1unl8NuVbD7m6plQSJtQIuLMFbkdTOVo4XNGpkZmZshRj5KVGyRR6oW/+MYxP8P82okOACTLDX0hZ/NMwIyV2MZOyleP56///LM+7JePftrs1g+k+jJlnog5CvNvjmcS3cDTZkDKhtl8r35yOV+jgtR/+MYxPoOQ2YYEABTSKmIjcsiPb5ZfXf7UH8zFxqUaDwmSPCizYFGwQGwyZIIX0pOLKIpjETlo1U/56E0qoAczJRAWM5G8HJA/+MYxPwK8148GABNSUZyKUXZ6Ik9o/PNrPO4Xd3k45s5ZbFOhlkKfJ2SMjFyc9KZLMjQ60Ps1iyQiQycScX711gnjk89MiiI/+MYxP8TC2oIAACTEM0f+Z/SNfy///f9lc5XLIHLMz46Yck2h2K0dtqT0bECVySOS9qTEGr9rfbPd2TQq7VMzuRDg3vYJJEn/+MYxO0ME2YcEABNSJ2RxzMIKcrhC0U0F3kImjyb03for+r/zq1OmMvJ/7vbWJlSA5zVyGFyjBs22U4ODIPh4hDbrVUbv/ln/+MYxPcNW2YcEABNSGWrMglL8cicpXM60b///+8h4bKpxqdMwhMvkpTs/hZPkDJUtJu2TccDTSJKRRGOl+v/1//9Omu/2pdE/+MYxPwPu2oQCABTLHWi9r07yp99tVRSsxysZJwFXKcDYBwxzjoPraIHIgUpiCmopmXHJwp268/L++7oMjOERqsPR/WT59fe/+MYxPgMU1ooGABTSLv/8+5at2WSQuEzX00HAFGyipKM5p5VFojkAmjknWmIKaimZccnBdUObf4ovk//MMX///X/yt/uOXlx/+MYxP8SW2IIAACTEKktqFqTxCJSJF/JNmSImOhln2AosFn0lTEFNRTMuOTguMlVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPAMw2IgEABTSVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPgK215IGACNTFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8MW2I4GABNSFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8Ks1oUGABTZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8AAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEFHMTAgU2Vjb25kcyBvZiBTaWxlbmNlAAAAAAAAAAAAQW5hciBTb2Z0d2FyZSBMTEMAAAAAAAAAAAAAAAAAQmxhbmsgQXVkaW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8=";
|
|
1034
929
|
|
|
@@ -1042,10 +937,11 @@ const getIsIOS = () => {
|
|
|
1042
937
|
}
|
|
1043
938
|
};
|
|
1044
939
|
const isIOS = getIsIOS();
|
|
1045
|
-
class
|
|
940
|
+
class BaseClient {
|
|
1046
941
|
algosdk;
|
|
1047
942
|
algodClient;
|
|
1048
943
|
keepWCAlive;
|
|
944
|
+
static metadata;
|
|
1049
945
|
constructor(algosdk, algodClient) {
|
|
1050
946
|
this.algosdk = algosdk;
|
|
1051
947
|
this.algodClient = algodClient;
|
|
@@ -1161,32 +1057,42 @@ class BaseWallet {
|
|
|
1161
1057
|
}
|
|
1162
1058
|
}
|
|
1163
1059
|
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
class PeraWalletClient extends BaseWallet {
|
|
1060
|
+
const ICON$6 = "data:image/svg+xml;base64," +
|
|
1061
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=";
|
|
1062
|
+
|
|
1063
|
+
class PeraWalletClient extends BaseClient {
|
|
1169
1064
|
#client;
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1065
|
+
network;
|
|
1066
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1173
1067
|
super(algosdk, algodClient);
|
|
1174
1068
|
this.#client = client;
|
|
1175
|
-
this.
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1069
|
+
this.network = network;
|
|
1070
|
+
}
|
|
1071
|
+
static metadata = {
|
|
1072
|
+
id: exports.PROVIDER_ID.PERA,
|
|
1073
|
+
name: "Pera",
|
|
1074
|
+
icon: ICON$6,
|
|
1075
|
+
isWalletConnect: true,
|
|
1076
|
+
};
|
|
1077
|
+
static async init({ clientOptions, algodOptions, clientStatic, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1078
|
+
try {
|
|
1079
|
+
const PeraWalletConnect = clientStatic || (await import('@perawallet/connect')).PeraWalletConnect;
|
|
1080
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1081
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1082
|
+
const peraWallet = new PeraWalletConnect({
|
|
1083
|
+
...(clientOptions ? clientOptions : { shouldShowSignTxnToast: false }),
|
|
1084
|
+
});
|
|
1085
|
+
return new PeraWalletClient({
|
|
1086
|
+
client: peraWallet,
|
|
1087
|
+
algosdk,
|
|
1088
|
+
algodClient,
|
|
1089
|
+
network,
|
|
1090
|
+
});
|
|
1091
|
+
}
|
|
1092
|
+
catch (e) {
|
|
1093
|
+
console.error("Error initializing...", e);
|
|
1094
|
+
return null;
|
|
1095
|
+
}
|
|
1190
1096
|
}
|
|
1191
1097
|
async connect(onDisconnect) {
|
|
1192
1098
|
this.keepWCAliveStart();
|
|
@@ -1194,53 +1100,36 @@ class PeraWalletClient extends BaseWallet {
|
|
|
1194
1100
|
this.keepWCAliveStop();
|
|
1195
1101
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1196
1102
|
if (accounts.length === 0) {
|
|
1197
|
-
throw new Error(`No accounts found for ${
|
|
1103
|
+
throw new Error(`No accounts found for ${PeraWalletClient.metadata.id}`);
|
|
1198
1104
|
}
|
|
1199
1105
|
const mappedAccounts = accounts.map((address, index) => ({
|
|
1200
1106
|
name: `Pera Wallet ${index + 1}`,
|
|
1201
1107
|
address,
|
|
1202
|
-
providerId:
|
|
1108
|
+
providerId: PeraWalletClient.metadata.id,
|
|
1203
1109
|
}));
|
|
1204
1110
|
return {
|
|
1205
|
-
...
|
|
1111
|
+
...PeraWalletClient.metadata,
|
|
1206
1112
|
accounts: mappedAccounts,
|
|
1207
1113
|
};
|
|
1208
1114
|
}
|
|
1209
1115
|
async reconnect(onDisconnect) {
|
|
1210
|
-
const accounts = await this.#client.reconnectSession();
|
|
1116
|
+
const accounts = await this.#client.reconnectSession().catch(console.info);
|
|
1211
1117
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1212
1118
|
if (!accounts) {
|
|
1213
1119
|
return null;
|
|
1214
1120
|
}
|
|
1215
1121
|
return {
|
|
1216
|
-
...
|
|
1122
|
+
...PeraWalletClient.metadata,
|
|
1217
1123
|
accounts: accounts.map((address, index) => ({
|
|
1218
1124
|
name: `Pera Wallet ${index + 1}`,
|
|
1219
1125
|
address,
|
|
1220
|
-
providerId:
|
|
1126
|
+
providerId: PeraWalletClient.metadata.id,
|
|
1221
1127
|
})),
|
|
1222
1128
|
};
|
|
1223
1129
|
}
|
|
1224
1130
|
async disconnect() {
|
|
1225
1131
|
await this.#client.disconnect();
|
|
1226
1132
|
}
|
|
1227
|
-
formatTransactionsArray(transactions) {
|
|
1228
|
-
const formattedTransactions = [];
|
|
1229
|
-
for (const [type, txn] of transactions) {
|
|
1230
|
-
if (type === "s") {
|
|
1231
|
-
formattedTransactions.push({
|
|
1232
|
-
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1233
|
-
signers: [],
|
|
1234
|
-
});
|
|
1235
|
-
}
|
|
1236
|
-
else {
|
|
1237
|
-
formattedTransactions.push({
|
|
1238
|
-
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1239
|
-
});
|
|
1240
|
-
}
|
|
1241
|
-
}
|
|
1242
|
-
return formattedTransactions;
|
|
1243
|
-
}
|
|
1244
1133
|
async signTransactions(connectedAccounts, transactions) {
|
|
1245
1134
|
// Decode the transactions to access their properties.
|
|
1246
1135
|
const decodedTxns = transactions.map((txn) => {
|
|
@@ -1282,6 +1171,25 @@ class PeraWalletClient extends BaseWallet {
|
|
|
1282
1171
|
}, []);
|
|
1283
1172
|
return signedTxns;
|
|
1284
1173
|
}
|
|
1174
|
+
/** @deprecated */
|
|
1175
|
+
formatTransactionsArray(transactions) {
|
|
1176
|
+
const formattedTransactions = [];
|
|
1177
|
+
for (const [type, txn] of transactions) {
|
|
1178
|
+
if (type === "s") {
|
|
1179
|
+
formattedTransactions.push({
|
|
1180
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1181
|
+
signers: [],
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
else {
|
|
1185
|
+
formattedTransactions.push({
|
|
1186
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
return formattedTransactions;
|
|
1191
|
+
}
|
|
1192
|
+
/** @deprecated */
|
|
1285
1193
|
async signEncodedTransactions(transactions) {
|
|
1286
1194
|
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1287
1195
|
this.keepWCAliveStart();
|
|
@@ -1304,43 +1212,58 @@ class PeraWalletClient extends BaseWallet {
|
|
|
1304
1212
|
}
|
|
1305
1213
|
}
|
|
1306
1214
|
|
|
1215
|
+
const ICON$5 = "data:image/svg+xml;base64," +
|
|
1216
|
+
"PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHBhdGggZmlsbD0iIzI0NUVDNiIgZD0iTTE2LDMyYy0zLjIsMC02LjItMC45LTguOS0yLjdjLTIuNi0xLjgtNC43LTQuMy01LjktNy4yQzAsMTkuMi0wLjMsMTYsMC4zLDEyLjlDMC45LDkuOCwyLjQsNyw0LjcsNC43IEM2LjIsMy4yLDcuOSwyLDkuOSwxLjJDMTEuOCwwLjQsMTMuOSwwLDE2LDBzNC4yLDAuNCw2LjEsMS4yYzEuOSwwLjgsMy43LDIsNS4yLDMuNXMyLjcsMy4zLDMuNSw1LjJjMC44LDEuOSwxLjIsNCwxLjIsNi4xIHMtMC40LDQuMi0xLjIsNi4xYy0wLjgsMS45LTIsMy43LTMuNSw1LjJjLTEuNSwxLjUtMy4yLDIuNy01LjIsMy41QzIwLjIsMzEuNiwxOC4xLDMyLDE2LDMyTDE2LDMyeiBNMjAuMiwxMS4ybDAuMSwwLjVsMi42LDkuNWgyLjEgTDIxLjUsOC45bC0wLjEtMC4zaC0xLjlsMCwwLjFsLTEuNywzLjFMMTYsMTQuOWwwLDAuMWwwLTAuMWwtMC4yLTAuOGwtMC42LTIuNGwtMC4xLTAuMmwtMC43LTIuNmwtMC4xLTAuM2gtMS45bDAsMC4xbC0xLjcsMy4xIGwtMS44LDMuMkw3LjEsMThsLTEuOCwzLjJoMi4xTDkuMiwxOGwxLjgtMy4ybDEuOC0zLjJsMC4zLTAuNWwwLjEsMC41bDAuNSwyLjFsMC43LDIuNmwwLjIsMC45TDE0LjIsMThsLTEuOCwzLjJoMi4xbDAuOC0xLjMgbDEuMy0yLjNsMS41LTIuN2wxLjgtMy4yTDIwLjIsMTEuMkwyMC4yLDExLjJ6Ii8+Cjwvc3ZnPgo=";
|
|
1217
|
+
|
|
1307
1218
|
/**
|
|
1308
1219
|
* Helpful resources:
|
|
1309
1220
|
* https://github.com/randlabs/myalgo-connect
|
|
1310
1221
|
*/
|
|
1311
|
-
class MyAlgoWalletClient extends
|
|
1222
|
+
class MyAlgoWalletClient extends BaseClient {
|
|
1312
1223
|
#client;
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1224
|
+
network;
|
|
1225
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1316
1226
|
super(algosdk, algodClient);
|
|
1317
1227
|
this.#client = client;
|
|
1318
|
-
this.
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
algosdk
|
|
1330
|
-
algodClient
|
|
1331
|
-
|
|
1228
|
+
this.network = network;
|
|
1229
|
+
}
|
|
1230
|
+
static metadata = {
|
|
1231
|
+
id: exports.PROVIDER_ID.MYALGO,
|
|
1232
|
+
name: "MyAlgo",
|
|
1233
|
+
icon: ICON$5,
|
|
1234
|
+
isWalletConnect: false,
|
|
1235
|
+
};
|
|
1236
|
+
static async init({ clientOptions, algodOptions, clientStatic, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1237
|
+
try {
|
|
1238
|
+
const MyAlgoConnect = clientStatic || (await import('@randlabs/myalgo-connect')).default;
|
|
1239
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1240
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1241
|
+
const myAlgo = new MyAlgoConnect({
|
|
1242
|
+
...(clientOptions ? clientOptions : { disableLedgerNano: false }),
|
|
1243
|
+
});
|
|
1244
|
+
return new MyAlgoWalletClient({
|
|
1245
|
+
client: myAlgo,
|
|
1246
|
+
algosdk: algosdk,
|
|
1247
|
+
algodClient: algodClient,
|
|
1248
|
+
network,
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
catch (e) {
|
|
1252
|
+
console.error("Error initializing...", e);
|
|
1253
|
+
return null;
|
|
1254
|
+
}
|
|
1332
1255
|
}
|
|
1333
1256
|
async connect() {
|
|
1334
1257
|
const accounts = await this.#client.connect();
|
|
1335
1258
|
if (accounts.length === 0) {
|
|
1336
|
-
throw new Error(`No accounts found for ${
|
|
1259
|
+
throw new Error(`No accounts found for ${MyAlgoWalletClient.metadata.id}`);
|
|
1337
1260
|
}
|
|
1338
1261
|
const mappedAccounts = accounts.map((account) => ({
|
|
1339
1262
|
...account,
|
|
1340
|
-
providerId:
|
|
1263
|
+
providerId: MyAlgoWalletClient.metadata.id,
|
|
1341
1264
|
}));
|
|
1342
1265
|
return {
|
|
1343
|
-
...
|
|
1266
|
+
...MyAlgoWalletClient.metadata,
|
|
1344
1267
|
accounts: mappedAccounts,
|
|
1345
1268
|
};
|
|
1346
1269
|
}
|
|
@@ -1380,6 +1303,7 @@ class MyAlgoWalletClient extends BaseWallet {
|
|
|
1380
1303
|
}, []);
|
|
1381
1304
|
return signedTxns;
|
|
1382
1305
|
}
|
|
1306
|
+
/** @deprecated */
|
|
1383
1307
|
async signEncodedTransactions(transactions) {
|
|
1384
1308
|
const transactionsToSign = [];
|
|
1385
1309
|
const signedRawTransactions = [];
|
|
@@ -1406,218 +1330,78 @@ class MyAlgoWalletClient extends BaseWallet {
|
|
|
1406
1330
|
}
|
|
1407
1331
|
}
|
|
1408
1332
|
|
|
1409
|
-
|
|
1333
|
+
const ICON$4 = "data:image/svg+xml;base64," +
|
|
1334
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
|
|
1335
|
+
|
|
1336
|
+
class DeflyWalletClient extends BaseClient {
|
|
1410
1337
|
#client;
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1338
|
+
network;
|
|
1339
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1414
1340
|
super(algosdk, algodClient);
|
|
1415
1341
|
this.#client = client;
|
|
1416
|
-
this.
|
|
1417
|
-
this.provider = provider;
|
|
1418
|
-
}
|
|
1419
|
-
static async init() {
|
|
1420
|
-
if (typeof window == "undefined" ||
|
|
1421
|
-
window.AlgoSigner === undefined) {
|
|
1422
|
-
throw new Error("AlgoSigner is not available.");
|
|
1423
|
-
}
|
|
1424
|
-
const { algosdk, algodClient } = await Algod.init();
|
|
1425
|
-
const algoSigner = window.AlgoSigner;
|
|
1426
|
-
return new AlgoSignerClient({
|
|
1427
|
-
id: exports.PROVIDER_ID.ALGO_SIGNER,
|
|
1428
|
-
client: algoSigner,
|
|
1429
|
-
provider: providers[exports.PROVIDER_ID.ALGO_SIGNER],
|
|
1430
|
-
algosdk: algosdk,
|
|
1431
|
-
algodClient: algodClient,
|
|
1432
|
-
});
|
|
1433
|
-
}
|
|
1434
|
-
async connect() {
|
|
1435
|
-
await this.#client.connect();
|
|
1436
|
-
let ledger = "MainNet";
|
|
1437
|
-
if (NODE_NETWORK === "mainnet") {
|
|
1438
|
-
ledger = "MainNet";
|
|
1439
|
-
}
|
|
1440
|
-
else if (NODE_NETWORK === "betanet") {
|
|
1441
|
-
ledger = "BetaNet";
|
|
1442
|
-
}
|
|
1443
|
-
else if (NODE_NETWORK === "testnet") {
|
|
1444
|
-
ledger = "TestNet";
|
|
1445
|
-
}
|
|
1446
|
-
else if (!!NODE_NETWORK) {
|
|
1447
|
-
ledger = NODE_NETWORK;
|
|
1448
|
-
}
|
|
1449
|
-
const accounts = await this.#client.accounts({
|
|
1450
|
-
ledger,
|
|
1451
|
-
});
|
|
1452
|
-
if (accounts.length === 0) {
|
|
1453
|
-
throw new Error(`No accounts found for ${this.provider}`);
|
|
1454
|
-
}
|
|
1455
|
-
const mappedAccounts = accounts.map(({ address }, index) => ({
|
|
1456
|
-
name: `AlgoSigner ${index + 1}`,
|
|
1457
|
-
address,
|
|
1458
|
-
providerId: this.provider.id,
|
|
1459
|
-
}));
|
|
1460
|
-
return {
|
|
1461
|
-
...this.provider,
|
|
1462
|
-
accounts: mappedAccounts,
|
|
1463
|
-
};
|
|
1342
|
+
this.network = network;
|
|
1464
1343
|
}
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1344
|
+
static metadata = {
|
|
1345
|
+
id: exports.PROVIDER_ID.DEFLY,
|
|
1346
|
+
name: "Defly",
|
|
1347
|
+
icon: ICON$4,
|
|
1348
|
+
isWalletConnect: true,
|
|
1349
|
+
};
|
|
1350
|
+
static async init({ clientOptions, algodOptions, clientStatic, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1351
|
+
try {
|
|
1352
|
+
const DeflyWalletConnect = clientStatic ||
|
|
1353
|
+
(await import('@blockshake/defly-connect')).DeflyWalletConnect;
|
|
1354
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1355
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1356
|
+
const deflyWallet = new DeflyWalletConnect({
|
|
1357
|
+
...(clientOptions ? clientOptions : { shouldShowSignTxnToast: false }),
|
|
1358
|
+
});
|
|
1359
|
+
return new DeflyWalletClient({
|
|
1360
|
+
client: deflyWallet,
|
|
1361
|
+
algosdk,
|
|
1362
|
+
algodClient,
|
|
1363
|
+
network,
|
|
1364
|
+
});
|
|
1469
1365
|
}
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
return;
|
|
1474
|
-
}
|
|
1475
|
-
formatTransactionsArray(transactions) {
|
|
1476
|
-
const formattedTransactions = transactions.map(([type, txn]) => {
|
|
1477
|
-
const formattedTxn = {
|
|
1478
|
-
txn: txn[1],
|
|
1479
|
-
};
|
|
1480
|
-
if (type === "s") {
|
|
1481
|
-
formattedTxn.signers = [];
|
|
1482
|
-
const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1483
|
-
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
|
|
1484
|
-
}
|
|
1485
|
-
else {
|
|
1486
|
-
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
1487
|
-
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
|
|
1488
|
-
}
|
|
1489
|
-
return formattedTxn;
|
|
1490
|
-
});
|
|
1491
|
-
return formattedTransactions;
|
|
1492
|
-
}
|
|
1493
|
-
async signTransactions(connectedAccounts, transactions) {
|
|
1494
|
-
// Decode the transactions to access their properties.
|
|
1495
|
-
const decodedTxns = transactions.map((txn) => {
|
|
1496
|
-
return this.algosdk.decodeObj(txn);
|
|
1497
|
-
});
|
|
1498
|
-
// Marshal the transactions,
|
|
1499
|
-
// and add the signers property if they shouldn't be signed.
|
|
1500
|
-
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1501
|
-
const txnObj = {
|
|
1502
|
-
txn: this.#client.encoding.msgpackToBase64(transactions[i]),
|
|
1503
|
-
};
|
|
1504
|
-
if ("txn" in txn ||
|
|
1505
|
-
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1506
|
-
txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
|
|
1507
|
-
txnObj.signers = [];
|
|
1508
|
-
}
|
|
1509
|
-
acc.push(txnObj);
|
|
1510
|
-
return acc;
|
|
1511
|
-
}, []);
|
|
1512
|
-
// Sign them with the client.
|
|
1513
|
-
const result = await this.#client.signTxn(txnsToSign);
|
|
1514
|
-
// Join the newly signed transactions with the original group of transactions.
|
|
1515
|
-
const signedTxns = result.reduce((acc, txn, i) => {
|
|
1516
|
-
if (txn) {
|
|
1517
|
-
acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1518
|
-
}
|
|
1519
|
-
else {
|
|
1520
|
-
acc.push(transactions[i]);
|
|
1521
|
-
}
|
|
1522
|
-
return acc;
|
|
1523
|
-
}, []);
|
|
1524
|
-
return signedTxns;
|
|
1525
|
-
}
|
|
1526
|
-
async signEncodedTransactions(transactions) {
|
|
1527
|
-
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1528
|
-
const result = await this.#client.signTxn(transactionsToSign);
|
|
1529
|
-
if (!result) {
|
|
1530
|
-
throw new Error("Signing failed.");
|
|
1366
|
+
catch (e) {
|
|
1367
|
+
console.error("Error initializing...", e);
|
|
1368
|
+
return null;
|
|
1531
1369
|
}
|
|
1532
|
-
const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
|
|
1533
|
-
if (txn) {
|
|
1534
|
-
signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1535
|
-
}
|
|
1536
|
-
if (txn === null) {
|
|
1537
|
-
signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
|
|
1538
|
-
}
|
|
1539
|
-
return signedTxns;
|
|
1540
|
-
}, []);
|
|
1541
|
-
return signedRawTransactions;
|
|
1542
|
-
}
|
|
1543
|
-
}
|
|
1544
|
-
|
|
1545
|
-
class DeflyWalletClient extends BaseWallet {
|
|
1546
|
-
#client;
|
|
1547
|
-
id;
|
|
1548
|
-
provider;
|
|
1549
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1550
|
-
super(algosdk, algodClient);
|
|
1551
|
-
this.#client = client;
|
|
1552
|
-
this.id = id;
|
|
1553
|
-
this.provider = provider;
|
|
1554
|
-
}
|
|
1555
|
-
static async init() {
|
|
1556
|
-
const { algosdk, algodClient } = await Algod.init();
|
|
1557
|
-
const DeflyWalletConnect = (await import('@blockshake/defly-connect'))
|
|
1558
|
-
.DeflyWalletConnect;
|
|
1559
|
-
const deflyWallet = new DeflyWalletConnect({
|
|
1560
|
-
shouldShowSignTxnToast: false,
|
|
1561
|
-
});
|
|
1562
|
-
return new DeflyWalletClient({
|
|
1563
|
-
id: exports.PROVIDER_ID.DEFLY,
|
|
1564
|
-
client: deflyWallet,
|
|
1565
|
-
provider: providers[exports.PROVIDER_ID.DEFLY],
|
|
1566
|
-
algosdk,
|
|
1567
|
-
algodClient,
|
|
1568
|
-
});
|
|
1569
1370
|
}
|
|
1570
1371
|
async connect(onDisconnect) {
|
|
1571
|
-
const accounts = await this.#client.connect();
|
|
1372
|
+
const accounts = await this.#client.connect().catch(console.info);
|
|
1572
1373
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1573
|
-
if (accounts.length === 0) {
|
|
1574
|
-
throw new Error(`No accounts found for ${
|
|
1374
|
+
if (!accounts || accounts.length === 0) {
|
|
1375
|
+
throw new Error(`No accounts found for ${DeflyWalletClient.metadata.id}`);
|
|
1575
1376
|
}
|
|
1576
1377
|
const mappedAccounts = accounts.map((address, index) => ({
|
|
1577
1378
|
name: `Defly Wallet ${index + 1}`,
|
|
1578
1379
|
address,
|
|
1579
|
-
providerId:
|
|
1380
|
+
providerId: DeflyWalletClient.metadata.id,
|
|
1580
1381
|
}));
|
|
1581
1382
|
return {
|
|
1582
|
-
...
|
|
1383
|
+
...DeflyWalletClient.metadata,
|
|
1583
1384
|
accounts: mappedAccounts,
|
|
1584
1385
|
};
|
|
1585
1386
|
}
|
|
1586
1387
|
async reconnect(onDisconnect) {
|
|
1587
|
-
const accounts = await this.#client.reconnectSession();
|
|
1388
|
+
const accounts = await this.#client.reconnectSession().catch(console.info);
|
|
1588
1389
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1589
1390
|
if (!accounts) {
|
|
1590
1391
|
return null;
|
|
1591
1392
|
}
|
|
1592
1393
|
return {
|
|
1593
|
-
...
|
|
1394
|
+
...DeflyWalletClient.metadata,
|
|
1594
1395
|
accounts: accounts.map((address, index) => ({
|
|
1595
1396
|
name: `Defly Wallet ${index + 1}`,
|
|
1596
1397
|
address,
|
|
1597
|
-
providerId:
|
|
1398
|
+
providerId: DeflyWalletClient.metadata.id,
|
|
1598
1399
|
})),
|
|
1599
1400
|
};
|
|
1600
1401
|
}
|
|
1601
1402
|
async disconnect() {
|
|
1602
1403
|
await this.#client.disconnect();
|
|
1603
1404
|
}
|
|
1604
|
-
formatTransactionsArray(transactions) {
|
|
1605
|
-
const formattedTransactions = [];
|
|
1606
|
-
for (const [type, txn] of transactions) {
|
|
1607
|
-
if (type === "s") {
|
|
1608
|
-
formattedTransactions.push({
|
|
1609
|
-
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1610
|
-
signers: [],
|
|
1611
|
-
});
|
|
1612
|
-
}
|
|
1613
|
-
else {
|
|
1614
|
-
formattedTransactions.push({
|
|
1615
|
-
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1616
|
-
});
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
return formattedTransactions;
|
|
1620
|
-
}
|
|
1621
1405
|
async signTransactions(connectedAccounts, transactions) {
|
|
1622
1406
|
// Decode the transactions to access their properties.
|
|
1623
1407
|
const decodedTxns = transactions.map((txn) => {
|
|
@@ -1655,6 +1439,7 @@ class DeflyWalletClient extends BaseWallet {
|
|
|
1655
1439
|
}, []);
|
|
1656
1440
|
return signedTxns;
|
|
1657
1441
|
}
|
|
1442
|
+
/** @deprecated */
|
|
1658
1443
|
async signEncodedTransactions(transactions) {
|
|
1659
1444
|
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1660
1445
|
const result = await this.#client.signTransaction([
|
|
@@ -1673,47 +1458,84 @@ class DeflyWalletClient extends BaseWallet {
|
|
|
1673
1458
|
}
|
|
1674
1459
|
return signedTransactions;
|
|
1675
1460
|
}
|
|
1461
|
+
/** @deprecated */
|
|
1462
|
+
formatTransactionsArray(transactions) {
|
|
1463
|
+
const formattedTransactions = [];
|
|
1464
|
+
for (const [type, txn] of transactions) {
|
|
1465
|
+
if (type === "s") {
|
|
1466
|
+
formattedTransactions.push({
|
|
1467
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1468
|
+
signers: [],
|
|
1469
|
+
});
|
|
1470
|
+
}
|
|
1471
|
+
else {
|
|
1472
|
+
formattedTransactions.push({
|
|
1473
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1474
|
+
});
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
return formattedTransactions;
|
|
1478
|
+
}
|
|
1676
1479
|
}
|
|
1677
1480
|
|
|
1678
|
-
|
|
1481
|
+
const ICON$3 = "data:image/svg+xml;base64," +
|
|
1482
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
|
|
1483
|
+
|
|
1484
|
+
class ExodusClient extends BaseClient {
|
|
1679
1485
|
#client;
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
constructor({ client,
|
|
1486
|
+
#onlyIfTrusted;
|
|
1487
|
+
network;
|
|
1488
|
+
constructor({ client, algosdk, algodClient, onlyIfTrusted, network, }) {
|
|
1683
1489
|
super(algosdk, algodClient);
|
|
1684
1490
|
this.#client = client;
|
|
1685
|
-
this
|
|
1686
|
-
this.
|
|
1687
|
-
}
|
|
1688
|
-
static
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1491
|
+
this.#onlyIfTrusted = onlyIfTrusted;
|
|
1492
|
+
this.network = network;
|
|
1493
|
+
}
|
|
1494
|
+
static metadata = {
|
|
1495
|
+
id: exports.PROVIDER_ID.EXODUS,
|
|
1496
|
+
name: "Exodus",
|
|
1497
|
+
icon: ICON$3,
|
|
1498
|
+
isWalletConnect: false,
|
|
1499
|
+
};
|
|
1500
|
+
static async init({ clientOptions, algodOptions, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1501
|
+
try {
|
|
1502
|
+
if (typeof window == "undefined" ||
|
|
1503
|
+
window.exodus === undefined) {
|
|
1504
|
+
throw new Error("Exodus is not available.");
|
|
1505
|
+
}
|
|
1506
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1507
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1508
|
+
const exodus = window.exodus.algorand;
|
|
1509
|
+
return new ExodusClient({
|
|
1510
|
+
id: exports.PROVIDER_ID.EXODUS,
|
|
1511
|
+
client: exodus,
|
|
1512
|
+
algosdk: algosdk,
|
|
1513
|
+
algodClient: algodClient,
|
|
1514
|
+
onlyIfTrusted: clientOptions?.onlyIfTrusted || false,
|
|
1515
|
+
network,
|
|
1516
|
+
});
|
|
1517
|
+
}
|
|
1518
|
+
catch (e) {
|
|
1519
|
+
console.error("Error initializing...", e);
|
|
1520
|
+
return null;
|
|
1521
|
+
}
|
|
1702
1522
|
}
|
|
1703
1523
|
async connect() {
|
|
1704
|
-
const { address } = await this.#client.connect(
|
|
1524
|
+
const { address } = await this.#client.connect({
|
|
1525
|
+
onlyIfTrusted: this.#onlyIfTrusted,
|
|
1526
|
+
});
|
|
1705
1527
|
if (!address) {
|
|
1706
|
-
throw new Error(`No accounts found for ${
|
|
1528
|
+
throw new Error(`No accounts found for ${ExodusClient.metadata.id}`);
|
|
1707
1529
|
}
|
|
1708
1530
|
const accounts = [
|
|
1709
1531
|
{
|
|
1710
1532
|
name: `Exodus 1`,
|
|
1711
1533
|
address,
|
|
1712
|
-
providerId:
|
|
1534
|
+
providerId: ExodusClient.metadata.id,
|
|
1713
1535
|
},
|
|
1714
1536
|
];
|
|
1715
1537
|
return {
|
|
1716
|
-
...
|
|
1538
|
+
...ExodusClient.metadata,
|
|
1717
1539
|
accounts,
|
|
1718
1540
|
};
|
|
1719
1541
|
}
|
|
@@ -1758,6 +1580,7 @@ class ExodusClient extends BaseWallet {
|
|
|
1758
1580
|
}, []);
|
|
1759
1581
|
return signedTxns;
|
|
1760
1582
|
}
|
|
1583
|
+
/** @deprecated */
|
|
1761
1584
|
async signEncodedTransactions(transactions) {
|
|
1762
1585
|
const transactionsToSign = [];
|
|
1763
1586
|
const signedRawTransactions = [];
|
|
@@ -1785,172 +1608,209 @@ class ExodusClient extends BaseWallet {
|
|
|
1785
1608
|
}
|
|
1786
1609
|
}
|
|
1787
1610
|
|
|
1788
|
-
const
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1611
|
+
const ICON$2 = "data:image/svg+xml;base64," +
|
|
1612
|
+
"PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
|
|
1613
|
+
|
|
1614
|
+
const getNetwork = (network) => {
|
|
1615
|
+
if (network === "betanet") {
|
|
1616
|
+
return "BetaNet";
|
|
1617
|
+
}
|
|
1618
|
+
if (network === "testnet") {
|
|
1619
|
+
return "TestNet";
|
|
1620
|
+
}
|
|
1621
|
+
if (network === "mainnet") {
|
|
1622
|
+
return "MainNet";
|
|
1623
|
+
}
|
|
1624
|
+
return network;
|
|
1792
1625
|
};
|
|
1793
|
-
class
|
|
1626
|
+
class AlgoSignerClient extends BaseClient {
|
|
1794
1627
|
#client;
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
provider;
|
|
1798
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1628
|
+
network;
|
|
1629
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1799
1630
|
super(algosdk, algodClient);
|
|
1800
1631
|
this.#client = client;
|
|
1801
|
-
this.
|
|
1802
|
-
this.provider = provider;
|
|
1803
|
-
this.walletId = "";
|
|
1804
|
-
}
|
|
1805
|
-
static async init() {
|
|
1806
|
-
// TODO: allow diff config options?
|
|
1807
|
-
const kmdConfig = DefaultKMDConfig;
|
|
1808
|
-
const { algosdk, algodClient } = await Algod.init();
|
|
1809
|
-
const kmdClient = new algosdk.Kmd(kmdConfig.token, kmdConfig.host, kmdConfig.port);
|
|
1810
|
-
return new KMDWallet({
|
|
1811
|
-
id: exports.PROVIDER_ID.KMD_WALLET,
|
|
1812
|
-
client: kmdClient,
|
|
1813
|
-
provider: providers[exports.PROVIDER_ID.KMD_WALLET],
|
|
1814
|
-
algosdk: algosdk,
|
|
1815
|
-
algodClient: algodClient,
|
|
1816
|
-
});
|
|
1632
|
+
this.network = network;
|
|
1817
1633
|
}
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
}
|
|
1825
|
-
|
|
1826
|
-
|
|
1634
|
+
static metadata = {
|
|
1635
|
+
id: exports.PROVIDER_ID.ALGOSIGNER,
|
|
1636
|
+
name: "AlgoSigner",
|
|
1637
|
+
icon: ICON$2,
|
|
1638
|
+
isWalletConnect: false,
|
|
1639
|
+
};
|
|
1640
|
+
static async init({ algodOptions, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1641
|
+
try {
|
|
1642
|
+
if (typeof window == "undefined" ||
|
|
1643
|
+
window.AlgoSigner === undefined) {
|
|
1644
|
+
throw new Error("AlgoSigner is not available.");
|
|
1645
|
+
}
|
|
1646
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1647
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1648
|
+
const algosigner = window.AlgoSigner;
|
|
1649
|
+
return new AlgoSignerClient({
|
|
1650
|
+
id: exports.PROVIDER_ID.ALGOSIGNER,
|
|
1651
|
+
client: algosigner,
|
|
1652
|
+
algosdk: algosdk,
|
|
1653
|
+
algodClient: algodClient,
|
|
1654
|
+
network,
|
|
1655
|
+
});
|
|
1656
|
+
}
|
|
1657
|
+
catch (e) {
|
|
1658
|
+
console.error("Error initializing...", e);
|
|
1659
|
+
return null;
|
|
1660
|
+
}
|
|
1827
1661
|
}
|
|
1828
|
-
async
|
|
1662
|
+
async connect() {
|
|
1663
|
+
await this.#client.connect();
|
|
1664
|
+
const accounts = await this.#client.accounts({
|
|
1665
|
+
ledger: getNetwork(this.network),
|
|
1666
|
+
});
|
|
1667
|
+
if (accounts.length === 0) {
|
|
1668
|
+
throw new Error(`No accounts found for ${AlgoSignerClient.metadata.id}`);
|
|
1669
|
+
}
|
|
1670
|
+
const mappedAccounts = accounts.map(({ address }, index) => ({
|
|
1671
|
+
name: `AlgoSigner ${index + 1}`,
|
|
1672
|
+
address,
|
|
1673
|
+
providerId: AlgoSignerClient.metadata.id,
|
|
1674
|
+
}));
|
|
1829
1675
|
return {
|
|
1830
|
-
...
|
|
1831
|
-
accounts:
|
|
1676
|
+
...AlgoSignerClient.metadata,
|
|
1677
|
+
accounts: mappedAccounts,
|
|
1832
1678
|
};
|
|
1833
1679
|
}
|
|
1834
|
-
async
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
}
|
|
1839
|
-
async getWalletToken(walletId, password) {
|
|
1840
|
-
const handleResp = await this.#client.initWalletHandle(walletId, password);
|
|
1841
|
-
return handleResp.wallet_handle_token;
|
|
1842
|
-
}
|
|
1843
|
-
async releaseToken(token) {
|
|
1844
|
-
await this.#client.releaseWalletHandle(token);
|
|
1845
|
-
}
|
|
1846
|
-
async listWallets() {
|
|
1847
|
-
const walletResponse = await this.#client.listWallets();
|
|
1848
|
-
const walletList = walletResponse["wallets"];
|
|
1849
|
-
const walletMap = {};
|
|
1850
|
-
for (const w of walletList) {
|
|
1851
|
-
walletMap[w.name] = w.id;
|
|
1680
|
+
async reconnect(onDisconnect) {
|
|
1681
|
+
if (window === undefined ||
|
|
1682
|
+
window.AlgoSigner === undefined) {
|
|
1683
|
+
onDisconnect();
|
|
1852
1684
|
}
|
|
1853
|
-
return
|
|
1685
|
+
return null;
|
|
1854
1686
|
}
|
|
1855
|
-
async
|
|
1856
|
-
|
|
1857
|
-
if (!(wallet in walletMap))
|
|
1858
|
-
throw Error("No wallet named: " + wallet);
|
|
1859
|
-
this.walletId = walletMap[wallet];
|
|
1860
|
-
// Get a handle token
|
|
1861
|
-
const token = await this.getWalletToken(this.walletId, password);
|
|
1862
|
-
// Fetch accounts and format them as lib expects
|
|
1863
|
-
const listResponse = await this.#client.listKeys(token);
|
|
1864
|
-
const addresses = listResponse["addresses"];
|
|
1865
|
-
const mappedAccounts = addresses.map((address, index) => {
|
|
1866
|
-
return {
|
|
1867
|
-
name: `KMDWallet ${index + 1}`,
|
|
1868
|
-
address,
|
|
1869
|
-
providerId: this.provider.id,
|
|
1870
|
-
};
|
|
1871
|
-
});
|
|
1872
|
-
// Release handle token
|
|
1873
|
-
this.releaseToken(token);
|
|
1874
|
-
return mappedAccounts;
|
|
1687
|
+
async disconnect() {
|
|
1688
|
+
return;
|
|
1875
1689
|
}
|
|
1876
1690
|
async signTransactions(connectedAccounts, transactions) {
|
|
1877
1691
|
// Decode the transactions to access their properties.
|
|
1878
1692
|
const decodedTxns = transactions.map((txn) => {
|
|
1879
1693
|
return this.algosdk.decodeObj(txn);
|
|
1880
1694
|
});
|
|
1881
|
-
//
|
|
1882
|
-
|
|
1883
|
-
const
|
|
1884
|
-
|
|
1695
|
+
// Marshal the transactions,
|
|
1696
|
+
// and add the signers property if they shouldn't be signed.
|
|
1697
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1698
|
+
const txnObj = {
|
|
1699
|
+
txn: this.#client.encoding.msgpackToBase64(transactions[i]),
|
|
1700
|
+
};
|
|
1701
|
+
if ("txn" in txn ||
|
|
1702
|
+
!connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1703
|
+
txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
|
|
1704
|
+
txnObj.signers = [];
|
|
1705
|
+
}
|
|
1706
|
+
acc.push(txnObj);
|
|
1707
|
+
return acc;
|
|
1708
|
+
}, []);
|
|
1885
1709
|
// Sign them with the client.
|
|
1886
|
-
const
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
// Its already signed, skip it
|
|
1892
|
-
if (!("snd" in dtxn))
|
|
1893
|
-
continue;
|
|
1894
|
-
// Not to be signed by our signer, skip it
|
|
1895
|
-
if (!connectedAccounts.includes(this.algosdk.encodeAddress(dtxn.snd)))
|
|
1896
|
-
continue;
|
|
1897
|
-
// overwrite with an empty blob
|
|
1898
|
-
signedTxns[idx] = new Uint8Array();
|
|
1899
|
-
const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
|
|
1900
|
-
signingPromises.push(this.#client.signTransaction(token, pw, txn));
|
|
1901
|
-
}
|
|
1902
|
-
const signingResults = await Promise.all(signingPromises);
|
|
1903
|
-
// Restore the newly signed txns in the correct order
|
|
1904
|
-
let signedIdx = 0;
|
|
1905
|
-
for (const idx in signedTxns) {
|
|
1906
|
-
// If its an empty array, infer that it is one of the
|
|
1907
|
-
// ones we wanted to have signed and overwrite the empty buff
|
|
1908
|
-
if (signedTxns[idx].length === 0) {
|
|
1909
|
-
signedTxns[idx] = signingResults[signedIdx];
|
|
1910
|
-
signedIdx += 1;
|
|
1710
|
+
const result = await this.#client.signTxn(txnsToSign);
|
|
1711
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
1712
|
+
const signedTxns = result.reduce((acc, txn, i) => {
|
|
1713
|
+
if (txn) {
|
|
1714
|
+
acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1911
1715
|
}
|
|
1912
|
-
|
|
1716
|
+
else {
|
|
1717
|
+
acc.push(transactions[i]);
|
|
1718
|
+
}
|
|
1719
|
+
return acc;
|
|
1720
|
+
}, []);
|
|
1913
1721
|
return signedTxns;
|
|
1914
1722
|
}
|
|
1915
|
-
|
|
1916
|
-
|
|
1723
|
+
/** @deprecated */
|
|
1724
|
+
formatTransactionsArray(transactions) {
|
|
1725
|
+
const formattedTransactions = transactions.map(([type, txn]) => {
|
|
1726
|
+
const formattedTxn = {
|
|
1727
|
+
txn: txn[1],
|
|
1728
|
+
};
|
|
1729
|
+
if (type === "s") {
|
|
1730
|
+
formattedTxn.signers = [];
|
|
1731
|
+
const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1732
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
|
|
1733
|
+
}
|
|
1734
|
+
else {
|
|
1735
|
+
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
1736
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
|
|
1737
|
+
}
|
|
1738
|
+
return formattedTxn;
|
|
1739
|
+
});
|
|
1740
|
+
return formattedTransactions;
|
|
1741
|
+
}
|
|
1742
|
+
/** @deprecated */
|
|
1743
|
+
async signEncodedTransactions(transactions) {
|
|
1744
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1745
|
+
const result = await this.#client.signTxn(transactionsToSign);
|
|
1746
|
+
if (!result) {
|
|
1747
|
+
throw new Error("Signing failed.");
|
|
1748
|
+
}
|
|
1749
|
+
const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
|
|
1750
|
+
if (txn) {
|
|
1751
|
+
signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1752
|
+
}
|
|
1753
|
+
if (txn === null) {
|
|
1754
|
+
signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
|
|
1755
|
+
}
|
|
1756
|
+
return signedTxns;
|
|
1757
|
+
}, []);
|
|
1758
|
+
return signedRawTransactions;
|
|
1917
1759
|
}
|
|
1918
1760
|
}
|
|
1919
1761
|
|
|
1920
|
-
|
|
1762
|
+
const ICON$1 = "data:image/svg+xml;base64," +
|
|
1763
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==";
|
|
1764
|
+
const DEFAULT_NETWORK = "mainnet";
|
|
1765
|
+
|
|
1766
|
+
class WalletConnectClient extends BaseClient {
|
|
1921
1767
|
#client;
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1768
|
+
network;
|
|
1769
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1925
1770
|
super(algosdk, algodClient);
|
|
1926
1771
|
this.#client = client;
|
|
1927
|
-
this.
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1772
|
+
this.network = network;
|
|
1773
|
+
}
|
|
1774
|
+
static metadata = {
|
|
1775
|
+
id: exports.PROVIDER_ID.WALLETCONNECT,
|
|
1776
|
+
name: "WalletConnect",
|
|
1777
|
+
icon: ICON$1,
|
|
1778
|
+
isWalletConnect: true,
|
|
1779
|
+
};
|
|
1780
|
+
static async init({ clientOptions, algodOptions, clientStatic, modalStatic, algosdkStatic, network = DEFAULT_NETWORK, }) {
|
|
1781
|
+
try {
|
|
1782
|
+
const WalletConnect = clientStatic || (await import('@walletconnect/client')).default;
|
|
1783
|
+
const QRCodeModal = modalStatic ||
|
|
1784
|
+
(await import('algorand-walletconnect-qrcode-modal')).default;
|
|
1785
|
+
const walletConnect = new WalletConnect({
|
|
1786
|
+
...(clientOptions
|
|
1787
|
+
? clientOptions
|
|
1788
|
+
: {
|
|
1789
|
+
bridge: "https://bridge.walletconnect.org",
|
|
1790
|
+
qrcodeModal: QRCodeModal,
|
|
1791
|
+
}),
|
|
1792
|
+
});
|
|
1793
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1794
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1795
|
+
const initWallet = {
|
|
1796
|
+
client: walletConnect,
|
|
1797
|
+
algosdk: algosdk,
|
|
1798
|
+
algodClient: algodClient,
|
|
1799
|
+
network,
|
|
1800
|
+
};
|
|
1801
|
+
return new WalletConnectClient(initWallet);
|
|
1802
|
+
}
|
|
1803
|
+
catch (e) {
|
|
1804
|
+
console.error("Error initializing...", e);
|
|
1805
|
+
return null;
|
|
1806
|
+
}
|
|
1947
1807
|
}
|
|
1948
1808
|
async connect() {
|
|
1949
1809
|
let chainId = 416001;
|
|
1950
|
-
if (
|
|
1810
|
+
if (this.network === "betanet") {
|
|
1951
1811
|
chainId = 416003;
|
|
1952
1812
|
}
|
|
1953
|
-
else if (
|
|
1813
|
+
else if (this.network === "testnet") {
|
|
1954
1814
|
chainId = 416002;
|
|
1955
1815
|
}
|
|
1956
1816
|
if (!this.#client.connected) {
|
|
@@ -1963,11 +1823,11 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1963
1823
|
}
|
|
1964
1824
|
const { accounts } = payload.params[0];
|
|
1965
1825
|
resolve({
|
|
1966
|
-
...
|
|
1826
|
+
...WalletConnectClient.metadata,
|
|
1967
1827
|
accounts: accounts.map((address, index) => ({
|
|
1968
1828
|
name: `Wallet Connect ${index + 1}`,
|
|
1969
1829
|
address,
|
|
1970
|
-
providerId:
|
|
1830
|
+
providerId: WalletConnectClient.metadata.id,
|
|
1971
1831
|
})),
|
|
1972
1832
|
});
|
|
1973
1833
|
});
|
|
@@ -1977,28 +1837,27 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1977
1837
|
}
|
|
1978
1838
|
const { accounts } = payload.params[0];
|
|
1979
1839
|
resolve({
|
|
1980
|
-
...
|
|
1840
|
+
...WalletConnectClient.metadata,
|
|
1981
1841
|
accounts: accounts.map((address, index) => ({
|
|
1982
1842
|
name: `Wallet Connect ${index + 1}`,
|
|
1983
1843
|
address,
|
|
1984
|
-
providerId:
|
|
1844
|
+
providerId: WalletConnectClient.metadata.id,
|
|
1985
1845
|
})),
|
|
1986
1846
|
});
|
|
1987
1847
|
});
|
|
1988
1848
|
});
|
|
1989
1849
|
}
|
|
1990
1850
|
async reconnect() {
|
|
1991
|
-
this.#client = (await WalletConnectClient.init()).#client;
|
|
1992
1851
|
const accounts = this.#client.accounts;
|
|
1993
1852
|
if (!accounts) {
|
|
1994
1853
|
return null;
|
|
1995
1854
|
}
|
|
1996
1855
|
return {
|
|
1997
|
-
...
|
|
1856
|
+
...WalletConnectClient.metadata,
|
|
1998
1857
|
accounts: accounts.map((address, index) => ({
|
|
1999
1858
|
name: `Wallet Connect ${index + 1}`,
|
|
2000
1859
|
address,
|
|
2001
|
-
providerId:
|
|
1860
|
+
providerId: WalletConnectClient.metadata.id,
|
|
2002
1861
|
})),
|
|
2003
1862
|
};
|
|
2004
1863
|
}
|
|
@@ -2013,20 +1872,6 @@ class WalletConnectClient extends BaseWallet {
|
|
|
2013
1872
|
console.error("Error disconnecting", e);
|
|
2014
1873
|
}
|
|
2015
1874
|
}
|
|
2016
|
-
formatTransactionsArray(transactions) {
|
|
2017
|
-
const formattedTransactions = transactions.map((txn) => {
|
|
2018
|
-
const formattedTxn = {
|
|
2019
|
-
txn: txn[1],
|
|
2020
|
-
};
|
|
2021
|
-
if (txn[0] === "s") {
|
|
2022
|
-
const decodedTxn = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn[1], "base64")));
|
|
2023
|
-
formattedTxn.txn = Buffer.from(this.algosdk.encodeUnsignedTransaction(decodedTxn.txn)).toString("base64");
|
|
2024
|
-
formattedTxn.signers = [];
|
|
2025
|
-
}
|
|
2026
|
-
return formattedTxn;
|
|
2027
|
-
});
|
|
2028
|
-
return formattedTransactions;
|
|
2029
|
-
}
|
|
2030
1875
|
async signTransactions(connectedAccounts, transactions) {
|
|
2031
1876
|
// Decode the transactions to access their properties.
|
|
2032
1877
|
const decodedTxns = transactions.map((txn) => {
|
|
@@ -2069,6 +1914,22 @@ class WalletConnectClient extends BaseWallet {
|
|
|
2069
1914
|
}, []);
|
|
2070
1915
|
return signedTxns;
|
|
2071
1916
|
}
|
|
1917
|
+
/** @deprecarted */
|
|
1918
|
+
formatTransactionsArray(transactions) {
|
|
1919
|
+
const formattedTransactions = transactions.map((txn) => {
|
|
1920
|
+
const formattedTxn = {
|
|
1921
|
+
txn: txn[1],
|
|
1922
|
+
};
|
|
1923
|
+
if (txn[0] === "s") {
|
|
1924
|
+
const decodedTxn = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn[1], "base64")));
|
|
1925
|
+
formattedTxn.txn = Buffer.from(this.algosdk.encodeUnsignedTransaction(decodedTxn.txn)).toString("base64");
|
|
1926
|
+
formattedTxn.signers = [];
|
|
1927
|
+
}
|
|
1928
|
+
return formattedTxn;
|
|
1929
|
+
});
|
|
1930
|
+
return formattedTransactions;
|
|
1931
|
+
}
|
|
1932
|
+
/** @deprecated */
|
|
2072
1933
|
async signEncodedTransactions(transactions) {
|
|
2073
1934
|
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
2074
1935
|
const requestParams = [transactionsToSign];
|
|
@@ -2089,128 +1950,164 @@ class WalletConnectClient extends BaseWallet {
|
|
|
2089
1950
|
}
|
|
2090
1951
|
}
|
|
2091
1952
|
|
|
2092
|
-
const
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
1953
|
+
const ICON = "data:image/svg+xml;base64," +
|
|
1954
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+";
|
|
1955
|
+
|
|
1956
|
+
class KMDWalletClient extends BaseClient {
|
|
1957
|
+
#client;
|
|
1958
|
+
#wallet;
|
|
1959
|
+
#password;
|
|
1960
|
+
walletId;
|
|
1961
|
+
id;
|
|
1962
|
+
network;
|
|
1963
|
+
constructor({ client, id, wallet, password, algosdk, algodClient, network, }) {
|
|
1964
|
+
super(algosdk, algodClient);
|
|
1965
|
+
this.#client = client;
|
|
1966
|
+
this.#wallet = wallet;
|
|
1967
|
+
this.#password = password;
|
|
1968
|
+
this.id = id;
|
|
1969
|
+
this.walletId = "";
|
|
1970
|
+
this.network = network;
|
|
1971
|
+
}
|
|
1972
|
+
static metadata = {
|
|
1973
|
+
id: exports.PROVIDER_ID.KMD,
|
|
1974
|
+
name: "KMD",
|
|
1975
|
+
icon: ICON,
|
|
1976
|
+
isWalletConnect: false,
|
|
1977
|
+
};
|
|
1978
|
+
static async init({ clientOptions, algodOptions, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1979
|
+
try {
|
|
1980
|
+
const { token = "a".repeat(64), host = "http://localhost", port = "4002", wallet = "", password = "", } = clientOptions || {};
|
|
1981
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1982
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1983
|
+
const kmdClient = new algosdk.Kmd(token, host, port);
|
|
1984
|
+
return new KMDWalletClient({
|
|
1985
|
+
id: exports.PROVIDER_ID.KMD,
|
|
1986
|
+
password,
|
|
1987
|
+
wallet,
|
|
1988
|
+
client: kmdClient,
|
|
1989
|
+
algosdk: algosdk,
|
|
1990
|
+
algodClient: algodClient,
|
|
1991
|
+
network,
|
|
1992
|
+
});
|
|
2109
1993
|
}
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
console.info("error initializing client", e);
|
|
2114
|
-
return;
|
|
1994
|
+
catch (e) {
|
|
1995
|
+
console.error("Error initializing...", e);
|
|
1996
|
+
return null;
|
|
2115
1997
|
}
|
|
2116
|
-
}
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
1998
|
+
}
|
|
1999
|
+
async connect() {
|
|
2000
|
+
// TODO: prompt for wallet and password?
|
|
2001
|
+
return {
|
|
2002
|
+
...KMDWalletClient.metadata,
|
|
2003
|
+
accounts: await this.listAccounts(this.#wallet, await this.requestPassword()),
|
|
2004
|
+
};
|
|
2005
|
+
}
|
|
2006
|
+
async disconnect() {
|
|
2007
|
+
return;
|
|
2008
|
+
}
|
|
2009
|
+
async reconnect() {
|
|
2010
|
+
return {
|
|
2011
|
+
...KMDWalletClient.metadata,
|
|
2012
|
+
accounts: await this.listAccounts(this.#wallet, this.#password || (await this.requestPassword())),
|
|
2013
|
+
};
|
|
2014
|
+
}
|
|
2015
|
+
async requestPassword() {
|
|
2016
|
+
// TODO: store it locally?
|
|
2017
|
+
const pw = prompt("gib password");
|
|
2018
|
+
return pw ? pw : "";
|
|
2019
|
+
}
|
|
2020
|
+
async getWalletToken(walletId, password) {
|
|
2021
|
+
const handleResp = await this.#client.initWalletHandle(walletId, password);
|
|
2022
|
+
return handleResp.wallet_handle_token;
|
|
2023
|
+
}
|
|
2024
|
+
async releaseToken(token) {
|
|
2025
|
+
await this.#client.releaseWalletHandle(token);
|
|
2026
|
+
}
|
|
2027
|
+
async listWallets() {
|
|
2028
|
+
const walletResponse = await this.#client.listWallets();
|
|
2029
|
+
const walletList = walletResponse["wallets"];
|
|
2030
|
+
const walletMap = {};
|
|
2031
|
+
for (const w of walletList) {
|
|
2032
|
+
walletMap[w.name] = w.id;
|
|
2121
2033
|
}
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2034
|
+
return walletMap;
|
|
2035
|
+
}
|
|
2036
|
+
async listAccounts(wallet, password) {
|
|
2037
|
+
const walletMap = await this.listWallets();
|
|
2038
|
+
if (!(wallet in walletMap))
|
|
2039
|
+
throw Error("No wallet named: " + wallet);
|
|
2040
|
+
this.walletId = walletMap[wallet];
|
|
2041
|
+
// Get a handle token
|
|
2042
|
+
const token = await this.getWalletToken(this.walletId, password);
|
|
2043
|
+
// Fetch accounts and format them as lib expects
|
|
2044
|
+
const listResponse = await this.#client.listKeys(token);
|
|
2045
|
+
const addresses = listResponse["addresses"];
|
|
2046
|
+
const mappedAccounts = addresses.map((address, index) => {
|
|
2047
|
+
return {
|
|
2048
|
+
name: `KMDWallet ${index + 1}`,
|
|
2049
|
+
address,
|
|
2050
|
+
providerId: KMDWalletClient.metadata.id,
|
|
2051
|
+
};
|
|
2052
|
+
});
|
|
2053
|
+
// Release handle token
|
|
2054
|
+
this.releaseToken(token);
|
|
2055
|
+
return mappedAccounts;
|
|
2056
|
+
}
|
|
2057
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
2058
|
+
// Decode the transactions to access their properties.
|
|
2059
|
+
const decodedTxns = transactions.map((txn) => {
|
|
2060
|
+
return this.algosdk.decodeObj(txn);
|
|
2061
|
+
});
|
|
2062
|
+
// Get a handle token
|
|
2063
|
+
const pw = await this.requestPassword();
|
|
2064
|
+
const token = await this.getWalletToken(this.walletId, pw);
|
|
2065
|
+
const signedTxns = [];
|
|
2066
|
+
// Sign them with the client.
|
|
2067
|
+
const signingPromises = [];
|
|
2068
|
+
for (const idx in decodedTxns) {
|
|
2069
|
+
const dtxn = decodedTxns[idx];
|
|
2070
|
+
// push the incoming txn into signed, we'll overwrite it later
|
|
2071
|
+
signedTxns.push(transactions[idx]);
|
|
2072
|
+
// Its already signed, skip it
|
|
2073
|
+
if (!("snd" in dtxn))
|
|
2074
|
+
continue;
|
|
2075
|
+
// Not to be signed by our signer, skip it
|
|
2076
|
+
if (!connectedAccounts.includes(this.algosdk.encodeAddress(dtxn.snd)))
|
|
2077
|
+
continue;
|
|
2078
|
+
// overwrite with an empty blob
|
|
2079
|
+
signedTxns[idx] = new Uint8Array();
|
|
2080
|
+
const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
|
|
2081
|
+
signingPromises.push(this.#client.signTransaction(token, pw, txn));
|
|
2127
2082
|
}
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2083
|
+
const signingResults = await Promise.all(signingPromises);
|
|
2084
|
+
// Restore the newly signed txns in the correct order
|
|
2085
|
+
let signedIdx = 0;
|
|
2086
|
+
for (const idx in signedTxns) {
|
|
2087
|
+
// If its an empty array, infer that it is one of the
|
|
2088
|
+
// ones we wanted to have signed and overwrite the empty buff
|
|
2089
|
+
if (signedTxns[idx].length === 0) {
|
|
2090
|
+
signedTxns[idx] = signingResults[signedIdx];
|
|
2091
|
+
signedIdx += 1;
|
|
2092
|
+
}
|
|
2133
2093
|
}
|
|
2134
|
-
|
|
2135
|
-
};
|
|
2136
|
-
|
|
2137
|
-
const getWalletClient = async (id) => {
|
|
2138
|
-
if (!id) {
|
|
2139
|
-
throw new Error("No wallet provider id provided");
|
|
2094
|
+
return signedTxns;
|
|
2140
2095
|
}
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
throw new Error(`No wallet client found for provider id: ${id}`);
|
|
2096
|
+
signEncodedTransactions(transactions) {
|
|
2097
|
+
throw new Error("Method not implemented.");
|
|
2144
2098
|
}
|
|
2145
|
-
return client;
|
|
2146
|
-
};
|
|
2147
|
-
|
|
2148
|
-
function useWallet() {
|
|
2149
|
-
const allAccounts = useWalletStore((state) => state.accounts);
|
|
2150
|
-
const activeAccount = useWalletStore((state) => state.activeAccount);
|
|
2151
|
-
const accounts = require$$0.useMemo(() => allAccounts.filter((account) => account.providerId === activeAccount?.providerId), [allAccounts, activeAccount]);
|
|
2152
|
-
const signTransactions = async (transactions) => {
|
|
2153
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
2154
|
-
if (!walletClient || !activeAccount?.address) {
|
|
2155
|
-
throw new Error("No wallet found.");
|
|
2156
|
-
}
|
|
2157
|
-
const signedTransactions = await walletClient.signTransactions(accounts.map((acct) => acct.address), transactions);
|
|
2158
|
-
return signedTransactions;
|
|
2159
|
-
};
|
|
2160
|
-
const sendTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2161
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
2162
|
-
const result = await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
2163
|
-
return result;
|
|
2164
|
-
};
|
|
2165
|
-
const signer = async (txnGroup, indexesToSign) => {
|
|
2166
|
-
const algosdk = await getAlgosdk();
|
|
2167
|
-
const txnBlobs = txnGroup.map(algosdk.encodeUnsignedTransaction);
|
|
2168
|
-
const txns = await Promise.resolve(signTransactions(txnBlobs));
|
|
2169
|
-
return txns.filter((_, index) => indexesToSign.includes(index));
|
|
2170
|
-
};
|
|
2171
|
-
const getAccountInfo = async () => {
|
|
2172
|
-
if (!activeAccount)
|
|
2173
|
-
throw new Error("No selected account.");
|
|
2174
|
-
const walletClient = await getWalletClient(activeAccount.providerId);
|
|
2175
|
-
const accountInfo = await walletClient?.getAccountInfo(activeAccount.address);
|
|
2176
|
-
return accountInfo;
|
|
2177
|
-
};
|
|
2178
|
-
const getAddress = () => {
|
|
2179
|
-
return activeAccount?.address;
|
|
2180
|
-
};
|
|
2181
|
-
const getAssets = async () => {
|
|
2182
|
-
if (!activeAccount)
|
|
2183
|
-
throw new Error("No selected account.");
|
|
2184
|
-
const walletClient = await getWalletClient(activeAccount.providerId);
|
|
2185
|
-
return await walletClient?.getAssets(activeAccount.address);
|
|
2186
|
-
};
|
|
2187
|
-
const groupTransactionsBySender = async (transactions) => {
|
|
2188
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
2189
|
-
return walletClient?.groupTransactionsBySender(transactions);
|
|
2190
|
-
};
|
|
2191
|
-
const signEncodedTransactions = async (transactions) => {
|
|
2192
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
2193
|
-
return await walletClient?.signEncodedTransactions(transactions);
|
|
2194
|
-
};
|
|
2195
|
-
const sendRawTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2196
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
2197
|
-
return await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
2198
|
-
};
|
|
2199
|
-
return {
|
|
2200
|
-
accounts,
|
|
2201
|
-
activeAccount,
|
|
2202
|
-
signer,
|
|
2203
|
-
signTransactions,
|
|
2204
|
-
sendTransactions,
|
|
2205
|
-
getAddress,
|
|
2206
|
-
groupTransactionsBySender,
|
|
2207
|
-
getAccountInfo,
|
|
2208
|
-
getAssets,
|
|
2209
|
-
signEncodedTransactions,
|
|
2210
|
-
sendRawTransactions,
|
|
2211
|
-
};
|
|
2212
2099
|
}
|
|
2213
2100
|
|
|
2101
|
+
var allClients = {
|
|
2102
|
+
[PeraWalletClient.metadata.id]: PeraWalletClient,
|
|
2103
|
+
[MyAlgoWalletClient.metadata.id]: MyAlgoWalletClient,
|
|
2104
|
+
[DeflyWalletClient.metadata.id]: DeflyWalletClient,
|
|
2105
|
+
[ExodusClient.metadata.id]: ExodusClient,
|
|
2106
|
+
[AlgoSignerClient.metadata.id]: AlgoSignerClient,
|
|
2107
|
+
[WalletConnectClient.metadata.id]: WalletConnectClient,
|
|
2108
|
+
[KMDWalletClient.metadata.id]: KMDWalletClient,
|
|
2109
|
+
};
|
|
2110
|
+
|
|
2214
2111
|
function shallow(objA, objB) {
|
|
2215
2112
|
if (Object.is(objA, objB)) {
|
|
2216
2113
|
return true;
|
|
@@ -2230,81 +2127,76 @@ function shallow(objA, objB) {
|
|
|
2230
2127
|
return true;
|
|
2231
2128
|
}
|
|
2232
2129
|
|
|
2233
|
-
function
|
|
2234
|
-
const
|
|
2235
|
-
const
|
|
2236
|
-
.filter(({ id }) => options?.providers
|
|
2237
|
-
? options.providers.includes(id)
|
|
2238
|
-
: id !== exports.PROVIDER_ID.KMD_WALLET)
|
|
2239
|
-
.map(({ id, name, icon, isWalletConnect }) => {
|
|
2240
|
-
return {
|
|
2241
|
-
id,
|
|
2242
|
-
name,
|
|
2243
|
-
icon,
|
|
2244
|
-
accounts: accounts.filter((account) => account.providerId === id),
|
|
2245
|
-
activeAccount: activeAccount?.providerId === id ? activeAccount : null,
|
|
2246
|
-
isActive: activeAccount?.providerId === id,
|
|
2247
|
-
isConnected: accounts.some((accounts) => accounts.providerId === id),
|
|
2248
|
-
isWalletConnect,
|
|
2249
|
-
connect: () => connect(id),
|
|
2250
|
-
disconnect: () => disconnect(id),
|
|
2251
|
-
reconnect: () => reconnect(id),
|
|
2252
|
-
setActive: () => setActive(id),
|
|
2253
|
-
selectAccount: (account) => selectActiveAccount(id, account),
|
|
2254
|
-
};
|
|
2255
|
-
}), [accounts, activeAccount]);
|
|
2130
|
+
function useWallet() {
|
|
2131
|
+
const clients = require$$0.useContext(ClientContext);
|
|
2132
|
+
const { activeAccount, accounts: connectedAccounts, setActiveAccount: _setActiveAccount, clearActiveAccount, addAccounts, removeAccounts, } = useWalletStore(walletStoreSelector, shallow);
|
|
2256
2133
|
const getAccountsByProvider = (id) => {
|
|
2257
|
-
return
|
|
2134
|
+
return connectedAccounts.filter((account) => account.providerId === id);
|
|
2258
2135
|
};
|
|
2259
|
-
const
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2136
|
+
const connectedActiveAccounts = require$$0.useMemo(() => connectedAccounts.filter((account) => account.providerId === activeAccount?.providerId), [connectedAccounts, activeAccount]);
|
|
2137
|
+
const providers = require$$0.useMemo(() => {
|
|
2138
|
+
if (!clients)
|
|
2139
|
+
return null;
|
|
2140
|
+
const supportedClients = Object.keys(clients);
|
|
2141
|
+
return supportedClients.map((id) => {
|
|
2142
|
+
return {
|
|
2143
|
+
...allClients[id],
|
|
2144
|
+
accounts: getAccountsByProvider(id),
|
|
2145
|
+
isActive: activeAccount?.providerId === id,
|
|
2146
|
+
isConnected: connectedAccounts.some((accounts) => accounts.providerId === id),
|
|
2147
|
+
connect: () => connect(id),
|
|
2148
|
+
disconnect: () => disconnect(id),
|
|
2149
|
+
reconnect: () => reconnect(id),
|
|
2150
|
+
setActiveProvider: () => setActive(id),
|
|
2151
|
+
setActiveAccount: (account) => selectActiveAccount(id, account),
|
|
2152
|
+
};
|
|
2264
2153
|
});
|
|
2154
|
+
}, [clients, connectedAccounts, connectedActiveAccounts, activeAccount]);
|
|
2155
|
+
const getClient = async (id) => {
|
|
2156
|
+
if (!id)
|
|
2157
|
+
throw new Error("Provier ID is missing.");
|
|
2158
|
+
const client = await clients?.[id];
|
|
2159
|
+
if (!client)
|
|
2160
|
+
throw new Error("Client not found for ID");
|
|
2161
|
+
return client;
|
|
2265
2162
|
};
|
|
2266
2163
|
const disconnectWCSessions = async (id) => {
|
|
2267
|
-
if (!
|
|
2164
|
+
if (!allClients[id].metadata.isWalletConnect) {
|
|
2165
|
+
return;
|
|
2166
|
+
}
|
|
2167
|
+
if (!providers) {
|
|
2268
2168
|
return;
|
|
2269
2169
|
}
|
|
2270
|
-
const wcSessions = Object.values(providers
|
|
2170
|
+
const wcSessions = Object.values(providers).filter((p) => p.metadata.id !== id &&
|
|
2171
|
+
p.metadata.isWalletConnect &&
|
|
2172
|
+
(p.isConnected || p.isActive));
|
|
2271
2173
|
for (const session of wcSessions) {
|
|
2272
|
-
await disconnect(session.id);
|
|
2174
|
+
await disconnect(session.metadata.id);
|
|
2273
2175
|
}
|
|
2274
2176
|
};
|
|
2275
|
-
const
|
|
2177
|
+
const selectActiveAccount = async (providerId, address) => {
|
|
2276
2178
|
try {
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
if (!walletInfo || !walletInfo.accounts.length) {
|
|
2281
|
-
throw new Error("Failed to connect " + id);
|
|
2179
|
+
const account = connectedActiveAccounts.find((acct) => acct.address === address && acct.providerId === providerId);
|
|
2180
|
+
if (!account) {
|
|
2181
|
+
throw new Error(`No accounts with address ${address} found.`);
|
|
2282
2182
|
}
|
|
2283
|
-
|
|
2284
|
-
|
|
2183
|
+
await disconnectWCSessions(account.providerId);
|
|
2184
|
+
_setActiveAccount(account);
|
|
2285
2185
|
}
|
|
2286
2186
|
catch (e) {
|
|
2287
2187
|
console.error(e);
|
|
2288
2188
|
}
|
|
2289
2189
|
};
|
|
2290
|
-
const
|
|
2190
|
+
const connect = async (id) => {
|
|
2291
2191
|
try {
|
|
2292
2192
|
await disconnectWCSessions(id);
|
|
2293
|
-
const
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
console.error(e);
|
|
2298
|
-
}
|
|
2299
|
-
};
|
|
2300
|
-
const selectActiveAccount = async (providerId, address) => {
|
|
2301
|
-
try {
|
|
2302
|
-
const account = accounts.find((acct) => acct.address === address && acct.providerId === providerId);
|
|
2303
|
-
if (!account) {
|
|
2304
|
-
throw new Error(`No accounts with address ${address} found.`);
|
|
2193
|
+
const walletClient = await getClient(id);
|
|
2194
|
+
const walletInfo = await walletClient?.connect(() => disconnect(id));
|
|
2195
|
+
if (!walletInfo || !walletInfo.accounts.length) {
|
|
2196
|
+
throw new Error("Failed to connect " + id);
|
|
2305
2197
|
}
|
|
2306
|
-
|
|
2307
|
-
|
|
2198
|
+
_setActiveAccount(walletInfo.accounts[0]);
|
|
2199
|
+
addAccounts(walletInfo.accounts);
|
|
2308
2200
|
}
|
|
2309
2201
|
catch (e) {
|
|
2310
2202
|
console.error(e);
|
|
@@ -2312,7 +2204,7 @@ function useConnectWallet(options) {
|
|
|
2312
2204
|
};
|
|
2313
2205
|
const reconnect = async (id) => {
|
|
2314
2206
|
try {
|
|
2315
|
-
const walletClient = await
|
|
2207
|
+
const walletClient = await getClient(id);
|
|
2316
2208
|
const walletInfo = await walletClient?.reconnect(() => disconnect(id));
|
|
2317
2209
|
if (walletInfo && walletInfo.accounts.length) {
|
|
2318
2210
|
addAccounts(walletInfo.accounts);
|
|
@@ -2325,7 +2217,7 @@ function useConnectWallet(options) {
|
|
|
2325
2217
|
};
|
|
2326
2218
|
const disconnect = async (id) => {
|
|
2327
2219
|
try {
|
|
2328
|
-
const walletClient = await
|
|
2220
|
+
const walletClient = await getClient(id);
|
|
2329
2221
|
walletClient?.disconnect();
|
|
2330
2222
|
}
|
|
2331
2223
|
catch (e) {
|
|
@@ -2336,29 +2228,134 @@ function useConnectWallet(options) {
|
|
|
2336
2228
|
removeAccounts(id);
|
|
2337
2229
|
}
|
|
2338
2230
|
};
|
|
2231
|
+
const setActive = async (id) => {
|
|
2232
|
+
try {
|
|
2233
|
+
await disconnectWCSessions(id);
|
|
2234
|
+
const accounts = getAccountsByProvider(id);
|
|
2235
|
+
_setActiveAccount(accounts[0]);
|
|
2236
|
+
}
|
|
2237
|
+
catch (e) {
|
|
2238
|
+
console.error(e);
|
|
2239
|
+
}
|
|
2240
|
+
};
|
|
2241
|
+
const signTransactions = async (transactions) => {
|
|
2242
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2243
|
+
if (!walletClient || !activeAccount?.address) {
|
|
2244
|
+
throw new Error("No wallet found.");
|
|
2245
|
+
}
|
|
2246
|
+
const signedTransactions = await walletClient.signTransactions(connectedActiveAccounts.map((acct) => acct.address), transactions);
|
|
2247
|
+
return signedTransactions;
|
|
2248
|
+
};
|
|
2249
|
+
const sendTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2250
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2251
|
+
const result = await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
2252
|
+
return result;
|
|
2253
|
+
};
|
|
2254
|
+
const signer = async (txnGroup, indexesToSign) => {
|
|
2255
|
+
const algosdk = await getAlgosdk();
|
|
2256
|
+
const txnBlobs = txnGroup.map(algosdk.encodeUnsignedTransaction);
|
|
2257
|
+
const txns = await Promise.resolve(signTransactions(txnBlobs));
|
|
2258
|
+
return txns.filter((_, index) => indexesToSign.includes(index));
|
|
2259
|
+
};
|
|
2260
|
+
const getAccountInfo = async () => {
|
|
2261
|
+
if (!activeAccount)
|
|
2262
|
+
throw new Error("No selected account.");
|
|
2263
|
+
const walletClient = await getClient(activeAccount.providerId);
|
|
2264
|
+
const accountInfo = await walletClient?.getAccountInfo(activeAccount.address);
|
|
2265
|
+
return accountInfo;
|
|
2266
|
+
};
|
|
2267
|
+
const getAddress = () => {
|
|
2268
|
+
return activeAccount?.address;
|
|
2269
|
+
};
|
|
2270
|
+
const getAssets = async () => {
|
|
2271
|
+
if (!activeAccount)
|
|
2272
|
+
throw new Error("No selected account.");
|
|
2273
|
+
const walletClient = await getClient(activeAccount.providerId);
|
|
2274
|
+
return await walletClient?.getAssets(activeAccount.address);
|
|
2275
|
+
};
|
|
2276
|
+
const groupTransactionsBySender = async (transactions) => {
|
|
2277
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2278
|
+
return walletClient?.groupTransactionsBySender(transactions);
|
|
2279
|
+
};
|
|
2280
|
+
const signEncodedTransactions = async (transactions) => {
|
|
2281
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2282
|
+
return await walletClient?.signEncodedTransactions(transactions);
|
|
2283
|
+
};
|
|
2284
|
+
const sendRawTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2285
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2286
|
+
return await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
2287
|
+
};
|
|
2339
2288
|
return {
|
|
2340
|
-
|
|
2289
|
+
clients,
|
|
2290
|
+
providers,
|
|
2291
|
+
connectedAccounts,
|
|
2292
|
+
connectedActiveAccounts,
|
|
2341
2293
|
activeAccount,
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2294
|
+
activeAddress: activeAccount?.address,
|
|
2295
|
+
signer,
|
|
2296
|
+
signTransactions,
|
|
2297
|
+
sendTransactions,
|
|
2298
|
+
getAddress,
|
|
2299
|
+
groupTransactionsBySender,
|
|
2300
|
+
getAccountInfo,
|
|
2301
|
+
getAssets,
|
|
2302
|
+
signEncodedTransactions,
|
|
2303
|
+
sendRawTransactions,
|
|
2349
2304
|
};
|
|
2350
2305
|
}
|
|
2351
2306
|
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2307
|
+
const initializeProviders = (providers, nodeConfig, algosdkStatic) => {
|
|
2308
|
+
const initializedProviders = {};
|
|
2309
|
+
const { network = DEFAULT_NETWORK$1, nodeServer = DEFAULT_NODE_BASEURL, nodePort = DEFAULT_NODE_PORT, nodeToken = DEFAULT_NODE_TOKEN, } = nodeConfig || {};
|
|
2310
|
+
if (!providers || providers.length === 0)
|
|
2311
|
+
for (const [id, client] of Object.entries(allClients)) {
|
|
2312
|
+
if (id === "kmd") {
|
|
2313
|
+
continue;
|
|
2314
|
+
}
|
|
2315
|
+
initializedProviders[id] = client.init({
|
|
2316
|
+
network,
|
|
2317
|
+
algodOptions: [nodeToken, nodeServer, nodePort],
|
|
2318
|
+
algosdkStatic: algosdkStatic,
|
|
2319
|
+
});
|
|
2320
|
+
}
|
|
2321
|
+
if (providers) {
|
|
2322
|
+
for (const id of providers) {
|
|
2323
|
+
initializedProviders[id] = allClients[id].init({
|
|
2324
|
+
network,
|
|
2325
|
+
algodOptions: [nodeToken, nodeServer, nodePort],
|
|
2326
|
+
algosdkStatic: algosdkStatic,
|
|
2327
|
+
});
|
|
2328
|
+
}
|
|
2329
|
+
}
|
|
2330
|
+
return initializedProviders;
|
|
2331
|
+
};
|
|
2332
|
+
|
|
2333
|
+
const reconnectProviders = async (providers) => {
|
|
2334
|
+
try {
|
|
2335
|
+
const clients = Object.values(providers);
|
|
2336
|
+
for (const client of clients) {
|
|
2337
|
+
const c = await client;
|
|
2338
|
+
c?.reconnect(c?.disconnect);
|
|
2339
|
+
}
|
|
2340
|
+
}
|
|
2341
|
+
catch (e) {
|
|
2342
|
+
console.error(e);
|
|
2343
|
+
}
|
|
2344
|
+
};
|
|
2345
|
+
|
|
2346
|
+
exports.DEFAULT_NETWORK = DEFAULT_NETWORK$1;
|
|
2347
|
+
exports.DEFAULT_NODE_BASEURL = DEFAULT_NODE_BASEURL;
|
|
2348
|
+
exports.DEFAULT_NODE_PORT = DEFAULT_NODE_PORT;
|
|
2349
|
+
exports.DEFAULT_NODE_TOKEN = DEFAULT_NODE_TOKEN;
|
|
2350
|
+
exports.WalletProvider = clientStore;
|
|
2351
|
+
exports.algosigner = AlgoSignerClient;
|
|
2352
|
+
exports.defly = DeflyWalletClient;
|
|
2353
|
+
exports.exodus = ExodusClient;
|
|
2354
|
+
exports.initializeProviders = initializeProviders;
|
|
2355
|
+
exports.kmd = KMDWalletClient;
|
|
2356
|
+
exports.myalgo = MyAlgoWalletClient;
|
|
2357
|
+
exports.pera = PeraWalletClient;
|
|
2358
|
+
exports.reconnectProviders = reconnectProviders;
|
|
2363
2359
|
exports.useWallet = useWallet;
|
|
2360
|
+
exports.walletconnect = WalletConnectClient;
|
|
2364
2361
|
//# sourceMappingURL=index.js.map
|