@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.
Files changed (130) hide show
  1. package/README.md +252 -94
  2. package/dist/cjs/algod/index.d.ts +3 -2
  3. package/dist/cjs/clients/algosigner/client.d.ts +35 -0
  4. package/dist/cjs/clients/algosigner/constants.d.ts +2 -0
  5. package/dist/cjs/clients/algosigner/index.d.ts +2 -0
  6. package/dist/cjs/clients/algosigner/types.d.ts +40 -0
  7. package/dist/cjs/clients/base/base.d.ts +50 -0
  8. package/dist/cjs/clients/base/index.d.ts +2 -0
  9. package/dist/cjs/clients/defly/client.d.ts +37 -0
  10. package/dist/cjs/clients/defly/constants.d.ts +1 -0
  11. package/dist/cjs/clients/defly/index.d.ts +2 -0
  12. package/dist/cjs/clients/defly/types.d.ts +36 -0
  13. package/dist/cjs/clients/exodus/client.d.ts +33 -0
  14. package/dist/cjs/clients/exodus/constants.d.ts +1 -0
  15. package/dist/cjs/clients/exodus/index.d.ts +2 -0
  16. package/dist/cjs/clients/exodus/types.d.ts +40 -0
  17. package/dist/cjs/clients/index.d.ts +11 -15
  18. package/dist/cjs/clients/kmd/client.d.ts +29 -0
  19. package/dist/cjs/clients/kmd/constants.d.ts +1 -0
  20. package/dist/cjs/clients/kmd/index.d.ts +2 -0
  21. package/dist/cjs/clients/kmd/types.d.ts +38 -0
  22. package/dist/cjs/clients/myalgo/client.d.ts +37 -0
  23. package/dist/cjs/clients/myalgo/constants.d.ts +1 -0
  24. package/dist/cjs/clients/myalgo/index.d.ts +2 -0
  25. package/dist/cjs/clients/myalgo/types.d.ts +23 -0
  26. package/dist/cjs/clients/pera/client.d.ts +35 -0
  27. package/dist/cjs/clients/pera/constants.d.ts +1 -0
  28. package/dist/cjs/clients/pera/index.d.ts +2 -0
  29. package/dist/cjs/clients/pera/types.d.ts +36 -0
  30. package/dist/cjs/clients/walletconnect/client.d.ts +37 -0
  31. package/dist/cjs/clients/walletconnect/constants.d.ts +2 -0
  32. package/dist/cjs/clients/walletconnect/index.d.ts +2 -0
  33. package/dist/cjs/clients/walletconnect/types.d.ts +54 -0
  34. package/dist/cjs/constants/constants.d.ts +12 -16
  35. package/dist/cjs/hooks/index.d.ts +0 -1
  36. package/dist/cjs/hooks/useWallet.d.ts +140 -8
  37. package/dist/cjs/index.d.ts +4 -2
  38. package/dist/cjs/index.js +1428 -1031
  39. package/dist/cjs/index.js.map +1 -1
  40. package/dist/cjs/store/index.d.ts +1 -0
  41. package/dist/cjs/store/state/clientStore.d.ts +22 -0
  42. package/dist/cjs/store/state/walletStore.d.ts +17 -1
  43. package/dist/cjs/types/node.d.ts +3 -0
  44. package/dist/cjs/types/wallet.d.ts +2 -2
  45. package/dist/cjs/utils/index.d.ts +2 -2
  46. package/dist/cjs/utils/initializeProviders.d.ts +13 -0
  47. package/dist/cjs/utils/reconnectProviders.d.ts +6 -0
  48. package/dist/esm/algod/index.d.ts +3 -2
  49. package/dist/esm/clients/algosigner/client.d.ts +35 -0
  50. package/dist/esm/clients/algosigner/constants.d.ts +2 -0
  51. package/dist/esm/clients/algosigner/index.d.ts +2 -0
  52. package/dist/esm/clients/algosigner/types.d.ts +40 -0
  53. package/dist/esm/clients/base/base.d.ts +50 -0
  54. package/dist/esm/clients/base/index.d.ts +2 -0
  55. package/dist/esm/clients/defly/client.d.ts +37 -0
  56. package/dist/esm/clients/defly/constants.d.ts +1 -0
  57. package/dist/esm/clients/defly/index.d.ts +2 -0
  58. package/dist/esm/clients/defly/types.d.ts +36 -0
  59. package/dist/esm/clients/exodus/client.d.ts +33 -0
  60. package/dist/esm/clients/exodus/constants.d.ts +1 -0
  61. package/dist/esm/clients/exodus/index.d.ts +2 -0
  62. package/dist/esm/clients/exodus/types.d.ts +40 -0
  63. package/dist/esm/clients/index.d.ts +11 -15
  64. package/dist/esm/clients/kmd/client.d.ts +29 -0
  65. package/dist/esm/clients/kmd/constants.d.ts +1 -0
  66. package/dist/esm/clients/kmd/index.d.ts +2 -0
  67. package/dist/esm/clients/kmd/types.d.ts +38 -0
  68. package/dist/esm/clients/myalgo/client.d.ts +37 -0
  69. package/dist/esm/clients/myalgo/constants.d.ts +1 -0
  70. package/dist/esm/clients/myalgo/index.d.ts +2 -0
  71. package/dist/esm/clients/myalgo/types.d.ts +23 -0
  72. package/dist/esm/clients/pera/client.d.ts +35 -0
  73. package/dist/esm/clients/pera/constants.d.ts +1 -0
  74. package/dist/esm/clients/pera/index.d.ts +2 -0
  75. package/dist/esm/clients/pera/types.d.ts +36 -0
  76. package/dist/esm/clients/walletconnect/client.d.ts +37 -0
  77. package/dist/esm/clients/walletconnect/constants.d.ts +2 -0
  78. package/dist/esm/clients/walletconnect/index.d.ts +2 -0
  79. package/dist/esm/clients/walletconnect/types.d.ts +54 -0
  80. package/dist/esm/constants/constants.d.ts +12 -16
  81. package/dist/esm/hooks/index.d.ts +0 -1
  82. package/dist/esm/hooks/useWallet.d.ts +140 -8
  83. package/dist/esm/index.d.ts +4 -2
  84. package/dist/esm/index.js +1415 -1021
  85. package/dist/esm/store/index.d.ts +1 -0
  86. package/dist/esm/store/state/clientStore.d.ts +22 -0
  87. package/dist/esm/store/state/walletStore.d.ts +17 -1
  88. package/dist/esm/types/node.d.ts +3 -0
  89. package/dist/esm/types/wallet.d.ts +2 -2
  90. package/dist/esm/utils/index.d.ts +2 -2
  91. package/dist/esm/utils/initializeProviders.d.ts +13 -0
  92. package/dist/esm/utils/reconnectProviders.d.ts +6 -0
  93. package/dist/index.d.ts +669 -66
  94. package/package.json +5 -5
  95. package/dist/cjs/clients/algosigner.d.ts +0 -62
  96. package/dist/cjs/clients/base.d.ts +0 -63
  97. package/dist/cjs/clients/defly.d.ts +0 -51
  98. package/dist/cjs/clients/exodus.d.ts +0 -52
  99. package/dist/cjs/clients/kmd.d.ts +0 -31
  100. package/dist/cjs/clients/myalgowallet.d.ts +0 -40
  101. package/dist/cjs/clients/perawallet.d.ts +0 -47
  102. package/dist/cjs/clients/walletconnect.d.ts +0 -47
  103. package/dist/cjs/hooks/useConnectWallet.d.ts +0 -30
  104. package/dist/cjs/providers/algosigner.d.ts +0 -2
  105. package/dist/cjs/providers/defly.d.ts +0 -2
  106. package/dist/cjs/providers/exodus.d.ts +0 -2
  107. package/dist/cjs/providers/index.d.ts +0 -9
  108. package/dist/cjs/providers/kmd.d.ts +0 -2
  109. package/dist/cjs/providers/myalgowallet.d.ts +0 -2
  110. package/dist/cjs/providers/perawallet.d.ts +0 -2
  111. package/dist/cjs/providers/walletconnect.d.ts +0 -2
  112. package/dist/cjs/store/middelware/immer.d.ts +0 -10
  113. package/dist/esm/clients/algosigner.d.ts +0 -62
  114. package/dist/esm/clients/base.d.ts +0 -63
  115. package/dist/esm/clients/defly.d.ts +0 -51
  116. package/dist/esm/clients/exodus.d.ts +0 -52
  117. package/dist/esm/clients/kmd.d.ts +0 -31
  118. package/dist/esm/clients/myalgowallet.d.ts +0 -40
  119. package/dist/esm/clients/perawallet.d.ts +0 -47
  120. package/dist/esm/clients/walletconnect.d.ts +0 -47
  121. package/dist/esm/hooks/useConnectWallet.d.ts +0 -30
  122. package/dist/esm/providers/algosigner.d.ts +0 -2
  123. package/dist/esm/providers/defly.d.ts +0 -2
  124. package/dist/esm/providers/exodus.d.ts +0 -2
  125. package/dist/esm/providers/index.d.ts +0 -9
  126. package/dist/esm/providers/kmd.d.ts +0 -2
  127. package/dist/esm/providers/myalgowallet.d.ts +0 -2
  128. package/dist/esm/providers/perawallet.d.ts +0 -2
  129. package/dist/esm/providers/walletconnect.d.ts +0 -2
  130. package/dist/esm/store/middelware/immer.d.ts +0 -10
