@txnlab/use-wallet 0.1.22 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +252 -94
- 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/cjs/clients/base/base.d.ts +50 -0
- 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/myalgo/client.d.ts +37 -0
- 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 +1428 -1031
- 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/store/state/walletStore.d.ts +17 -1
- 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/esm/clients/base/base.d.ts +50 -0
- 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/myalgo/client.d.ts +37 -0
- 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 +1415 -1021
- package/dist/esm/store/index.d.ts +1 -0
- package/dist/esm/store/state/clientStore.d.ts +22 -0
- package/dist/esm/store/state/walletStore.d.ts +17 -1
- 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 +5 -5
- package/dist/cjs/clients/algosigner.d.ts +0 -62
- package/dist/cjs/clients/base.d.ts +0 -63
- 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/myalgowallet.d.ts +0 -40
- 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/cjs/store/middelware/immer.d.ts +0 -10
- package/dist/esm/clients/algosigner.d.ts +0 -62
- package/dist/esm/clients/base.d.ts +0 -63
- 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/myalgowallet.d.ts +0 -40
- 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/esm/store/middelware/immer.d.ts +0 -10
package/dist/esm/index.js
CHANGED
|
@@ -1,62 +1,27 @@
|
|
|
1
|
-
import
|
|
1
|
+
import require$$0, { useDebugValue, createContext, useContext, useMemo } from 'react';
|
|
2
2
|
import { formatJsonRpcRequest } from '@json-rpc-tools/utils';
|
|
3
3
|
|
|
4
4
|
var PROVIDER_ID;
|
|
5
5
|
(function (PROVIDER_ID) {
|
|
6
|
-
PROVIDER_ID["
|
|
7
|
-
PROVIDER_ID["
|
|
8
|
-
PROVIDER_ID["
|
|
9
|
-
PROVIDER_ID["
|
|
10
|
-
PROVIDER_ID["DEFLY"] = "
|
|
11
|
-
PROVIDER_ID["EXODUS"] = "
|
|
12
|
-
PROVIDER_ID["
|
|
6
|
+
PROVIDER_ID["KMD"] = "kmd";
|
|
7
|
+
PROVIDER_ID["PERA"] = "pera";
|
|
8
|
+
PROVIDER_ID["MYALGO"] = "myalgo";
|
|
9
|
+
PROVIDER_ID["ALGOSIGNER"] = "algosigner";
|
|
10
|
+
PROVIDER_ID["DEFLY"] = "defly";
|
|
11
|
+
PROVIDER_ID["EXODUS"] = "exodus";
|
|
12
|
+
PROVIDER_ID["WALLETCONNECT"] = "walletconnect";
|
|
13
13
|
})(PROVIDER_ID || (PROVIDER_ID = {}));
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
process.env.NEXT_PUBLIC_NODE_URL ||
|
|
19
|
-
"https://mainnet-api.algonode.cloud";
|
|
20
|
-
const NODE_TOKEN = process.env.NODE_TOKEN ||
|
|
21
|
-
process.env.REACT_APP_NODE_TOKEN ||
|
|
22
|
-
process.env.NEXT_PUBLIC_NODE_TOKEN ||
|
|
23
|
-
"";
|
|
24
|
-
const NODE_PORT = process.env.NODE_PORT ||
|
|
25
|
-
process.env.REACT_APP_NODE_PORT ||
|
|
26
|
-
process.env.NEXT_PUBLIC_NODE_PORT ||
|
|
27
|
-
"";
|
|
28
|
-
const NODE_NETWORK = process.env.NODE_NETWORK ||
|
|
29
|
-
process.env.REACT_APP_NODE_NETWORK ||
|
|
30
|
-
process.env.NEXT_PUBLIC_NODE_NETWORK ||
|
|
31
|
-
/** @todo deprecate this env var */
|
|
32
|
-
process.env.NEXT_PUBLIC_VERCEL_ENV ||
|
|
33
|
-
"mainnet";
|
|
34
|
-
const KMD_HOST = process.env.KMD_HOST ||
|
|
35
|
-
process.env.REACT_APP_KMD_HOST ||
|
|
36
|
-
process.env.NEXT_PUBLIC_KMD_HOST ||
|
|
37
|
-
"http://localhost";
|
|
38
|
-
const KMD_TOKEN = process.env.KMD_TOKEN ||
|
|
39
|
-
process.env.REACT_APP_KMD_TOKEN ||
|
|
40
|
-
process.env.NEXT_PUBLIC_KMD_TOKEN ||
|
|
41
|
-
"a".repeat(64);
|
|
42
|
-
const KMD_PORT = process.env.KMD_PORT ||
|
|
43
|
-
process.env.REACT_APP_KMD_PORT ||
|
|
44
|
-
process.env.NEXT_PUBLIC_KMD_PORT ||
|
|
45
|
-
"4002";
|
|
46
|
-
const KMD_WALLET$1 = process.env.KMD_WALLET ||
|
|
47
|
-
process.env.REACT_APP_KMD_WALLET ||
|
|
48
|
-
process.env.NEXT_PUBLIC_KMD_WALLET ||
|
|
49
|
-
"unencrypted-default-wallet";
|
|
50
|
-
const KMD_PASSWORD = process.env.KMD_PASSWORD ||
|
|
51
|
-
process.env.REACT_APP_KMD_PASSWORD ||
|
|
52
|
-
process.env.NEXT_PUBLIC_KMD_PASSWORD ||
|
|
53
|
-
"";
|
|
14
|
+
const DEFAULT_NETWORK$1 = "mainnet";
|
|
15
|
+
const DEFAULT_NODE_BASEURL = "https://mainnet-api.algonode.cloud";
|
|
16
|
+
const DEFAULT_NODE_TOKEN = "";
|
|
17
|
+
const DEFAULT_NODE_PORT = "";
|
|
54
18
|
|
|
55
19
|
const getAlgosdk = async () => {
|
|
56
20
|
return (await import('algosdk')).default;
|
|
57
21
|
};
|
|
58
|
-
const getAlgodClient = async (algosdk) => {
|
|
59
|
-
|
|
22
|
+
const getAlgodClient = async (algosdk, algodClientOptions) => {
|
|
23
|
+
const [tokenOrBaseClient = DEFAULT_NODE_TOKEN, baseServer = DEFAULT_NODE_BASEURL, port = DEFAULT_NODE_PORT, headers,] = algodClientOptions || [];
|
|
24
|
+
return new algosdk.Algodv2(tokenOrBaseClient, baseServer, port, headers);
|
|
60
25
|
};
|
|
61
26
|
class Algod {
|
|
62
27
|
algosdk;
|
|
@@ -65,62 +30,37 @@ class Algod {
|
|
|
65
30
|
this.algosdk = algosdk;
|
|
66
31
|
this.algodClient = algodClient;
|
|
67
32
|
}
|
|
68
|
-
static async init() {
|
|
33
|
+
static async init(algodOptions) {
|
|
69
34
|
const algosdk = await getAlgosdk();
|
|
70
|
-
const algodClient = await getAlgodClient(algosdk);
|
|
35
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
71
36
|
return new Algod(algosdk, algodClient);
|
|
72
37
|
}
|
|
73
38
|
}
|
|
74
39
|
|
|
75
40
|
function n(n){for(var r=arguments.length,t=Array(r>1?r-1:0),e=1;e<r;e++)t[e-1]=arguments[e];if("production"!==process.env.NODE_ENV){var i=Y[n],o=i?"function"==typeof i?i.apply(null,t):i:"unknown error nr: "+n;throw Error("[Immer] "+o)}throw Error("[Immer] minified error nr: "+n+(t.length?" "+t.map((function(n){return "'"+n+"'"})).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function r(n){return !!n&&!!n[Q]}function t(n){return !!n&&(function(n){if(!n||"object"!=typeof n)return !1;var r=Object.getPrototypeOf(n);if(null===r)return !0;var t=Object.hasOwnProperty.call(r,"constructor")&&r.constructor;return t===Object||"function"==typeof t&&Function.toString.call(t)===Z}(n)||Array.isArray(n)||!!n[L]||!!n.constructor[L]||s(n)||v(n))}function i(n,r,t){void 0===t&&(t=!1),0===o(n)?(t?Object.keys:nn)(n).forEach((function(e){t&&"symbol"==typeof e||r(e,n[e],n);})):n.forEach((function(t,e){return r(e,t,n)}));}function o(n){var r=n[Q];return r?r.i>3?r.i-4:r.i:Array.isArray(n)?1:s(n)?2:v(n)?3:0}function u(n,r){return 2===o(n)?n.has(r):Object.prototype.hasOwnProperty.call(n,r)}function a(n,r){return 2===o(n)?n.get(r):n[r]}function f(n,r,t){var e=o(n);2===e?n.set(r,t):3===e?(n.delete(r),n.add(t)):n[r]=t;}function c(n,r){return n===r?0!==n||1/n==1/r:n!=n&&r!=r}function s(n){return X&&n instanceof Map}function v(n){return q&&n instanceof Set}function p(n){return n.o||n.t}function l(n){if(Array.isArray(n))return Array.prototype.slice.call(n);var r=rn(n);delete r[Q];for(var t=nn(r),e=0;e<t.length;e++){var i=t[e],o=r[i];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(r[i]={configurable:!0,writable:!0,enumerable:o.enumerable,value:n[i]});}return Object.create(Object.getPrototypeOf(n),r)}function d(n,e){return void 0===e&&(e=!1),y(n)||r(n)||!t(n)?n:(o(n)>1&&(n.set=n.add=n.clear=n.delete=h),Object.freeze(n),e&&i(n,(function(n,r){return d(r,!0)}),!0),n)}function h(){n(2);}function y(n){return null==n||"object"!=typeof n||Object.isFrozen(n)}function b(r){var t=tn[r];return t||n(18,r),t}function _(){return "production"===process.env.NODE_ENV||U||n(0),U}function j(n,r){r&&(b("Patches"),n.u=[],n.s=[],n.v=r);}function O(n){g(n),n.p.forEach(S),n.p=null;}function g(n){n===U&&(U=n.l);}function w(n){return U={p:[],l:U,h:n,m:!0,_:0}}function S(n){var r=n[Q];0===r.i||1===r.i?r.j():r.O=!0;}function P(r,e){e._=e.p.length;var i=e.p[0],o=void 0!==r&&r!==i;return e.h.g||b("ES5").S(e,r,o),o?(i[Q].P&&(O(e),n(4)),t(r)&&(r=M(e,r),e.l||x(e,r)),e.u&&b("Patches").M(i[Q].t,r,e.u,e.s)):r=M(e,i,[]),O(e),e.u&&e.v(e.u,e.s),r!==H?r:void 0}function M(n,r,t){if(y(r))return r;var e=r[Q];if(!e)return i(r,(function(i,o){return A(n,e,r,i,o,t)}),!0),r;if(e.A!==n)return r;if(!e.P)return x(n,e.t,!0),e.t;if(!e.I){e.I=!0,e.A._--;var o=4===e.i||5===e.i?e.o=l(e.k):e.o;i(3===e.i?new Set(o):o,(function(r,i){return A(n,e,o,r,i,t)})),x(n,o,!1),t&&n.u&&b("Patches").R(e,t,n.u,n.s);}return e.o}function A(e,i,o,a,c,s){if("production"!==process.env.NODE_ENV&&c===o&&n(5),r(c)){var v=M(e,c,s&&i&&3!==i.i&&!u(i.D,a)?s.concat(a):void 0);if(f(o,a,v),!r(v))return;e.m=!1;}if(t(c)&&!y(c)){if(!e.h.F&&e._<1)return;M(e,c),i&&i.A.l||x(e,c);}}function x(n,r,t){void 0===t&&(t=!1),n.h.F&&n.m&&d(r,t);}function z(n,r){var t=n[Q];return (t?p(t):n)[r]}function I(n,r){if(r in n)for(var t=Object.getPrototypeOf(n);t;){var e=Object.getOwnPropertyDescriptor(t,r);if(e)return e;t=Object.getPrototypeOf(t);}}function k(n){n.P||(n.P=!0,n.l&&k(n.l));}function E(n){n.o||(n.o=l(n.t));}function R(n,r,t){var e=s(r)?b("MapSet").N(r,t):v(r)?b("MapSet").T(r,t):n.g?function(n,r){var t=Array.isArray(n),e={i:t?1:0,A:r?r.A:_(),P:!1,I:!1,D:{},l:r,t:n,k:null,o:null,j:null,C:!1},i=e,o=en;t&&(i=[e],o=on);var u=Proxy.revocable(i,o),a=u.revoke,f=u.proxy;return e.k=f,e.j=a,f}(r,t):b("ES5").J(r,t);return (t?t.A:_()).p.push(e),e}function D(e){return r(e)||n(22,e),function n(r){if(!t(r))return r;var e,u=r[Q],c=o(r);if(u){if(!u.P&&(u.i<4||!b("ES5").K(u)))return u.t;u.I=!0,e=F(r,c),u.I=!1;}else e=F(r,c);return i(e,(function(r,t){u&&a(u.t,r)===t||f(e,r,n(t));})),3===c?new Set(e):e}(e)}function F(n,r){switch(r){case 2:return new Map(n);case 3:return Array.from(n)}return l(n)}var G,U,W="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),X="undefined"!=typeof Map,q="undefined"!=typeof Set,B="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,H=W?Symbol.for("immer-nothing"):((G={})["immer-nothing"]=!0,G),L=W?Symbol.for("immer-draftable"):"__$immer_draftable",Q=W?Symbol.for("immer-state"):"__$immer_state",Y={0:"Illegal state",1:"Immer drafts cannot have computed properties",2:"This object has been frozen and should not be mutated",3:function(n){return "Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+n},4:"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.",5:"Immer forbids circular references",6:"The first or second argument to `produce` must be a function",7:"The third argument to `produce` must be a function or undefined",8:"First argument to `createDraft` must be a plain object, an array, or an immerable object",9:"First argument to `finishDraft` must be a draft returned by `createDraft`",10:"The given draft is already finalized",11:"Object.defineProperty() cannot be used on an Immer draft",12:"Object.setPrototypeOf() cannot be used on an Immer draft",13:"Immer only supports deleting array indices",14:"Immer only supports setting array indices and the 'length' property",15:function(n){return "Cannot apply patch, path doesn't resolve: "+n},16:'Sets cannot have "replace" patches.',17:function(n){return "Unsupported patch operation: "+n},18:function(n){return "The plugin for '"+n+"' has not been loaded into Immer. To enable the plugin, import and call `enable"+n+"()` when initializing your application."},20:"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available",21:function(n){return "produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '"+n+"'"},22:function(n){return "'current' expects a draft, got: "+n},23:function(n){return "'original' expects a draft, got: "+n},24:"Patching reserved attributes like __proto__, prototype and constructor is not allowed"},Z=""+Object.prototype.constructor,nn="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(n){return Object.getOwnPropertyNames(n).concat(Object.getOwnPropertySymbols(n))}:Object.getOwnPropertyNames,rn=Object.getOwnPropertyDescriptors||function(n){var r={};return nn(n).forEach((function(t){r[t]=Object.getOwnPropertyDescriptor(n,t);})),r},tn={},en={get:function(n,r){if(r===Q)return n;var e=p(n);if(!u(e,r))return function(n,r,t){var e,i=I(r,t);return i?"value"in i?i.value:null===(e=i.get)||void 0===e?void 0:e.call(n.k):void 0}(n,e,r);var i=e[r];return n.I||!t(i)?i:i===z(n.t,r)?(E(n),n.o[r]=R(n.A.h,i,n)):i},has:function(n,r){return r in p(n)},ownKeys:function(n){return Reflect.ownKeys(p(n))},set:function(n,r,t){var e=I(p(n),r);if(null==e?void 0:e.set)return e.set.call(n.k,t),!0;if(!n.P){var i=z(p(n),r),o=null==i?void 0:i[Q];if(o&&o.t===t)return n.o[r]=t,n.D[r]=!1,!0;if(c(t,i)&&(void 0!==t||u(n.t,r)))return !0;E(n),k(n);}return n.o[r]===t&&"number"!=typeof t&&(void 0!==t||r in n.o)||(n.o[r]=t,n.D[r]=!0,!0)},deleteProperty:function(n,r){return void 0!==z(n.t,r)||r in n.t?(n.D[r]=!1,E(n),k(n)):delete n.D[r],n.o&&delete n.o[r],!0},getOwnPropertyDescriptor:function(n,r){var t=p(n),e=Reflect.getOwnPropertyDescriptor(t,r);return e?{writable:!0,configurable:1!==n.i||"length"!==r,enumerable:e.enumerable,value:t[r]}:e},defineProperty:function(){n(11);},getPrototypeOf:function(n){return Object.getPrototypeOf(n.t)},setPrototypeOf:function(){n(12);}},on={};i(en,(function(n,r){on[n]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)};})),on.deleteProperty=function(r,t){return "production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&n(13),on.set.call(this,r,t,void 0)},on.set=function(r,t,e){return "production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&n(14),en.set.call(this,r[0],t,e,r[0])};var un=function(){function e(r){var e=this;this.g=B,this.F=!0,this.produce=function(r,i,o){if("function"==typeof r&&"function"!=typeof i){var u=i;i=r;var a=e;return function(n){var r=this;void 0===n&&(n=u);for(var t=arguments.length,e=Array(t>1?t-1:0),o=1;o<t;o++)e[o-1]=arguments[o];return a.produce(n,(function(n){var t;return (t=i).call.apply(t,[r,n].concat(e))}))}}var f;if("function"!=typeof i&&n(6),void 0!==o&&"function"!=typeof o&&n(7),t(r)){var c=w(e),s=R(e,r,void 0),v=!0;try{f=i(s),v=!1;}finally{v?O(c):g(c);}return "undefined"!=typeof Promise&&f instanceof Promise?f.then((function(n){return j(c,o),P(n,c)}),(function(n){throw O(c),n})):(j(c,o),P(f,c))}if(!r||"object"!=typeof r){if(void 0===(f=i(r))&&(f=r),f===H&&(f=void 0),e.F&&d(f,!0),o){var p=[],l=[];b("Patches").M(r,f,p,l),o(p,l);}return f}n(21,r);},this.produceWithPatches=function(n,r){if("function"==typeof n)return function(r){for(var t=arguments.length,i=Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return e.produceWithPatches(r,(function(r){return n.apply(void 0,[r].concat(i))}))};var t,i,o=e.produce(n,r,(function(n,r){t=n,i=r;}));return "undefined"!=typeof Promise&&o instanceof Promise?o.then((function(n){return [n,t,i]})):[o,t,i]},"boolean"==typeof(null==r?void 0:r.useProxies)&&this.setUseProxies(r.useProxies),"boolean"==typeof(null==r?void 0:r.autoFreeze)&&this.setAutoFreeze(r.autoFreeze);}var i=e.prototype;return i.createDraft=function(e){t(e)||n(8),r(e)&&(e=D(e));var i=w(this),o=R(this,e,void 0);return o[Q].C=!0,g(i),o},i.finishDraft=function(r,t){var e=r&&r[Q];"production"!==process.env.NODE_ENV&&(e&&e.C||n(9),e.I&&n(10));var i=e.A;return j(i,t),P(void 0,i)},i.setAutoFreeze=function(n){this.F=n;},i.setUseProxies=function(r){r&&!B&&n(20),this.g=r;},i.applyPatches=function(n,t){var e;for(e=t.length-1;e>=0;e--){var i=t[e];if(0===i.path.length&&"replace"===i.op){n=i.value;break}}e>-1&&(t=t.slice(e+1));var o=b("Patches").$;return r(n)?o(n,t):this.produce(n,(function(n){return o(n,t)}))},e}(),an=new un,fn=an.produce;an.produceWithPatches.bind(an);an.setAutoFreeze.bind(an);an.setUseProxies.bind(an);an.applyPatches.bind(an);an.createDraft.bind(an);an.finishDraft.bind(an);
|
|
76
41
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
*/
|
|
84
|
-
const immer = (config) => (set, get, api) => {
|
|
85
|
-
// see https://github.com/pmndrs/zustand/issues/449#issuecomment-873777576
|
|
86
|
-
api.setState = (fn$1) => set(fn(fn$1));
|
|
87
|
-
return config((partial, replace) => {
|
|
88
|
-
const nextState = typeof partial === "function"
|
|
89
|
-
? fn(partial)
|
|
90
|
-
: partial;
|
|
91
|
-
return set(nextState, replace);
|
|
92
|
-
}, get, api);
|
|
42
|
+
const immerImpl = (initializer) => (set, get, store) => {
|
|
43
|
+
store.setState = (updater, replace, ...a) => {
|
|
44
|
+
const nextState = typeof updater === "function" ? fn(updater) : updater;
|
|
45
|
+
return set(nextState, replace, ...a);
|
|
46
|
+
};
|
|
47
|
+
return initializer(store.setState, get, store);
|
|
93
48
|
};
|
|
49
|
+
const immer = immerImpl;
|
|
94
50
|
|
|
95
|
-
|
|
51
|
+
const createStoreImpl = (createState) => {
|
|
96
52
|
let state;
|
|
97
53
|
const listeners = /* @__PURE__ */ new Set();
|
|
98
54
|
const setState = (partial, replace) => {
|
|
99
55
|
const nextState = typeof partial === "function" ? partial(state) : partial;
|
|
100
|
-
if (nextState
|
|
56
|
+
if (!Object.is(nextState, state)) {
|
|
101
57
|
const previousState = state;
|
|
102
|
-
state = replace ? nextState : Object.assign({}, state, nextState);
|
|
58
|
+
state = (replace != null ? replace : typeof nextState !== "object") ? nextState : Object.assign({}, state, nextState);
|
|
103
59
|
listeners.forEach((listener) => listener(state, previousState));
|
|
104
60
|
}
|
|
105
61
|
};
|
|
106
62
|
const getState = () => state;
|
|
107
|
-
const
|
|
108
|
-
console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");
|
|
109
|
-
let currentSlice = selector(state);
|
|
110
|
-
function listenerToAdd() {
|
|
111
|
-
const nextSlice = selector(state);
|
|
112
|
-
if (!equalityFn(currentSlice, nextSlice)) {
|
|
113
|
-
const previousSlice = currentSlice;
|
|
114
|
-
listener(currentSlice = nextSlice, previousSlice);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
listeners.add(listenerToAdd);
|
|
118
|
-
return () => listeners.delete(listenerToAdd);
|
|
119
|
-
};
|
|
120
|
-
const subscribe = (listener, selector, equalityFn) => {
|
|
121
|
-
if (selector || equalityFn) {
|
|
122
|
-
return subscribeWithSelector(listener, selector, equalityFn);
|
|
123
|
-
}
|
|
63
|
+
const subscribe = (listener) => {
|
|
124
64
|
listeners.add(listener);
|
|
125
65
|
return () => listeners.delete(listener);
|
|
126
66
|
};
|
|
@@ -128,170 +68,588 @@ function createStore(createState) {
|
|
|
128
68
|
const api = { setState, getState, subscribe, destroy };
|
|
129
69
|
state = createState(setState, getState, api);
|
|
130
70
|
return api;
|
|
71
|
+
};
|
|
72
|
+
const createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
|
|
73
|
+
|
|
74
|
+
function getDefaultExportFromCjs (x) {
|
|
75
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
var withSelector = {exports: {}};
|
|
79
|
+
|
|
80
|
+
var withSelector_production_min = {};
|
|
81
|
+
|
|
82
|
+
var shim = {exports: {}};
|
|
83
|
+
|
|
84
|
+
var useSyncExternalStoreShim_production_min = {};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @license React
|
|
88
|
+
* use-sync-external-store-shim.production.min.js
|
|
89
|
+
*
|
|
90
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
91
|
+
*
|
|
92
|
+
* This source code is licensed under the MIT license found in the
|
|
93
|
+
* LICENSE file in the root directory of this source tree.
|
|
94
|
+
*/
|
|
95
|
+
|
|
96
|
+
var hasRequiredUseSyncExternalStoreShim_production_min;
|
|
97
|
+
|
|
98
|
+
function requireUseSyncExternalStoreShim_production_min () {
|
|
99
|
+
if (hasRequiredUseSyncExternalStoreShim_production_min) return useSyncExternalStoreShim_production_min;
|
|
100
|
+
hasRequiredUseSyncExternalStoreShim_production_min = 1;
|
|
101
|
+
var e=require$$0;function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k="function"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c});},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c});})},[a]);p(d);return d}
|
|
102
|
+
function r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return !k(a,d)}catch(f){return !0}}function t(a,b){return b()}var u="undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement?t:q;useSyncExternalStoreShim_production_min.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;
|
|
103
|
+
return useSyncExternalStoreShim_production_min;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
var useSyncExternalStoreShim_development = {};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @license React
|
|
110
|
+
* use-sync-external-store-shim.development.js
|
|
111
|
+
*
|
|
112
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
113
|
+
*
|
|
114
|
+
* This source code is licensed under the MIT license found in the
|
|
115
|
+
* LICENSE file in the root directory of this source tree.
|
|
116
|
+
*/
|
|
117
|
+
|
|
118
|
+
var hasRequiredUseSyncExternalStoreShim_development;
|
|
119
|
+
|
|
120
|
+
function requireUseSyncExternalStoreShim_development () {
|
|
121
|
+
if (hasRequiredUseSyncExternalStoreShim_development) return useSyncExternalStoreShim_development;
|
|
122
|
+
hasRequiredUseSyncExternalStoreShim_development = 1;
|
|
123
|
+
|
|
124
|
+
if (process.env.NODE_ENV !== "production") {
|
|
125
|
+
(function() {
|
|
126
|
+
|
|
127
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
128
|
+
if (
|
|
129
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
130
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
|
|
131
|
+
'function'
|
|
132
|
+
) {
|
|
133
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
|
|
134
|
+
}
|
|
135
|
+
var React = require$$0;
|
|
136
|
+
|
|
137
|
+
var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
138
|
+
|
|
139
|
+
function error(format) {
|
|
140
|
+
{
|
|
141
|
+
{
|
|
142
|
+
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
143
|
+
args[_key2 - 1] = arguments[_key2];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
printWarning('error', format, args);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function printWarning(level, format, args) {
|
|
152
|
+
// When changing this logic, you might want to also
|
|
153
|
+
// update consoleWithStackDev.www.js as well.
|
|
154
|
+
{
|
|
155
|
+
var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
|
|
156
|
+
var stack = ReactDebugCurrentFrame.getStackAddendum();
|
|
157
|
+
|
|
158
|
+
if (stack !== '') {
|
|
159
|
+
format += '%s';
|
|
160
|
+
args = args.concat([stack]);
|
|
161
|
+
} // eslint-disable-next-line react-internal/safe-string-coercion
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
var argsWithFormat = args.map(function (item) {
|
|
165
|
+
return String(item);
|
|
166
|
+
}); // Careful: RN currently depends on this prefix
|
|
167
|
+
|
|
168
|
+
argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
|
|
169
|
+
// breaks IE9: https://github.com/facebook/react/issues/13610
|
|
170
|
+
// eslint-disable-next-line react-internal/no-production-logging
|
|
171
|
+
|
|
172
|
+
Function.prototype.apply.call(console[level], console, argsWithFormat);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
|
178
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
|
179
|
+
*/
|
|
180
|
+
function is(x, y) {
|
|
181
|
+
return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
|
|
182
|
+
;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
var objectIs = typeof Object.is === 'function' ? Object.is : is;
|
|
186
|
+
|
|
187
|
+
// dispatch for CommonJS interop named imports.
|
|
188
|
+
|
|
189
|
+
var useState = React.useState,
|
|
190
|
+
useEffect = React.useEffect,
|
|
191
|
+
useLayoutEffect = React.useLayoutEffect,
|
|
192
|
+
useDebugValue = React.useDebugValue;
|
|
193
|
+
var didWarnOld18Alpha = false;
|
|
194
|
+
var didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works
|
|
195
|
+
// because of a very particular set of implementation details and assumptions
|
|
196
|
+
// -- change any one of them and it will break. The most important assumption
|
|
197
|
+
// is that updates are always synchronous, because concurrent rendering is
|
|
198
|
+
// only available in versions of React that also have a built-in
|
|
199
|
+
// useSyncExternalStore API. And we only use this shim when the built-in API
|
|
200
|
+
// does not exist.
|
|
201
|
+
//
|
|
202
|
+
// Do not assume that the clever hacks used by this hook also work in general.
|
|
203
|
+
// The point of this shim is to replace the need for hacks by other libraries.
|
|
204
|
+
|
|
205
|
+
function useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of
|
|
206
|
+
// React do not expose a way to check if we're hydrating. So users of the shim
|
|
207
|
+
// will need to track that themselves and return the correct value
|
|
208
|
+
// from `getSnapshot`.
|
|
209
|
+
getServerSnapshot) {
|
|
210
|
+
{
|
|
211
|
+
if (!didWarnOld18Alpha) {
|
|
212
|
+
if (React.startTransition !== undefined) {
|
|
213
|
+
didWarnOld18Alpha = true;
|
|
214
|
+
|
|
215
|
+
error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
} // Read the current snapshot from the store on every render. Again, this
|
|
219
|
+
// breaks the rules of React, and only works here because of specific
|
|
220
|
+
// implementation details, most importantly that updates are
|
|
221
|
+
// always synchronous.
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
var value = getSnapshot();
|
|
225
|
+
|
|
226
|
+
{
|
|
227
|
+
if (!didWarnUncachedGetSnapshot) {
|
|
228
|
+
var cachedValue = getSnapshot();
|
|
229
|
+
|
|
230
|
+
if (!objectIs(value, cachedValue)) {
|
|
231
|
+
error('The result of getSnapshot should be cached to avoid an infinite loop');
|
|
232
|
+
|
|
233
|
+
didWarnUncachedGetSnapshot = true;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
} // Because updates are synchronous, we don't queue them. Instead we force a
|
|
237
|
+
// re-render whenever the subscribed state changes by updating an some
|
|
238
|
+
// arbitrary useState hook. Then, during render, we call getSnapshot to read
|
|
239
|
+
// the current value.
|
|
240
|
+
//
|
|
241
|
+
// Because we don't actually use the state returned by the useState hook, we
|
|
242
|
+
// can save a bit of memory by storing other stuff in that slot.
|
|
243
|
+
//
|
|
244
|
+
// To implement the early bailout, we need to track some things on a mutable
|
|
245
|
+
// object. Usually, we would put that in a useRef hook, but we can stash it in
|
|
246
|
+
// our useState hook instead.
|
|
247
|
+
//
|
|
248
|
+
// To force a re-render, we call forceUpdate({inst}). That works because the
|
|
249
|
+
// new object always fails an equality check.
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
var _useState = useState({
|
|
253
|
+
inst: {
|
|
254
|
+
value: value,
|
|
255
|
+
getSnapshot: getSnapshot
|
|
256
|
+
}
|
|
257
|
+
}),
|
|
258
|
+
inst = _useState[0].inst,
|
|
259
|
+
forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated
|
|
260
|
+
// in the layout phase so we can access it during the tearing check that
|
|
261
|
+
// happens on subscribe.
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
useLayoutEffect(function () {
|
|
265
|
+
inst.value = value;
|
|
266
|
+
inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the
|
|
267
|
+
// commit phase if there was an interleaved mutation. In concurrent mode
|
|
268
|
+
// this can happen all the time, but even in synchronous mode, an earlier
|
|
269
|
+
// effect may have mutated the store.
|
|
270
|
+
|
|
271
|
+
if (checkIfSnapshotChanged(inst)) {
|
|
272
|
+
// Force a re-render.
|
|
273
|
+
forceUpdate({
|
|
274
|
+
inst: inst
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}, [subscribe, value, getSnapshot]);
|
|
278
|
+
useEffect(function () {
|
|
279
|
+
// Check for changes right before subscribing. Subsequent changes will be
|
|
280
|
+
// detected in the subscription handler.
|
|
281
|
+
if (checkIfSnapshotChanged(inst)) {
|
|
282
|
+
// Force a re-render.
|
|
283
|
+
forceUpdate({
|
|
284
|
+
inst: inst
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
var handleStoreChange = function () {
|
|
289
|
+
// TODO: Because there is no cross-renderer API for batching updates, it's
|
|
290
|
+
// up to the consumer of this library to wrap their subscription event
|
|
291
|
+
// with unstable_batchedUpdates. Should we try to detect when this isn't
|
|
292
|
+
// the case and print a warning in development?
|
|
293
|
+
// The store changed. Check if the snapshot changed since the last time we
|
|
294
|
+
// read from the store.
|
|
295
|
+
if (checkIfSnapshotChanged(inst)) {
|
|
296
|
+
// Force a re-render.
|
|
297
|
+
forceUpdate({
|
|
298
|
+
inst: inst
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}; // Subscribe to the store and return a clean-up function.
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
return subscribe(handleStoreChange);
|
|
305
|
+
}, [subscribe]);
|
|
306
|
+
useDebugValue(value);
|
|
307
|
+
return value;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function checkIfSnapshotChanged(inst) {
|
|
311
|
+
var latestGetSnapshot = inst.getSnapshot;
|
|
312
|
+
var prevValue = inst.value;
|
|
313
|
+
|
|
314
|
+
try {
|
|
315
|
+
var nextValue = latestGetSnapshot();
|
|
316
|
+
return !objectIs(prevValue, nextValue);
|
|
317
|
+
} catch (error) {
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {
|
|
323
|
+
// Note: The shim does not use getServerSnapshot, because pre-18 versions of
|
|
324
|
+
// React do not expose a way to check if we're hydrating. So users of the shim
|
|
325
|
+
// will need to track that themselves and return the correct value
|
|
326
|
+
// from `getSnapshot`.
|
|
327
|
+
return getSnapshot();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
|
|
331
|
+
|
|
332
|
+
var isServerEnvironment = !canUseDOM;
|
|
333
|
+
|
|
334
|
+
var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;
|
|
335
|
+
var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;
|
|
336
|
+
|
|
337
|
+
useSyncExternalStoreShim_development.useSyncExternalStore = useSyncExternalStore$2;
|
|
338
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
339
|
+
if (
|
|
340
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
341
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
|
|
342
|
+
'function'
|
|
343
|
+
) {
|
|
344
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
})();
|
|
348
|
+
}
|
|
349
|
+
return useSyncExternalStoreShim_development;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
var hasRequiredShim;
|
|
353
|
+
|
|
354
|
+
function requireShim () {
|
|
355
|
+
if (hasRequiredShim) return shim.exports;
|
|
356
|
+
hasRequiredShim = 1;
|
|
357
|
+
(function (module) {
|
|
358
|
+
|
|
359
|
+
if (process.env.NODE_ENV === 'production') {
|
|
360
|
+
module.exports = requireUseSyncExternalStoreShim_production_min();
|
|
361
|
+
} else {
|
|
362
|
+
module.exports = requireUseSyncExternalStoreShim_development();
|
|
363
|
+
}
|
|
364
|
+
} (shim));
|
|
365
|
+
return shim.exports;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* @license React
|
|
370
|
+
* use-sync-external-store-shim/with-selector.production.min.js
|
|
371
|
+
*
|
|
372
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
373
|
+
*
|
|
374
|
+
* This source code is licensed under the MIT license found in the
|
|
375
|
+
* LICENSE file in the root directory of this source tree.
|
|
376
|
+
*/
|
|
377
|
+
|
|
378
|
+
var hasRequiredWithSelector_production_min;
|
|
379
|
+
|
|
380
|
+
function requireWithSelector_production_min () {
|
|
381
|
+
if (hasRequiredWithSelector_production_min) return withSelector_production_min;
|
|
382
|
+
hasRequiredWithSelector_production_min = 1;
|
|
383
|
+
var h=require$$0,n=requireShim();function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q="function"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;
|
|
384
|
+
withSelector_production_min.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f;}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return [function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);
|
|
385
|
+
u(function(){f.hasValue=!0;f.value=d;},[d]);w(d);return d};
|
|
386
|
+
return withSelector_production_min;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
var withSelector_development = {};
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* @license React
|
|
393
|
+
* use-sync-external-store-shim/with-selector.development.js
|
|
394
|
+
*
|
|
395
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
396
|
+
*
|
|
397
|
+
* This source code is licensed under the MIT license found in the
|
|
398
|
+
* LICENSE file in the root directory of this source tree.
|
|
399
|
+
*/
|
|
400
|
+
|
|
401
|
+
var hasRequiredWithSelector_development;
|
|
402
|
+
|
|
403
|
+
function requireWithSelector_development () {
|
|
404
|
+
if (hasRequiredWithSelector_development) return withSelector_development;
|
|
405
|
+
hasRequiredWithSelector_development = 1;
|
|
406
|
+
|
|
407
|
+
if (process.env.NODE_ENV !== "production") {
|
|
408
|
+
(function() {
|
|
409
|
+
|
|
410
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
411
|
+
if (
|
|
412
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
413
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
|
|
414
|
+
'function'
|
|
415
|
+
) {
|
|
416
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
|
|
417
|
+
}
|
|
418
|
+
var React = require$$0;
|
|
419
|
+
var shim = requireShim();
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
|
423
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
|
424
|
+
*/
|
|
425
|
+
function is(x, y) {
|
|
426
|
+
return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
|
|
427
|
+
;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
var objectIs = typeof Object.is === 'function' ? Object.is : is;
|
|
431
|
+
|
|
432
|
+
var useSyncExternalStore = shim.useSyncExternalStore;
|
|
433
|
+
|
|
434
|
+
// for CommonJS interop.
|
|
435
|
+
|
|
436
|
+
var useRef = React.useRef,
|
|
437
|
+
useEffect = React.useEffect,
|
|
438
|
+
useMemo = React.useMemo,
|
|
439
|
+
useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.
|
|
440
|
+
|
|
441
|
+
function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
|
|
442
|
+
// Use this to track the rendered snapshot.
|
|
443
|
+
var instRef = useRef(null);
|
|
444
|
+
var inst;
|
|
445
|
+
|
|
446
|
+
if (instRef.current === null) {
|
|
447
|
+
inst = {
|
|
448
|
+
hasValue: false,
|
|
449
|
+
value: null
|
|
450
|
+
};
|
|
451
|
+
instRef.current = inst;
|
|
452
|
+
} else {
|
|
453
|
+
inst = instRef.current;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
var _useMemo = useMemo(function () {
|
|
457
|
+
// Track the memoized state using closure variables that are local to this
|
|
458
|
+
// memoized instance of a getSnapshot function. Intentionally not using a
|
|
459
|
+
// useRef hook, because that state would be shared across all concurrent
|
|
460
|
+
// copies of the hook/component.
|
|
461
|
+
var hasMemo = false;
|
|
462
|
+
var memoizedSnapshot;
|
|
463
|
+
var memoizedSelection;
|
|
464
|
+
|
|
465
|
+
var memoizedSelector = function (nextSnapshot) {
|
|
466
|
+
if (!hasMemo) {
|
|
467
|
+
// The first time the hook is called, there is no memoized result.
|
|
468
|
+
hasMemo = true;
|
|
469
|
+
memoizedSnapshot = nextSnapshot;
|
|
470
|
+
|
|
471
|
+
var _nextSelection = selector(nextSnapshot);
|
|
472
|
+
|
|
473
|
+
if (isEqual !== undefined) {
|
|
474
|
+
// Even if the selector has changed, the currently rendered selection
|
|
475
|
+
// may be equal to the new selection. We should attempt to reuse the
|
|
476
|
+
// current value if possible, to preserve downstream memoizations.
|
|
477
|
+
if (inst.hasValue) {
|
|
478
|
+
var currentSelection = inst.value;
|
|
479
|
+
|
|
480
|
+
if (isEqual(currentSelection, _nextSelection)) {
|
|
481
|
+
memoizedSelection = currentSelection;
|
|
482
|
+
return currentSelection;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
memoizedSelection = _nextSelection;
|
|
488
|
+
return _nextSelection;
|
|
489
|
+
} // We may be able to reuse the previous invocation's result.
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
// We may be able to reuse the previous invocation's result.
|
|
493
|
+
var prevSnapshot = memoizedSnapshot;
|
|
494
|
+
var prevSelection = memoizedSelection;
|
|
495
|
+
|
|
496
|
+
if (objectIs(prevSnapshot, nextSnapshot)) {
|
|
497
|
+
// The snapshot is the same as last time. Reuse the previous selection.
|
|
498
|
+
return prevSelection;
|
|
499
|
+
} // The snapshot has changed, so we need to compute a new selection.
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
// The snapshot has changed, so we need to compute a new selection.
|
|
503
|
+
var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data
|
|
504
|
+
// has changed. If it hasn't, return the previous selection. That signals
|
|
505
|
+
// to React that the selections are conceptually equal, and we can bail
|
|
506
|
+
// out of rendering.
|
|
507
|
+
|
|
508
|
+
// If a custom isEqual function is provided, use that to check if the data
|
|
509
|
+
// has changed. If it hasn't, return the previous selection. That signals
|
|
510
|
+
// to React that the selections are conceptually equal, and we can bail
|
|
511
|
+
// out of rendering.
|
|
512
|
+
if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {
|
|
513
|
+
return prevSelection;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
memoizedSnapshot = nextSnapshot;
|
|
517
|
+
memoizedSelection = nextSelection;
|
|
518
|
+
return nextSelection;
|
|
519
|
+
}; // Assigning this to a constant so that Flow knows it can't change.
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
// Assigning this to a constant so that Flow knows it can't change.
|
|
523
|
+
var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;
|
|
524
|
+
|
|
525
|
+
var getSnapshotWithSelector = function () {
|
|
526
|
+
return memoizedSelector(getSnapshot());
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {
|
|
530
|
+
return memoizedSelector(maybeGetServerSnapshot());
|
|
531
|
+
};
|
|
532
|
+
return [getSnapshotWithSelector, getServerSnapshotWithSelector];
|
|
533
|
+
}, [getSnapshot, getServerSnapshot, selector, isEqual]),
|
|
534
|
+
getSelection = _useMemo[0],
|
|
535
|
+
getServerSelection = _useMemo[1];
|
|
536
|
+
|
|
537
|
+
var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);
|
|
538
|
+
useEffect(function () {
|
|
539
|
+
inst.hasValue = true;
|
|
540
|
+
inst.value = value;
|
|
541
|
+
}, [value]);
|
|
542
|
+
useDebugValue(value);
|
|
543
|
+
return value;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
withSelector_development.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;
|
|
547
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
548
|
+
if (
|
|
549
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
550
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
|
|
551
|
+
'function'
|
|
552
|
+
) {
|
|
553
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
})();
|
|
557
|
+
}
|
|
558
|
+
return withSelector_development;
|
|
131
559
|
}
|
|
132
560
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
561
|
+
(function (module) {
|
|
562
|
+
|
|
563
|
+
if (process.env.NODE_ENV === 'production') {
|
|
564
|
+
module.exports = requireWithSelector_production_min();
|
|
565
|
+
} else {
|
|
566
|
+
module.exports = requireWithSelector_development();
|
|
567
|
+
}
|
|
568
|
+
} (withSelector));
|
|
569
|
+
|
|
570
|
+
var useSyncExternalStoreExports = /*@__PURE__*/getDefaultExportFromCjs(withSelector.exports);
|
|
571
|
+
|
|
572
|
+
const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
|
|
573
|
+
function useStore(api, selector = api.getState, equalityFn) {
|
|
574
|
+
const slice = useSyncExternalStoreWithSelector(
|
|
575
|
+
api.subscribe,
|
|
576
|
+
api.getState,
|
|
577
|
+
api.getServerState || api.getState,
|
|
578
|
+
selector,
|
|
579
|
+
equalityFn
|
|
580
|
+
);
|
|
581
|
+
useDebugValue(slice);
|
|
582
|
+
return slice;
|
|
583
|
+
}
|
|
584
|
+
const createImpl = (createState) => {
|
|
136
585
|
const api = typeof createState === "function" ? createStore(createState) : createState;
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
586
|
+
const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);
|
|
587
|
+
Object.assign(useBoundStore, api);
|
|
588
|
+
return useBoundStore;
|
|
589
|
+
};
|
|
590
|
+
const create = (createState) => createState ? createImpl(createState) : createImpl;
|
|
591
|
+
|
|
592
|
+
const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {
|
|
593
|
+
const { enabled, anonymousActionType, ...options } = devtoolsOptions;
|
|
594
|
+
let extensionConnector;
|
|
595
|
+
try {
|
|
596
|
+
extensionConnector = (enabled != null ? enabled : (import.meta.env && import.meta.env.MODE) !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
597
|
+
} catch {
|
|
598
|
+
}
|
|
599
|
+
if (!extensionConnector) {
|
|
600
|
+
if ((import.meta.env && import.meta.env.MODE) !== "production" && enabled) {
|
|
601
|
+
console.warn(
|
|
602
|
+
"[zustand devtools middleware] Please install/enable Redux devtools extension"
|
|
603
|
+
);
|
|
153
604
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
const nextState = api.getState();
|
|
168
|
-
const nextStateSlice = selectorRef.current(nextState);
|
|
169
|
-
if (!equalityFnRef.current(currentSliceRef.current, nextStateSlice)) {
|
|
170
|
-
stateRef.current = nextState;
|
|
171
|
-
currentSliceRef.current = nextStateSlice;
|
|
172
|
-
forceUpdate();
|
|
173
|
-
}
|
|
174
|
-
} catch (error) {
|
|
175
|
-
erroredRef.current = true;
|
|
176
|
-
forceUpdate();
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
const unsubscribe = api.subscribe(listener);
|
|
180
|
-
if (api.getState() !== stateBeforeSubscriptionRef.current) {
|
|
181
|
-
listener();
|
|
182
|
-
}
|
|
183
|
-
return unsubscribe;
|
|
184
|
-
}, []);
|
|
185
|
-
const sliceToReturn = hasNewStateSlice ? newStateSlice : currentSliceRef.current;
|
|
186
|
-
useDebugValue(sliceToReturn);
|
|
187
|
-
return sliceToReturn;
|
|
605
|
+
return fn(set, get, api);
|
|
606
|
+
}
|
|
607
|
+
const extension = extensionConnector.connect(options);
|
|
608
|
+
let isRecording = true;
|
|
609
|
+
api.setState = (state, replace, nameOrAction) => {
|
|
610
|
+
const r = set(state, replace);
|
|
611
|
+
if (!isRecording)
|
|
612
|
+
return r;
|
|
613
|
+
extension.send(
|
|
614
|
+
nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction,
|
|
615
|
+
get()
|
|
616
|
+
);
|
|
617
|
+
return r;
|
|
188
618
|
};
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
next() {
|
|
195
|
-
const done = items.length <= 0;
|
|
196
|
-
return { value: items.shift(), done };
|
|
197
|
-
}
|
|
198
|
-
};
|
|
619
|
+
const setStateFromDevtools = (...a) => {
|
|
620
|
+
const originalIsRecording = isRecording;
|
|
621
|
+
isRecording = false;
|
|
622
|
+
set(...a);
|
|
623
|
+
isRecording = originalIsRecording;
|
|
199
624
|
};
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
const devtoolsOptions = options === void 0 ? { name: void 0, anonymousActionType: void 0 } : typeof options === "string" ? { name: options } : options;
|
|
212
|
-
if (typeof ((_a = devtoolsOptions == null ? void 0 : devtoolsOptions.serialize) == null ? void 0 : _a.options) !== "undefined") {
|
|
213
|
-
console.warn("[zustand devtools middleware]: `serialize.options` is deprecated, just use `serialize`");
|
|
214
|
-
}
|
|
215
|
-
let extensionConnector;
|
|
216
|
-
try {
|
|
217
|
-
extensionConnector = window.__REDUX_DEVTOOLS_EXTENSION__ || window.top.__REDUX_DEVTOOLS_EXTENSION__;
|
|
218
|
-
} catch {
|
|
219
|
-
}
|
|
220
|
-
if (!extensionConnector) {
|
|
221
|
-
if ((import.meta.env && import.meta.env.MODE) !== "production" && typeof window !== "undefined") {
|
|
222
|
-
console.warn("[zustand devtools middleware] Please install/enable Redux devtools extension");
|
|
223
|
-
}
|
|
224
|
-
return fn(set, get, api);
|
|
225
|
-
}
|
|
226
|
-
let extension = Object.create(extensionConnector.connect(devtoolsOptions));
|
|
227
|
-
let didWarnAboutDevtools = false;
|
|
228
|
-
Object.defineProperty(api, "devtools", {
|
|
229
|
-
get: () => {
|
|
230
|
-
if (!didWarnAboutDevtools) {
|
|
231
|
-
console.warn("[zustand devtools middleware] `devtools` property on the store is deprecated it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
|
|
232
|
-
didWarnAboutDevtools = true;
|
|
233
|
-
}
|
|
234
|
-
return extension;
|
|
235
|
-
},
|
|
236
|
-
set: (value) => {
|
|
237
|
-
if (!didWarnAboutDevtools) {
|
|
238
|
-
console.warn("[zustand devtools middleware] `api.devtools` is deprecated, it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
|
|
239
|
-
didWarnAboutDevtools = true;
|
|
240
|
-
}
|
|
241
|
-
extension = value;
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
let didWarnAboutPrefix = false;
|
|
245
|
-
Object.defineProperty(extension, "prefix", {
|
|
246
|
-
get: () => {
|
|
247
|
-
if (!didWarnAboutPrefix) {
|
|
248
|
-
console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
|
|
249
|
-
didWarnAboutPrefix = true;
|
|
250
|
-
}
|
|
251
|
-
return "";
|
|
252
|
-
},
|
|
253
|
-
set: () => {
|
|
254
|
-
if (!didWarnAboutPrefix) {
|
|
255
|
-
console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
|
|
256
|
-
didWarnAboutPrefix = true;
|
|
257
|
-
}
|
|
625
|
+
const initialState = fn(api.setState, get, api);
|
|
626
|
+
extension.init(initialState);
|
|
627
|
+
if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
|
|
628
|
+
let didWarnAboutReservedActionType = false;
|
|
629
|
+
const originalDispatch = api.dispatch;
|
|
630
|
+
api.dispatch = (...a) => {
|
|
631
|
+
if ((import.meta.env && import.meta.env.MODE) !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) {
|
|
632
|
+
console.warn(
|
|
633
|
+
'[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.'
|
|
634
|
+
);
|
|
635
|
+
didWarnAboutReservedActionType = true;
|
|
258
636
|
}
|
|
259
|
-
|
|
260
|
-
let isRecording = true;
|
|
261
|
-
api.setState = (state, replace, nameOrAction) => {
|
|
262
|
-
set(state, replace);
|
|
263
|
-
if (!isRecording)
|
|
264
|
-
return;
|
|
265
|
-
extension.send(nameOrAction === void 0 ? { type: devtoolsOptions.anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction, get());
|
|
266
|
-
};
|
|
267
|
-
const setStateFromDevtools = (...a) => {
|
|
268
|
-
const originalIsRecording = isRecording;
|
|
269
|
-
isRecording = false;
|
|
270
|
-
set(...a);
|
|
271
|
-
isRecording = originalIsRecording;
|
|
637
|
+
originalDispatch(...a);
|
|
272
638
|
};
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
639
|
+
}
|
|
640
|
+
extension.subscribe((message) => {
|
|
641
|
+
var _a;
|
|
642
|
+
switch (message.type) {
|
|
643
|
+
case "ACTION":
|
|
644
|
+
if (typeof message.payload !== "string") {
|
|
645
|
+
console.error(
|
|
646
|
+
"[zustand devtools middleware] Unsupported action format"
|
|
647
|
+
);
|
|
648
|
+
return;
|
|
282
649
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
extension.subscribe((message) => {
|
|
287
|
-
var _a2;
|
|
288
|
-
switch (message.type) {
|
|
289
|
-
case "ACTION":
|
|
290
|
-
if (typeof message.payload !== "string") {
|
|
291
|
-
console.error("[zustand devtools middleware] Unsupported action format");
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
return parseJsonThen(message.payload, (action) => {
|
|
650
|
+
return parseJsonThen(
|
|
651
|
+
message.payload,
|
|
652
|
+
(action) => {
|
|
295
653
|
if (action.type === "__setState") {
|
|
296
654
|
setStateFromDevtools(action.state);
|
|
297
655
|
return;
|
|
@@ -301,69 +659,60 @@ function devtools(fn, options) {
|
|
|
301
659
|
if (typeof api.dispatch !== "function")
|
|
302
660
|
return;
|
|
303
661
|
api.dispatch(action);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
setStateFromDevtools(lastComputedState);
|
|
328
|
-
extension.send(null, nextLiftedState);
|
|
662
|
+
}
|
|
663
|
+
);
|
|
664
|
+
case "DISPATCH":
|
|
665
|
+
switch (message.payload.type) {
|
|
666
|
+
case "RESET":
|
|
667
|
+
setStateFromDevtools(initialState);
|
|
668
|
+
return extension.init(api.getState());
|
|
669
|
+
case "COMMIT":
|
|
670
|
+
return extension.init(api.getState());
|
|
671
|
+
case "ROLLBACK":
|
|
672
|
+
return parseJsonThen(message.state, (state) => {
|
|
673
|
+
setStateFromDevtools(state);
|
|
674
|
+
extension.init(api.getState());
|
|
675
|
+
});
|
|
676
|
+
case "JUMP_TO_STATE":
|
|
677
|
+
case "JUMP_TO_ACTION":
|
|
678
|
+
return parseJsonThen(message.state, (state) => {
|
|
679
|
+
setStateFromDevtools(state);
|
|
680
|
+
});
|
|
681
|
+
case "IMPORT_STATE": {
|
|
682
|
+
const { nextLiftedState } = message.payload;
|
|
683
|
+
const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;
|
|
684
|
+
if (!lastComputedState)
|
|
329
685
|
return;
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
686
|
+
setStateFromDevtools(lastComputedState);
|
|
687
|
+
extension.send(
|
|
688
|
+
null,
|
|
689
|
+
nextLiftedState
|
|
690
|
+
);
|
|
691
|
+
return;
|
|
333
692
|
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
}
|
|
693
|
+
case "PAUSE_RECORDING":
|
|
694
|
+
return isRecording = !isRecording;
|
|
695
|
+
}
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
return initialState;
|
|
700
|
+
};
|
|
701
|
+
const devtools = devtoolsImpl;
|
|
340
702
|
const parseJsonThen = (stringified, f) => {
|
|
341
703
|
let parsed;
|
|
342
704
|
try {
|
|
343
705
|
parsed = JSON.parse(stringified);
|
|
344
706
|
} catch (e) {
|
|
345
|
-
console.error(
|
|
707
|
+
console.error(
|
|
708
|
+
"[zustand devtools middleware] Could not parse the received json",
|
|
709
|
+
e
|
|
710
|
+
);
|
|
346
711
|
}
|
|
347
712
|
if (parsed !== void 0)
|
|
348
713
|
f(parsed);
|
|
349
714
|
};
|
|
350
715
|
|
|
351
|
-
var __defProp = Object.defineProperty;
|
|
352
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
353
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
354
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
355
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
356
|
-
var __spreadValues = (a, b) => {
|
|
357
|
-
for (var prop in b || (b = {}))
|
|
358
|
-
if (__hasOwnProp.call(b, prop))
|
|
359
|
-
__defNormalProp(a, prop, b[prop]);
|
|
360
|
-
if (__getOwnPropSymbols)
|
|
361
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
362
|
-
if (__propIsEnum.call(b, prop))
|
|
363
|
-
__defNormalProp(a, prop, b[prop]);
|
|
364
|
-
}
|
|
365
|
-
return a;
|
|
366
|
-
};
|
|
367
716
|
const toThenable = (fn) => (input) => {
|
|
368
717
|
try {
|
|
369
718
|
const result = fn(input);
|
|
@@ -389,18 +738,19 @@ const toThenable = (fn) => (input) => {
|
|
|
389
738
|
};
|
|
390
739
|
}
|
|
391
740
|
};
|
|
392
|
-
const
|
|
393
|
-
let options =
|
|
741
|
+
const persistImpl = (config, baseOptions) => (set, get, api) => {
|
|
742
|
+
let options = {
|
|
394
743
|
getStorage: () => localStorage,
|
|
395
744
|
serialize: JSON.stringify,
|
|
396
745
|
deserialize: JSON.parse,
|
|
397
746
|
partialize: (state) => state,
|
|
398
747
|
version: 0,
|
|
399
|
-
merge: (persistedState, currentState) =>
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
748
|
+
merge: (persistedState, currentState) => ({
|
|
749
|
+
...currentState,
|
|
750
|
+
...persistedState
|
|
751
|
+
}),
|
|
752
|
+
...baseOptions
|
|
753
|
+
};
|
|
404
754
|
let hasHydrated = false;
|
|
405
755
|
const hydrationListeners = /* @__PURE__ */ new Set();
|
|
406
756
|
const finishHydrationListeners = /* @__PURE__ */ new Set();
|
|
@@ -410,27 +760,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
410
760
|
} catch (e) {
|
|
411
761
|
}
|
|
412
762
|
if (!storage) {
|
|
413
|
-
return config(
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
763
|
+
return config(
|
|
764
|
+
(...args) => {
|
|
765
|
+
console.warn(
|
|
766
|
+
`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
|
|
767
|
+
);
|
|
768
|
+
set(...args);
|
|
769
|
+
},
|
|
770
|
+
get,
|
|
771
|
+
api
|
|
772
|
+
);
|
|
419
773
|
}
|
|
420
774
|
const thenableSerialize = toThenable(options.serialize);
|
|
421
775
|
const setItem = () => {
|
|
422
|
-
const state = options.partialize(
|
|
423
|
-
if (options.whitelist) {
|
|
424
|
-
Object.keys(state).forEach((key) => {
|
|
425
|
-
var _a;
|
|
426
|
-
!((_a = options.whitelist) == null ? void 0 : _a.includes(key)) && delete state[key];
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
if (options.blacklist) {
|
|
430
|
-
options.blacklist.forEach((key) => delete state[key]);
|
|
431
|
-
}
|
|
776
|
+
const state = options.partialize({ ...get() });
|
|
432
777
|
let errorInSync;
|
|
433
|
-
const thenable = thenableSerialize({ state, version: options.version }).then(
|
|
778
|
+
const thenable = thenableSerialize({ state, version: options.version }).then(
|
|
779
|
+
(serializedValue) => storage.setItem(options.name, serializedValue)
|
|
780
|
+
).catch((e) => {
|
|
434
781
|
errorInSync = e;
|
|
435
782
|
});
|
|
436
783
|
if (errorInSync) {
|
|
@@ -443,10 +790,14 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
443
790
|
savedSetState(state, replace);
|
|
444
791
|
void setItem();
|
|
445
792
|
};
|
|
446
|
-
const configResult = config(
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
793
|
+
const configResult = config(
|
|
794
|
+
(...args) => {
|
|
795
|
+
set(...args);
|
|
796
|
+
void setItem();
|
|
797
|
+
},
|
|
798
|
+
get,
|
|
799
|
+
api
|
|
800
|
+
);
|
|
450
801
|
let stateFromStorage;
|
|
451
802
|
const hydrate = () => {
|
|
452
803
|
var _a;
|
|
@@ -463,16 +814,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
463
814
|
if (deserializedStorageValue) {
|
|
464
815
|
if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
|
|
465
816
|
if (options.migrate) {
|
|
466
|
-
return options.migrate(
|
|
817
|
+
return options.migrate(
|
|
818
|
+
deserializedStorageValue.state,
|
|
819
|
+
deserializedStorageValue.version
|
|
820
|
+
);
|
|
467
821
|
}
|
|
468
|
-
console.error(
|
|
822
|
+
console.error(
|
|
823
|
+
`State loaded from storage couldn't be migrated since no migrate function was provided`
|
|
824
|
+
);
|
|
469
825
|
} else {
|
|
470
826
|
return deserializedStorageValue.state;
|
|
471
827
|
}
|
|
472
828
|
}
|
|
473
829
|
}).then((migratedState) => {
|
|
474
830
|
var _a2;
|
|
475
|
-
stateFromStorage = options.merge(
|
|
831
|
+
stateFromStorage = options.merge(
|
|
832
|
+
migratedState,
|
|
833
|
+
(_a2 = get()) != null ? _a2 : configResult
|
|
834
|
+
);
|
|
476
835
|
set(stateFromStorage, true);
|
|
477
836
|
return setItem();
|
|
478
837
|
}).then(() => {
|
|
@@ -485,15 +844,18 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
485
844
|
};
|
|
486
845
|
api.persist = {
|
|
487
846
|
setOptions: (newOptions) => {
|
|
488
|
-
options =
|
|
847
|
+
options = {
|
|
848
|
+
...options,
|
|
849
|
+
...newOptions
|
|
850
|
+
};
|
|
489
851
|
if (newOptions.getStorage) {
|
|
490
852
|
storage = newOptions.getStorage();
|
|
491
853
|
}
|
|
492
854
|
},
|
|
493
855
|
clearStorage: () => {
|
|
494
|
-
|
|
495
|
-
(_a = storage == null ? void 0 : storage.removeItem) == null ? void 0 : _a.call(storage, options.name);
|
|
856
|
+
storage == null ? void 0 : storage.removeItem(options.name);
|
|
496
857
|
},
|
|
858
|
+
getOptions: () => options,
|
|
497
859
|
rehydrate: () => hydrate(),
|
|
498
860
|
hasHydrated: () => hasHydrated,
|
|
499
861
|
onHydrate: (cb) => {
|
|
@@ -512,6 +874,7 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
512
874
|
hydrate();
|
|
513
875
|
return stateFromStorage || configResult;
|
|
514
876
|
};
|
|
877
|
+
const persist = persistImpl;
|
|
515
878
|
|
|
516
879
|
const walletStoreSelector = (state) => ({
|
|
517
880
|
accounts: state.accounts,
|
|
@@ -521,7 +884,7 @@ const walletStoreSelector = (state) => ({
|
|
|
521
884
|
addAccounts: state.addAccounts,
|
|
522
885
|
removeAccounts: state.removeAccounts,
|
|
523
886
|
});
|
|
524
|
-
const useWalletStore = create(
|
|
887
|
+
const useWalletStore = create()(immer(persist(devtools((set, _get) => ({
|
|
525
888
|
accounts: [],
|
|
526
889
|
activeAccount: null,
|
|
527
890
|
setActiveAccount: (account) => {
|
|
@@ -555,81 +918,10 @@ const useWalletStore = create(devtools(persist(immer((set, _get) => ({
|
|
|
555
918
|
})), {
|
|
556
919
|
name: "txnlab-use-wallet",
|
|
557
920
|
version: 0, // increment to deprecate stored data
|
|
558
|
-
})
|
|
559
|
-
));
|
|
560
|
-
|
|
561
|
-
const icon$6 = "data:image/svg+xml;base64," +
|
|
562
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=";
|
|
563
|
-
const PERA_WALLET = {
|
|
564
|
-
id: PROVIDER_ID.PERA_WALLET,
|
|
565
|
-
name: "Pera Wallet",
|
|
566
|
-
icon: icon$6,
|
|
567
|
-
isWalletConnect: true,
|
|
568
|
-
};
|
|
569
|
-
|
|
570
|
-
const icon$5 = "data:image/svg+xml;base64," +
|
|
571
|
-
"PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHBhdGggZmlsbD0iIzI0NUVDNiIgZD0iTTE2LDMyYy0zLjIsMC02LjItMC45LTguOS0yLjdjLTIuNi0xLjgtNC43LTQuMy01LjktNy4yQzAsMTkuMi0wLjMsMTYsMC4zLDEyLjlDMC45LDkuOCwyLjQsNyw0LjcsNC43IEM2LjIsMy4yLDcuOSwyLDkuOSwxLjJDMTEuOCwwLjQsMTMuOSwwLDE2LDBzNC4yLDAuNCw2LjEsMS4yYzEuOSwwLjgsMy43LDIsNS4yLDMuNXMyLjcsMy4zLDMuNSw1LjJjMC44LDEuOSwxLjIsNCwxLjIsNi4xIHMtMC40LDQuMi0xLjIsNi4xYy0wLjgsMS45LTIsMy43LTMuNSw1LjJjLTEuNSwxLjUtMy4yLDIuNy01LjIsMy41QzIwLjIsMzEuNiwxOC4xLDMyLDE2LDMyTDE2LDMyeiBNMjAuMiwxMS4ybDAuMSwwLjVsMi42LDkuNWgyLjEgTDIxLjUsOC45bC0wLjEtMC4zaC0xLjlsMCwwLjFsLTEuNywzLjFMMTYsMTQuOWwwLDAuMWwwLTAuMWwtMC4yLTAuOGwtMC42LTIuNGwtMC4xLTAuMmwtMC43LTIuNmwtMC4xLTAuM2gtMS45bDAsMC4xbC0xLjcsMy4xIGwtMS44LDMuMkw3LjEsMThsLTEuOCwzLjJoMi4xTDkuMiwxOGwxLjgtMy4ybDEuOC0zLjJsMC4zLTAuNWwwLjEsMC41bDAuNSwyLjFsMC43LDIuNmwwLjIsMC45TDE0LjIsMThsLTEuOCwzLjJoMi4xbDAuOC0xLjMgbDEuMy0yLjNsMS41LTIuN2wxLjgtMy4yTDIwLjIsMTEuMkwyMC4yLDExLjJ6Ii8+Cjwvc3ZnPgo=";
|
|
572
|
-
const MYALGO_WALLET = {
|
|
573
|
-
id: PROVIDER_ID.MYALGO_WALLET,
|
|
574
|
-
name: "MyAlgo Wallet",
|
|
575
|
-
icon: icon$5,
|
|
576
|
-
isWalletConnect: false,
|
|
577
|
-
};
|
|
578
|
-
|
|
579
|
-
const icon$4 = "data:image/svg+xml;base64," +
|
|
580
|
-
"PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
|
|
581
|
-
const ALGO_SIGNER = {
|
|
582
|
-
id: PROVIDER_ID.ALGO_SIGNER,
|
|
583
|
-
name: "AlgoSigner",
|
|
584
|
-
icon: icon$4,
|
|
585
|
-
isWalletConnect: false,
|
|
586
|
-
};
|
|
587
|
-
|
|
588
|
-
const icon$3 = "data:image/svg+xml;base64," +
|
|
589
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
|
|
590
|
-
const DEFLY = {
|
|
591
|
-
id: PROVIDER_ID.DEFLY,
|
|
592
|
-
name: "Defly Wallet",
|
|
593
|
-
icon: icon$3,
|
|
594
|
-
isWalletConnect: true,
|
|
595
|
-
};
|
|
596
|
-
|
|
597
|
-
const icon$2 = "data:image/svg+xml;base64," +
|
|
598
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
|
|
599
|
-
const EXODUS = {
|
|
600
|
-
id: PROVIDER_ID.EXODUS,
|
|
601
|
-
name: "Exodus",
|
|
602
|
-
icon: icon$2,
|
|
603
|
-
isWalletConnect: false,
|
|
604
|
-
};
|
|
605
|
-
|
|
606
|
-
const icon$1 = "data:image/svg+xml;base64," +
|
|
607
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+";
|
|
608
|
-
const KMD_WALLET = {
|
|
609
|
-
id: PROVIDER_ID.KMD_WALLET,
|
|
610
|
-
name: "KMD",
|
|
611
|
-
icon: icon$1,
|
|
612
|
-
isWalletConnect: false,
|
|
613
|
-
};
|
|
614
|
-
|
|
615
|
-
const icon = "data:image/svg+xml;base64," +
|
|
616
|
-
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==";
|
|
617
|
-
const WALLET_CONNECT = {
|
|
618
|
-
id: PROVIDER_ID.WALLET_CONNECT,
|
|
619
|
-
name: "Wallet Connect",
|
|
620
|
-
icon,
|
|
621
|
-
isWalletConnect: true,
|
|
622
|
-
};
|
|
921
|
+
})));
|
|
623
922
|
|
|
624
|
-
const
|
|
625
|
-
|
|
626
|
-
[PROVIDER_ID.MYALGO_WALLET]: MYALGO_WALLET,
|
|
627
|
-
[PROVIDER_ID.DEFLY]: DEFLY,
|
|
628
|
-
[PROVIDER_ID.ALGO_SIGNER]: ALGO_SIGNER,
|
|
629
|
-
[PROVIDER_ID.EXODUS]: EXODUS,
|
|
630
|
-
[PROVIDER_ID.KMD_WALLET]: KMD_WALLET,
|
|
631
|
-
[PROVIDER_ID.WALLET_CONNECT]: WALLET_CONNECT,
|
|
632
|
-
};
|
|
923
|
+
const ClientContext = createContext(null);
|
|
924
|
+
var clientStore = ClientContext.Provider;
|
|
633
925
|
|
|
634
926
|
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=";
|
|
635
927
|
|
|
@@ -643,10 +935,11 @@ const getIsIOS = () => {
|
|
|
643
935
|
}
|
|
644
936
|
};
|
|
645
937
|
const isIOS = getIsIOS();
|
|
646
|
-
class
|
|
938
|
+
class BaseClient {
|
|
647
939
|
algosdk;
|
|
648
940
|
algodClient;
|
|
649
941
|
keepWCAlive;
|
|
942
|
+
static metadata;
|
|
650
943
|
constructor(algosdk, algodClient) {
|
|
651
944
|
this.algosdk = algosdk;
|
|
652
945
|
this.algodClient = algodClient;
|
|
@@ -725,14 +1018,17 @@ class BaseWallet {
|
|
|
725
1018
|
}, []);
|
|
726
1019
|
return groupBy(decodedGroup, "from");
|
|
727
1020
|
}
|
|
728
|
-
async sendRawTransactions(transactions) {
|
|
1021
|
+
async sendRawTransactions(transactions, waitRoundsToConfirm) {
|
|
729
1022
|
const sentTransaction = await this.algodClient
|
|
730
1023
|
.sendRawTransaction(transactions)
|
|
731
1024
|
.do();
|
|
732
1025
|
if (!sentTransaction) {
|
|
733
1026
|
throw new Error("Transaction failed.");
|
|
734
1027
|
}
|
|
735
|
-
const
|
|
1028
|
+
const decodedTxn = this.algosdk.decodeSignedTransaction(transactions[0]);
|
|
1029
|
+
const waitRounds = waitRoundsToConfirm ||
|
|
1030
|
+
decodedTxn.txn.lastRound - decodedTxn.txn.firstRound;
|
|
1031
|
+
const confirmedTransaction = await this.waitForConfirmation(sentTransaction.txId, waitRounds);
|
|
736
1032
|
return {
|
|
737
1033
|
id: sentTransaction.txId,
|
|
738
1034
|
...confirmedTransaction,
|
|
@@ -759,32 +1055,42 @@ class BaseWallet {
|
|
|
759
1055
|
}
|
|
760
1056
|
}
|
|
761
1057
|
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
class PeraWalletClient extends BaseWallet {
|
|
1058
|
+
const ICON$6 = "data:image/svg+xml;base64," +
|
|
1059
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=";
|
|
1060
|
+
|
|
1061
|
+
class PeraWalletClient extends BaseClient {
|
|
767
1062
|
#client;
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1063
|
+
network;
|
|
1064
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
771
1065
|
super(algosdk, algodClient);
|
|
772
1066
|
this.#client = client;
|
|
773
|
-
this.
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
1067
|
+
this.network = network;
|
|
1068
|
+
}
|
|
1069
|
+
static metadata = {
|
|
1070
|
+
id: PROVIDER_ID.PERA,
|
|
1071
|
+
name: "Pera",
|
|
1072
|
+
icon: ICON$6,
|
|
1073
|
+
isWalletConnect: true,
|
|
1074
|
+
};
|
|
1075
|
+
static async init({ clientOptions, algodOptions, clientStatic, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1076
|
+
try {
|
|
1077
|
+
const PeraWalletConnect = clientStatic || (await import('@perawallet/connect')).PeraWalletConnect;
|
|
1078
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1079
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1080
|
+
const peraWallet = new PeraWalletConnect({
|
|
1081
|
+
...(clientOptions ? clientOptions : { shouldShowSignTxnToast: false }),
|
|
1082
|
+
});
|
|
1083
|
+
return new PeraWalletClient({
|
|
1084
|
+
client: peraWallet,
|
|
1085
|
+
algosdk,
|
|
1086
|
+
algodClient,
|
|
1087
|
+
network,
|
|
1088
|
+
});
|
|
1089
|
+
}
|
|
1090
|
+
catch (e) {
|
|
1091
|
+
console.error("Error initializing...", e);
|
|
1092
|
+
return null;
|
|
1093
|
+
}
|
|
788
1094
|
}
|
|
789
1095
|
async connect(onDisconnect) {
|
|
790
1096
|
this.keepWCAliveStart();
|
|
@@ -792,54 +1098,37 @@ class PeraWalletClient extends BaseWallet {
|
|
|
792
1098
|
this.keepWCAliveStop();
|
|
793
1099
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
794
1100
|
if (accounts.length === 0) {
|
|
795
|
-
throw new Error(`No accounts found for ${
|
|
1101
|
+
throw new Error(`No accounts found for ${PeraWalletClient.metadata.id}`);
|
|
796
1102
|
}
|
|
797
1103
|
const mappedAccounts = accounts.map((address, index) => ({
|
|
798
1104
|
name: `Pera Wallet ${index + 1}`,
|
|
799
1105
|
address,
|
|
800
|
-
providerId:
|
|
1106
|
+
providerId: PeraWalletClient.metadata.id,
|
|
801
1107
|
}));
|
|
802
1108
|
return {
|
|
803
|
-
...
|
|
1109
|
+
...PeraWalletClient.metadata,
|
|
804
1110
|
accounts: mappedAccounts,
|
|
805
1111
|
};
|
|
806
1112
|
}
|
|
807
1113
|
async reconnect(onDisconnect) {
|
|
808
|
-
const accounts = await this.#client.reconnectSession();
|
|
1114
|
+
const accounts = await this.#client.reconnectSession().catch(console.info);
|
|
809
1115
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
810
1116
|
if (!accounts) {
|
|
811
1117
|
return null;
|
|
812
1118
|
}
|
|
813
1119
|
return {
|
|
814
|
-
...
|
|
1120
|
+
...PeraWalletClient.metadata,
|
|
815
1121
|
accounts: accounts.map((address, index) => ({
|
|
816
1122
|
name: `Pera Wallet ${index + 1}`,
|
|
817
1123
|
address,
|
|
818
|
-
providerId:
|
|
1124
|
+
providerId: PeraWalletClient.metadata.id,
|
|
819
1125
|
})),
|
|
820
1126
|
};
|
|
821
1127
|
}
|
|
822
1128
|
async disconnect() {
|
|
823
1129
|
await this.#client.disconnect();
|
|
824
1130
|
}
|
|
825
|
-
|
|
826
|
-
const formattedTransactions = [];
|
|
827
|
-
for (const [type, txn] of transactions) {
|
|
828
|
-
if (type === "s") {
|
|
829
|
-
formattedTransactions.push({
|
|
830
|
-
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
831
|
-
signers: [],
|
|
832
|
-
});
|
|
833
|
-
}
|
|
834
|
-
else {
|
|
835
|
-
formattedTransactions.push({
|
|
836
|
-
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
837
|
-
});
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
return formattedTransactions;
|
|
841
|
-
}
|
|
842
|
-
async signTransactions(activeAdress, transactions) {
|
|
1131
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
843
1132
|
// Decode the transactions to access their properties.
|
|
844
1133
|
const decodedTxns = transactions.map((txn) => {
|
|
845
1134
|
return this.algosdk.decodeObj(txn);
|
|
@@ -848,7 +1137,7 @@ class PeraWalletClient extends BaseWallet {
|
|
|
848
1137
|
// and add the signers property if they shouldn't be signed.
|
|
849
1138
|
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
850
1139
|
if (!("txn" in txn) &&
|
|
851
|
-
this.algosdk.encodeAddress(txn["snd"])
|
|
1140
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
852
1141
|
acc.push({
|
|
853
1142
|
txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
|
|
854
1143
|
});
|
|
@@ -880,6 +1169,25 @@ class PeraWalletClient extends BaseWallet {
|
|
|
880
1169
|
}, []);
|
|
881
1170
|
return signedTxns;
|
|
882
1171
|
}
|
|
1172
|
+
/** @deprecated */
|
|
1173
|
+
formatTransactionsArray(transactions) {
|
|
1174
|
+
const formattedTransactions = [];
|
|
1175
|
+
for (const [type, txn] of transactions) {
|
|
1176
|
+
if (type === "s") {
|
|
1177
|
+
formattedTransactions.push({
|
|
1178
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1179
|
+
signers: [],
|
|
1180
|
+
});
|
|
1181
|
+
}
|
|
1182
|
+
else {
|
|
1183
|
+
formattedTransactions.push({
|
|
1184
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1185
|
+
});
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
return formattedTransactions;
|
|
1189
|
+
}
|
|
1190
|
+
/** @deprecated */
|
|
883
1191
|
async signEncodedTransactions(transactions) {
|
|
884
1192
|
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
885
1193
|
this.keepWCAliveStart();
|
|
@@ -902,43 +1210,58 @@ class PeraWalletClient extends BaseWallet {
|
|
|
902
1210
|
}
|
|
903
1211
|
}
|
|
904
1212
|
|
|
1213
|
+
const ICON$5 = "data:image/svg+xml;base64," +
|
|
1214
|
+
"PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHBhdGggZmlsbD0iIzI0NUVDNiIgZD0iTTE2LDMyYy0zLjIsMC02LjItMC45LTguOS0yLjdjLTIuNi0xLjgtNC43LTQuMy01LjktNy4yQzAsMTkuMi0wLjMsMTYsMC4zLDEyLjlDMC45LDkuOCwyLjQsNyw0LjcsNC43IEM2LjIsMy4yLDcuOSwyLDkuOSwxLjJDMTEuOCwwLjQsMTMuOSwwLDE2LDBzNC4yLDAuNCw2LjEsMS4yYzEuOSwwLjgsMy43LDIsNS4yLDMuNXMyLjcsMy4zLDMuNSw1LjJjMC44LDEuOSwxLjIsNCwxLjIsNi4xIHMtMC40LDQuMi0xLjIsNi4xYy0wLjgsMS45LTIsMy43LTMuNSw1LjJjLTEuNSwxLjUtMy4yLDIuNy01LjIsMy41QzIwLjIsMzEuNiwxOC4xLDMyLDE2LDMyTDE2LDMyeiBNMjAuMiwxMS4ybDAuMSwwLjVsMi42LDkuNWgyLjEgTDIxLjUsOC45bC0wLjEtMC4zaC0xLjlsMCwwLjFsLTEuNywzLjFMMTYsMTQuOWwwLDAuMWwwLTAuMWwtMC4yLTAuOGwtMC42LTIuNGwtMC4xLTAuMmwtMC43LTIuNmwtMC4xLTAuM2gtMS45bDAsMC4xbC0xLjcsMy4xIGwtMS44LDMuMkw3LjEsMThsLTEuOCwzLjJoMi4xTDkuMiwxOGwxLjgtMy4ybDEuOC0zLjJsMC4zLTAuNWwwLjEsMC41bDAuNSwyLjFsMC43LDIuNmwwLjIsMC45TDE0LjIsMThsLTEuOCwzLjJoMi4xbDAuOC0xLjMgbDEuMy0yLjNsMS41LTIuN2wxLjgtMy4yTDIwLjIsMTEuMkwyMC4yLDExLjJ6Ii8+Cjwvc3ZnPgo=";
|
|
1215
|
+
|
|
905
1216
|
/**
|
|
906
1217
|
* Helpful resources:
|
|
907
1218
|
* https://github.com/randlabs/myalgo-connect
|
|
908
1219
|
*/
|
|
909
|
-
class MyAlgoWalletClient extends
|
|
1220
|
+
class MyAlgoWalletClient extends BaseClient {
|
|
910
1221
|
#client;
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1222
|
+
network;
|
|
1223
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
914
1224
|
super(algosdk, algodClient);
|
|
915
1225
|
this.#client = client;
|
|
916
|
-
this.
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
algosdk
|
|
928
|
-
algodClient
|
|
929
|
-
|
|
1226
|
+
this.network = network;
|
|
1227
|
+
}
|
|
1228
|
+
static metadata = {
|
|
1229
|
+
id: PROVIDER_ID.MYALGO,
|
|
1230
|
+
name: "MyAlgo",
|
|
1231
|
+
icon: ICON$5,
|
|
1232
|
+
isWalletConnect: false,
|
|
1233
|
+
};
|
|
1234
|
+
static async init({ clientOptions, algodOptions, clientStatic, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1235
|
+
try {
|
|
1236
|
+
const MyAlgoConnect = clientStatic || (await import('@randlabs/myalgo-connect')).default;
|
|
1237
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1238
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1239
|
+
const myAlgo = new MyAlgoConnect({
|
|
1240
|
+
...(clientOptions ? clientOptions : { disableLedgerNano: false }),
|
|
1241
|
+
});
|
|
1242
|
+
return new MyAlgoWalletClient({
|
|
1243
|
+
client: myAlgo,
|
|
1244
|
+
algosdk: algosdk,
|
|
1245
|
+
algodClient: algodClient,
|
|
1246
|
+
network,
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
1249
|
+
catch (e) {
|
|
1250
|
+
console.error("Error initializing...", e);
|
|
1251
|
+
return null;
|
|
1252
|
+
}
|
|
930
1253
|
}
|
|
931
1254
|
async connect() {
|
|
932
1255
|
const accounts = await this.#client.connect();
|
|
933
1256
|
if (accounts.length === 0) {
|
|
934
|
-
throw new Error(`No accounts found for ${
|
|
1257
|
+
throw new Error(`No accounts found for ${MyAlgoWalletClient.metadata.id}`);
|
|
935
1258
|
}
|
|
936
1259
|
const mappedAccounts = accounts.map((account) => ({
|
|
937
1260
|
...account,
|
|
938
|
-
providerId:
|
|
1261
|
+
providerId: MyAlgoWalletClient.metadata.id,
|
|
939
1262
|
}));
|
|
940
1263
|
return {
|
|
941
|
-
...
|
|
1264
|
+
...MyAlgoWalletClient.metadata,
|
|
942
1265
|
accounts: mappedAccounts,
|
|
943
1266
|
};
|
|
944
1267
|
}
|
|
@@ -948,7 +1271,7 @@ class MyAlgoWalletClient extends BaseWallet {
|
|
|
948
1271
|
async disconnect() {
|
|
949
1272
|
return;
|
|
950
1273
|
}
|
|
951
|
-
async signTransactions(
|
|
1274
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
952
1275
|
// Decode the transactions to access their properties.
|
|
953
1276
|
const decodedTxns = transactions.map((txn) => {
|
|
954
1277
|
return this.algosdk.decodeObj(txn);
|
|
@@ -958,7 +1281,7 @@ class MyAlgoWalletClient extends BaseWallet {
|
|
|
958
1281
|
// If the transaction isn't already signed and is to be sent from a connected account,
|
|
959
1282
|
// add it to the arrays of transactions to be signed.
|
|
960
1283
|
if (!("txn" in txn) &&
|
|
961
|
-
this.algosdk.encodeAddress(txn["snd"])
|
|
1284
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
962
1285
|
acc.push(transactions[i]);
|
|
963
1286
|
}
|
|
964
1287
|
return acc;
|
|
@@ -978,6 +1301,7 @@ class MyAlgoWalletClient extends BaseWallet {
|
|
|
978
1301
|
}, []);
|
|
979
1302
|
return signedTxns;
|
|
980
1303
|
}
|
|
1304
|
+
/** @deprecated */
|
|
981
1305
|
async signEncodedTransactions(transactions) {
|
|
982
1306
|
const transactionsToSign = [];
|
|
983
1307
|
const signedRawTransactions = [];
|
|
@@ -1004,219 +1328,79 @@ class MyAlgoWalletClient extends BaseWallet {
|
|
|
1004
1328
|
}
|
|
1005
1329
|
}
|
|
1006
1330
|
|
|
1007
|
-
|
|
1331
|
+
const ICON$4 = "data:image/svg+xml;base64," +
|
|
1332
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
|
|
1333
|
+
|
|
1334
|
+
class DeflyWalletClient extends BaseClient {
|
|
1008
1335
|
#client;
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1336
|
+
network;
|
|
1337
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1012
1338
|
super(algosdk, algodClient);
|
|
1013
1339
|
this.#client = client;
|
|
1014
|
-
this.
|
|
1015
|
-
this.provider = provider;
|
|
1016
|
-
}
|
|
1017
|
-
static async init() {
|
|
1018
|
-
if (typeof window == "undefined" ||
|
|
1019
|
-
window.AlgoSigner === undefined) {
|
|
1020
|
-
throw new Error("AlgoSigner is not available.");
|
|
1021
|
-
}
|
|
1022
|
-
const { algosdk, algodClient } = await Algod.init();
|
|
1023
|
-
const algoSigner = window.AlgoSigner;
|
|
1024
|
-
return new AlgoSignerClient({
|
|
1025
|
-
id: PROVIDER_ID.ALGO_SIGNER,
|
|
1026
|
-
client: algoSigner,
|
|
1027
|
-
provider: providers[PROVIDER_ID.ALGO_SIGNER],
|
|
1028
|
-
algosdk: algosdk,
|
|
1029
|
-
algodClient: algodClient,
|
|
1030
|
-
});
|
|
1340
|
+
this.network = network;
|
|
1031
1341
|
}
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
const mappedAccounts = accounts.map(({ address }, index) => ({
|
|
1054
|
-
name: `AlgoSigner ${index + 1}`,
|
|
1055
|
-
address,
|
|
1056
|
-
providerId: this.provider.id,
|
|
1057
|
-
}));
|
|
1058
|
-
return {
|
|
1059
|
-
...this.provider,
|
|
1060
|
-
accounts: mappedAccounts,
|
|
1061
|
-
};
|
|
1062
|
-
}
|
|
1063
|
-
async reconnect(onDisconnect) {
|
|
1064
|
-
if (window === undefined ||
|
|
1065
|
-
window.AlgoSigner === undefined) {
|
|
1066
|
-
onDisconnect();
|
|
1342
|
+
static metadata = {
|
|
1343
|
+
id: PROVIDER_ID.DEFLY,
|
|
1344
|
+
name: "Defly",
|
|
1345
|
+
icon: ICON$4,
|
|
1346
|
+
isWalletConnect: true,
|
|
1347
|
+
};
|
|
1348
|
+
static async init({ clientOptions, algodOptions, clientStatic, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1349
|
+
try {
|
|
1350
|
+
const DeflyWalletConnect = clientStatic ||
|
|
1351
|
+
(await import('@blockshake/defly-connect')).DeflyWalletConnect;
|
|
1352
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1353
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1354
|
+
const deflyWallet = new DeflyWalletConnect({
|
|
1355
|
+
...(clientOptions ? clientOptions : { shouldShowSignTxnToast: false }),
|
|
1356
|
+
});
|
|
1357
|
+
return new DeflyWalletClient({
|
|
1358
|
+
client: deflyWallet,
|
|
1359
|
+
algosdk,
|
|
1360
|
+
algodClient,
|
|
1361
|
+
network,
|
|
1362
|
+
});
|
|
1067
1363
|
}
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
return;
|
|
1072
|
-
}
|
|
1073
|
-
formatTransactionsArray(transactions) {
|
|
1074
|
-
const formattedTransactions = transactions.map(([type, txn]) => {
|
|
1075
|
-
const formattedTxn = {
|
|
1076
|
-
txn: txn[1],
|
|
1077
|
-
};
|
|
1078
|
-
if (type === "s") {
|
|
1079
|
-
formattedTxn.signers = [];
|
|
1080
|
-
const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1081
|
-
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
|
|
1082
|
-
}
|
|
1083
|
-
else {
|
|
1084
|
-
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
1085
|
-
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
|
|
1086
|
-
}
|
|
1087
|
-
return formattedTxn;
|
|
1088
|
-
});
|
|
1089
|
-
return formattedTransactions;
|
|
1090
|
-
}
|
|
1091
|
-
async signTransactions(activeAdress, transactions) {
|
|
1092
|
-
// Decode the transactions to access their properties.
|
|
1093
|
-
const decodedTxns = transactions.map((txn) => {
|
|
1094
|
-
return this.algosdk.decodeObj(txn);
|
|
1095
|
-
});
|
|
1096
|
-
// Marshal the transactions,
|
|
1097
|
-
// and add the signers property if they shouldn't be signed.
|
|
1098
|
-
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1099
|
-
const txnObj = {
|
|
1100
|
-
txn: this.#client.encoding.msgpackToBase64(transactions[i]),
|
|
1101
|
-
};
|
|
1102
|
-
if ("txn" in txn ||
|
|
1103
|
-
this.algosdk.encodeAddress(txn["snd"]) !== activeAdress) {
|
|
1104
|
-
txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
|
|
1105
|
-
txnObj.signers = [];
|
|
1106
|
-
}
|
|
1107
|
-
acc.push(txnObj);
|
|
1108
|
-
return acc;
|
|
1109
|
-
}, []);
|
|
1110
|
-
// Sign them with the client.
|
|
1111
|
-
const result = await this.#client.signTxn(txnsToSign);
|
|
1112
|
-
// Join the newly signed transactions with the original group of transactions.
|
|
1113
|
-
const signedTxns = result.reduce((acc, txn, i) => {
|
|
1114
|
-
if (txn) {
|
|
1115
|
-
acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1116
|
-
}
|
|
1117
|
-
else {
|
|
1118
|
-
acc.push(transactions[i]);
|
|
1119
|
-
}
|
|
1120
|
-
return acc;
|
|
1121
|
-
}, []);
|
|
1122
|
-
return signedTxns;
|
|
1123
|
-
}
|
|
1124
|
-
async signEncodedTransactions(transactions) {
|
|
1125
|
-
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1126
|
-
const result = await this.#client.signTxn(transactionsToSign);
|
|
1127
|
-
if (!result) {
|
|
1128
|
-
throw new Error("Signing failed.");
|
|
1364
|
+
catch (e) {
|
|
1365
|
+
console.error("Error initializing...", e);
|
|
1366
|
+
return null;
|
|
1129
1367
|
}
|
|
1130
|
-
const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
|
|
1131
|
-
if (txn) {
|
|
1132
|
-
signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1133
|
-
}
|
|
1134
|
-
if (txn === null) {
|
|
1135
|
-
signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
|
|
1136
|
-
}
|
|
1137
|
-
return signedTxns;
|
|
1138
|
-
}, []);
|
|
1139
|
-
return signedRawTransactions;
|
|
1140
|
-
}
|
|
1141
|
-
}
|
|
1142
|
-
|
|
1143
|
-
class DeflyWalletClient extends BaseWallet {
|
|
1144
|
-
#client;
|
|
1145
|
-
id;
|
|
1146
|
-
provider;
|
|
1147
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1148
|
-
super(algosdk, algodClient);
|
|
1149
|
-
this.#client = client;
|
|
1150
|
-
this.id = id;
|
|
1151
|
-
this.provider = provider;
|
|
1152
|
-
}
|
|
1153
|
-
static async init() {
|
|
1154
|
-
const { algosdk, algodClient } = await Algod.init();
|
|
1155
|
-
const DeflyWalletConnect = (await import('@blockshake/defly-connect'))
|
|
1156
|
-
.DeflyWalletConnect;
|
|
1157
|
-
const deflyWallet = new DeflyWalletConnect({
|
|
1158
|
-
shouldShowSignTxnToast: false,
|
|
1159
|
-
});
|
|
1160
|
-
return new DeflyWalletClient({
|
|
1161
|
-
id: PROVIDER_ID.DEFLY,
|
|
1162
|
-
client: deflyWallet,
|
|
1163
|
-
provider: providers[PROVIDER_ID.DEFLY],
|
|
1164
|
-
algosdk,
|
|
1165
|
-
algodClient,
|
|
1166
|
-
});
|
|
1167
1368
|
}
|
|
1168
1369
|
async connect(onDisconnect) {
|
|
1169
|
-
const accounts = await this.#client.connect();
|
|
1370
|
+
const accounts = await this.#client.connect().catch(console.info);
|
|
1170
1371
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1171
|
-
if (accounts.length === 0) {
|
|
1172
|
-
throw new Error(`No accounts found for ${
|
|
1372
|
+
if (!accounts || accounts.length === 0) {
|
|
1373
|
+
throw new Error(`No accounts found for ${DeflyWalletClient.metadata.id}`);
|
|
1173
1374
|
}
|
|
1174
1375
|
const mappedAccounts = accounts.map((address, index) => ({
|
|
1175
1376
|
name: `Defly Wallet ${index + 1}`,
|
|
1176
1377
|
address,
|
|
1177
|
-
providerId:
|
|
1378
|
+
providerId: DeflyWalletClient.metadata.id,
|
|
1178
1379
|
}));
|
|
1179
1380
|
return {
|
|
1180
|
-
...
|
|
1381
|
+
...DeflyWalletClient.metadata,
|
|
1181
1382
|
accounts: mappedAccounts,
|
|
1182
1383
|
};
|
|
1183
1384
|
}
|
|
1184
1385
|
async reconnect(onDisconnect) {
|
|
1185
|
-
const accounts = await this.#client.reconnectSession();
|
|
1386
|
+
const accounts = await this.#client.reconnectSession().catch(console.info);
|
|
1186
1387
|
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1187
1388
|
if (!accounts) {
|
|
1188
1389
|
return null;
|
|
1189
1390
|
}
|
|
1190
1391
|
return {
|
|
1191
|
-
...
|
|
1392
|
+
...DeflyWalletClient.metadata,
|
|
1192
1393
|
accounts: accounts.map((address, index) => ({
|
|
1193
1394
|
name: `Defly Wallet ${index + 1}`,
|
|
1194
1395
|
address,
|
|
1195
|
-
providerId:
|
|
1396
|
+
providerId: DeflyWalletClient.metadata.id,
|
|
1196
1397
|
})),
|
|
1197
1398
|
};
|
|
1198
1399
|
}
|
|
1199
1400
|
async disconnect() {
|
|
1200
1401
|
await this.#client.disconnect();
|
|
1201
1402
|
}
|
|
1202
|
-
|
|
1203
|
-
const formattedTransactions = [];
|
|
1204
|
-
for (const [type, txn] of transactions) {
|
|
1205
|
-
if (type === "s") {
|
|
1206
|
-
formattedTransactions.push({
|
|
1207
|
-
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1208
|
-
signers: [],
|
|
1209
|
-
});
|
|
1210
|
-
}
|
|
1211
|
-
else {
|
|
1212
|
-
formattedTransactions.push({
|
|
1213
|
-
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1214
|
-
});
|
|
1215
|
-
}
|
|
1216
|
-
}
|
|
1217
|
-
return formattedTransactions;
|
|
1218
|
-
}
|
|
1219
|
-
async signTransactions(activeAdress, transactions) {
|
|
1403
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1220
1404
|
// Decode the transactions to access their properties.
|
|
1221
1405
|
const decodedTxns = transactions.map((txn) => {
|
|
1222
1406
|
return this.algosdk.decodeObj(txn);
|
|
@@ -1225,7 +1409,7 @@ class DeflyWalletClient extends BaseWallet {
|
|
|
1225
1409
|
// and add the signers property if they shouldn't be signed.
|
|
1226
1410
|
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1227
1411
|
if (!("txn" in txn) &&
|
|
1228
|
-
this.algosdk.encodeAddress(txn["snd"])
|
|
1412
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1229
1413
|
acc.push({
|
|
1230
1414
|
txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
|
|
1231
1415
|
});
|
|
@@ -1253,6 +1437,7 @@ class DeflyWalletClient extends BaseWallet {
|
|
|
1253
1437
|
}, []);
|
|
1254
1438
|
return signedTxns;
|
|
1255
1439
|
}
|
|
1440
|
+
/** @deprecated */
|
|
1256
1441
|
async signEncodedTransactions(transactions) {
|
|
1257
1442
|
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1258
1443
|
const result = await this.#client.signTransaction([
|
|
@@ -1271,47 +1456,84 @@ class DeflyWalletClient extends BaseWallet {
|
|
|
1271
1456
|
}
|
|
1272
1457
|
return signedTransactions;
|
|
1273
1458
|
}
|
|
1459
|
+
/** @deprecated */
|
|
1460
|
+
formatTransactionsArray(transactions) {
|
|
1461
|
+
const formattedTransactions = [];
|
|
1462
|
+
for (const [type, txn] of transactions) {
|
|
1463
|
+
if (type === "s") {
|
|
1464
|
+
formattedTransactions.push({
|
|
1465
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1466
|
+
signers: [],
|
|
1467
|
+
});
|
|
1468
|
+
}
|
|
1469
|
+
else {
|
|
1470
|
+
formattedTransactions.push({
|
|
1471
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1472
|
+
});
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
return formattedTransactions;
|
|
1476
|
+
}
|
|
1274
1477
|
}
|
|
1275
1478
|
|
|
1276
|
-
|
|
1479
|
+
const ICON$3 = "data:image/svg+xml;base64," +
|
|
1480
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
|
|
1481
|
+
|
|
1482
|
+
class ExodusClient extends BaseClient {
|
|
1277
1483
|
#client;
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
constructor({ client,
|
|
1484
|
+
#onlyIfTrusted;
|
|
1485
|
+
network;
|
|
1486
|
+
constructor({ client, algosdk, algodClient, onlyIfTrusted, network, }) {
|
|
1281
1487
|
super(algosdk, algodClient);
|
|
1282
1488
|
this.#client = client;
|
|
1283
|
-
this
|
|
1284
|
-
this.
|
|
1285
|
-
}
|
|
1286
|
-
static
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1489
|
+
this.#onlyIfTrusted = onlyIfTrusted;
|
|
1490
|
+
this.network = network;
|
|
1491
|
+
}
|
|
1492
|
+
static metadata = {
|
|
1493
|
+
id: PROVIDER_ID.EXODUS,
|
|
1494
|
+
name: "Exodus",
|
|
1495
|
+
icon: ICON$3,
|
|
1496
|
+
isWalletConnect: false,
|
|
1497
|
+
};
|
|
1498
|
+
static async init({ clientOptions, algodOptions, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1499
|
+
try {
|
|
1500
|
+
if (typeof window == "undefined" ||
|
|
1501
|
+
window.exodus === undefined) {
|
|
1502
|
+
throw new Error("Exodus is not available.");
|
|
1503
|
+
}
|
|
1504
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1505
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1506
|
+
const exodus = window.exodus.algorand;
|
|
1507
|
+
return new ExodusClient({
|
|
1508
|
+
id: PROVIDER_ID.EXODUS,
|
|
1509
|
+
client: exodus,
|
|
1510
|
+
algosdk: algosdk,
|
|
1511
|
+
algodClient: algodClient,
|
|
1512
|
+
onlyIfTrusted: clientOptions?.onlyIfTrusted || false,
|
|
1513
|
+
network,
|
|
1514
|
+
});
|
|
1515
|
+
}
|
|
1516
|
+
catch (e) {
|
|
1517
|
+
console.error("Error initializing...", e);
|
|
1518
|
+
return null;
|
|
1519
|
+
}
|
|
1300
1520
|
}
|
|
1301
1521
|
async connect() {
|
|
1302
|
-
const { address } = await this.#client.connect(
|
|
1522
|
+
const { address } = await this.#client.connect({
|
|
1523
|
+
onlyIfTrusted: this.#onlyIfTrusted,
|
|
1524
|
+
});
|
|
1303
1525
|
if (!address) {
|
|
1304
|
-
throw new Error(`No accounts found for ${
|
|
1526
|
+
throw new Error(`No accounts found for ${ExodusClient.metadata.id}`);
|
|
1305
1527
|
}
|
|
1306
1528
|
const accounts = [
|
|
1307
1529
|
{
|
|
1308
1530
|
name: `Exodus 1`,
|
|
1309
1531
|
address,
|
|
1310
|
-
providerId:
|
|
1532
|
+
providerId: ExodusClient.metadata.id,
|
|
1311
1533
|
},
|
|
1312
1534
|
];
|
|
1313
1535
|
return {
|
|
1314
|
-
...
|
|
1536
|
+
...ExodusClient.metadata,
|
|
1315
1537
|
accounts,
|
|
1316
1538
|
};
|
|
1317
1539
|
}
|
|
@@ -1326,7 +1548,7 @@ class ExodusClient extends BaseWallet {
|
|
|
1326
1548
|
async disconnect() {
|
|
1327
1549
|
return;
|
|
1328
1550
|
}
|
|
1329
|
-
async signTransactions(
|
|
1551
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1330
1552
|
// Decode the transactions to access their properties.
|
|
1331
1553
|
const decodedTxns = transactions.map((txn) => {
|
|
1332
1554
|
return this.algosdk.decodeObj(txn);
|
|
@@ -1336,7 +1558,7 @@ class ExodusClient extends BaseWallet {
|
|
|
1336
1558
|
// If the transaction isn't already signed and is to be sent from a connected account,
|
|
1337
1559
|
// add it to the arrays of transactions to be signed.
|
|
1338
1560
|
if (!("txn" in txn) &&
|
|
1339
|
-
this.algosdk.encodeAddress(txn["snd"])
|
|
1561
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1340
1562
|
acc.push(transactions[i]);
|
|
1341
1563
|
}
|
|
1342
1564
|
return acc;
|
|
@@ -1356,6 +1578,7 @@ class ExodusClient extends BaseWallet {
|
|
|
1356
1578
|
}, []);
|
|
1357
1579
|
return signedTxns;
|
|
1358
1580
|
}
|
|
1581
|
+
/** @deprecated */
|
|
1359
1582
|
async signEncodedTransactions(transactions) {
|
|
1360
1583
|
const transactionsToSign = [];
|
|
1361
1584
|
const signedRawTransactions = [];
|
|
@@ -1383,172 +1606,209 @@ class ExodusClient extends BaseWallet {
|
|
|
1383
1606
|
}
|
|
1384
1607
|
}
|
|
1385
1608
|
|
|
1386
|
-
const
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1609
|
+
const ICON$2 = "data:image/svg+xml;base64," +
|
|
1610
|
+
"PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
|
|
1611
|
+
|
|
1612
|
+
const getNetwork = (network) => {
|
|
1613
|
+
if (network === "betanet") {
|
|
1614
|
+
return "BetaNet";
|
|
1615
|
+
}
|
|
1616
|
+
if (network === "testnet") {
|
|
1617
|
+
return "TestNet";
|
|
1618
|
+
}
|
|
1619
|
+
if (network === "mainnet") {
|
|
1620
|
+
return "MainNet";
|
|
1621
|
+
}
|
|
1622
|
+
return network;
|
|
1390
1623
|
};
|
|
1391
|
-
class
|
|
1624
|
+
class AlgoSignerClient extends BaseClient {
|
|
1392
1625
|
#client;
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
provider;
|
|
1396
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1626
|
+
network;
|
|
1627
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1397
1628
|
super(algosdk, algodClient);
|
|
1398
1629
|
this.#client = client;
|
|
1399
|
-
this.
|
|
1400
|
-
this.provider = provider;
|
|
1401
|
-
this.walletId = "";
|
|
1630
|
+
this.network = network;
|
|
1402
1631
|
}
|
|
1403
|
-
static
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1632
|
+
static metadata = {
|
|
1633
|
+
id: PROVIDER_ID.ALGOSIGNER,
|
|
1634
|
+
name: "AlgoSigner",
|
|
1635
|
+
icon: ICON$2,
|
|
1636
|
+
isWalletConnect: false,
|
|
1637
|
+
};
|
|
1638
|
+
static async init({ algodOptions, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1639
|
+
try {
|
|
1640
|
+
if (typeof window == "undefined" ||
|
|
1641
|
+
window.AlgoSigner === undefined) {
|
|
1642
|
+
throw new Error("AlgoSigner is not available.");
|
|
1643
|
+
}
|
|
1644
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1645
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1646
|
+
const algosigner = window.AlgoSigner;
|
|
1647
|
+
return new AlgoSignerClient({
|
|
1648
|
+
id: PROVIDER_ID.ALGOSIGNER,
|
|
1649
|
+
client: algosigner,
|
|
1650
|
+
algosdk: algosdk,
|
|
1651
|
+
algodClient: algodClient,
|
|
1652
|
+
network,
|
|
1653
|
+
});
|
|
1654
|
+
}
|
|
1655
|
+
catch (e) {
|
|
1656
|
+
console.error("Error initializing...", e);
|
|
1657
|
+
return null;
|
|
1658
|
+
}
|
|
1415
1659
|
}
|
|
1416
1660
|
async connect() {
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1661
|
+
await this.#client.connect();
|
|
1662
|
+
const accounts = await this.#client.accounts({
|
|
1663
|
+
ledger: getNetwork(this.network),
|
|
1664
|
+
});
|
|
1665
|
+
if (accounts.length === 0) {
|
|
1666
|
+
throw new Error(`No accounts found for ${AlgoSignerClient.metadata.id}`);
|
|
1667
|
+
}
|
|
1668
|
+
const mappedAccounts = accounts.map(({ address }, index) => ({
|
|
1669
|
+
name: `AlgoSigner ${index + 1}`,
|
|
1670
|
+
address,
|
|
1671
|
+
providerId: AlgoSignerClient.metadata.id,
|
|
1672
|
+
}));
|
|
1427
1673
|
return {
|
|
1428
|
-
...
|
|
1429
|
-
accounts:
|
|
1674
|
+
...AlgoSignerClient.metadata,
|
|
1675
|
+
accounts: mappedAccounts,
|
|
1430
1676
|
};
|
|
1431
1677
|
}
|
|
1432
|
-
async
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
}
|
|
1437
|
-
async getWalletToken(walletId, password) {
|
|
1438
|
-
const handleResp = await this.#client.initWalletHandle(walletId, password);
|
|
1439
|
-
return handleResp.wallet_handle_token;
|
|
1440
|
-
}
|
|
1441
|
-
async releaseToken(token) {
|
|
1442
|
-
await this.#client.releaseWalletHandle(token);
|
|
1443
|
-
}
|
|
1444
|
-
async listWallets() {
|
|
1445
|
-
const walletResponse = await this.#client.listWallets();
|
|
1446
|
-
const walletList = walletResponse["wallets"];
|
|
1447
|
-
const walletMap = {};
|
|
1448
|
-
for (const w of walletList) {
|
|
1449
|
-
walletMap[w.name] = w.id;
|
|
1678
|
+
async reconnect(onDisconnect) {
|
|
1679
|
+
if (window === undefined ||
|
|
1680
|
+
window.AlgoSigner === undefined) {
|
|
1681
|
+
onDisconnect();
|
|
1450
1682
|
}
|
|
1451
|
-
return
|
|
1683
|
+
return null;
|
|
1452
1684
|
}
|
|
1453
|
-
async
|
|
1454
|
-
|
|
1455
|
-
if (!(wallet in walletMap))
|
|
1456
|
-
throw Error("No wallet named: " + wallet);
|
|
1457
|
-
this.walletId = walletMap[wallet];
|
|
1458
|
-
// Get a handle token
|
|
1459
|
-
const token = await this.getWalletToken(this.walletId, password);
|
|
1460
|
-
// Fetch accounts and format them as lib expects
|
|
1461
|
-
const listResponse = await this.#client.listKeys(token);
|
|
1462
|
-
const addresses = listResponse["addresses"];
|
|
1463
|
-
const mappedAccounts = addresses.map((address, index) => {
|
|
1464
|
-
return {
|
|
1465
|
-
name: `KMDWallet ${index + 1}`,
|
|
1466
|
-
address,
|
|
1467
|
-
providerId: this.provider.id,
|
|
1468
|
-
};
|
|
1469
|
-
});
|
|
1470
|
-
// Release handle token
|
|
1471
|
-
this.releaseToken(token);
|
|
1472
|
-
return mappedAccounts;
|
|
1685
|
+
async disconnect() {
|
|
1686
|
+
return;
|
|
1473
1687
|
}
|
|
1474
|
-
async signTransactions(
|
|
1688
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1475
1689
|
// Decode the transactions to access their properties.
|
|
1476
1690
|
const decodedTxns = transactions.map((txn) => {
|
|
1477
1691
|
return this.algosdk.decodeObj(txn);
|
|
1478
1692
|
});
|
|
1479
|
-
//
|
|
1480
|
-
|
|
1481
|
-
const
|
|
1482
|
-
|
|
1693
|
+
// Marshal the transactions,
|
|
1694
|
+
// and add the signers property if they shouldn't be signed.
|
|
1695
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1696
|
+
const txnObj = {
|
|
1697
|
+
txn: this.#client.encoding.msgpackToBase64(transactions[i]),
|
|
1698
|
+
};
|
|
1699
|
+
if ("txn" in txn ||
|
|
1700
|
+
!connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1701
|
+
txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
|
|
1702
|
+
txnObj.signers = [];
|
|
1703
|
+
}
|
|
1704
|
+
acc.push(txnObj);
|
|
1705
|
+
return acc;
|
|
1706
|
+
}, []);
|
|
1483
1707
|
// Sign them with the client.
|
|
1484
|
-
const
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
// Its already signed, skip it
|
|
1490
|
-
if (!("snd" in dtxn))
|
|
1491
|
-
continue;
|
|
1492
|
-
// Not to be signed by our signer, skip it
|
|
1493
|
-
if (!(this.algosdk.encodeAddress(dtxn.snd) === activeAddress))
|
|
1494
|
-
continue;
|
|
1495
|
-
// overwrite with an empty blob
|
|
1496
|
-
signedTxns[idx] = new Uint8Array();
|
|
1497
|
-
const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
|
|
1498
|
-
signingPromises.push(this.#client.signTransaction(token, pw, txn));
|
|
1499
|
-
}
|
|
1500
|
-
const signingResults = await Promise.all(signingPromises);
|
|
1501
|
-
// Restore the newly signed txns in the correct order
|
|
1502
|
-
let signedIdx = 0;
|
|
1503
|
-
for (const idx in signedTxns) {
|
|
1504
|
-
// If its an empty array, infer that it is one of the
|
|
1505
|
-
// ones we wanted to have signed and overwrite the empty buff
|
|
1506
|
-
if (signedTxns[idx].length === 0) {
|
|
1507
|
-
signedTxns[idx] = signingResults[signedIdx];
|
|
1508
|
-
signedIdx += 1;
|
|
1708
|
+
const result = await this.#client.signTxn(txnsToSign);
|
|
1709
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
1710
|
+
const signedTxns = result.reduce((acc, txn, i) => {
|
|
1711
|
+
if (txn) {
|
|
1712
|
+
acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1509
1713
|
}
|
|
1510
|
-
|
|
1714
|
+
else {
|
|
1715
|
+
acc.push(transactions[i]);
|
|
1716
|
+
}
|
|
1717
|
+
return acc;
|
|
1718
|
+
}, []);
|
|
1511
1719
|
return signedTxns;
|
|
1512
1720
|
}
|
|
1513
|
-
|
|
1514
|
-
|
|
1721
|
+
/** @deprecated */
|
|
1722
|
+
formatTransactionsArray(transactions) {
|
|
1723
|
+
const formattedTransactions = transactions.map(([type, txn]) => {
|
|
1724
|
+
const formattedTxn = {
|
|
1725
|
+
txn: txn[1],
|
|
1726
|
+
};
|
|
1727
|
+
if (type === "s") {
|
|
1728
|
+
formattedTxn.signers = [];
|
|
1729
|
+
const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1730
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
|
|
1731
|
+
}
|
|
1732
|
+
else {
|
|
1733
|
+
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
1734
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
|
|
1735
|
+
}
|
|
1736
|
+
return formattedTxn;
|
|
1737
|
+
});
|
|
1738
|
+
return formattedTransactions;
|
|
1739
|
+
}
|
|
1740
|
+
/** @deprecated */
|
|
1741
|
+
async signEncodedTransactions(transactions) {
|
|
1742
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1743
|
+
const result = await this.#client.signTxn(transactionsToSign);
|
|
1744
|
+
if (!result) {
|
|
1745
|
+
throw new Error("Signing failed.");
|
|
1746
|
+
}
|
|
1747
|
+
const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
|
|
1748
|
+
if (txn) {
|
|
1749
|
+
signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1750
|
+
}
|
|
1751
|
+
if (txn === null) {
|
|
1752
|
+
signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
|
|
1753
|
+
}
|
|
1754
|
+
return signedTxns;
|
|
1755
|
+
}, []);
|
|
1756
|
+
return signedRawTransactions;
|
|
1515
1757
|
}
|
|
1516
1758
|
}
|
|
1517
1759
|
|
|
1518
|
-
|
|
1760
|
+
const ICON$1 = "data:image/svg+xml;base64," +
|
|
1761
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==";
|
|
1762
|
+
const DEFAULT_NETWORK = "mainnet";
|
|
1763
|
+
|
|
1764
|
+
class WalletConnectClient extends BaseClient {
|
|
1519
1765
|
#client;
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1766
|
+
network;
|
|
1767
|
+
constructor({ client, algosdk, algodClient, network, }) {
|
|
1523
1768
|
super(algosdk, algodClient);
|
|
1524
1769
|
this.#client = client;
|
|
1525
|
-
this.
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1770
|
+
this.network = network;
|
|
1771
|
+
}
|
|
1772
|
+
static metadata = {
|
|
1773
|
+
id: PROVIDER_ID.WALLETCONNECT,
|
|
1774
|
+
name: "WalletConnect",
|
|
1775
|
+
icon: ICON$1,
|
|
1776
|
+
isWalletConnect: true,
|
|
1777
|
+
};
|
|
1778
|
+
static async init({ clientOptions, algodOptions, clientStatic, modalStatic, algosdkStatic, network = DEFAULT_NETWORK, }) {
|
|
1779
|
+
try {
|
|
1780
|
+
const WalletConnect = clientStatic || (await import('@walletconnect/client')).default;
|
|
1781
|
+
const QRCodeModal = modalStatic ||
|
|
1782
|
+
(await import('algorand-walletconnect-qrcode-modal')).default;
|
|
1783
|
+
const walletConnect = new WalletConnect({
|
|
1784
|
+
...(clientOptions
|
|
1785
|
+
? clientOptions
|
|
1786
|
+
: {
|
|
1787
|
+
bridge: "https://bridge.walletconnect.org",
|
|
1788
|
+
qrcodeModal: QRCodeModal,
|
|
1789
|
+
}),
|
|
1790
|
+
});
|
|
1791
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1792
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1793
|
+
const initWallet = {
|
|
1794
|
+
client: walletConnect,
|
|
1795
|
+
algosdk: algosdk,
|
|
1796
|
+
algodClient: algodClient,
|
|
1797
|
+
network,
|
|
1798
|
+
};
|
|
1799
|
+
return new WalletConnectClient(initWallet);
|
|
1800
|
+
}
|
|
1801
|
+
catch (e) {
|
|
1802
|
+
console.error("Error initializing...", e);
|
|
1803
|
+
return null;
|
|
1804
|
+
}
|
|
1545
1805
|
}
|
|
1546
1806
|
async connect() {
|
|
1547
1807
|
let chainId = 416001;
|
|
1548
|
-
if (
|
|
1808
|
+
if (this.network === "betanet") {
|
|
1549
1809
|
chainId = 416003;
|
|
1550
1810
|
}
|
|
1551
|
-
else if (
|
|
1811
|
+
else if (this.network === "testnet") {
|
|
1552
1812
|
chainId = 416002;
|
|
1553
1813
|
}
|
|
1554
1814
|
if (!this.#client.connected) {
|
|
@@ -1561,11 +1821,11 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1561
1821
|
}
|
|
1562
1822
|
const { accounts } = payload.params[0];
|
|
1563
1823
|
resolve({
|
|
1564
|
-
...
|
|
1824
|
+
...WalletConnectClient.metadata,
|
|
1565
1825
|
accounts: accounts.map((address, index) => ({
|
|
1566
1826
|
name: `Wallet Connect ${index + 1}`,
|
|
1567
1827
|
address,
|
|
1568
|
-
providerId:
|
|
1828
|
+
providerId: WalletConnectClient.metadata.id,
|
|
1569
1829
|
})),
|
|
1570
1830
|
});
|
|
1571
1831
|
});
|
|
@@ -1575,28 +1835,27 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1575
1835
|
}
|
|
1576
1836
|
const { accounts } = payload.params[0];
|
|
1577
1837
|
resolve({
|
|
1578
|
-
...
|
|
1838
|
+
...WalletConnectClient.metadata,
|
|
1579
1839
|
accounts: accounts.map((address, index) => ({
|
|
1580
1840
|
name: `Wallet Connect ${index + 1}`,
|
|
1581
1841
|
address,
|
|
1582
|
-
providerId:
|
|
1842
|
+
providerId: WalletConnectClient.metadata.id,
|
|
1583
1843
|
})),
|
|
1584
1844
|
});
|
|
1585
1845
|
});
|
|
1586
1846
|
});
|
|
1587
1847
|
}
|
|
1588
1848
|
async reconnect() {
|
|
1589
|
-
this.#client = (await WalletConnectClient.init()).#client;
|
|
1590
1849
|
const accounts = this.#client.accounts;
|
|
1591
1850
|
if (!accounts) {
|
|
1592
1851
|
return null;
|
|
1593
1852
|
}
|
|
1594
1853
|
return {
|
|
1595
|
-
...
|
|
1854
|
+
...WalletConnectClient.metadata,
|
|
1596
1855
|
accounts: accounts.map((address, index) => ({
|
|
1597
1856
|
name: `Wallet Connect ${index + 1}`,
|
|
1598
1857
|
address,
|
|
1599
|
-
providerId:
|
|
1858
|
+
providerId: WalletConnectClient.metadata.id,
|
|
1600
1859
|
})),
|
|
1601
1860
|
};
|
|
1602
1861
|
}
|
|
@@ -1611,21 +1870,7 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1611
1870
|
console.error("Error disconnecting", e);
|
|
1612
1871
|
}
|
|
1613
1872
|
}
|
|
1614
|
-
|
|
1615
|
-
const formattedTransactions = transactions.map((txn) => {
|
|
1616
|
-
const formattedTxn = {
|
|
1617
|
-
txn: txn[1],
|
|
1618
|
-
};
|
|
1619
|
-
if (txn[0] === "s") {
|
|
1620
|
-
const decodedTxn = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn[1], "base64")));
|
|
1621
|
-
formattedTxn.txn = Buffer.from(this.algosdk.encodeUnsignedTransaction(decodedTxn.txn)).toString("base64");
|
|
1622
|
-
formattedTxn.signers = [];
|
|
1623
|
-
}
|
|
1624
|
-
return formattedTxn;
|
|
1625
|
-
});
|
|
1626
|
-
return formattedTransactions;
|
|
1627
|
-
}
|
|
1628
|
-
async signTransactions(activeAdress, transactions) {
|
|
1873
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1629
1874
|
// Decode the transactions to access their properties.
|
|
1630
1875
|
const decodedTxns = transactions.map((txn) => {
|
|
1631
1876
|
return this.algosdk.decodeObj(txn);
|
|
@@ -1634,7 +1879,7 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1634
1879
|
// and add the signers property if they shouldn't be signed.
|
|
1635
1880
|
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1636
1881
|
if (!("txn" in txn) &&
|
|
1637
|
-
this.algosdk.encodeAddress(txn["snd"])
|
|
1882
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1638
1883
|
acc.push({
|
|
1639
1884
|
txn: Buffer.from(transactions[i]).toString("base64"),
|
|
1640
1885
|
});
|
|
@@ -1667,6 +1912,22 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1667
1912
|
}, []);
|
|
1668
1913
|
return signedTxns;
|
|
1669
1914
|
}
|
|
1915
|
+
/** @deprecarted */
|
|
1916
|
+
formatTransactionsArray(transactions) {
|
|
1917
|
+
const formattedTransactions = transactions.map((txn) => {
|
|
1918
|
+
const formattedTxn = {
|
|
1919
|
+
txn: txn[1],
|
|
1920
|
+
};
|
|
1921
|
+
if (txn[0] === "s") {
|
|
1922
|
+
const decodedTxn = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn[1], "base64")));
|
|
1923
|
+
formattedTxn.txn = Buffer.from(this.algosdk.encodeUnsignedTransaction(decodedTxn.txn)).toString("base64");
|
|
1924
|
+
formattedTxn.signers = [];
|
|
1925
|
+
}
|
|
1926
|
+
return formattedTxn;
|
|
1927
|
+
});
|
|
1928
|
+
return formattedTransactions;
|
|
1929
|
+
}
|
|
1930
|
+
/** @deprecated */
|
|
1670
1931
|
async signEncodedTransactions(transactions) {
|
|
1671
1932
|
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1672
1933
|
const requestParams = [transactionsToSign];
|
|
@@ -1687,128 +1948,164 @@ class WalletConnectClient extends BaseWallet {
|
|
|
1687
1948
|
}
|
|
1688
1949
|
}
|
|
1689
1950
|
|
|
1690
|
-
const
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1951
|
+
const ICON = "data:image/svg+xml;base64," +
|
|
1952
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+";
|
|
1953
|
+
|
|
1954
|
+
class KMDWalletClient extends BaseClient {
|
|
1955
|
+
#client;
|
|
1956
|
+
#wallet;
|
|
1957
|
+
#password;
|
|
1958
|
+
walletId;
|
|
1959
|
+
id;
|
|
1960
|
+
network;
|
|
1961
|
+
constructor({ client, id, wallet, password, algosdk, algodClient, network, }) {
|
|
1962
|
+
super(algosdk, algodClient);
|
|
1963
|
+
this.#client = client;
|
|
1964
|
+
this.#wallet = wallet;
|
|
1965
|
+
this.#password = password;
|
|
1966
|
+
this.id = id;
|
|
1967
|
+
this.walletId = "";
|
|
1968
|
+
this.network = network;
|
|
1969
|
+
}
|
|
1970
|
+
static metadata = {
|
|
1971
|
+
id: PROVIDER_ID.KMD,
|
|
1972
|
+
name: "KMD",
|
|
1973
|
+
icon: ICON,
|
|
1974
|
+
isWalletConnect: false,
|
|
1975
|
+
};
|
|
1976
|
+
static async init({ clientOptions, algodOptions, algosdkStatic, network = DEFAULT_NETWORK$1, }) {
|
|
1977
|
+
try {
|
|
1978
|
+
const { token = "a".repeat(64), host = "http://localhost", port = "4002", wallet = "", password = "", } = clientOptions || {};
|
|
1979
|
+
const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
|
|
1980
|
+
const algodClient = await getAlgodClient(algosdk, algodOptions);
|
|
1981
|
+
const kmdClient = new algosdk.Kmd(token, host, port);
|
|
1982
|
+
return new KMDWalletClient({
|
|
1983
|
+
id: PROVIDER_ID.KMD,
|
|
1984
|
+
password,
|
|
1985
|
+
wallet,
|
|
1986
|
+
client: kmdClient,
|
|
1987
|
+
algosdk: algosdk,
|
|
1988
|
+
algodClient: algodClient,
|
|
1989
|
+
network,
|
|
1990
|
+
});
|
|
1707
1991
|
}
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
console.info("error initializing client", e);
|
|
1712
|
-
return;
|
|
1992
|
+
catch (e) {
|
|
1993
|
+
console.error("Error initializing...", e);
|
|
1994
|
+
return null;
|
|
1713
1995
|
}
|
|
1714
|
-
}
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1996
|
+
}
|
|
1997
|
+
async connect() {
|
|
1998
|
+
// TODO: prompt for wallet and password?
|
|
1999
|
+
return {
|
|
2000
|
+
...KMDWalletClient.metadata,
|
|
2001
|
+
accounts: await this.listAccounts(this.#wallet, await this.requestPassword()),
|
|
2002
|
+
};
|
|
2003
|
+
}
|
|
2004
|
+
async disconnect() {
|
|
2005
|
+
return;
|
|
2006
|
+
}
|
|
2007
|
+
async reconnect() {
|
|
2008
|
+
return {
|
|
2009
|
+
...KMDWalletClient.metadata,
|
|
2010
|
+
accounts: await this.listAccounts(this.#wallet, this.#password || (await this.requestPassword())),
|
|
2011
|
+
};
|
|
2012
|
+
}
|
|
2013
|
+
async requestPassword() {
|
|
2014
|
+
// TODO: store it locally?
|
|
2015
|
+
const pw = prompt("gib password");
|
|
2016
|
+
return pw ? pw : "";
|
|
2017
|
+
}
|
|
2018
|
+
async getWalletToken(walletId, password) {
|
|
2019
|
+
const handleResp = await this.#client.initWalletHandle(walletId, password);
|
|
2020
|
+
return handleResp.wallet_handle_token;
|
|
2021
|
+
}
|
|
2022
|
+
async releaseToken(token) {
|
|
2023
|
+
await this.#client.releaseWalletHandle(token);
|
|
2024
|
+
}
|
|
2025
|
+
async listWallets() {
|
|
2026
|
+
const walletResponse = await this.#client.listWallets();
|
|
2027
|
+
const walletList = walletResponse["wallets"];
|
|
2028
|
+
const walletMap = {};
|
|
2029
|
+
for (const w of walletList) {
|
|
2030
|
+
walletMap[w.name] = w.id;
|
|
1719
2031
|
}
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
2032
|
+
return walletMap;
|
|
2033
|
+
}
|
|
2034
|
+
async listAccounts(wallet, password) {
|
|
2035
|
+
const walletMap = await this.listWallets();
|
|
2036
|
+
if (!(wallet in walletMap))
|
|
2037
|
+
throw Error("No wallet named: " + wallet);
|
|
2038
|
+
this.walletId = walletMap[wallet];
|
|
2039
|
+
// Get a handle token
|
|
2040
|
+
const token = await this.getWalletToken(this.walletId, password);
|
|
2041
|
+
// Fetch accounts and format them as lib expects
|
|
2042
|
+
const listResponse = await this.#client.listKeys(token);
|
|
2043
|
+
const addresses = listResponse["addresses"];
|
|
2044
|
+
const mappedAccounts = addresses.map((address, index) => {
|
|
2045
|
+
return {
|
|
2046
|
+
name: `KMDWallet ${index + 1}`,
|
|
2047
|
+
address,
|
|
2048
|
+
providerId: KMDWalletClient.metadata.id,
|
|
2049
|
+
};
|
|
2050
|
+
});
|
|
2051
|
+
// Release handle token
|
|
2052
|
+
this.releaseToken(token);
|
|
2053
|
+
return mappedAccounts;
|
|
2054
|
+
}
|
|
2055
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
2056
|
+
// Decode the transactions to access their properties.
|
|
2057
|
+
const decodedTxns = transactions.map((txn) => {
|
|
2058
|
+
return this.algosdk.decodeObj(txn);
|
|
2059
|
+
});
|
|
2060
|
+
// Get a handle token
|
|
2061
|
+
const pw = await this.requestPassword();
|
|
2062
|
+
const token = await this.getWalletToken(this.walletId, pw);
|
|
2063
|
+
const signedTxns = [];
|
|
2064
|
+
// Sign them with the client.
|
|
2065
|
+
const signingPromises = [];
|
|
2066
|
+
for (const idx in decodedTxns) {
|
|
2067
|
+
const dtxn = decodedTxns[idx];
|
|
2068
|
+
// push the incoming txn into signed, we'll overwrite it later
|
|
2069
|
+
signedTxns.push(transactions[idx]);
|
|
2070
|
+
// Its already signed, skip it
|
|
2071
|
+
if (!("snd" in dtxn))
|
|
2072
|
+
continue;
|
|
2073
|
+
// Not to be signed by our signer, skip it
|
|
2074
|
+
if (!connectedAccounts.includes(this.algosdk.encodeAddress(dtxn.snd)))
|
|
2075
|
+
continue;
|
|
2076
|
+
// overwrite with an empty blob
|
|
2077
|
+
signedTxns[idx] = new Uint8Array();
|
|
2078
|
+
const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
|
|
2079
|
+
signingPromises.push(this.#client.signTransaction(token, pw, txn));
|
|
1725
2080
|
}
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
2081
|
+
const signingResults = await Promise.all(signingPromises);
|
|
2082
|
+
// Restore the newly signed txns in the correct order
|
|
2083
|
+
let signedIdx = 0;
|
|
2084
|
+
for (const idx in signedTxns) {
|
|
2085
|
+
// If its an empty array, infer that it is one of the
|
|
2086
|
+
// ones we wanted to have signed and overwrite the empty buff
|
|
2087
|
+
if (signedTxns[idx].length === 0) {
|
|
2088
|
+
signedTxns[idx] = signingResults[signedIdx];
|
|
2089
|
+
signedIdx += 1;
|
|
2090
|
+
}
|
|
1731
2091
|
}
|
|
1732
|
-
|
|
1733
|
-
};
|
|
1734
|
-
|
|
1735
|
-
const getWalletClient = async (id) => {
|
|
1736
|
-
if (!id) {
|
|
1737
|
-
throw new Error("No wallet provider id provided");
|
|
2092
|
+
return signedTxns;
|
|
1738
2093
|
}
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
throw new Error(`No wallet client found for provider id: ${id}`);
|
|
2094
|
+
signEncodedTransactions(transactions) {
|
|
2095
|
+
throw new Error("Method not implemented.");
|
|
1742
2096
|
}
|
|
1743
|
-
return client;
|
|
1744
|
-
};
|
|
1745
|
-
|
|
1746
|
-
function useWallet() {
|
|
1747
|
-
const allAccounts = useWalletStore((state) => state.accounts);
|
|
1748
|
-
const activeAccount = useWalletStore((state) => state.activeAccount);
|
|
1749
|
-
const accounts = useMemo(() => allAccounts.filter((account) => account.providerId === activeAccount?.providerId), [allAccounts, activeAccount]);
|
|
1750
|
-
const signTransactions = async (transactions) => {
|
|
1751
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
1752
|
-
if (!walletClient || !activeAccount?.address) {
|
|
1753
|
-
throw new Error("No wallet found.");
|
|
1754
|
-
}
|
|
1755
|
-
const signedTransactions = await walletClient.signTransactions(activeAccount.address, transactions);
|
|
1756
|
-
return signedTransactions;
|
|
1757
|
-
};
|
|
1758
|
-
const sendTransactions = async (transactions) => {
|
|
1759
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
1760
|
-
const result = await walletClient?.sendRawTransactions(transactions);
|
|
1761
|
-
return result;
|
|
1762
|
-
};
|
|
1763
|
-
const signer = async (txnGroup, indexesToSign) => {
|
|
1764
|
-
const algosdk = await getAlgosdk();
|
|
1765
|
-
const txnBlobs = txnGroup.map(algosdk.encodeUnsignedTransaction);
|
|
1766
|
-
const txns = await Promise.resolve(signTransactions(txnBlobs));
|
|
1767
|
-
return txns.filter((_, index) => indexesToSign.includes(index));
|
|
1768
|
-
};
|
|
1769
|
-
const getAccountInfo = async () => {
|
|
1770
|
-
if (!activeAccount)
|
|
1771
|
-
throw new Error("No selected account.");
|
|
1772
|
-
const walletClient = await getWalletClient(activeAccount.providerId);
|
|
1773
|
-
const accountInfo = await walletClient?.getAccountInfo(activeAccount.address);
|
|
1774
|
-
return accountInfo;
|
|
1775
|
-
};
|
|
1776
|
-
const getAddress = () => {
|
|
1777
|
-
return activeAccount?.address;
|
|
1778
|
-
};
|
|
1779
|
-
const getAssets = async () => {
|
|
1780
|
-
if (!activeAccount)
|
|
1781
|
-
throw new Error("No selected account.");
|
|
1782
|
-
const walletClient = await getWalletClient(activeAccount.providerId);
|
|
1783
|
-
return await walletClient?.getAssets(activeAccount.address);
|
|
1784
|
-
};
|
|
1785
|
-
const groupTransactionsBySender = async (transactions) => {
|
|
1786
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
1787
|
-
return walletClient?.groupTransactionsBySender(transactions);
|
|
1788
|
-
};
|
|
1789
|
-
const signEncodedTransactions = async (transactions) => {
|
|
1790
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
1791
|
-
return await walletClient?.signEncodedTransactions(transactions);
|
|
1792
|
-
};
|
|
1793
|
-
const sendRawTransactions = async (transactions) => {
|
|
1794
|
-
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
1795
|
-
return await walletClient?.sendRawTransactions(transactions);
|
|
1796
|
-
};
|
|
1797
|
-
return {
|
|
1798
|
-
accounts,
|
|
1799
|
-
activeAccount,
|
|
1800
|
-
signer,
|
|
1801
|
-
signTransactions,
|
|
1802
|
-
sendTransactions,
|
|
1803
|
-
getAddress,
|
|
1804
|
-
groupTransactionsBySender,
|
|
1805
|
-
getAccountInfo,
|
|
1806
|
-
getAssets,
|
|
1807
|
-
signEncodedTransactions,
|
|
1808
|
-
sendRawTransactions,
|
|
1809
|
-
};
|
|
1810
2097
|
}
|
|
1811
2098
|
|
|
2099
|
+
var allClients = {
|
|
2100
|
+
[PeraWalletClient.metadata.id]: PeraWalletClient,
|
|
2101
|
+
[MyAlgoWalletClient.metadata.id]: MyAlgoWalletClient,
|
|
2102
|
+
[DeflyWalletClient.metadata.id]: DeflyWalletClient,
|
|
2103
|
+
[ExodusClient.metadata.id]: ExodusClient,
|
|
2104
|
+
[AlgoSignerClient.metadata.id]: AlgoSignerClient,
|
|
2105
|
+
[WalletConnectClient.metadata.id]: WalletConnectClient,
|
|
2106
|
+
[KMDWalletClient.metadata.id]: KMDWalletClient,
|
|
2107
|
+
};
|
|
2108
|
+
|
|
1812
2109
|
function shallow(objA, objB) {
|
|
1813
2110
|
if (Object.is(objA, objB)) {
|
|
1814
2111
|
return true;
|
|
@@ -1828,81 +2125,76 @@ function shallow(objA, objB) {
|
|
|
1828
2125
|
return true;
|
|
1829
2126
|
}
|
|
1830
2127
|
|
|
1831
|
-
function
|
|
1832
|
-
const
|
|
1833
|
-
const
|
|
1834
|
-
.filter(({ id }) => options?.providers
|
|
1835
|
-
? options.providers.includes(id)
|
|
1836
|
-
: id !== PROVIDER_ID.KMD_WALLET)
|
|
1837
|
-
.map(({ id, name, icon, isWalletConnect }) => {
|
|
1838
|
-
return {
|
|
1839
|
-
id,
|
|
1840
|
-
name,
|
|
1841
|
-
icon,
|
|
1842
|
-
accounts: accounts.filter((account) => account.providerId === id),
|
|
1843
|
-
activeAccount: activeAccount?.providerId === id ? activeAccount : null,
|
|
1844
|
-
isActive: activeAccount?.providerId === id,
|
|
1845
|
-
isConnected: accounts.some((accounts) => accounts.providerId === id),
|
|
1846
|
-
isWalletConnect,
|
|
1847
|
-
connect: () => connect(id),
|
|
1848
|
-
disconnect: () => disconnect(id),
|
|
1849
|
-
reconnect: () => reconnect(id),
|
|
1850
|
-
setActive: () => setActive(id),
|
|
1851
|
-
selectAccount: (account) => selectActiveAccount(id, account),
|
|
1852
|
-
};
|
|
1853
|
-
}), [accounts, activeAccount]);
|
|
2128
|
+
function useWallet() {
|
|
2129
|
+
const clients = useContext(ClientContext);
|
|
2130
|
+
const { activeAccount, accounts: connectedAccounts, setActiveAccount: _setActiveAccount, clearActiveAccount, addAccounts, removeAccounts, } = useWalletStore(walletStoreSelector, shallow);
|
|
1854
2131
|
const getAccountsByProvider = (id) => {
|
|
1855
|
-
return
|
|
2132
|
+
return connectedAccounts.filter((account) => account.providerId === id);
|
|
1856
2133
|
};
|
|
1857
|
-
const
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
2134
|
+
const connectedActiveAccounts = useMemo(() => connectedAccounts.filter((account) => account.providerId === activeAccount?.providerId), [connectedAccounts, activeAccount]);
|
|
2135
|
+
const providers = useMemo(() => {
|
|
2136
|
+
if (!clients)
|
|
2137
|
+
return null;
|
|
2138
|
+
const supportedClients = Object.keys(clients);
|
|
2139
|
+
return supportedClients.map((id) => {
|
|
2140
|
+
return {
|
|
2141
|
+
...allClients[id],
|
|
2142
|
+
accounts: getAccountsByProvider(id),
|
|
2143
|
+
isActive: activeAccount?.providerId === id,
|
|
2144
|
+
isConnected: connectedAccounts.some((accounts) => accounts.providerId === id),
|
|
2145
|
+
connect: () => connect(id),
|
|
2146
|
+
disconnect: () => disconnect(id),
|
|
2147
|
+
reconnect: () => reconnect(id),
|
|
2148
|
+
setActiveProvider: () => setActive(id),
|
|
2149
|
+
setActiveAccount: (account) => selectActiveAccount(id, account),
|
|
2150
|
+
};
|
|
1862
2151
|
});
|
|
2152
|
+
}, [clients, connectedAccounts, connectedActiveAccounts, activeAccount]);
|
|
2153
|
+
const getClient = async (id) => {
|
|
2154
|
+
if (!id)
|
|
2155
|
+
throw new Error("Provier ID is missing.");
|
|
2156
|
+
const client = await clients?.[id];
|
|
2157
|
+
if (!client)
|
|
2158
|
+
throw new Error("Client not found for ID");
|
|
2159
|
+
return client;
|
|
1863
2160
|
};
|
|
1864
2161
|
const disconnectWCSessions = async (id) => {
|
|
1865
|
-
if (!
|
|
2162
|
+
if (!allClients[id].metadata.isWalletConnect) {
|
|
1866
2163
|
return;
|
|
1867
2164
|
}
|
|
1868
|
-
|
|
2165
|
+
if (!providers) {
|
|
2166
|
+
return;
|
|
2167
|
+
}
|
|
2168
|
+
const wcSessions = Object.values(providers).filter((p) => p.metadata.id !== id &&
|
|
2169
|
+
p.metadata.isWalletConnect &&
|
|
2170
|
+
(p.isConnected || p.isActive));
|
|
1869
2171
|
for (const session of wcSessions) {
|
|
1870
|
-
await disconnect(session.id);
|
|
2172
|
+
await disconnect(session.metadata.id);
|
|
1871
2173
|
}
|
|
1872
2174
|
};
|
|
1873
|
-
const
|
|
2175
|
+
const selectActiveAccount = async (providerId, address) => {
|
|
1874
2176
|
try {
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
if (!walletInfo || !walletInfo.accounts.length) {
|
|
1879
|
-
throw new Error("Failed to connect " + id);
|
|
2177
|
+
const account = connectedActiveAccounts.find((acct) => acct.address === address && acct.providerId === providerId);
|
|
2178
|
+
if (!account) {
|
|
2179
|
+
throw new Error(`No accounts with address ${address} found.`);
|
|
1880
2180
|
}
|
|
1881
|
-
|
|
1882
|
-
|
|
2181
|
+
await disconnectWCSessions(account.providerId);
|
|
2182
|
+
_setActiveAccount(account);
|
|
1883
2183
|
}
|
|
1884
2184
|
catch (e) {
|
|
1885
2185
|
console.error(e);
|
|
1886
2186
|
}
|
|
1887
2187
|
};
|
|
1888
|
-
const
|
|
2188
|
+
const connect = async (id) => {
|
|
1889
2189
|
try {
|
|
1890
2190
|
await disconnectWCSessions(id);
|
|
1891
|
-
const
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
console.error(e);
|
|
1896
|
-
}
|
|
1897
|
-
};
|
|
1898
|
-
const selectActiveAccount = async (providerId, address) => {
|
|
1899
|
-
try {
|
|
1900
|
-
const account = accounts.find((acct) => acct.address === address && acct.providerId === providerId);
|
|
1901
|
-
if (!account) {
|
|
1902
|
-
throw new Error(`No accounts with address ${address} found.`);
|
|
2191
|
+
const walletClient = await getClient(id);
|
|
2192
|
+
const walletInfo = await walletClient?.connect(() => disconnect(id));
|
|
2193
|
+
if (!walletInfo || !walletInfo.accounts.length) {
|
|
2194
|
+
throw new Error("Failed to connect " + id);
|
|
1903
2195
|
}
|
|
1904
|
-
|
|
1905
|
-
|
|
2196
|
+
_setActiveAccount(walletInfo.accounts[0]);
|
|
2197
|
+
addAccounts(walletInfo.accounts);
|
|
1906
2198
|
}
|
|
1907
2199
|
catch (e) {
|
|
1908
2200
|
console.error(e);
|
|
@@ -1910,7 +2202,7 @@ function useConnectWallet(options) {
|
|
|
1910
2202
|
};
|
|
1911
2203
|
const reconnect = async (id) => {
|
|
1912
2204
|
try {
|
|
1913
|
-
const walletClient = await
|
|
2205
|
+
const walletClient = await getClient(id);
|
|
1914
2206
|
const walletInfo = await walletClient?.reconnect(() => disconnect(id));
|
|
1915
2207
|
if (walletInfo && walletInfo.accounts.length) {
|
|
1916
2208
|
addAccounts(walletInfo.accounts);
|
|
@@ -1923,7 +2215,7 @@ function useConnectWallet(options) {
|
|
|
1923
2215
|
};
|
|
1924
2216
|
const disconnect = async (id) => {
|
|
1925
2217
|
try {
|
|
1926
|
-
const walletClient = await
|
|
2218
|
+
const walletClient = await getClient(id);
|
|
1927
2219
|
walletClient?.disconnect();
|
|
1928
2220
|
}
|
|
1929
2221
|
catch (e) {
|
|
@@ -1934,17 +2226,119 @@ function useConnectWallet(options) {
|
|
|
1934
2226
|
removeAccounts(id);
|
|
1935
2227
|
}
|
|
1936
2228
|
};
|
|
2229
|
+
const setActive = async (id) => {
|
|
2230
|
+
try {
|
|
2231
|
+
await disconnectWCSessions(id);
|
|
2232
|
+
const accounts = getAccountsByProvider(id);
|
|
2233
|
+
_setActiveAccount(accounts[0]);
|
|
2234
|
+
}
|
|
2235
|
+
catch (e) {
|
|
2236
|
+
console.error(e);
|
|
2237
|
+
}
|
|
2238
|
+
};
|
|
2239
|
+
const signTransactions = async (transactions) => {
|
|
2240
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2241
|
+
if (!walletClient || !activeAccount?.address) {
|
|
2242
|
+
throw new Error("No wallet found.");
|
|
2243
|
+
}
|
|
2244
|
+
const signedTransactions = await walletClient.signTransactions(connectedActiveAccounts.map((acct) => acct.address), transactions);
|
|
2245
|
+
return signedTransactions;
|
|
2246
|
+
};
|
|
2247
|
+
const sendTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2248
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2249
|
+
const result = await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
2250
|
+
return result;
|
|
2251
|
+
};
|
|
2252
|
+
const signer = async (txnGroup, indexesToSign) => {
|
|
2253
|
+
const algosdk = await getAlgosdk();
|
|
2254
|
+
const txnBlobs = txnGroup.map(algosdk.encodeUnsignedTransaction);
|
|
2255
|
+
const txns = await Promise.resolve(signTransactions(txnBlobs));
|
|
2256
|
+
return txns.filter((_, index) => indexesToSign.includes(index));
|
|
2257
|
+
};
|
|
2258
|
+
const getAccountInfo = async () => {
|
|
2259
|
+
if (!activeAccount)
|
|
2260
|
+
throw new Error("No selected account.");
|
|
2261
|
+
const walletClient = await getClient(activeAccount.providerId);
|
|
2262
|
+
const accountInfo = await walletClient?.getAccountInfo(activeAccount.address);
|
|
2263
|
+
return accountInfo;
|
|
2264
|
+
};
|
|
2265
|
+
const getAddress = () => {
|
|
2266
|
+
return activeAccount?.address;
|
|
2267
|
+
};
|
|
2268
|
+
const getAssets = async () => {
|
|
2269
|
+
if (!activeAccount)
|
|
2270
|
+
throw new Error("No selected account.");
|
|
2271
|
+
const walletClient = await getClient(activeAccount.providerId);
|
|
2272
|
+
return await walletClient?.getAssets(activeAccount.address);
|
|
2273
|
+
};
|
|
2274
|
+
const groupTransactionsBySender = async (transactions) => {
|
|
2275
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2276
|
+
return walletClient?.groupTransactionsBySender(transactions);
|
|
2277
|
+
};
|
|
2278
|
+
const signEncodedTransactions = async (transactions) => {
|
|
2279
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2280
|
+
return await walletClient?.signEncodedTransactions(transactions);
|
|
2281
|
+
};
|
|
2282
|
+
const sendRawTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2283
|
+
const walletClient = await getClient(activeAccount?.providerId);
|
|
2284
|
+
return await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
2285
|
+
};
|
|
1937
2286
|
return {
|
|
1938
|
-
|
|
2287
|
+
clients,
|
|
2288
|
+
providers,
|
|
2289
|
+
connectedAccounts,
|
|
2290
|
+
connectedActiveAccounts,
|
|
1939
2291
|
activeAccount,
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
2292
|
+
activeAddress: activeAccount?.address,
|
|
2293
|
+
signer,
|
|
2294
|
+
signTransactions,
|
|
2295
|
+
sendTransactions,
|
|
2296
|
+
getAddress,
|
|
2297
|
+
groupTransactionsBySender,
|
|
2298
|
+
getAccountInfo,
|
|
2299
|
+
getAssets,
|
|
2300
|
+
signEncodedTransactions,
|
|
2301
|
+
sendRawTransactions,
|
|
1947
2302
|
};
|
|
1948
2303
|
}
|
|
1949
2304
|
|
|
1950
|
-
|
|
2305
|
+
const initializeProviders = (providers, nodeConfig, algosdkStatic) => {
|
|
2306
|
+
const initializedProviders = {};
|
|
2307
|
+
const { network = DEFAULT_NETWORK$1, nodeServer = DEFAULT_NODE_BASEURL, nodePort = DEFAULT_NODE_PORT, nodeToken = DEFAULT_NODE_TOKEN, } = nodeConfig || {};
|
|
2308
|
+
if (!providers || providers.length === 0)
|
|
2309
|
+
for (const [id, client] of Object.entries(allClients)) {
|
|
2310
|
+
if (id === "kmd") {
|
|
2311
|
+
continue;
|
|
2312
|
+
}
|
|
2313
|
+
initializedProviders[id] = client.init({
|
|
2314
|
+
network,
|
|
2315
|
+
algodOptions: [nodeToken, nodeServer, nodePort],
|
|
2316
|
+
algosdkStatic: algosdkStatic,
|
|
2317
|
+
});
|
|
2318
|
+
}
|
|
2319
|
+
if (providers) {
|
|
2320
|
+
for (const id of providers) {
|
|
2321
|
+
initializedProviders[id] = allClients[id].init({
|
|
2322
|
+
network,
|
|
2323
|
+
algodOptions: [nodeToken, nodeServer, nodePort],
|
|
2324
|
+
algosdkStatic: algosdkStatic,
|
|
2325
|
+
});
|
|
2326
|
+
}
|
|
2327
|
+
}
|
|
2328
|
+
return initializedProviders;
|
|
2329
|
+
};
|
|
2330
|
+
|
|
2331
|
+
const reconnectProviders = async (providers) => {
|
|
2332
|
+
try {
|
|
2333
|
+
const clients = Object.values(providers);
|
|
2334
|
+
for (const client of clients) {
|
|
2335
|
+
const c = await client;
|
|
2336
|
+
c?.reconnect(c?.disconnect);
|
|
2337
|
+
}
|
|
2338
|
+
}
|
|
2339
|
+
catch (e) {
|
|
2340
|
+
console.error(e);
|
|
2341
|
+
}
|
|
2342
|
+
};
|
|
2343
|
+
|
|
2344
|
+
export { DEFAULT_NETWORK$1 as DEFAULT_NETWORK, DEFAULT_NODE_BASEURL, DEFAULT_NODE_PORT, DEFAULT_NODE_TOKEN, PROVIDER_ID, clientStore as WalletProvider, AlgoSignerClient as algosigner, DeflyWalletClient as defly, ExodusClient as exodus, initializeProviders, KMDWalletClient as kmd, MyAlgoWalletClient as myalgo, PeraWalletClient as pera, reconnectProviders, useWallet, WalletConnectClient as walletconnect };
|