package/dist/esm/index.js CHANGED
@@ -1,62 +1,27 @@
1
- import { useReducer, useRef, useDebugValue, useEffect, useLayoutEffect, useMemo } from 'react';
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["KMD_WALLET"] = "KMD Wallet";
7
- PROVIDER_ID["PERA_WALLET"] = "Pera Wallet";
8
- PROVIDER_ID["MYALGO_WALLET"] = "MyAlgo Wallet";
9
- PROVIDER_ID["ALGO_SIGNER"] = "Algo Signer";
10
- PROVIDER_ID["DEFLY"] = "Defly";
11
- PROVIDER_ID["EXODUS"] = "Exodus";
12
- PROVIDER_ID["WALLET_CONNECT"] = "Wallet Connect";
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 NODE_SERVER = process.env.NODE_SERVER ||
15
- process.env.REACT_APP_NODE_SERVER ||
16
- process.env.NEXT_PUBLIC_NODE_SERVER ||
17
- /** @todo deprecate this env var */
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
- return new algosdk.Algodv2(NODE_TOKEN, NODE_SERVER, NODE_PORT);
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
- * The immer middleware turns the `set` method into a proxy for the immer `produce` method.
79
- * https://immerjs.github.io/immer/
80
- *
81
- * The TypeScript magic is taken from here:
82
- * https://github.com/pmndrs/zustand/blob/main/tests/middlewareTypes.test.tsx
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
- function createStore(createState) {
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 !== state) {
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 subscribeWithSelector = (listener, selector = getState, equalityFn = Object.is) => {
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
- const isSSR = typeof window === "undefined" || !window.navigator || /ServerSideRendering|^Deno\//.test(window.navigator.userAgent);
134
- const useIsomorphicLayoutEffect = isSSR ? useEffect : useLayoutEffect;
135
- function create(createState) {
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 useStore = (selector = api.getState, equalityFn = Object.is) => {
138
- const [, forceUpdate] = useReducer((c) => c + 1, 0);
139
- const state = api.getState();
140
- const stateRef = useRef(state);
141
- const selectorRef = useRef(selector);
142
- const equalityFnRef = useRef(equalityFn);
143
- const erroredRef = useRef(false);
144
- const currentSliceRef = useRef();
145
- if (currentSliceRef.current === void 0) {
146
- currentSliceRef.current = selector(state);
147
- }
148
- let newStateSlice;
149
- let hasNewStateSlice = false;
150
- if (stateRef.current !== state || selectorRef.current !== selector || equalityFnRef.current !== equalityFn || erroredRef.current) {
151
- newStateSlice = selector(state);
152
- hasNewStateSlice = !equalityFn(currentSliceRef.current, newStateSlice);
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
- useIsomorphicLayoutEffect(() => {
155
- if (hasNewStateSlice) {
156
- currentSliceRef.current = newStateSlice;
157
- }
158
- stateRef.current = state;
159
- selectorRef.current = selector;
160
- equalityFnRef.current = equalityFn;
161
- erroredRef.current = false;
162
- });
163
- const stateBeforeSubscriptionRef = useRef(state);
164
- useIsomorphicLayoutEffect(() => {
165
- const listener = () => {
166
- try {
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
- Object.assign(useStore, api);
190
- useStore[Symbol.iterator] = function() {
191
- console.warn("[useStore, api] = create() is deprecated and will be removed in v4");
192
- const items = [useStore, api];
193
- return {
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
- return useStore;
201
- }
202
-
203
- function devtools(fn, options) {
204
- return (set, get, api) => {
205
- var _a;
206
- let didWarnAboutNameDeprecation = false;
207
- if (typeof options === "string" && !didWarnAboutNameDeprecation) {
208
- console.warn("[zustand devtools middleware]: passing `name` as directly will be not allowed in next majorpass the `name` in an object `{ name: ... }` instead");
209
- didWarnAboutNameDeprecation = true;
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
- const initialState = fn(api.setState, get, api);
274
- extension.init(initialState);
275
- if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
276
- let didWarnAboutReservedActionType = false;
277
- const originalDispatch = api.dispatch;
278
- api.dispatch = (...a) => {
279
- if (a[0].type === "__setState" && !didWarnAboutReservedActionType) {
280
- console.warn('[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.');
281
- didWarnAboutReservedActionType = true;
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
- originalDispatch(...a);
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
- case "DISPATCH":
306
- switch (message.payload.type) {
307
- case "RESET":
308
- setStateFromDevtools(initialState);
309
- return extension.init(api.getState());
310
- case "COMMIT":
311
- return extension.init(api.getState());
312
- case "ROLLBACK":
313
- return parseJsonThen(message.state, (state) => {
314
- setStateFromDevtools(state);
315
- extension.init(api.getState());
316
- });
317
- case "JUMP_TO_STATE":
318
- case "JUMP_TO_ACTION":
319
- return parseJsonThen(message.state, (state) => {
320
- setStateFromDevtools(state);
321
- });
322
- case "IMPORT_STATE": {
323
- const { nextLiftedState } = message.payload;
324
- const lastComputedState = (_a2 = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a2.state;
325
- if (!lastComputedState)
326
- return;
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
- case "PAUSE_RECORDING":
332
- return isRecording = !isRecording;
686
+ setStateFromDevtools(lastComputedState);
687
+ extension.send(
688
+ null,
689
+ nextLiftedState
690
+ );
691
+ return;
333
692
  }
334
- return;
335
- }
336
- });
337
- return initialState;
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("[zustand devtools middleware] Could not parse the received json", e);
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 persist = (config, baseOptions) => (set, get, api) => {
393
- let options = __spreadValues({
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) => __spreadValues(__spreadValues({}, currentState), persistedState)
400
- }, baseOptions);
401
- if (options.blacklist || options.whitelist) {
402
- console.warn(`The ${options.blacklist ? "blacklist" : "whitelist"} option is deprecated and will be removed in the next version. Please use the 'partialize' option instead.`);
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((...args) => {
414
- console.warn(`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`);
415
- set(...args);
416
- }, get, api);
417
- } else if (!storage.removeItem) {
418
- console.warn(`[zustand persist middleware] The given storage for item '${options.name}' does not contain a 'removeItem' method, which will be required in v4.`);
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(__spreadValues({}, get()));
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((serializedValue) => storage.setItem(options.name, serializedValue)).catch((e) => {
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((...args) => {
447
- set(...args);
448
- void setItem();
449
- }, get, api);
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(deserializedStorageValue.state, deserializedStorageValue.version);
817
+ return options.migrate(
818
+ deserializedStorageValue.state,
819
+ deserializedStorageValue.version
820
+ );
467
821
  }
468
- console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`);
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(migratedState, (_a2 = get()) != null ? _a2 : configResult);
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 = __spreadValues(__spreadValues({}, options), newOptions);
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
- var _a;
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(devtools(persist(immer((set, _get) => ({
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
- }), { name: "local-storage" } // prefix in Redux DevTools
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 providers = {
625
- [PROVIDER_ID.PERA_WALLET]: PERA_WALLET,
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 BaseWallet {
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 confirmedTransaction = await this.waitForConfirmation(sentTransaction.txId);
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
- * Helpful resources:
764
- * https://github.com/perawallet/connect
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
- id;
769
- provider;
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.id = id;
774
- this.provider = provider;
775
- }
776
- static async init() {
777
- const { algosdk, algodClient } = await Algod.init();
778
- const PeraWalletConnect = (await import('@perawallet/connect'))
779
- .PeraWalletConnect;
780
- const peraWallet = new PeraWalletConnect({ shouldShowSignTxnToast: false });
781
- return new PeraWalletClient({
782
- id: PROVIDER_ID.PERA_WALLET,
783
- client: peraWallet,
784
- provider: providers[PROVIDER_ID.PERA_WALLET],
785
- algosdk: algosdk,
786
- algodClient: algodClient,
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 ${this.provider}`);
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: this.provider.id,
1106
+ providerId: PeraWalletClient.metadata.id,
801
1107
  }));
802
1108
  return {
803
- ...this.provider,
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
- ...this.provider,
1120
+ ...PeraWalletClient.metadata,
815
1121
  accounts: accounts.map((address, index) => ({
816
1122
  name: `Pera Wallet ${index + 1}`,
817
1123
  address,
818
- providerId: this.provider.id,
1124
+ providerId: PeraWalletClient.metadata.id,
819
1125
  })),
820
1126
  };
821
1127
  }
822
1128
  async disconnect() {
823
1129
  await this.#client.disconnect();
824
1130
  }
825
- formatTransactionsArray(transactions) {
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"]) === activeAdress) {
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 BaseWallet {
1220
+ class MyAlgoWalletClient extends BaseClient {
910
1221
  #client;
911
- id;
912
- provider;
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.id = id;
917
- this.provider = provider;
918
- }
919
- static async init() {
920
- const { algosdk, algodClient } = await Algod.init();
921
- const MyAlgoConnect = (await import('@randlabs/myalgo-connect')).default;
922
- const myAlgo = new MyAlgoConnect({ disableLedgerNano: false });
923
- return new MyAlgoWalletClient({
924
- id: PROVIDER_ID.MYALGO_WALLET,
925
- client: myAlgo,
926
- provider: providers[PROVIDER_ID.MYALGO_WALLET],
927
- algosdk: algosdk,
928
- algodClient: 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 ${this.provider}`);
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: this.provider.id,
1261
+ providerId: MyAlgoWalletClient.metadata.id,
939
1262
  }));
940
1263
  return {
941
- ...this.provider,
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(activeAdress, transactions) {
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"]) === activeAdress) {
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
- class AlgoSignerClient extends BaseWallet {
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
- id;
1010
- provider;
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.id = id;
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
- async connect() {
1033
- await this.#client.connect();
1034
- let ledger = "MainNet";
1035
- if (NODE_NETWORK === "mainnet") {
1036
- ledger = "MainNet";
1037
- }
1038
- else if (NODE_NETWORK === "betanet") {
1039
- ledger = "BetaNet";
1040
- }
1041
- else if (NODE_NETWORK === "testnet") {
1042
- ledger = "TestNet";
1043
- }
1044
- else if (!!NODE_NETWORK) {
1045
- ledger = NODE_NETWORK;
1046
- }
1047
- const accounts = await this.#client.accounts({
1048
- ledger,
1049
- });
1050
- if (accounts.length === 0) {
1051
- throw new Error(`No accounts found for ${this.provider}`);
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
- return null;
1069
- }
1070
- async disconnect() {
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 ${this.provider}`);
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: this.provider.id,
1378
+ providerId: DeflyWalletClient.metadata.id,
1178
1379
  }));
1179
1380
  return {
1180
- ...this.provider,
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
- ...this.provider,
1392
+ ...DeflyWalletClient.metadata,
1192
1393
  accounts: accounts.map((address, index) => ({
1193
1394
  name: `Defly Wallet ${index + 1}`,
1194
1395
  address,
1195
- providerId: this.provider.id,
1396
+ providerId: DeflyWalletClient.metadata.id,
1196
1397
  })),
1197
1398
  };
1198
1399
  }
1199
1400
  async disconnect() {
1200
1401
  await this.#client.disconnect();
1201
1402
  }
1202
- formatTransactionsArray(transactions) {
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"]) === activeAdress) {
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
- class ExodusClient extends BaseWallet {
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
- id;
1279
- provider;
1280
- constructor({ client, id, provider, algosdk, algodClient }) {
1484
+ #onlyIfTrusted;
1485
+ network;
1486
+ constructor({ client, algosdk, algodClient, onlyIfTrusted, network, }) {
1281
1487
  super(algosdk, algodClient);
1282
1488
  this.#client = client;
1283
- this.id = id;
1284
- this.provider = provider;
1285
- }
1286
- static async init() {
1287
- if (typeof window == "undefined" ||
1288
- window.exodus === undefined) {
1289
- throw new Error("Exodus is not available.");
1290
- }
1291
- const { algosdk, algodClient } = await Algod.init();
1292
- const exodus = window.exodus.algorand;
1293
- return new ExodusClient({
1294
- id: PROVIDER_ID.EXODUS,
1295
- client: exodus,
1296
- provider: providers[PROVIDER_ID.EXODUS],
1297
- algosdk: algosdk,
1298
- algodClient: algodClient,
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 ${this.provider}`);
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: this.provider.id,
1532
+ providerId: ExodusClient.metadata.id,
1311
1533
  },
1312
1534
  ];
1313
1535
  return {
1314
- ...this.provider,
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(activeAdress, transactions) {
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"]) === activeAdress) {
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 DefaultKMDConfig = {
1387
- host: KMD_HOST,
1388
- token: KMD_TOKEN,
1389
- port: KMD_PORT,
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 KMDWallet extends BaseWallet {
1624
+ class AlgoSignerClient extends BaseClient {
1392
1625
  #client;
1393
- walletId;
1394
- id;
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.id = id;
1400
- this.provider = provider;
1401
- this.walletId = "";
1630
+ this.network = network;
1402
1631
  }
1403
- static async init() {
1404
- // TODO: allow diff config options?
1405
- const kmdConfig = DefaultKMDConfig;
1406
- const { algosdk, algodClient } = await Algod.init();
1407
- const kmdClient = new algosdk.Kmd(kmdConfig.token, kmdConfig.host, kmdConfig.port);
1408
- return new KMDWallet({
1409
- id: PROVIDER_ID.KMD_WALLET,
1410
- client: kmdClient,
1411
- provider: providers[PROVIDER_ID.KMD_WALLET],
1412
- algosdk: algosdk,
1413
- algodClient: algodClient,
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
- // TODO: prompt for wallet and password?
1418
- return {
1419
- ...this.provider,
1420
- accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
1421
- };
1422
- }
1423
- async disconnect() {
1424
- return;
1425
- }
1426
- async reconnect() {
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
- ...this.provider,
1429
- accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
1674
+ ...AlgoSignerClient.metadata,
1675
+ accounts: mappedAccounts,
1430
1676
  };
1431
1677
  }
1432
- async requestPassword() {
1433
- // TODO: store it locally?
1434
- const pw = prompt("gib password");
1435
- return pw ? pw : "";
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 walletMap;
1683
+ return null;
1452
1684
  }
1453
- async listAccounts(wallet, password) {
1454
- const walletMap = await this.listWallets();
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(activeAddress, transactions) {
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
- // Get a handle token
1480
- const pw = await this.requestPassword();
1481
- const token = await this.getWalletToken(this.walletId, pw);
1482
- const signedTxns = [];
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 signingPromises = [];
1485
- for (const idx in decodedTxns) {
1486
- const dtxn = decodedTxns[idx];
1487
- // push the incoming txn into signed, we'll overwrite it later
1488
- signedTxns.push(transactions[idx]);
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
- signEncodedTransactions(transactions) {
1514
- throw new Error("Method not implemented.");
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
- class WalletConnectClient extends BaseWallet {
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
- id;
1521
- provider;
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.id = id;
1526
- this.provider = provider;
1527
- }
1528
- static async init() {
1529
- const { algosdk, algodClient } = await Algod.init();
1530
- const WalletConnect = (await import('@walletconnect/client')).default;
1531
- const QRCodeModal = (await import('algorand-walletconnect-qrcode-modal'))
1532
- .default;
1533
- const walletConnect = new WalletConnect({
1534
- bridge: "https://bridge.walletconnect.org",
1535
- qrcodeModal: QRCodeModal,
1536
- });
1537
- const initWallet = {
1538
- id: PROVIDER_ID.WALLET_CONNECT,
1539
- client: walletConnect,
1540
- provider: providers[PROVIDER_ID.WALLET_CONNECT],
1541
- algosdk: algosdk,
1542
- algodClient: algodClient,
1543
- };
1544
- return new WalletConnectClient(initWallet);
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 (NODE_NETWORK === "betanet") {
1808
+ if (this.network === "betanet") {
1549
1809
  chainId = 416003;
1550
1810
  }
1551
- else if (NODE_NETWORK === "testnet") {
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
- ...this.provider,
1824
+ ...WalletConnectClient.metadata,
1565
1825
  accounts: accounts.map((address, index) => ({
1566
1826
  name: `Wallet Connect ${index + 1}`,
1567
1827
  address,
1568
- providerId: this.provider.id,
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
- ...this.provider,
1838
+ ...WalletConnectClient.metadata,
1579
1839
  accounts: accounts.map((address, index) => ({
1580
1840
  name: `Wallet Connect ${index + 1}`,
1581
1841
  address,
1582
- providerId: this.provider.id,
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
- ...this.provider,
1854
+ ...WalletConnectClient.metadata,
1596
1855
  accounts: accounts.map((address, index) => ({
1597
1856
  name: `Wallet Connect ${index + 1}`,
1598
1857
  address,
1599
- providerId: this.provider.id,
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
- formatTransactionsArray(transactions) {
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"]) === activeAdress) {
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 clients = {
1691
- [PROVIDER_ID.KMD_WALLET]: KMDWallet.init().catch((e) => {
1692
- if (typeof window !== "undefined") {
1693
- console.info("error initializing client", e);
1694
- return;
1695
- }
1696
- }),
1697
- [PROVIDER_ID.PERA_WALLET]: PeraWalletClient.init().catch((e) => {
1698
- if (typeof window !== "undefined") {
1699
- console.info("error initializing client", e);
1700
- return;
1701
- }
1702
- }),
1703
- [PROVIDER_ID.MYALGO_WALLET]: MyAlgoWalletClient.init().catch((e) => {
1704
- if (typeof window !== "undefined") {
1705
- console.info("error initializing client", e);
1706
- return;
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
- [PROVIDER_ID.ALGO_SIGNER]: AlgoSignerClient.init().catch((e) => {
1710
- if (typeof window !== "undefined") {
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
- [PROVIDER_ID.DEFLY]: DeflyWalletClient.init().catch((e) => {
1716
- if (typeof window !== "undefined") {
1717
- console.info("error initializing client", e);
1718
- return;
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
- [PROVIDER_ID.EXODUS]: ExodusClient.init().catch((e) => {
1722
- if (typeof window !== "undefined") {
1723
- console.info("error initializing client", e);
1724
- return;
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
- [PROVIDER_ID.WALLET_CONNECT]: WalletConnectClient.init().catch((e) => {
1728
- if (typeof window !== "undefined") {
1729
- console.info("error initializing client", e);
1730
- return;
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
- const client = await clients[id];
1740
- if (!client) {
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 useConnectWallet(options) {
1832
- const { accounts, setActiveAccount: setActiveAccount, activeAccount, clearActiveAccount, addAccounts, removeAccounts, } = useWalletStore(walletStoreSelector, shallow);
1833
- const providers$1 = useMemo(() => Object.values(providers)
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 accounts.filter((account) => account.providerId === id);
2132
+ return connectedAccounts.filter((account) => account.providerId === id);
1856
2133
  };
1857
- const reconnectProviders = async () => {
1858
- Object.values(providers$1).forEach(({ id, isActive, isConnected }) => {
1859
- if (isActive || isConnected) {
1860
- reconnect(id);
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 (!providers[id].isWalletConnect) {
2162
+ if (!allClients[id].metadata.isWalletConnect) {
1866
2163
  return;
1867
2164
  }
1868
- const wcSessions = Object.values(providers$1).filter((p) => p.id !== id && p.isWalletConnect && (p.isConnected || p.isActive));
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 connect = async (id) => {
2175
+ const selectActiveAccount = async (providerId, address) => {
1874
2176
  try {
1875
- await disconnectWCSessions(id);
1876
- const walletClient = await getWalletClient(id);
1877
- const walletInfo = await walletClient.connect(() => disconnect(id));
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
- setActiveAccount(walletInfo.accounts[0]);
1882
- addAccounts(walletInfo.accounts);
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 setActive = async (id) => {
2188
+ const connect = async (id) => {
1889
2189
  try {
1890
2190
  await disconnectWCSessions(id);
1891
- const accounts = getAccountsByProvider(id);
1892
- setActiveAccount(accounts[0]);
1893
- }
1894
- catch (e) {
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
- await disconnectWCSessions(account.providerId);
1905
- setActiveAccount(account);
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 getWalletClient(id);
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 getWalletClient(id);
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
- providers: providers$1,
2287
+ clients,
2288
+ providers,
2289
+ connectedAccounts,
2290
+ connectedActiveAccounts,
1939
2291
  activeAccount,
1940
- accounts,
1941
- connect,
1942
- reconnect,
1943
- disconnect,
1944
- selectActiveAccount,
1945
- setActive,
1946
- reconnectProviders,
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
- export { KMD_HOST, KMD_PASSWORD, KMD_PORT, KMD_TOKEN, KMD_WALLET$1 as KMD_WALLET, NODE_NETWORK, NODE_PORT, NODE_SERVER, NODE_TOKEN, PROVIDER_ID, getWalletClient, useConnectWallet, useWallet };
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 };