@txnlab/use-wallet 0.1.21 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/clients/algosigner.d.ts +1 -1
- package/dist/cjs/clients/base.d.ts +4 -4
- package/dist/cjs/clients/defly.d.ts +1 -1
- package/dist/cjs/clients/exodus.d.ts +1 -1
- package/dist/cjs/clients/kmd.d.ts +1 -1
- package/dist/cjs/clients/myalgowallet.d.ts +1 -1
- package/dist/cjs/clients/perawallet.d.ts +1 -1
- package/dist/cjs/clients/walletconnect.d.ts +1 -1
- package/dist/cjs/hooks/useWallet.d.ts +2 -2
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +1967 -327
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/index.d.ts +7 -7
- package/dist/cjs/store/state/walletStore.d.ts +17 -1
- package/dist/esm/clients/algosigner.d.ts +1 -1
- package/dist/esm/clients/base.d.ts +4 -4
- package/dist/esm/clients/defly.d.ts +1 -1
- package/dist/esm/clients/exodus.d.ts +1 -1
- package/dist/esm/clients/kmd.d.ts +1 -1
- package/dist/esm/clients/myalgowallet.d.ts +1 -1
- package/dist/esm/clients/perawallet.d.ts +1 -1
- package/dist/esm/clients/walletconnect.d.ts +1 -1
- package/dist/esm/hooks/useWallet.d.ts +2 -2
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +1943 -300
- package/dist/esm/providers/index.d.ts +7 -7
- package/dist/esm/store/state/walletStore.d.ts +17 -1
- package/dist/index.d.ts +65 -3
- package/package.json +10 -10
- package/dist/cjs/base-9794b627.js +0 -174
- package/dist/cjs/base-9794b627.js.map +0 -1
- package/dist/cjs/clients/algosigner.js +0 -144
- package/dist/cjs/clients/algosigner.js.map +0 -1
- package/dist/cjs/clients/defly.js +0 -159
- package/dist/cjs/clients/defly.js.map +0 -1
- package/dist/cjs/clients/exodus.js +0 -118
- package/dist/cjs/clients/exodus.js.map +0 -1
- package/dist/cjs/clients/kmd.js +0 -140
- package/dist/cjs/clients/kmd.js.map +0 -1
- package/dist/cjs/clients/myalgowallet.js +0 -128
- package/dist/cjs/clients/myalgowallet.js.map +0 -1
- package/dist/cjs/clients/perawallet.js +0 -169
- package/dist/cjs/clients/perawallet.js.map +0 -1
- package/dist/cjs/clients/walletconnect.js +0 -199
- package/dist/cjs/clients/walletconnect.js.map +0 -1
- package/dist/cjs/constants-e76d1f05.js +0 -63
- package/dist/cjs/constants-e76d1f05.js.map +0 -1
- package/dist/cjs/constants.js +0 -22
- package/dist/cjs/constants.js.map +0 -1
- package/dist/cjs/providers.js +0 -81
- package/dist/cjs/providers.js.map +0 -1
- package/dist/cjs/store/middelware/immer.d.ts +0 -10
- package/dist/cjs/utils.js +0 -74
- package/dist/cjs/utils.js.map +0 -1
- package/dist/esm/base-71089716.js +0 -152
- package/dist/esm/base-71089716.js.map +0 -1
- package/dist/esm/clients/algosigner.js +0 -142
- package/dist/esm/clients/algosigner.js.map +0 -1
- package/dist/esm/clients/defly.js +0 -139
- package/dist/esm/clients/defly.js.map +0 -1
- package/dist/esm/clients/exodus.js +0 -116
- package/dist/esm/clients/exodus.js.map +0 -1
- package/dist/esm/clients/kmd.js +0 -138
- package/dist/esm/clients/kmd.js.map +0 -1
- package/dist/esm/clients/myalgowallet.js +0 -108
- package/dist/esm/clients/myalgowallet.js.map +0 -1
- package/dist/esm/clients/perawallet.js +0 -149
- package/dist/esm/clients/perawallet.js.map +0 -1
- package/dist/esm/clients/walletconnect.js +0 -179
- package/dist/esm/clients/walletconnect.js.map +0 -1
- package/dist/esm/constants-49b44514.js +0 -53
- package/dist/esm/constants-49b44514.js.map +0 -1
- package/dist/esm/constants.js +0 -2
- package/dist/esm/constants.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/providers.js +0 -77
- package/dist/esm/providers.js.map +0 -1
- package/dist/esm/store/middelware/immer.d.ts +0 -10
- package/dist/esm/utils.js +0 -70
- package/dist/esm/utils.js.map +0 -1
package/dist/cjs/index.js
CHANGED
|
@@ -1,70 +1,103 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
3
|
+
var require$$0 = require('react');
|
|
4
|
+
var utils = require('@json-rpc-tools/utils');
|
|
5
|
+
|
|
6
|
+
exports.PROVIDER_ID = void 0;
|
|
7
|
+
(function (PROVIDER_ID) {
|
|
8
|
+
PROVIDER_ID["KMD_WALLET"] = "KMD Wallet";
|
|
9
|
+
PROVIDER_ID["PERA_WALLET"] = "Pera Wallet";
|
|
10
|
+
PROVIDER_ID["MYALGO_WALLET"] = "MyAlgo Wallet";
|
|
11
|
+
PROVIDER_ID["ALGO_SIGNER"] = "Algo Signer";
|
|
12
|
+
PROVIDER_ID["DEFLY"] = "Defly";
|
|
13
|
+
PROVIDER_ID["EXODUS"] = "Exodus";
|
|
14
|
+
PROVIDER_ID["WALLET_CONNECT"] = "Wallet Connect";
|
|
15
|
+
})(exports.PROVIDER_ID || (exports.PROVIDER_ID = {}));
|
|
16
|
+
const NODE_SERVER = process.env.NODE_SERVER ||
|
|
17
|
+
process.env.REACT_APP_NODE_SERVER ||
|
|
18
|
+
process.env.NEXT_PUBLIC_NODE_SERVER ||
|
|
19
|
+
/** @todo deprecate this env var */
|
|
20
|
+
process.env.NEXT_PUBLIC_NODE_URL ||
|
|
21
|
+
"https://mainnet-api.algonode.cloud";
|
|
22
|
+
const NODE_TOKEN = process.env.NODE_TOKEN ||
|
|
23
|
+
process.env.REACT_APP_NODE_TOKEN ||
|
|
24
|
+
process.env.NEXT_PUBLIC_NODE_TOKEN ||
|
|
25
|
+
"";
|
|
26
|
+
const NODE_PORT = process.env.NODE_PORT ||
|
|
27
|
+
process.env.REACT_APP_NODE_PORT ||
|
|
28
|
+
process.env.NEXT_PUBLIC_NODE_PORT ||
|
|
29
|
+
"";
|
|
30
|
+
const NODE_NETWORK = process.env.NODE_NETWORK ||
|
|
31
|
+
process.env.REACT_APP_NODE_NETWORK ||
|
|
32
|
+
process.env.NEXT_PUBLIC_NODE_NETWORK ||
|
|
33
|
+
/** @todo deprecate this env var */
|
|
34
|
+
process.env.NEXT_PUBLIC_VERCEL_ENV ||
|
|
35
|
+
"mainnet";
|
|
36
|
+
const KMD_HOST = process.env.KMD_HOST ||
|
|
37
|
+
process.env.REACT_APP_KMD_HOST ||
|
|
38
|
+
process.env.NEXT_PUBLIC_KMD_HOST ||
|
|
39
|
+
"http://localhost";
|
|
40
|
+
const KMD_TOKEN = process.env.KMD_TOKEN ||
|
|
41
|
+
process.env.REACT_APP_KMD_TOKEN ||
|
|
42
|
+
process.env.NEXT_PUBLIC_KMD_TOKEN ||
|
|
43
|
+
"a".repeat(64);
|
|
44
|
+
const KMD_PORT = process.env.KMD_PORT ||
|
|
45
|
+
process.env.REACT_APP_KMD_PORT ||
|
|
46
|
+
process.env.NEXT_PUBLIC_KMD_PORT ||
|
|
47
|
+
"4002";
|
|
48
|
+
const KMD_WALLET$1 = process.env.KMD_WALLET ||
|
|
49
|
+
process.env.REACT_APP_KMD_WALLET ||
|
|
50
|
+
process.env.NEXT_PUBLIC_KMD_WALLET ||
|
|
51
|
+
"unencrypted-default-wallet";
|
|
52
|
+
const KMD_PASSWORD = process.env.KMD_PASSWORD ||
|
|
53
|
+
process.env.REACT_APP_KMD_PASSWORD ||
|
|
54
|
+
process.env.NEXT_PUBLIC_KMD_PASSWORD ||
|
|
55
|
+
"";
|
|
56
|
+
|
|
57
|
+
const getAlgosdk = async () => {
|
|
58
|
+
return (await import('algosdk')).default;
|
|
59
|
+
};
|
|
60
|
+
const getAlgodClient = async (algosdk) => {
|
|
61
|
+
return new algosdk.Algodv2(NODE_TOKEN, NODE_SERVER, NODE_PORT);
|
|
62
|
+
};
|
|
63
|
+
class Algod {
|
|
64
|
+
algosdk;
|
|
65
|
+
algodClient;
|
|
66
|
+
constructor(algosdk, algodClient) {
|
|
67
|
+
this.algosdk = algosdk;
|
|
68
|
+
this.algodClient = algodClient;
|
|
69
|
+
}
|
|
70
|
+
static async init() {
|
|
71
|
+
const algosdk = await getAlgosdk();
|
|
72
|
+
const algodClient = await getAlgodClient(algosdk);
|
|
73
|
+
return new Algod(algosdk, algodClient);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
18
76
|
|
|
19
77
|
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);
|
|
20
78
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*/
|
|
28
|
-
const immer = (config) => (set, get, api) => {
|
|
29
|
-
// see https://github.com/pmndrs/zustand/issues/449#issuecomment-873777576
|
|
30
|
-
api.setState = (fn$1) => set(fn(fn$1));
|
|
31
|
-
return config((partial, replace) => {
|
|
32
|
-
const nextState = typeof partial === "function"
|
|
33
|
-
? fn(partial)
|
|
34
|
-
: partial;
|
|
35
|
-
return set(nextState, replace);
|
|
36
|
-
}, get, api);
|
|
79
|
+
const immerImpl = (initializer) => (set, get, store) => {
|
|
80
|
+
store.setState = (updater, replace, ...a) => {
|
|
81
|
+
const nextState = typeof updater === "function" ? fn(updater) : updater;
|
|
82
|
+
return set(nextState, replace, ...a);
|
|
83
|
+
};
|
|
84
|
+
return initializer(store.setState, get, store);
|
|
37
85
|
};
|
|
86
|
+
const immer = immerImpl;
|
|
38
87
|
|
|
39
|
-
|
|
88
|
+
const createStoreImpl = (createState) => {
|
|
40
89
|
let state;
|
|
41
90
|
const listeners = /* @__PURE__ */ new Set();
|
|
42
91
|
const setState = (partial, replace) => {
|
|
43
92
|
const nextState = typeof partial === "function" ? partial(state) : partial;
|
|
44
|
-
if (nextState
|
|
93
|
+
if (!Object.is(nextState, state)) {
|
|
45
94
|
const previousState = state;
|
|
46
|
-
state = replace ? nextState : Object.assign({}, state, nextState);
|
|
95
|
+
state = (replace != null ? replace : typeof nextState !== "object") ? nextState : Object.assign({}, state, nextState);
|
|
47
96
|
listeners.forEach((listener) => listener(state, previousState));
|
|
48
97
|
}
|
|
49
98
|
};
|
|
50
99
|
const getState = () => state;
|
|
51
|
-
const
|
|
52
|
-
console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");
|
|
53
|
-
let currentSlice = selector(state);
|
|
54
|
-
function listenerToAdd() {
|
|
55
|
-
const nextSlice = selector(state);
|
|
56
|
-
if (!equalityFn(currentSlice, nextSlice)) {
|
|
57
|
-
const previousSlice = currentSlice;
|
|
58
|
-
listener(currentSlice = nextSlice, previousSlice);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
listeners.add(listenerToAdd);
|
|
62
|
-
return () => listeners.delete(listenerToAdd);
|
|
63
|
-
};
|
|
64
|
-
const subscribe = (listener, selector, equalityFn) => {
|
|
65
|
-
if (selector || equalityFn) {
|
|
66
|
-
return subscribeWithSelector(listener, selector, equalityFn);
|
|
67
|
-
}
|
|
100
|
+
const subscribe = (listener) => {
|
|
68
101
|
listeners.add(listener);
|
|
69
102
|
return () => listeners.delete(listener);
|
|
70
103
|
};
|
|
@@ -72,170 +105,588 @@ function createStore(createState) {
|
|
|
72
105
|
const api = { setState, getState, subscribe, destroy };
|
|
73
106
|
state = createState(setState, getState, api);
|
|
74
107
|
return api;
|
|
108
|
+
};
|
|
109
|
+
const createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
|
|
110
|
+
|
|
111
|
+
function getDefaultExportFromCjs (x) {
|
|
112
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
var withSelector = {exports: {}};
|
|
116
|
+
|
|
117
|
+
var withSelector_production_min = {};
|
|
118
|
+
|
|
119
|
+
var shim = {exports: {}};
|
|
120
|
+
|
|
121
|
+
var useSyncExternalStoreShim_production_min = {};
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @license React
|
|
125
|
+
* use-sync-external-store-shim.production.min.js
|
|
126
|
+
*
|
|
127
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
128
|
+
*
|
|
129
|
+
* This source code is licensed under the MIT license found in the
|
|
130
|
+
* LICENSE file in the root directory of this source tree.
|
|
131
|
+
*/
|
|
132
|
+
|
|
133
|
+
var hasRequiredUseSyncExternalStoreShim_production_min;
|
|
134
|
+
|
|
135
|
+
function requireUseSyncExternalStoreShim_production_min () {
|
|
136
|
+
if (hasRequiredUseSyncExternalStoreShim_production_min) return useSyncExternalStoreShim_production_min;
|
|
137
|
+
hasRequiredUseSyncExternalStoreShim_production_min = 1;
|
|
138
|
+
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}
|
|
139
|
+
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;
|
|
140
|
+
return useSyncExternalStoreShim_production_min;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
var useSyncExternalStoreShim_development = {};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* @license React
|
|
147
|
+
* use-sync-external-store-shim.development.js
|
|
148
|
+
*
|
|
149
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
150
|
+
*
|
|
151
|
+
* This source code is licensed under the MIT license found in the
|
|
152
|
+
* LICENSE file in the root directory of this source tree.
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
var hasRequiredUseSyncExternalStoreShim_development;
|
|
156
|
+
|
|
157
|
+
function requireUseSyncExternalStoreShim_development () {
|
|
158
|
+
if (hasRequiredUseSyncExternalStoreShim_development) return useSyncExternalStoreShim_development;
|
|
159
|
+
hasRequiredUseSyncExternalStoreShim_development = 1;
|
|
160
|
+
|
|
161
|
+
if (process.env.NODE_ENV !== "production") {
|
|
162
|
+
(function() {
|
|
163
|
+
|
|
164
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
165
|
+
if (
|
|
166
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
167
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
|
|
168
|
+
'function'
|
|
169
|
+
) {
|
|
170
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
|
|
171
|
+
}
|
|
172
|
+
var React = require$$0;
|
|
173
|
+
|
|
174
|
+
var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
175
|
+
|
|
176
|
+
function error(format) {
|
|
177
|
+
{
|
|
178
|
+
{
|
|
179
|
+
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
180
|
+
args[_key2 - 1] = arguments[_key2];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
printWarning('error', format, args);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function printWarning(level, format, args) {
|
|
189
|
+
// When changing this logic, you might want to also
|
|
190
|
+
// update consoleWithStackDev.www.js as well.
|
|
191
|
+
{
|
|
192
|
+
var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
|
|
193
|
+
var stack = ReactDebugCurrentFrame.getStackAddendum();
|
|
194
|
+
|
|
195
|
+
if (stack !== '') {
|
|
196
|
+
format += '%s';
|
|
197
|
+
args = args.concat([stack]);
|
|
198
|
+
} // eslint-disable-next-line react-internal/safe-string-coercion
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
var argsWithFormat = args.map(function (item) {
|
|
202
|
+
return String(item);
|
|
203
|
+
}); // Careful: RN currently depends on this prefix
|
|
204
|
+
|
|
205
|
+
argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
|
|
206
|
+
// breaks IE9: https://github.com/facebook/react/issues/13610
|
|
207
|
+
// eslint-disable-next-line react-internal/no-production-logging
|
|
208
|
+
|
|
209
|
+
Function.prototype.apply.call(console[level], console, argsWithFormat);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
|
215
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
|
216
|
+
*/
|
|
217
|
+
function is(x, y) {
|
|
218
|
+
return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
|
|
219
|
+
;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
var objectIs = typeof Object.is === 'function' ? Object.is : is;
|
|
223
|
+
|
|
224
|
+
// dispatch for CommonJS interop named imports.
|
|
225
|
+
|
|
226
|
+
var useState = React.useState,
|
|
227
|
+
useEffect = React.useEffect,
|
|
228
|
+
useLayoutEffect = React.useLayoutEffect,
|
|
229
|
+
useDebugValue = React.useDebugValue;
|
|
230
|
+
var didWarnOld18Alpha = false;
|
|
231
|
+
var didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works
|
|
232
|
+
// because of a very particular set of implementation details and assumptions
|
|
233
|
+
// -- change any one of them and it will break. The most important assumption
|
|
234
|
+
// is that updates are always synchronous, because concurrent rendering is
|
|
235
|
+
// only available in versions of React that also have a built-in
|
|
236
|
+
// useSyncExternalStore API. And we only use this shim when the built-in API
|
|
237
|
+
// does not exist.
|
|
238
|
+
//
|
|
239
|
+
// Do not assume that the clever hacks used by this hook also work in general.
|
|
240
|
+
// The point of this shim is to replace the need for hacks by other libraries.
|
|
241
|
+
|
|
242
|
+
function useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of
|
|
243
|
+
// React do not expose a way to check if we're hydrating. So users of the shim
|
|
244
|
+
// will need to track that themselves and return the correct value
|
|
245
|
+
// from `getSnapshot`.
|
|
246
|
+
getServerSnapshot) {
|
|
247
|
+
{
|
|
248
|
+
if (!didWarnOld18Alpha) {
|
|
249
|
+
if (React.startTransition !== undefined) {
|
|
250
|
+
didWarnOld18Alpha = true;
|
|
251
|
+
|
|
252
|
+
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.');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} // Read the current snapshot from the store on every render. Again, this
|
|
256
|
+
// breaks the rules of React, and only works here because of specific
|
|
257
|
+
// implementation details, most importantly that updates are
|
|
258
|
+
// always synchronous.
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
var value = getSnapshot();
|
|
262
|
+
|
|
263
|
+
{
|
|
264
|
+
if (!didWarnUncachedGetSnapshot) {
|
|
265
|
+
var cachedValue = getSnapshot();
|
|
266
|
+
|
|
267
|
+
if (!objectIs(value, cachedValue)) {
|
|
268
|
+
error('The result of getSnapshot should be cached to avoid an infinite loop');
|
|
269
|
+
|
|
270
|
+
didWarnUncachedGetSnapshot = true;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
} // Because updates are synchronous, we don't queue them. Instead we force a
|
|
274
|
+
// re-render whenever the subscribed state changes by updating an some
|
|
275
|
+
// arbitrary useState hook. Then, during render, we call getSnapshot to read
|
|
276
|
+
// the current value.
|
|
277
|
+
//
|
|
278
|
+
// Because we don't actually use the state returned by the useState hook, we
|
|
279
|
+
// can save a bit of memory by storing other stuff in that slot.
|
|
280
|
+
//
|
|
281
|
+
// To implement the early bailout, we need to track some things on a mutable
|
|
282
|
+
// object. Usually, we would put that in a useRef hook, but we can stash it in
|
|
283
|
+
// our useState hook instead.
|
|
284
|
+
//
|
|
285
|
+
// To force a re-render, we call forceUpdate({inst}). That works because the
|
|
286
|
+
// new object always fails an equality check.
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
var _useState = useState({
|
|
290
|
+
inst: {
|
|
291
|
+
value: value,
|
|
292
|
+
getSnapshot: getSnapshot
|
|
293
|
+
}
|
|
294
|
+
}),
|
|
295
|
+
inst = _useState[0].inst,
|
|
296
|
+
forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated
|
|
297
|
+
// in the layout phase so we can access it during the tearing check that
|
|
298
|
+
// happens on subscribe.
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
useLayoutEffect(function () {
|
|
302
|
+
inst.value = value;
|
|
303
|
+
inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the
|
|
304
|
+
// commit phase if there was an interleaved mutation. In concurrent mode
|
|
305
|
+
// this can happen all the time, but even in synchronous mode, an earlier
|
|
306
|
+
// effect may have mutated the store.
|
|
307
|
+
|
|
308
|
+
if (checkIfSnapshotChanged(inst)) {
|
|
309
|
+
// Force a re-render.
|
|
310
|
+
forceUpdate({
|
|
311
|
+
inst: inst
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}, [subscribe, value, getSnapshot]);
|
|
315
|
+
useEffect(function () {
|
|
316
|
+
// Check for changes right before subscribing. Subsequent changes will be
|
|
317
|
+
// detected in the subscription handler.
|
|
318
|
+
if (checkIfSnapshotChanged(inst)) {
|
|
319
|
+
// Force a re-render.
|
|
320
|
+
forceUpdate({
|
|
321
|
+
inst: inst
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
var handleStoreChange = function () {
|
|
326
|
+
// TODO: Because there is no cross-renderer API for batching updates, it's
|
|
327
|
+
// up to the consumer of this library to wrap their subscription event
|
|
328
|
+
// with unstable_batchedUpdates. Should we try to detect when this isn't
|
|
329
|
+
// the case and print a warning in development?
|
|
330
|
+
// The store changed. Check if the snapshot changed since the last time we
|
|
331
|
+
// read from the store.
|
|
332
|
+
if (checkIfSnapshotChanged(inst)) {
|
|
333
|
+
// Force a re-render.
|
|
334
|
+
forceUpdate({
|
|
335
|
+
inst: inst
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}; // Subscribe to the store and return a clean-up function.
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
return subscribe(handleStoreChange);
|
|
342
|
+
}, [subscribe]);
|
|
343
|
+
useDebugValue(value);
|
|
344
|
+
return value;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function checkIfSnapshotChanged(inst) {
|
|
348
|
+
var latestGetSnapshot = inst.getSnapshot;
|
|
349
|
+
var prevValue = inst.value;
|
|
350
|
+
|
|
351
|
+
try {
|
|
352
|
+
var nextValue = latestGetSnapshot();
|
|
353
|
+
return !objectIs(prevValue, nextValue);
|
|
354
|
+
} catch (error) {
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {
|
|
360
|
+
// Note: The shim does not use getServerSnapshot, because pre-18 versions of
|
|
361
|
+
// React do not expose a way to check if we're hydrating. So users of the shim
|
|
362
|
+
// will need to track that themselves and return the correct value
|
|
363
|
+
// from `getSnapshot`.
|
|
364
|
+
return getSnapshot();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
|
|
368
|
+
|
|
369
|
+
var isServerEnvironment = !canUseDOM;
|
|
370
|
+
|
|
371
|
+
var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;
|
|
372
|
+
var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;
|
|
373
|
+
|
|
374
|
+
useSyncExternalStoreShim_development.useSyncExternalStore = useSyncExternalStore$2;
|
|
375
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
376
|
+
if (
|
|
377
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
378
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
|
|
379
|
+
'function'
|
|
380
|
+
) {
|
|
381
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
})();
|
|
385
|
+
}
|
|
386
|
+
return useSyncExternalStoreShim_development;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
var hasRequiredShim;
|
|
390
|
+
|
|
391
|
+
function requireShim () {
|
|
392
|
+
if (hasRequiredShim) return shim.exports;
|
|
393
|
+
hasRequiredShim = 1;
|
|
394
|
+
(function (module) {
|
|
395
|
+
|
|
396
|
+
if (process.env.NODE_ENV === 'production') {
|
|
397
|
+
module.exports = requireUseSyncExternalStoreShim_production_min();
|
|
398
|
+
} else {
|
|
399
|
+
module.exports = requireUseSyncExternalStoreShim_development();
|
|
400
|
+
}
|
|
401
|
+
} (shim));
|
|
402
|
+
return shim.exports;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* @license React
|
|
407
|
+
* use-sync-external-store-shim/with-selector.production.min.js
|
|
408
|
+
*
|
|
409
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
410
|
+
*
|
|
411
|
+
* This source code is licensed under the MIT license found in the
|
|
412
|
+
* LICENSE file in the root directory of this source tree.
|
|
413
|
+
*/
|
|
414
|
+
|
|
415
|
+
var hasRequiredWithSelector_production_min;
|
|
416
|
+
|
|
417
|
+
function requireWithSelector_production_min () {
|
|
418
|
+
if (hasRequiredWithSelector_production_min) return withSelector_production_min;
|
|
419
|
+
hasRequiredWithSelector_production_min = 1;
|
|
420
|
+
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;
|
|
421
|
+
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]);
|
|
422
|
+
u(function(){f.hasValue=!0;f.value=d;},[d]);w(d);return d};
|
|
423
|
+
return withSelector_production_min;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
var withSelector_development = {};
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* @license React
|
|
430
|
+
* use-sync-external-store-shim/with-selector.development.js
|
|
431
|
+
*
|
|
432
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
433
|
+
*
|
|
434
|
+
* This source code is licensed under the MIT license found in the
|
|
435
|
+
* LICENSE file in the root directory of this source tree.
|
|
436
|
+
*/
|
|
437
|
+
|
|
438
|
+
var hasRequiredWithSelector_development;
|
|
439
|
+
|
|
440
|
+
function requireWithSelector_development () {
|
|
441
|
+
if (hasRequiredWithSelector_development) return withSelector_development;
|
|
442
|
+
hasRequiredWithSelector_development = 1;
|
|
443
|
+
|
|
444
|
+
if (process.env.NODE_ENV !== "production") {
|
|
445
|
+
(function() {
|
|
446
|
+
|
|
447
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
448
|
+
if (
|
|
449
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
450
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
|
|
451
|
+
'function'
|
|
452
|
+
) {
|
|
453
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
|
|
454
|
+
}
|
|
455
|
+
var React = require$$0;
|
|
456
|
+
var shim = requireShim();
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
|
460
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
|
461
|
+
*/
|
|
462
|
+
function is(x, y) {
|
|
463
|
+
return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
|
|
464
|
+
;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
var objectIs = typeof Object.is === 'function' ? Object.is : is;
|
|
468
|
+
|
|
469
|
+
var useSyncExternalStore = shim.useSyncExternalStore;
|
|
470
|
+
|
|
471
|
+
// for CommonJS interop.
|
|
472
|
+
|
|
473
|
+
var useRef = React.useRef,
|
|
474
|
+
useEffect = React.useEffect,
|
|
475
|
+
useMemo = React.useMemo,
|
|
476
|
+
useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.
|
|
477
|
+
|
|
478
|
+
function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
|
|
479
|
+
// Use this to track the rendered snapshot.
|
|
480
|
+
var instRef = useRef(null);
|
|
481
|
+
var inst;
|
|
482
|
+
|
|
483
|
+
if (instRef.current === null) {
|
|
484
|
+
inst = {
|
|
485
|
+
hasValue: false,
|
|
486
|
+
value: null
|
|
487
|
+
};
|
|
488
|
+
instRef.current = inst;
|
|
489
|
+
} else {
|
|
490
|
+
inst = instRef.current;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
var _useMemo = useMemo(function () {
|
|
494
|
+
// Track the memoized state using closure variables that are local to this
|
|
495
|
+
// memoized instance of a getSnapshot function. Intentionally not using a
|
|
496
|
+
// useRef hook, because that state would be shared across all concurrent
|
|
497
|
+
// copies of the hook/component.
|
|
498
|
+
var hasMemo = false;
|
|
499
|
+
var memoizedSnapshot;
|
|
500
|
+
var memoizedSelection;
|
|
501
|
+
|
|
502
|
+
var memoizedSelector = function (nextSnapshot) {
|
|
503
|
+
if (!hasMemo) {
|
|
504
|
+
// The first time the hook is called, there is no memoized result.
|
|
505
|
+
hasMemo = true;
|
|
506
|
+
memoizedSnapshot = nextSnapshot;
|
|
507
|
+
|
|
508
|
+
var _nextSelection = selector(nextSnapshot);
|
|
509
|
+
|
|
510
|
+
if (isEqual !== undefined) {
|
|
511
|
+
// Even if the selector has changed, the currently rendered selection
|
|
512
|
+
// may be equal to the new selection. We should attempt to reuse the
|
|
513
|
+
// current value if possible, to preserve downstream memoizations.
|
|
514
|
+
if (inst.hasValue) {
|
|
515
|
+
var currentSelection = inst.value;
|
|
516
|
+
|
|
517
|
+
if (isEqual(currentSelection, _nextSelection)) {
|
|
518
|
+
memoizedSelection = currentSelection;
|
|
519
|
+
return currentSelection;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
memoizedSelection = _nextSelection;
|
|
525
|
+
return _nextSelection;
|
|
526
|
+
} // We may be able to reuse the previous invocation's result.
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
// We may be able to reuse the previous invocation's result.
|
|
530
|
+
var prevSnapshot = memoizedSnapshot;
|
|
531
|
+
var prevSelection = memoizedSelection;
|
|
532
|
+
|
|
533
|
+
if (objectIs(prevSnapshot, nextSnapshot)) {
|
|
534
|
+
// The snapshot is the same as last time. Reuse the previous selection.
|
|
535
|
+
return prevSelection;
|
|
536
|
+
} // The snapshot has changed, so we need to compute a new selection.
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
// The snapshot has changed, so we need to compute a new selection.
|
|
540
|
+
var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data
|
|
541
|
+
// has changed. If it hasn't, return the previous selection. That signals
|
|
542
|
+
// to React that the selections are conceptually equal, and we can bail
|
|
543
|
+
// out of rendering.
|
|
544
|
+
|
|
545
|
+
// If a custom isEqual function is provided, use that to check if the data
|
|
546
|
+
// has changed. If it hasn't, return the previous selection. That signals
|
|
547
|
+
// to React that the selections are conceptually equal, and we can bail
|
|
548
|
+
// out of rendering.
|
|
549
|
+
if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {
|
|
550
|
+
return prevSelection;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
memoizedSnapshot = nextSnapshot;
|
|
554
|
+
memoizedSelection = nextSelection;
|
|
555
|
+
return nextSelection;
|
|
556
|
+
}; // Assigning this to a constant so that Flow knows it can't change.
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
// Assigning this to a constant so that Flow knows it can't change.
|
|
560
|
+
var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;
|
|
561
|
+
|
|
562
|
+
var getSnapshotWithSelector = function () {
|
|
563
|
+
return memoizedSelector(getSnapshot());
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {
|
|
567
|
+
return memoizedSelector(maybeGetServerSnapshot());
|
|
568
|
+
};
|
|
569
|
+
return [getSnapshotWithSelector, getServerSnapshotWithSelector];
|
|
570
|
+
}, [getSnapshot, getServerSnapshot, selector, isEqual]),
|
|
571
|
+
getSelection = _useMemo[0],
|
|
572
|
+
getServerSelection = _useMemo[1];
|
|
573
|
+
|
|
574
|
+
var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);
|
|
575
|
+
useEffect(function () {
|
|
576
|
+
inst.hasValue = true;
|
|
577
|
+
inst.value = value;
|
|
578
|
+
}, [value]);
|
|
579
|
+
useDebugValue(value);
|
|
580
|
+
return value;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
withSelector_development.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;
|
|
584
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
585
|
+
if (
|
|
586
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
587
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
|
|
588
|
+
'function'
|
|
589
|
+
) {
|
|
590
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
})();
|
|
594
|
+
}
|
|
595
|
+
return withSelector_development;
|
|
75
596
|
}
|
|
76
597
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
598
|
+
(function (module) {
|
|
599
|
+
|
|
600
|
+
if (process.env.NODE_ENV === 'production') {
|
|
601
|
+
module.exports = requireWithSelector_production_min();
|
|
602
|
+
} else {
|
|
603
|
+
module.exports = requireWithSelector_development();
|
|
604
|
+
}
|
|
605
|
+
} (withSelector));
|
|
606
|
+
|
|
607
|
+
var useSyncExternalStoreExports = /*@__PURE__*/getDefaultExportFromCjs(withSelector.exports);
|
|
608
|
+
|
|
609
|
+
const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
|
|
610
|
+
function useStore(api, selector = api.getState, equalityFn) {
|
|
611
|
+
const slice = useSyncExternalStoreWithSelector(
|
|
612
|
+
api.subscribe,
|
|
613
|
+
api.getState,
|
|
614
|
+
api.getServerState || api.getState,
|
|
615
|
+
selector,
|
|
616
|
+
equalityFn
|
|
617
|
+
);
|
|
618
|
+
require$$0.useDebugValue(slice);
|
|
619
|
+
return slice;
|
|
620
|
+
}
|
|
621
|
+
const createImpl = (createState) => {
|
|
80
622
|
const api = typeof createState === "function" ? createStore(createState) : createState;
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
623
|
+
const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);
|
|
624
|
+
Object.assign(useBoundStore, api);
|
|
625
|
+
return useBoundStore;
|
|
626
|
+
};
|
|
627
|
+
const create = (createState) => createState ? createImpl(createState) : createImpl;
|
|
628
|
+
|
|
629
|
+
const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {
|
|
630
|
+
const { enabled, anonymousActionType, ...options } = devtoolsOptions;
|
|
631
|
+
let extensionConnector;
|
|
632
|
+
try {
|
|
633
|
+
extensionConnector = (enabled != null ? enabled : (undefined && undefined.MODE) !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
634
|
+
} catch {
|
|
635
|
+
}
|
|
636
|
+
if (!extensionConnector) {
|
|
637
|
+
if ((undefined && undefined.MODE) !== "production" && enabled) {
|
|
638
|
+
console.warn(
|
|
639
|
+
"[zustand devtools middleware] Please install/enable Redux devtools extension"
|
|
640
|
+
);
|
|
97
641
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const nextState = api.getState();
|
|
112
|
-
const nextStateSlice = selectorRef.current(nextState);
|
|
113
|
-
if (!equalityFnRef.current(currentSliceRef.current, nextStateSlice)) {
|
|
114
|
-
stateRef.current = nextState;
|
|
115
|
-
currentSliceRef.current = nextStateSlice;
|
|
116
|
-
forceUpdate();
|
|
117
|
-
}
|
|
118
|
-
} catch (error) {
|
|
119
|
-
erroredRef.current = true;
|
|
120
|
-
forceUpdate();
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
const unsubscribe = api.subscribe(listener);
|
|
124
|
-
if (api.getState() !== stateBeforeSubscriptionRef.current) {
|
|
125
|
-
listener();
|
|
126
|
-
}
|
|
127
|
-
return unsubscribe;
|
|
128
|
-
}, []);
|
|
129
|
-
const sliceToReturn = hasNewStateSlice ? newStateSlice : currentSliceRef.current;
|
|
130
|
-
react.useDebugValue(sliceToReturn);
|
|
131
|
-
return sliceToReturn;
|
|
642
|
+
return fn(set, get, api);
|
|
643
|
+
}
|
|
644
|
+
const extension = extensionConnector.connect(options);
|
|
645
|
+
let isRecording = true;
|
|
646
|
+
api.setState = (state, replace, nameOrAction) => {
|
|
647
|
+
const r = set(state, replace);
|
|
648
|
+
if (!isRecording)
|
|
649
|
+
return r;
|
|
650
|
+
extension.send(
|
|
651
|
+
nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction,
|
|
652
|
+
get()
|
|
653
|
+
);
|
|
654
|
+
return r;
|
|
132
655
|
};
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
next() {
|
|
139
|
-
const done = items.length <= 0;
|
|
140
|
-
return { value: items.shift(), done };
|
|
141
|
-
}
|
|
142
|
-
};
|
|
656
|
+
const setStateFromDevtools = (...a) => {
|
|
657
|
+
const originalIsRecording = isRecording;
|
|
658
|
+
isRecording = false;
|
|
659
|
+
set(...a);
|
|
660
|
+
isRecording = originalIsRecording;
|
|
143
661
|
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const devtoolsOptions = options === void 0 ? { name: void 0, anonymousActionType: void 0 } : typeof options === "string" ? { name: options } : options;
|
|
156
|
-
if (typeof ((_a = devtoolsOptions == null ? void 0 : devtoolsOptions.serialize) == null ? void 0 : _a.options) !== "undefined") {
|
|
157
|
-
console.warn("[zustand devtools middleware]: `serialize.options` is deprecated, just use `serialize`");
|
|
158
|
-
}
|
|
159
|
-
let extensionConnector;
|
|
160
|
-
try {
|
|
161
|
-
extensionConnector = window.__REDUX_DEVTOOLS_EXTENSION__ || window.top.__REDUX_DEVTOOLS_EXTENSION__;
|
|
162
|
-
} catch {
|
|
163
|
-
}
|
|
164
|
-
if (!extensionConnector) {
|
|
165
|
-
if ((undefined && undefined.MODE) !== "production" && typeof window !== "undefined") {
|
|
166
|
-
console.warn("[zustand devtools middleware] Please install/enable Redux devtools extension");
|
|
167
|
-
}
|
|
168
|
-
return fn(set, get, api);
|
|
169
|
-
}
|
|
170
|
-
let extension = Object.create(extensionConnector.connect(devtoolsOptions));
|
|
171
|
-
let didWarnAboutDevtools = false;
|
|
172
|
-
Object.defineProperty(api, "devtools", {
|
|
173
|
-
get: () => {
|
|
174
|
-
if (!didWarnAboutDevtools) {
|
|
175
|
-
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");
|
|
176
|
-
didWarnAboutDevtools = true;
|
|
177
|
-
}
|
|
178
|
-
return extension;
|
|
179
|
-
},
|
|
180
|
-
set: (value) => {
|
|
181
|
-
if (!didWarnAboutDevtools) {
|
|
182
|
-
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");
|
|
183
|
-
didWarnAboutDevtools = true;
|
|
184
|
-
}
|
|
185
|
-
extension = value;
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
let didWarnAboutPrefix = false;
|
|
189
|
-
Object.defineProperty(extension, "prefix", {
|
|
190
|
-
get: () => {
|
|
191
|
-
if (!didWarnAboutPrefix) {
|
|
192
|
-
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.");
|
|
193
|
-
didWarnAboutPrefix = true;
|
|
194
|
-
}
|
|
195
|
-
return "";
|
|
196
|
-
},
|
|
197
|
-
set: () => {
|
|
198
|
-
if (!didWarnAboutPrefix) {
|
|
199
|
-
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.");
|
|
200
|
-
didWarnAboutPrefix = true;
|
|
201
|
-
}
|
|
662
|
+
const initialState = fn(api.setState, get, api);
|
|
663
|
+
extension.init(initialState);
|
|
664
|
+
if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
|
|
665
|
+
let didWarnAboutReservedActionType = false;
|
|
666
|
+
const originalDispatch = api.dispatch;
|
|
667
|
+
api.dispatch = (...a) => {
|
|
668
|
+
if ((undefined && undefined.MODE) !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) {
|
|
669
|
+
console.warn(
|
|
670
|
+
'[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.'
|
|
671
|
+
);
|
|
672
|
+
didWarnAboutReservedActionType = true;
|
|
202
673
|
}
|
|
203
|
-
|
|
204
|
-
let isRecording = true;
|
|
205
|
-
api.setState = (state, replace, nameOrAction) => {
|
|
206
|
-
set(state, replace);
|
|
207
|
-
if (!isRecording)
|
|
208
|
-
return;
|
|
209
|
-
extension.send(nameOrAction === void 0 ? { type: devtoolsOptions.anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction, get());
|
|
210
|
-
};
|
|
211
|
-
const setStateFromDevtools = (...a) => {
|
|
212
|
-
const originalIsRecording = isRecording;
|
|
213
|
-
isRecording = false;
|
|
214
|
-
set(...a);
|
|
215
|
-
isRecording = originalIsRecording;
|
|
674
|
+
originalDispatch(...a);
|
|
216
675
|
};
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
676
|
+
}
|
|
677
|
+
extension.subscribe((message) => {
|
|
678
|
+
var _a;
|
|
679
|
+
switch (message.type) {
|
|
680
|
+
case "ACTION":
|
|
681
|
+
if (typeof message.payload !== "string") {
|
|
682
|
+
console.error(
|
|
683
|
+
"[zustand devtools middleware] Unsupported action format"
|
|
684
|
+
);
|
|
685
|
+
return;
|
|
226
686
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
extension.subscribe((message) => {
|
|
231
|
-
var _a2;
|
|
232
|
-
switch (message.type) {
|
|
233
|
-
case "ACTION":
|
|
234
|
-
if (typeof message.payload !== "string") {
|
|
235
|
-
console.error("[zustand devtools middleware] Unsupported action format");
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
return parseJsonThen(message.payload, (action) => {
|
|
687
|
+
return parseJsonThen(
|
|
688
|
+
message.payload,
|
|
689
|
+
(action) => {
|
|
239
690
|
if (action.type === "__setState") {
|
|
240
691
|
setStateFromDevtools(action.state);
|
|
241
692
|
return;
|
|
@@ -245,69 +696,60 @@ function devtools(fn, options) {
|
|
|
245
696
|
if (typeof api.dispatch !== "function")
|
|
246
697
|
return;
|
|
247
698
|
api.dispatch(action);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
setStateFromDevtools(lastComputedState);
|
|
272
|
-
extension.send(null, nextLiftedState);
|
|
699
|
+
}
|
|
700
|
+
);
|
|
701
|
+
case "DISPATCH":
|
|
702
|
+
switch (message.payload.type) {
|
|
703
|
+
case "RESET":
|
|
704
|
+
setStateFromDevtools(initialState);
|
|
705
|
+
return extension.init(api.getState());
|
|
706
|
+
case "COMMIT":
|
|
707
|
+
return extension.init(api.getState());
|
|
708
|
+
case "ROLLBACK":
|
|
709
|
+
return parseJsonThen(message.state, (state) => {
|
|
710
|
+
setStateFromDevtools(state);
|
|
711
|
+
extension.init(api.getState());
|
|
712
|
+
});
|
|
713
|
+
case "JUMP_TO_STATE":
|
|
714
|
+
case "JUMP_TO_ACTION":
|
|
715
|
+
return parseJsonThen(message.state, (state) => {
|
|
716
|
+
setStateFromDevtools(state);
|
|
717
|
+
});
|
|
718
|
+
case "IMPORT_STATE": {
|
|
719
|
+
const { nextLiftedState } = message.payload;
|
|
720
|
+
const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;
|
|
721
|
+
if (!lastComputedState)
|
|
273
722
|
return;
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
723
|
+
setStateFromDevtools(lastComputedState);
|
|
724
|
+
extension.send(
|
|
725
|
+
null,
|
|
726
|
+
nextLiftedState
|
|
727
|
+
);
|
|
728
|
+
return;
|
|
277
729
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
}
|
|
730
|
+
case "PAUSE_RECORDING":
|
|
731
|
+
return isRecording = !isRecording;
|
|
732
|
+
}
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
return initialState;
|
|
737
|
+
};
|
|
738
|
+
const devtools = devtoolsImpl;
|
|
284
739
|
const parseJsonThen = (stringified, f) => {
|
|
285
740
|
let parsed;
|
|
286
741
|
try {
|
|
287
742
|
parsed = JSON.parse(stringified);
|
|
288
743
|
} catch (e) {
|
|
289
|
-
console.error(
|
|
744
|
+
console.error(
|
|
745
|
+
"[zustand devtools middleware] Could not parse the received json",
|
|
746
|
+
e
|
|
747
|
+
);
|
|
290
748
|
}
|
|
291
749
|
if (parsed !== void 0)
|
|
292
750
|
f(parsed);
|
|
293
751
|
};
|
|
294
752
|
|
|
295
|
-
var __defProp = Object.defineProperty;
|
|
296
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
297
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
298
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
299
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
300
|
-
var __spreadValues = (a, b) => {
|
|
301
|
-
for (var prop in b || (b = {}))
|
|
302
|
-
if (__hasOwnProp.call(b, prop))
|
|
303
|
-
__defNormalProp(a, prop, b[prop]);
|
|
304
|
-
if (__getOwnPropSymbols)
|
|
305
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
306
|
-
if (__propIsEnum.call(b, prop))
|
|
307
|
-
__defNormalProp(a, prop, b[prop]);
|
|
308
|
-
}
|
|
309
|
-
return a;
|
|
310
|
-
};
|
|
311
753
|
const toThenable = (fn) => (input) => {
|
|
312
754
|
try {
|
|
313
755
|
const result = fn(input);
|
|
@@ -333,18 +775,19 @@ const toThenable = (fn) => (input) => {
|
|
|
333
775
|
};
|
|
334
776
|
}
|
|
335
777
|
};
|
|
336
|
-
const
|
|
337
|
-
let options =
|
|
778
|
+
const persistImpl = (config, baseOptions) => (set, get, api) => {
|
|
779
|
+
let options = {
|
|
338
780
|
getStorage: () => localStorage,
|
|
339
781
|
serialize: JSON.stringify,
|
|
340
782
|
deserialize: JSON.parse,
|
|
341
783
|
partialize: (state) => state,
|
|
342
784
|
version: 0,
|
|
343
|
-
merge: (persistedState, currentState) =>
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
785
|
+
merge: (persistedState, currentState) => ({
|
|
786
|
+
...currentState,
|
|
787
|
+
...persistedState
|
|
788
|
+
}),
|
|
789
|
+
...baseOptions
|
|
790
|
+
};
|
|
348
791
|
let hasHydrated = false;
|
|
349
792
|
const hydrationListeners = /* @__PURE__ */ new Set();
|
|
350
793
|
const finishHydrationListeners = /* @__PURE__ */ new Set();
|
|
@@ -354,27 +797,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
354
797
|
} catch (e) {
|
|
355
798
|
}
|
|
356
799
|
if (!storage) {
|
|
357
|
-
return config(
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
800
|
+
return config(
|
|
801
|
+
(...args) => {
|
|
802
|
+
console.warn(
|
|
803
|
+
`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
|
|
804
|
+
);
|
|
805
|
+
set(...args);
|
|
806
|
+
},
|
|
807
|
+
get,
|
|
808
|
+
api
|
|
809
|
+
);
|
|
363
810
|
}
|
|
364
811
|
const thenableSerialize = toThenable(options.serialize);
|
|
365
812
|
const setItem = () => {
|
|
366
|
-
const state = options.partialize(
|
|
367
|
-
if (options.whitelist) {
|
|
368
|
-
Object.keys(state).forEach((key) => {
|
|
369
|
-
var _a;
|
|
370
|
-
!((_a = options.whitelist) == null ? void 0 : _a.includes(key)) && delete state[key];
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
if (options.blacklist) {
|
|
374
|
-
options.blacklist.forEach((key) => delete state[key]);
|
|
375
|
-
}
|
|
813
|
+
const state = options.partialize({ ...get() });
|
|
376
814
|
let errorInSync;
|
|
377
|
-
const thenable = thenableSerialize({ state, version: options.version }).then(
|
|
815
|
+
const thenable = thenableSerialize({ state, version: options.version }).then(
|
|
816
|
+
(serializedValue) => storage.setItem(options.name, serializedValue)
|
|
817
|
+
).catch((e) => {
|
|
378
818
|
errorInSync = e;
|
|
379
819
|
});
|
|
380
820
|
if (errorInSync) {
|
|
@@ -387,10 +827,14 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
387
827
|
savedSetState(state, replace);
|
|
388
828
|
void setItem();
|
|
389
829
|
};
|
|
390
|
-
const configResult = config(
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
830
|
+
const configResult = config(
|
|
831
|
+
(...args) => {
|
|
832
|
+
set(...args);
|
|
833
|
+
void setItem();
|
|
834
|
+
},
|
|
835
|
+
get,
|
|
836
|
+
api
|
|
837
|
+
);
|
|
394
838
|
let stateFromStorage;
|
|
395
839
|
const hydrate = () => {
|
|
396
840
|
var _a;
|
|
@@ -407,16 +851,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
407
851
|
if (deserializedStorageValue) {
|
|
408
852
|
if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
|
|
409
853
|
if (options.migrate) {
|
|
410
|
-
return options.migrate(
|
|
854
|
+
return options.migrate(
|
|
855
|
+
deserializedStorageValue.state,
|
|
856
|
+
deserializedStorageValue.version
|
|
857
|
+
);
|
|
411
858
|
}
|
|
412
|
-
console.error(
|
|
859
|
+
console.error(
|
|
860
|
+
`State loaded from storage couldn't be migrated since no migrate function was provided`
|
|
861
|
+
);
|
|
413
862
|
} else {
|
|
414
863
|
return deserializedStorageValue.state;
|
|
415
864
|
}
|
|
416
865
|
}
|
|
417
866
|
}).then((migratedState) => {
|
|
418
867
|
var _a2;
|
|
419
|
-
stateFromStorage = options.merge(
|
|
868
|
+
stateFromStorage = options.merge(
|
|
869
|
+
migratedState,
|
|
870
|
+
(_a2 = get()) != null ? _a2 : configResult
|
|
871
|
+
);
|
|
420
872
|
set(stateFromStorage, true);
|
|
421
873
|
return setItem();
|
|
422
874
|
}).then(() => {
|
|
@@ -429,15 +881,18 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
429
881
|
};
|
|
430
882
|
api.persist = {
|
|
431
883
|
setOptions: (newOptions) => {
|
|
432
|
-
options =
|
|
884
|
+
options = {
|
|
885
|
+
...options,
|
|
886
|
+
...newOptions
|
|
887
|
+
};
|
|
433
888
|
if (newOptions.getStorage) {
|
|
434
889
|
storage = newOptions.getStorage();
|
|
435
890
|
}
|
|
436
891
|
},
|
|
437
892
|
clearStorage: () => {
|
|
438
|
-
|
|
439
|
-
(_a = storage == null ? void 0 : storage.removeItem) == null ? void 0 : _a.call(storage, options.name);
|
|
893
|
+
storage == null ? void 0 : storage.removeItem(options.name);
|
|
440
894
|
},
|
|
895
|
+
getOptions: () => options,
|
|
441
896
|
rehydrate: () => hydrate(),
|
|
442
897
|
hasHydrated: () => hasHydrated,
|
|
443
898
|
onHydrate: (cb) => {
|
|
@@ -456,6 +911,7 @@ const persist = (config, baseOptions) => (set, get, api) => {
|
|
|
456
911
|
hydrate();
|
|
457
912
|
return stateFromStorage || configResult;
|
|
458
913
|
};
|
|
914
|
+
const persist = persistImpl;
|
|
459
915
|
|
|
460
916
|
const walletStoreSelector = (state) => ({
|
|
461
917
|
accounts: state.accounts,
|
|
@@ -465,7 +921,7 @@ const walletStoreSelector = (state) => ({
|
|
|
465
921
|
addAccounts: state.addAccounts,
|
|
466
922
|
removeAccounts: state.removeAccounts,
|
|
467
923
|
});
|
|
468
|
-
const useWalletStore = create(
|
|
924
|
+
const useWalletStore = create()(immer(persist(devtools((set, _get) => ({
|
|
469
925
|
accounts: [],
|
|
470
926
|
activeAccount: null,
|
|
471
927
|
setActiveAccount: (account) => {
|
|
@@ -499,28 +955,1215 @@ const useWalletStore = create(devtools(persist(immer((set, _get) => ({
|
|
|
499
955
|
})), {
|
|
500
956
|
name: "txnlab-use-wallet",
|
|
501
957
|
version: 0, // increment to deprecate stored data
|
|
502
|
-
})
|
|
503
|
-
|
|
958
|
+
})));
|
|
959
|
+
|
|
960
|
+
const icon$6 = "data:image/svg+xml;base64," +
|
|
961
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=";
|
|
962
|
+
const PERA_WALLET = {
|
|
963
|
+
id: exports.PROVIDER_ID.PERA_WALLET,
|
|
964
|
+
name: "Pera Wallet",
|
|
965
|
+
icon: icon$6,
|
|
966
|
+
isWalletConnect: true,
|
|
967
|
+
};
|
|
968
|
+
|
|
969
|
+
const icon$5 = "data:image/svg+xml;base64," +
|
|
970
|
+
"PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHBhdGggZmlsbD0iIzI0NUVDNiIgZD0iTTE2LDMyYy0zLjIsMC02LjItMC45LTguOS0yLjdjLTIuNi0xLjgtNC43LTQuMy01LjktNy4yQzAsMTkuMi0wLjMsMTYsMC4zLDEyLjlDMC45LDkuOCwyLjQsNyw0LjcsNC43IEM2LjIsMy4yLDcuOSwyLDkuOSwxLjJDMTEuOCwwLjQsMTMuOSwwLDE2LDBzNC4yLDAuNCw2LjEsMS4yYzEuOSwwLjgsMy43LDIsNS4yLDMuNXMyLjcsMy4zLDMuNSw1LjJjMC44LDEuOSwxLjIsNCwxLjIsNi4xIHMtMC40LDQuMi0xLjIsNi4xYy0wLjgsMS45LTIsMy43LTMuNSw1LjJjLTEuNSwxLjUtMy4yLDIuNy01LjIsMy41QzIwLjIsMzEuNiwxOC4xLDMyLDE2LDMyTDE2LDMyeiBNMjAuMiwxMS4ybDAuMSwwLjVsMi42LDkuNWgyLjEgTDIxLjUsOC45bC0wLjEtMC4zaC0xLjlsMCwwLjFsLTEuNywzLjFMMTYsMTQuOWwwLDAuMWwwLTAuMWwtMC4yLTAuOGwtMC42LTIuNGwtMC4xLTAuMmwtMC43LTIuNmwtMC4xLTAuM2gtMS45bDAsMC4xbC0xLjcsMy4xIGwtMS44LDMuMkw3LjEsMThsLTEuOCwzLjJoMi4xTDkuMiwxOGwxLjgtMy4ybDEuOC0zLjJsMC4zLTAuNWwwLjEsMC41bDAuNSwyLjFsMC43LDIuNmwwLjIsMC45TDE0LjIsMThsLTEuOCwzLjJoMi4xbDAuOC0xLjMgbDEuMy0yLjNsMS41LTIuN2wxLjgtMy4yTDIwLjIsMTEuMkwyMC4yLDExLjJ6Ii8+Cjwvc3ZnPgo=";
|
|
971
|
+
const MYALGO_WALLET = {
|
|
972
|
+
id: exports.PROVIDER_ID.MYALGO_WALLET,
|
|
973
|
+
name: "MyAlgo Wallet",
|
|
974
|
+
icon: icon$5,
|
|
975
|
+
isWalletConnect: false,
|
|
976
|
+
};
|
|
977
|
+
|
|
978
|
+
const icon$4 = "data:image/svg+xml;base64," +
|
|
979
|
+
"PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
|
|
980
|
+
const ALGO_SIGNER = {
|
|
981
|
+
id: exports.PROVIDER_ID.ALGO_SIGNER,
|
|
982
|
+
name: "AlgoSigner",
|
|
983
|
+
icon: icon$4,
|
|
984
|
+
isWalletConnect: false,
|
|
985
|
+
};
|
|
986
|
+
|
|
987
|
+
const icon$3 = "data:image/svg+xml;base64," +
|
|
988
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
|
|
989
|
+
const DEFLY = {
|
|
990
|
+
id: exports.PROVIDER_ID.DEFLY,
|
|
991
|
+
name: "Defly Wallet",
|
|
992
|
+
icon: icon$3,
|
|
993
|
+
isWalletConnect: true,
|
|
994
|
+
};
|
|
995
|
+
|
|
996
|
+
const icon$2 = "data:image/svg+xml;base64," +
|
|
997
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
|
|
998
|
+
const EXODUS = {
|
|
999
|
+
id: exports.PROVIDER_ID.EXODUS,
|
|
1000
|
+
name: "Exodus",
|
|
1001
|
+
icon: icon$2,
|
|
1002
|
+
isWalletConnect: false,
|
|
1003
|
+
};
|
|
1004
|
+
|
|
1005
|
+
const icon$1 = "data:image/svg+xml;base64," +
|
|
1006
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+";
|
|
1007
|
+
const KMD_WALLET = {
|
|
1008
|
+
id: exports.PROVIDER_ID.KMD_WALLET,
|
|
1009
|
+
name: "KMD",
|
|
1010
|
+
icon: icon$1,
|
|
1011
|
+
isWalletConnect: false,
|
|
1012
|
+
};
|
|
1013
|
+
|
|
1014
|
+
const icon = "data:image/svg+xml;base64," +
|
|
1015
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==";
|
|
1016
|
+
const WALLET_CONNECT = {
|
|
1017
|
+
id: exports.PROVIDER_ID.WALLET_CONNECT,
|
|
1018
|
+
name: "Wallet Connect",
|
|
1019
|
+
icon,
|
|
1020
|
+
isWalletConnect: true,
|
|
1021
|
+
};
|
|
1022
|
+
|
|
1023
|
+
const providers = {
|
|
1024
|
+
[exports.PROVIDER_ID.PERA_WALLET]: PERA_WALLET,
|
|
1025
|
+
[exports.PROVIDER_ID.MYALGO_WALLET]: MYALGO_WALLET,
|
|
1026
|
+
[exports.PROVIDER_ID.DEFLY]: DEFLY,
|
|
1027
|
+
[exports.PROVIDER_ID.ALGO_SIGNER]: ALGO_SIGNER,
|
|
1028
|
+
[exports.PROVIDER_ID.EXODUS]: EXODUS,
|
|
1029
|
+
[exports.PROVIDER_ID.KMD_WALLET]: KMD_WALLET,
|
|
1030
|
+
[exports.PROVIDER_ID.WALLET_CONNECT]: WALLET_CONNECT,
|
|
1031
|
+
};
|
|
1032
|
+
|
|
1033
|
+
const audio = "data:audio/mp3;base64,SUQzBAAAAAIYBlRJVDIAAAAWAAAAMTAgU2Vjb25kcyBvZiBTaWxlbmNlVFBFMQAAABIAAABBbmFyIFNvZnR3YXJlIExMQ1RBTEIAAAAMAAAAQmxhbmsgQXVkaW9BUElDAAIPAgAAAGltYWdlL2pwZWcAAwCJUE5HDQoaCgAAAA1JSERSAAAEOAAABDgIBgAAAOwQbI8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACD0AAAg9AQWVVbYAAAAHdElNRQffCgsFHDEDbwR2AAAgAElEQVR42uzde5RVZd0H8N8wDDcBAS8o6oCJVyxTsDSxojJvgVYq3jVNUQgzaZWmpqh56+ItNa+kr4Cay9Q0DQ1DWb2WeSm8pGRy0RAEgRFhuIzz/tFbC5yZc86eOWfmPDOfz1rvemvvZz9779+zz3DOt2fvXRER9QEAAACQsE5KAAAAAKROwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8BBq9pss81i4sSJMXToUMUAAACgaCoiol4ZaA177rln3HzzzdG/f/+oqamJww8/PGbNmqUwAAAAtJgZHLSKk046Ke67777o379/RET07t07pk6dGtXV1YoDAABAi5nBQcmde+65MW7cuEbXvfjii3HIIYfE2rVrFQoAAIBmq4yIC5WBUqioqIgf/ehHceqppzbZZosttohevXrFk08+qWAAAAA0/zdomMFBCVRWVsZPfvKTGD16dEHtjzrqqJgxY4bCAQAA0CwCDoquU6dOccMNN8SoUaMK3mbOnDkxYsSIWL16tQICAACQmVtUKLoLL7wwjj766Ezb9OnTJz788MP44x//qIAAAABkZgYHRXXyySfHxRdf3Kxt16xZEyNGjIg333xTIQEAAMjEa2Ipmv333z8mTpzY7O27dOnSou0BAADouMzgoCh23333uO+++6J79+4t7utLX/pSvPLKK4oKAABAwczgoMW22mqruOOOO4oSbkREjBs3TlEBAADIxAwOWqRTp05x3333xV577VW0Puvq6uIzn/lMzJ8/X4EBAAAo7PepEtASp59+elHDjYiIysrKOO200xQXAACAgpnBQbPtuuuu8cgjj0RVVVXR+66trY0999wzlixZotAAAADkZQYHzdKtW7e4/vrrSxJu/Kf/r3/96woNAABAQQQcNMv5558f22+/fUn3MWrUKIUGAACgIAIOMvvCF74Q3/jGN0q+nz322COqq6sVHAAAgLwEHGRSVVUVl156adH7Xbp0aaPLzeIAAACgEAIOMjn22GOLPqvimWeeic997nOxaNGiBusOOeQQRQcAACAvAQcF69GjR5x55plF7fOhhx6KI488MhYvXhxTp05tsH7IkCGx3XbbKT4AAAA5CTgo2De/+c3YbLPNitbfM888E+PGjYs1a9ZERMTkyZOjvr7hW4vN4gAAACAfAQcF6dOnT4wdO7Zo/S1dujTGjh0bdXV1/1321ltvxaxZsxq0HTFihAEAAAAgJwEHBfnWt74VvXv3Llp/Z555ZrzzzjsNlj/++OMNln3iE5+Irl27GgQAAACaJOAgr/79+8dJJ51UtP5uu+22RoOMiIhp06Y1WFZVVRWf+MQnDAQAAABNEnCQ19ixY6Nbt25F6evdd9+Nyy+/vMn1s2bNanRmx5577mkgAAAAaJKAg9wXSKdOMWrUqKL199Of/jQ++OCDnG0am90h4AAAACDn71clIJe99tor+vfvX5S+3njjjZgyZUredo0FHMOGDTMYAAAANEnAQU4jR44sWl8/+tGPYt26dXnbPf3007Fq1aoNlm2yySax7bbbGhAAAAAaJeCgSZWVlXHwwQcXpa9nn302HnvssYLarl69Ol588cUGyz/1qU8ZFAAAABol4KBJe++9d2y66aZF6euiiy7K1P6VV15psGyPPfYwKAAAADRKwEGTDjnkkKL088gjj8Rzzz2XaZuXX365wbKBAwcaFAAAABol4KBRnTt3joMOOqjF/axbty4uvfTSzNs1NoNjq622MjAAAAA0SsBBo/bZZ5/o27dvi/v5n//5n3jzzTczb/faa69FfX39BssGDBhgYAAAAGiUgINGFeOBnitWrIirrrqqWduuXr063n///Q2Wde/evSihCwAAAO2PgING7brrri3u46abborFixc3e/ulS5c2WOY2FQAAABoj4KBRQ4YMadH2a9eujV/+8pct6mPZsmUNlrlNBQAAgMYIOGigT58+LQ4SHnrooViyZEmL+mgs4DCDAwAAgMYIOGhg8ODBLe6jpbM3IiI++OCDBssEHAAAADRGwEED/fr1a9H2s2bNiueee67Fx9HYA0UFHAAAADRGwEEDLX1TyaRJk4pyHJtvvnmDZZ7BAQAAQGMEHDTQkhkcy5YtiwceeKAox7HZZps1WNazZ08DBAAAQAMCDhro06dPs7e9++67o7a2tsXH0KVLl+jdu3eD5Z07dzZAAAAANCDgoIHKyspmbVdfXx933nlnUY5hu+22K+qxAQAA0L4JOGhg5cqVzdpu+vTpMWfOnKIcw/7779/ocgEHAAAAjRFw0EBzA45ivBr2Pw488MBGl7tFBQAAgMYIOGjggw8+yLzN3Llz48knnyzK/rfaaqv4+Mc/3ug6AQcAAACNEXDQQHNmcEyePDk+/PDDouz/oIMOanKdW1QAAABojICDBpoTcDz22GNF2XePHj1i7NixTa4XcAAAANAYAQcNZL1FZc6cOfGPf/yjKPseP3589O/fv8n1Ag4AAAAaI+CggawzOKZNm1aU/W699dZx2mmn5WzjGRwAAAA0RsBBA1lncDz++ONF2e95550XXbt2zdmmWM/5AAAAoH0RcNBAlhkcNTU18ac//anF+9xzzz1j1KhRedstWrTIAAEAANCAgIMG3nnnnaivry+o7fTp02PdunUt2l9FRUVMnDixoLb/+te/DBAAAAANCDhoYPXq1bFw4cKC2hbj+RuHHXZYfPKTnyyo7YIFCwwQAAAADQg4aNScOXPytlm3bl1Mnz69Rfvp0aNH/OAHPyi4vYADAACAxgg4aNTcuXPztvnzn/8cNTU1LdrPuHHjcr4W9qMEHAAAADRGwEGjCgk4Xn/99RbtY6uttorTTz890zaewQEAAEBjBBw0qpBbVJYvX96ifVx55ZXRrVu3TNuYwQEAAEBjBBw0at68eXnbtCTgOO6442LEiBGZtxNwAAAA0JjOSkBjCpnBsWzZsmb1PXDgwLjgggsyb7dmzZp47733DA4AANCqKioqmr0sa9tCt1+3bl18+OGHBmc9Ao717LTTTrHjjju2yoVbqu1b+mFaf3ltbW3OW0h233336Ny5c6Z9VVRUxJgxY6JHjx6Zx2fBggVx4oknluRcy2Vcy+EPain2laVdSuea0nWVyjXoXNvn562tx6pcz7UUY9Xevos4V99FfBfxXaRcPgPl6OSTT45HH33UD/n1xzQi6pXh3yZMmBATJkxQCAAAAMraKaecEo888ohCrMcMjiJZvHhxo7ds1Nc3nh9lWZ61j6Zk7bu6ujp69+7dZH8LFiyIxYsXF3yM3bp1ix122KHZSens2bPj/fffb9b5t8U4pDDG5VyTVMcy6z6LcZ4pjHG51NvnNYyxz6ux7EDfF4yxsWwP36E68vf7Aw44IMaNG9fk+k6dPFJTwFEi1113Xdxyyy3t6py+973vxZlnntnk+nvvvTeuuOKKgvqqqqqK3/72t80ON9asWRNf/vKXY/Xq1S42AACg3dtpp51yrk/9FptSEPnQpL/97W851/fp06fgvs4666wYMmRIs4/lL3/5i3ADAADoMPI9QNQMjkZqogQ0ZdasWTnX9+3bt6B+9thjj/jWt77VomP54x//aEAAAIAOQ8CRnYrQpLfffjvna1kLmcHRrVu3uPbaa6OysrJFxzJz5kwDAgAAdBj5ntch4GikJkpALrlmcVRXV+fd/rzzzouPfexjLTqGVatWxQsvvGAwAACADsMMjuxUhJxyPYejuro6unbt2uT64cOHxze+8Y0WH8PMmTNj7dq1BgMAAOgw8s3g8JDRhgQc5JQr4OjUqVOTszM22WSTuOaaa4ryobvzzjsNBAAA0KHkm8HR0scAtEcCDnLK96DR7bffvtEP2o033hhbbrlli/c/Z86cmD59uoEAAAA6FLeoZKci5DRv3rxYvnx5k+sbCzjOOeecGD58eFH2f8cdd+SdmgUAANDeeMhodipCXrlmcXw04Dj44INj7NixRdnvqlWrYurUqQYAAADocMzgyE5FyCvXczjWDzgGDx4cV111VdH2e//990dNTY0BAAAAOpx8AYeHjDbUWQnIJ1fAsd1220VlZWV07949br/99ujZs2fR9jtp0iTFBwAAOiQzOLJTEfLKFXB06dIlqqur46qrrorBgwcXbZ9/+tOf4pVXXlF8AACgQxJwZKci5DV37tyct4pcfvnlcfDBBxd1nzfeeKPCAwAAHZaHjGanIhT0wXrppZeaXL/vvvsWdX9PPfVUTJs2TeEBAIAO/Tss5495AUfDmigBhch1m0oxrVu3Ls4//3wFBwAAOjS3qGSnIhQk16tii+n222+P2bNnKzgAANChCTiyUxEK0hozOBYvXhw/+9nPFBsAAOjwBBzZqQgFefPNN2PFihUl3cell16a82GmAAAAHYWAIzsVoeAP18svv1yy/l988cW45557FBoAACA8ZLQ5VISCvfLKKyX74J533nl5P8AAAAAdRb4ZHBUVFYr0EQIOCjJkyJA47LDDStL3TTfdFM8//7wiAwAA/D+3qGSnIuQ1aNCgmDJlSvTq1avofb/44otx2WWXKTIAAMB6BBzZqQg59e/fP+65557YbLPNit73+++/H6effnqsXbtWoQEAANYj4MhORWjSxhtvHFOnTo1tttmmJP1/73vfi7lz5yo0AABA1h/zAo6GNVECGtO9e/e46667YqeddipJ/1OnTo0HH3xQoQEAABphBkd2KkIDVVVVceutt8bQoUNL0v/rr78e5513nkIDAAA0QcCRnYqwgYqKirjmmmtixIgRJel/9erVcdppp8WqVasUGwAAoAkCjuxUhA1ccsklceihh5as/3PPPTf+/ve/KzQAAEAOAo7sOisBEf+euXHppZfGCSecULJ93HjjjTFlyhTFBgAAyCNfwFFRUaFIHyHgIDp16hQ//elPY/To0SXbxyOPPBKXXHKJYgMAABSgvr4+7+84NiTg6OgXQOfOce2115b0tpTnn38+xo8fn/cDCgAAwL+5RaUZv2+VoOOqqqqKG2+8MQ466KCS7WPevHlx4oknRm1trYIDAABlpbHbPJq69aNYywtt27lz7p/rAo6GBBxFMmzYsFi9enWbfwgKXV5VVRWjR4+OHXbYoWQ1qa2tjYcffjgOP/zwZp9j1vMs5R+jch3LcqxJKc+znGpVLv9QpjrGqX5e29sY+7waS2NsjP0b4zthR/hO2B4JOAQcJTNy5MgYOXKkQqynW7duMXbsWIUAAAAoMgFHQwKOIlm8eHEsW7aswfLGnjvR1LMoWtq2Keu3raioiIEDB0aPHj1KWo958+bF0qVLS16HLLVpzbEo13Mrh/PNcm6pjaVza/3jNZbOrb2dm3/v2te5+Qym9z3FZ9C5ldP3lL59+8a9994r4BBwtL7rrrsubrnllrI+xt69e8eUKVNKHm5ERBx88MGxZMkSFwYAAEAzbLLJJjnXCzgaqYkSdAz9+vWL++67L/bYY49W2V9r7QcAAKA98haV7FSkA+jdu3fce++9seuuu7baPocPH67wAAAAzSTgyE5F2rlu3brFHXfcEbvsskur7lfAAQAA0Hz5ni3Skd4YUygBRzvWuXPnuOmmm+LTn/50q+97p512ik033dQgAAAANIMZHNmpSDtVUVERP/vZz2K//fZrs/2bxQEAANA8Ao7sVKSduvDCC+Owww4r6T5mzpwZNTU1Ta7fd999DQQAAEAzCDiyU5F2aPz48XHKKaeUdB/PPfdcnHjiifHXv/61yTYCDgAAgObJF3BUVlYq0kcIONqZL37xi3H22WeXdB+vvvpqHHvssbFy5cp4/vnnm2y39dZbx6BBgwwKAABARh4ymp2Aox0ZOHBg/PznPy/phT537tw4+uijY/ny5RER8cILL+Rs7zkcAAAA2blFJTsVaSe6desWt956a2y88cYl28eiRYviqKOOioULF/53Wb6Aw20qAAAA2Qk4slORduLyyy+PIUOGlKz/mpqaOOqoo2LOnDkbLH/33XfjrbfeanK7ffbZx9QpAACAjPLdoiLgaKQmSpC+448/Po444oiS9V9bWxvHH398vPrqq42uzzWLo1+/fiUNXgAAANqrXLM4BByN1EQJ0rbHHnvExRdfXLL+161bF6eeemr8+c9/brKN21QAAACKL1fAYaZ8QwKOhHXp0iWuvfbaqKqqKkn/9fX1ceaZZ8YTTzyRs12uN6lEeNAoAABAc3+TNflj3gyOhjVRgnSNHz8+Pvaxj5Ws/x/+8Idx//335203a9asWLduXZPr99prr5KFMAAAAO1VXV1d0z/mBRwNa6IEadp2221j/PjxJev/5z//edx2220FtV21alW89tprTa7v3r17DB061KABAABkkOsWlcrKSgX6CAFHoq644oro0qVLSfr+/e9/H5dffnmmbfLdpuI5HAAAANl4Bkc2nZUgPV/72tdK9lyLN998M8aNG5f3ncsf9fzzz8dxxx3X5Prhw4fHj3/844iI2GSTTWLPPfeMXXbZJfr16xd9+/bd4P/36dMnVq5cGUuWLInFixfH4sWL//uf586dGzNmzIhly5a5EAAAgHbNW1SyEXAkpnfv3nHhhReWpO8PPvggvvGNb0RNTU3mbV988cWc63fbbbf42c9+Fp/61KcKem5Iz549Y/PNN290XV1dXTz77LPx+OOPx7Rp0+KNN95wYQAAAO2Oh4xmI+BIzLnnnhubbrppST44Z5xxRrz++uvN2n727NmxYsWK6NmzZ6Pru3TpEkceeWRRjrWysjL22muv2GuvveL888+PN998Mx577LG4+eabY+HChS4SAACgXTCDIxsVScigQYPimGOOKUnf11xzTTz66KMt+uDlm8VRKttuu22cfvrpMXPmzBg/fnzJnk0CAADQmgQc2ahIQk455ZSSXMRPPPFE/OQnP2n29hUVFXHEEUfE4MGD27Q+G220UZxzzjkxY8aMOPDAA10wAABA0gQc2ahIIjbeeOMYPXp00ft9880341vf+lbmh4r+xy677BIPPvhgXH311bHFFluURa0GDhwYt912W9x7772x8847u3gAAIAkeYtKNgKORBx33HHRo0ePon9YzjjjjGY9VLRXr15x8cUXx+9+97sYNmxYWdZs+PDh8dhjj8URRxzhAgIAAJLjIaPZqEgCqqqq4uSTTy56vzfffHM899xzmbf76le/Gk8//XScfPLJUVlZWfa1u/rqq2PChAkuJAAAICluUclGRRJwyCGHRP/+/Yva5z//+c+48sorM21TWVkZl156aVx//fVNvsK1XE2YMCGuuuqqqKqqckEBAABJyBVwlPv/2NwWBBwJGDNmTNE/JN/5zneitra24G169+4dd911V5x44onJ1nH06NFx1113Ra9evVxUAABA2fMMjmwEHGVu+PDhMWTIkKL2efvtt8ezzz5bcPuBAwfGb37zm/jc5z6XfD333XffeOCBB4o+IwYAAKDY3KKSjYqUua9+9atF7W/OnDlx2WWXFdz+05/+dDzyyCOx/fbbt5ua7rzzzvHLX/4yunXr5gIDAADKloeMZtNZCcpbsWdNfPe7341Vq1YV1PaTn/xkTJ06tV0GAbvttltcddVVcfrpp7vIAICSa2oqeTGWZ52mXoy+2+J8inGe5XTcxTjPFI67PV2zbTGWuZ4hKOAQcJTMgQceGNtss01RPwQbb7xxDBgwoGjHOH/+/Bg1alSMGjUq77H07NkzDjjggHY9y+GQQw6JwYMHx9///vd2/Y9WOf3x949W+/likuoXLWNsjP0w8m9MW/2NACg2AUcjf5cjojspCGQAACAASURBVF4Z/m3ChAleJwoAAEDZW7hwYey+++4KsR4zOIrk1Vdfjblz5zZY3tg9U03dR/XR5cOGDSvawzDnz58fL7zwQt5jiPj3cze22GKLDjN2a9eujccffzyWLVtWlHErZdumlOIYWvt8s9SgXMfHuXXMczOWzs25Ff/flfb8GfT3xbm5Tp1blrZPPPFEbLfddo22N4NDwFEyd999d9xyyy1F66+qqipeeeWVov2AP/zww2PevHl5206cOLFDhRv/qfWuu+4aX/jCF2LlypUuZgAAoCzU1dU1uU7A0UhNlKA8DR06NDbaaKOi9HXXXXcVFG7svffeccopp3TIeldXV8cZZ5zhwgMAAMpGrtfEVlZWKtBHCDjK1Gc/+9mi9LNy5cq4+uqr818InTrFxIkTO3TNTzvttBg0aJCLDwAAKAteE5uNipSpYr0e9t5774133303b7vRo0fHrrvu2qFr3qVLlw4f8gAAAOUj1wwOb3JqSMBRpnbaaaei9DN58uS8bXr27Blnn322okfEfvvtF1/84hcVAgAAaHO5Ag4zOBqpiRKUn169ekX37t1b3M9f//rXePnll/O2+/a3vx2bbbaZwv+/iy66KKqqqhQCAABoUwKObFSkDG2++eZF6WfKlCl522y55ZYd9sGiTdl2223j1FNPVQgAAKBNCTiy8ZrYMtS/f/8W97Fy5cr49a9/nbfdqFGjokuXLm1ynq+++mrceuutUV1dHQMHDozq6uqorq6OTTfdtM3HYMyYMXHzzTfH2rVrXZAAAECbEHBkI+AoQ8W4XeShhx6KFStW5G138MEHF/346+rq4sknn4y+ffvG0KFDm2zXp0+fmDp1aoPlgwYNimOOOSZGjx7dZmHHpptuGgcccED85je/cUECAABtItdbVDxktCGRTxkqxgyOQn6Y9+/fP2cAkdW8efPiyiuvjD333DOOP/74eOyxx3K233LLLaNnz54Nls+ZMyd+9KMfxdChQ+PUU0+Np556KucHu1SOO+44FyMAANBmzODIRkXKUEufwbF27dp45pln8rY76KCDipL6zZo1K4488sjYe++94+qrr4533nknIiJef/31vNvusMMOOc/j4YcfjiOPPDI+85nPxOOPP96q47DPPvvEoEGDXJAAAECbEHBkoyJlqKUBx1/+8pdYtWpV3nYHHnhgi/ZTU1MT5557bhx00EGNzrJ47bXX8vax/fbbF7SvuXPnxoknnhgTJ05stediVFRUxLHHHuuCBAAA2kSugCNCyNGgHkpQflp6i8rTTz+dt02/fv1i7733bvY+fv/738dnP/vZmDRpUtTV1TXaZv78+bFy5cqc/eSawfFR9fX1cdNNN8UhhxwS8+bNa5WxGD16tFfGAgAAbULAkY1qlKGWzuAoJODYb7/9orKysln9X3vttXHCCSfEokWLcrarr6+P2bNn52yTJeD4jxdffDG+/OUvt8oDQDfZZJM44IADXJQAAECry/csQg8a3ZCAo515//3348UXX8zbbtttt83c99q1a2PMmDFx+eWX500S/yPfbSrNCTgi/n17zJgxY+Luu+8ueU332WcfFxYAANDqzODIRjXK0OLFi5u97d///vcmbxlZX9++fTP3feGFF2aeNZHvQaNbb7119OjRo9nne/bZZ8dzzz1X0vHYY489XJQAAECrE3BkoxplaMmSJc3e9o033iioXZ8+fTL1e++998akSZMyH0++GRwVFRUxePDgZp/vmjVr4pvf/GYsXLiwZOOx0047Rffu3V2YAABAqxJwZKMaZaglAcc//vGPgtplmcHxt7/9Lb7//e8363gKeZNKc29T+Y+FCxfGySefHGvWrCnJeHTu3Dl22203FyYAANCqBBzZqEYZasktKsUOOJYsWRInn3xyrF69ulnH8/bbb8cHH3yQs01LA46IiOeff77ZIUwh3KYCAAC0Ng8ZzUbAUYbK6RaVCRMmxNtvv92iD2S+53AUI+CIiLjnnnvi97//fUnGRMABAAC0tnwBR3PfjNleCTjKUHNncHz44Ycxd+7cgtr27t07b5t58+bF448/3uLzKdWbVBpz0003lWRMdt99dxcmAADQqtyiko1qlKH58+c3a7sVK1bEunXrCmq7dOnSvG2mTJmSNzEsRL6Ao7q6Orp27VqU2s2cOTNefvnloo9J1oeyAgAAtJSAIxvVKEMvv/xyQQHERy1btqzgtvPmzcu5ft26dXHPPfcU5XzyBRydOnWK7bbbrmj1K8Usji5durgwAQCAViXgyEY1yvQifvrppzNvt3z58oLb5psl8sQTTxTt1aut8SaV9T344IPxzjvvFHVMKisr3d8GAAC0Kg8ZzUbAUaZmzJiReZssAUe+Z3X89re/Ldq5LFiwIN5///2cbYoZcKxduzZuu+22oo+JWRwAAEBrMoMjG9UoU80JOIp5i8qCBQuKej6t9SaV/5g8eXJRnh+yPgEHAADQmgQc2ahGmfrXv/4Vs2fPzrRNXV1dwW3z3aJS7Fs85syZk3N9MZ/BEfHvsKclr7dtTLEehAoAAFAIAUc2qlHGss7i6NevX8FtZ8+enfONK4sWLSrqueS7JWabbbYpev0KefZHpg+LPx4AAEArEnBk/M2mBOXrySefzNQ+S8BRU1MTzzzzTKPrVq1alfeZGVnluyWmR48esckmmxR1n8UMONatWxeLFy92UQIAAK3GQ0azEXCUsaeeeirTbRZZAo6IiGnTprXahyTfDI6I4s/iyPfcjyzeeuutnDNeAAAAii3fDA5vetyQgKOM1dXVxR133FFw+6wzIJoKOLp16xabbbZZUc+lkICjurq6qPss5gyOfM8QAQAAKDa3qGTTWQnK25QpU+K73/1uQW/w6NKlS2y00UbxwQcfFNT3vHnz4tVXX42dd965wbptttkm3n333aKdx8KFC2PNmjU5z2Prrbcuau1mz54d9fX1RZmR8uabb7oYAYAWaew7SVPfU4q1vFR9l/K4i3GOKZ9Pa49lW12brtnC2vfp00fAIeBofQceeGCjt1gU4wMzb968GDx4cEHHcfXVVzf5rIjG+m7qtouzzz670VkLLTmf2tranAHHkUceGdtvv31RvySsXLkyNtpooxaP79ChQ+P6669P8o95Of2R78hfQFI+n478BcQY+5Lph1HH+jem1NcVQLH5O/SRekREvTL824QJE2LChAkKAQAAQNnbb7/94uWXX1aI/2cGR5G89NJL8cYbbzRY3thTb5t6Em6utiNGjCjoIaJLliyJ6dOnZzqGvfbaKwYOHLjB+qVLl/73GR3NOd7Glu+5556xww47NHnsNTU18dBDDxWtZhERhx12WPTs2bPF43vPPffEihUrilKH1mrblHI93izbZ6lBSufr3NI9t/b6Gcxybq5T5+bc0vn7Yiydm3Nr23PLsv1ll10WJ5xwQpPH4hYVAUdJ/OpXv4pbbrmlZP1/9atfbfIWifX17ds3Lrjggli2bFnBfe+4444xffr0DaY39e3bN3784x/Hv/71r6Kdw5gxY+KCCy5ocn3Xrl3j+9//fqY/LvmMHDmyxQHH66+/Ht/5zndc5AAAQKvykNFsVCMRDz74YLz66qv5B7RTp/jsZz+bqe/XXnstHnvssQbL999//6KeQ743qXTt2jU233zzou6zR48eLe5jxowZLkAAAKDV5fsffwUcH6mHEqThww8/jIsvvrigtiNGjMjc/9VXX91g2UknnVTU9yoX8qrYYr5JZcCAAdG9e/cW9yPgAAAA2kJdXV3uH/QCjg3roQTp+MMf/hBPPfVU3nb77bdf5h/2s2bNismTJ2+wbLvttotDDz20aMc/f/78vG2qq6uLtr/dd9+9xX2sWbMm/vd//9fFBwAAtDq3qGSjGom56KKL8l7k/fr1i+OPP75Zfb/99tsbLPv+979f0MNNC7FixYpYsmRJzjblFnD8+c9/jlWrVrnwAACAVifgyEY1EvPKK6/Efffdl7fd6aefHt26dcvU9/vvvx/f/e53N1i29dZbxxlnnFG04583b17O9dtss03R9lWMgOP+++930QEAAG3CMziyUY0EXXHFFVFbW5uzzeabbx7HHnts5r5nzJgRt99++wbLli5dWrRjzxdwFGsGR/fu3WO33XZrUR+LFy8WcAAAAG3GMziyUY0ELViwIK677rq87caNGxddu3bN3P8Pf/jDuOeee/773996662iHXu+B40W6yGjX/nKV1r8BpU77rgj1qxZ44IDAADaRL5bVCoqKhRpPQKORF133XXxt7/9LWeb/v37xzHHHNOsD9GECRNi0qRJsWbNmgbP5WiJfAHHVlttVZQU8sgjj2zR9mvWrIk777zThQYAALQZz+DIRjUStW7duvj2t7+dd4bB+PHjY+ONN27WB+ncc8+NIUOGxAsvvFC04853i0pVVVVsscUWLdrHoEGDYq+99mpRH7/+9a/j3XffdaEBAABtRsCRjWok7LXXXosrr7wyZ5v+/fvH1Vdf3ex9fPDBB7F69eqiHXO+GRwRLX8Ox+jRo1s0VWvt2rVxww03uMAAAIA2JeDIRjUS94tf/CL+8pe/5Gyz//77x6mnnloWx7tgwYJYu3ZtzjYteZNKr169mnVbzvp+/vOfx+zZs11cAABAmxJwZKMa7eCCP+OMM2LVqlU525177rlFeW1qS9XV1eV9pkdLZnBMmDAhNt1002ZvP3v27BbNeAEAACjm772cP+gFHBvWQwnSN2fOnDj//PNztqmqqopf/OIX0bt37zY/3nzP4Wjum1R23HHHOOmkk1r0x+Oss87KO8MEAACgNXhNbDaq0U5MmTIlJk+enLPNNttsUxazE/I9h2PAgAHN6vfiiy+Ozp07N/u4Jk2aFM8995yLCQAAKAv19fW5f9ALODashxK0Hz/4wQ/i+eefz9nmgAMOiEsuuaRNPwj5Ao7m3GIycuTIGD58eLOP6aWXXorLLrvMRQQAAJQNt6hkoxrtyNq1a+Ob3/xm3tebnnTSSXHjjTdGly5d2uQ4892istlmm2Xqb8cdd8z7Nplc5syZE8ccc0ysXLnSRQQAAJQNt6hkoxrtzDvvvBNjxoyJdevW5Ww3cuTImDp1aps8kyPfDI5+/foV/EHdaqutYurUqbHxxhs361gWLlwYRx55ZN5QCAAAoLXlm8FRUVGhSOsRcLRDzzzzTJxzzjl579fae++949e//nVsscUWrXp8+QKOTp06Rb9+/fL207dv35g6dWqzj7+mpiaOPvrovDNKAAAA2oJncGSjGu3U5MmT49xzz83bbuedd46HH344dthhh1Y7tpqamli+fHnONvluU+nevXvceeedMXjw4GYdw4oVK+KEE06IV1991cUCAACUJc/gyEY12rFf/vKXBYUcAwYMiN/85jcxZsyYqKqqapVja8mDRgcMGBBTpkyJoUOHNmvfc+bMia985Svxpz/9yUUCAACULc/gyEY12rlJkyYVFHL06tUrLrjggpgxY0bsv//+JT+ufAFHUzM4Dj300Jg+fXp8+tOfbtZ+Z8yYEQceeGC8/vrrLg4AAKCsmcGRjWp0AJMmTYrzzjuvoLaDBg2KSZMmxa9+9avYZZddSnZM8+fPz7n+ozM4evfuHTfccEPccMMNzX4w6k033RTHHnts3ttjAAAAyoGAIxvV6CBuv/32OP/88wtuv88++8S0adPiJz/5SebXthYiywyOz3/+8/Hkk0/GoYce2qx91dTUxPjx42PixIl5p3gBAACUCwFHNp2VoOO47bbboqKiIi666KKC2nfq1CmOPvro+PrXvx5PPfVU/O53v4snnngiFi1a1OJjyRdwDB48OE477bQ46qijYvvtt2/2fh544IG48MILi3LMAAAArUnAkY2Ao4O59dZb4/3334+LLrooevXqVdA2Xbt2jf322y/222+/qK+vj+effz6mTZsW06ZNi9dee61Zx/Huu+/mXL///vu36Fkg//znP+Pss8+OmTNnGnQAACBJAo5sBBwd0D333BNPPfVUXHHFFfGlL30p07YVFRUxdOjQGDp0aJxzzjkxZ86cePzxx+Oll16KOXPmxNy5c/POlqisrIyuXbuW5NxWr14d1157bVx//fWxZs0agw0AACRLwJGNgKODWrBgQRx//PHxta99Lb73ve9FdXV1s/oZNGhQnHLKKRssW7lyZSxYsCBWrVoVq1evjtra2qitrY2qqqqorq6Orbbaquivo62trY2pU6fGjTfeGG+99ZYBBgAAkpcv4KioqFCk9Qg4Orj7778/HnzwwRg5cmSMGzcuhgwZ0uI+e/ToEdttt12rHH9NTU1MmjQpbr311liyZIkBBQAA2g0zOLIRcBB1dXXxwAMPxAMPPBCf//zn49RTT43hw4dH587le3ksXLgwbrnllrjzzjtjxYoVBhEAAGh3BBzZCDjYwB/+8If4wx/+EP369YsDDzwwRo4cGZ/5zGfKIuxYsWJFTJ8+PR599NF49NFHPWMDAABo1+rq6nKuF3BsSMBBo957772YPHlyTJ48+b9hx7777hvDhg2LAQMGtNpxLFq0KH73u9/FY489FjNnzoy1a9caHAAAoEMwgyMbAQd5rR92RERsscUWMWzYsBg6dGgMGzYshgwZEt26dSv6fi+++OL4xS9+EfX19QYBAADocPL9FhJwbEjAQWbvvPNOPPzww/Hwww//d1m/fv1iyy23jAEDBsSWW2753//cs2fPqKura/T/dtxxxxg2bFiT+6mtrRVuAAAAJdPUW0iKsTzrG04aa58vwBBw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AAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4A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/+MYxPkNE2IkGABNSVOQ7HM+7DuUt3Q7mjpUFmcjr1unl8NuVbD7m6plQSJtQIuLMFbkdTOVo4XNGpkZmZshRj5KVGyRR6oW/+MYxP8P82okOACTLDX0hZ/NMwIyV2MZOyleP56///LM+7JePftrs1g+k+jJlnog5CvNvjmcS3cDTZkDKhtl8r35yOV+jgtR/+MYxPoOQ2YYEABTSKmIjcsiPb5ZfXf7UH8zFxqUaDwmSPCizYFGwQGwyZIIX0pOLKIpjETlo1U/56E0qoAczJRAWM5G8HJA/+MYxPwK8148GABNSUZyKUXZ6Ik9o/PNrPO4Xd3k45s5ZbFOhlkKfJ2SMjFyc9KZLMjQ60Ps1iyQiQycScX711gnjk89MiiI/+MYxP8TC2oIAACTEM0f+Z/SNfy///f9lc5XLIHLMz46Yck2h2K0dtqT0bECVySOS9qTEGr9rfbPd2TQq7VMzuRDg3vYJJEn/+MYxO0ME2YcEABNSJ2RxzMIKcrhC0U0F3kImjyb03for+r/zq1OmMvJ/7vbWJlSA5zVyGFyjBs22U4ODIPh4hDbrVUbv/ln/+MYxPcNW2YcEABNSGWrMglL8cicpXM60b///+8h4bKpxqdMwhMvkpTs/hZPkDJUtJu2TccDTSJKRRGOl+v/1//9Omu/2pdE/+MYxPwPu2oQCABTLHWi9r07yp99tVRSsxysZJwFXKcDYBwxzjoPraIHIgUpiCmopmXHJwp268/L++7oMjOERqsPR/WT59fe/+MYxPgMU1ooGABTSLv/8+5at2WSQuEzX00HAFGyipKM5p5VFojkAmjknWmIKaimZccnBdUObf4ovk//MMX///X/yt/uOXlx/+MYxP8SW2IIAACTEKktqFqTxCJSJF/JNmSImOhln2AosFn0lTEFNRTMuOTguMlVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPAMw2IgEABTSVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPgK215IGACNTFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8MW2I4GABNSFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8Ks1oUGABTZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8AAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEFHMTAgU2Vjb25kcyBvZiBTaWxlbmNlAAAAAAAAAAAAQW5hciBTb2Z0d2FyZSBMTEMAAAAAAAAAAAAAAAAAQmxhbmsgQXVkaW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8=";
|
|
1034
|
+
|
|
1035
|
+
const getIsIOS = () => {
|
|
1036
|
+
if (typeof window !== "undefined") {
|
|
1037
|
+
return (/iPad|iPhone|iPod/.test(navigator?.userAgent) &&
|
|
1038
|
+
!window?.MSStream);
|
|
1039
|
+
}
|
|
1040
|
+
else {
|
|
1041
|
+
return false;
|
|
1042
|
+
}
|
|
1043
|
+
};
|
|
1044
|
+
const isIOS = getIsIOS();
|
|
1045
|
+
class BaseWallet {
|
|
1046
|
+
algosdk;
|
|
1047
|
+
algodClient;
|
|
1048
|
+
keepWCAlive;
|
|
1049
|
+
constructor(algosdk, algodClient) {
|
|
1050
|
+
this.algosdk = algosdk;
|
|
1051
|
+
this.algodClient = algodClient;
|
|
1052
|
+
this.keepWCAlive = new Audio();
|
|
1053
|
+
}
|
|
1054
|
+
async healthCheck() {
|
|
1055
|
+
return await this.algodClient.healthCheck().do();
|
|
1056
|
+
}
|
|
1057
|
+
async getAccountInfo(address) {
|
|
1058
|
+
const accountInfo = await this.algodClient.accountInformation(address).do();
|
|
1059
|
+
if (!accountInfo) {
|
|
1060
|
+
throw new Error("Unable to get account information");
|
|
1061
|
+
}
|
|
1062
|
+
return accountInfo;
|
|
1063
|
+
}
|
|
1064
|
+
async getAssets(address) {
|
|
1065
|
+
const accountInfo = await this.algodClient.accountInformation(address).do();
|
|
1066
|
+
if (!accountInfo || accountInfo.assets === undefined) {
|
|
1067
|
+
throw new Error("Unable to get account assets");
|
|
1068
|
+
}
|
|
1069
|
+
return accountInfo.assets;
|
|
1070
|
+
}
|
|
1071
|
+
async waitForConfirmation(txId, timeout = 4) {
|
|
1072
|
+
const confirmation = (await this.algosdk.waitForConfirmation(this.algodClient, txId, timeout));
|
|
1073
|
+
return { txId, ...confirmation };
|
|
1074
|
+
}
|
|
1075
|
+
decodeTransaction = (txn, isSigned) => {
|
|
1076
|
+
return isSigned
|
|
1077
|
+
? this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))).txn
|
|
1078
|
+
: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1079
|
+
};
|
|
1080
|
+
logEncodedTransaction(txn, isSigned) {
|
|
1081
|
+
const txnObj = this.decodeTransaction(txn, isSigned);
|
|
1082
|
+
console.log("TRANSACTION", {
|
|
1083
|
+
isSigned,
|
|
1084
|
+
from: txnObj.from && this.algosdk.encodeAddress(txnObj.from.publicKey),
|
|
1085
|
+
to: txnObj.to && this.algosdk.encodeAddress(txnObj.to.publicKey),
|
|
1086
|
+
type: txnObj.type,
|
|
1087
|
+
txn: txnObj,
|
|
1088
|
+
});
|
|
1089
|
+
}
|
|
1090
|
+
groupTransactionsBySender(transactions) {
|
|
1091
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1092
|
+
function groupBy(objectArray, property) {
|
|
1093
|
+
return objectArray.reduce(function (acc, obj) {
|
|
1094
|
+
const key = obj[property];
|
|
1095
|
+
if (!acc[key]) {
|
|
1096
|
+
acc[key] = [];
|
|
1097
|
+
}
|
|
1098
|
+
acc[key].push(obj);
|
|
1099
|
+
return acc;
|
|
1100
|
+
}, {});
|
|
1101
|
+
}
|
|
1102
|
+
const decodedGroup = transactions.reduce((acc, [type, txn], index) => {
|
|
1103
|
+
if (type === "u") {
|
|
1104
|
+
const decodedTxn = this.decodeTransaction(txn, false);
|
|
1105
|
+
const from = decodedTxn.from
|
|
1106
|
+
? this.algosdk.encodeAddress(decodedTxn.from.publicKey)
|
|
1107
|
+
: "";
|
|
1108
|
+
const to = decodedTxn.to
|
|
1109
|
+
? this.algosdk.encodeAddress(decodedTxn.to.publicKey)
|
|
1110
|
+
: "";
|
|
1111
|
+
const type = decodedTxn.type || "";
|
|
1112
|
+
const amount = Number(decodedTxn.amount) || 0; // convert from bigint to number
|
|
1113
|
+
const txnObj = {
|
|
1114
|
+
groupIndex: index,
|
|
1115
|
+
amount,
|
|
1116
|
+
from,
|
|
1117
|
+
to,
|
|
1118
|
+
type,
|
|
1119
|
+
txn,
|
|
1120
|
+
};
|
|
1121
|
+
acc.push(txnObj);
|
|
1122
|
+
}
|
|
1123
|
+
return acc;
|
|
1124
|
+
}, []);
|
|
1125
|
+
return groupBy(decodedGroup, "from");
|
|
1126
|
+
}
|
|
1127
|
+
async sendRawTransactions(transactions, waitRoundsToConfirm) {
|
|
1128
|
+
const sentTransaction = await this.algodClient
|
|
1129
|
+
.sendRawTransaction(transactions)
|
|
1130
|
+
.do();
|
|
1131
|
+
if (!sentTransaction) {
|
|
1132
|
+
throw new Error("Transaction failed.");
|
|
1133
|
+
}
|
|
1134
|
+
const decodedTxn = this.algosdk.decodeSignedTransaction(transactions[0]);
|
|
1135
|
+
const waitRounds = waitRoundsToConfirm ||
|
|
1136
|
+
decodedTxn.txn.lastRound - decodedTxn.txn.firstRound;
|
|
1137
|
+
const confirmedTransaction = await this.waitForConfirmation(sentTransaction.txId, waitRounds);
|
|
1138
|
+
return {
|
|
1139
|
+
id: sentTransaction.txId,
|
|
1140
|
+
...confirmedTransaction,
|
|
1141
|
+
};
|
|
1142
|
+
}
|
|
1143
|
+
keepWCAliveStart() {
|
|
1144
|
+
// Playing an audio file prevents Wallet Connect's
|
|
1145
|
+
// web socket connection from being dropped when
|
|
1146
|
+
// iOS goes into background mode
|
|
1147
|
+
if (!isIOS) {
|
|
1148
|
+
return;
|
|
1149
|
+
}
|
|
1150
|
+
this.keepWCAlive.src = audio;
|
|
1151
|
+
this.keepWCAlive.autoplay = true;
|
|
1152
|
+
this.keepWCAlive.volume = 0;
|
|
1153
|
+
this.keepWCAlive.loop = true;
|
|
1154
|
+
this.keepWCAlive.play();
|
|
1155
|
+
}
|
|
1156
|
+
keepWCAliveStop() {
|
|
1157
|
+
if (!isIOS) {
|
|
1158
|
+
return;
|
|
1159
|
+
}
|
|
1160
|
+
this.keepWCAlive.pause();
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
/**
|
|
1165
|
+
* Helpful resources:
|
|
1166
|
+
* https://github.com/perawallet/connect
|
|
1167
|
+
*/
|
|
1168
|
+
class PeraWalletClient extends BaseWallet {
|
|
1169
|
+
#client;
|
|
1170
|
+
id;
|
|
1171
|
+
provider;
|
|
1172
|
+
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1173
|
+
super(algosdk, algodClient);
|
|
1174
|
+
this.#client = client;
|
|
1175
|
+
this.id = id;
|
|
1176
|
+
this.provider = provider;
|
|
1177
|
+
}
|
|
1178
|
+
static async init() {
|
|
1179
|
+
const { algosdk, algodClient } = await Algod.init();
|
|
1180
|
+
const PeraWalletConnect = (await import('@perawallet/connect'))
|
|
1181
|
+
.PeraWalletConnect;
|
|
1182
|
+
const peraWallet = new PeraWalletConnect({ shouldShowSignTxnToast: false });
|
|
1183
|
+
return new PeraWalletClient({
|
|
1184
|
+
id: exports.PROVIDER_ID.PERA_WALLET,
|
|
1185
|
+
client: peraWallet,
|
|
1186
|
+
provider: providers[exports.PROVIDER_ID.PERA_WALLET],
|
|
1187
|
+
algosdk: algosdk,
|
|
1188
|
+
algodClient: algodClient,
|
|
1189
|
+
});
|
|
1190
|
+
}
|
|
1191
|
+
async connect(onDisconnect) {
|
|
1192
|
+
this.keepWCAliveStart();
|
|
1193
|
+
const accounts = await this.#client.connect();
|
|
1194
|
+
this.keepWCAliveStop();
|
|
1195
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1196
|
+
if (accounts.length === 0) {
|
|
1197
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
1198
|
+
}
|
|
1199
|
+
const mappedAccounts = accounts.map((address, index) => ({
|
|
1200
|
+
name: `Pera Wallet ${index + 1}`,
|
|
1201
|
+
address,
|
|
1202
|
+
providerId: this.provider.id,
|
|
1203
|
+
}));
|
|
1204
|
+
return {
|
|
1205
|
+
...this.provider,
|
|
1206
|
+
accounts: mappedAccounts,
|
|
1207
|
+
};
|
|
1208
|
+
}
|
|
1209
|
+
async reconnect(onDisconnect) {
|
|
1210
|
+
const accounts = await this.#client.reconnectSession();
|
|
1211
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1212
|
+
if (!accounts) {
|
|
1213
|
+
return null;
|
|
1214
|
+
}
|
|
1215
|
+
return {
|
|
1216
|
+
...this.provider,
|
|
1217
|
+
accounts: accounts.map((address, index) => ({
|
|
1218
|
+
name: `Pera Wallet ${index + 1}`,
|
|
1219
|
+
address,
|
|
1220
|
+
providerId: this.provider.id,
|
|
1221
|
+
})),
|
|
1222
|
+
};
|
|
1223
|
+
}
|
|
1224
|
+
async disconnect() {
|
|
1225
|
+
await this.#client.disconnect();
|
|
1226
|
+
}
|
|
1227
|
+
formatTransactionsArray(transactions) {
|
|
1228
|
+
const formattedTransactions = [];
|
|
1229
|
+
for (const [type, txn] of transactions) {
|
|
1230
|
+
if (type === "s") {
|
|
1231
|
+
formattedTransactions.push({
|
|
1232
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1233
|
+
signers: [],
|
|
1234
|
+
});
|
|
1235
|
+
}
|
|
1236
|
+
else {
|
|
1237
|
+
formattedTransactions.push({
|
|
1238
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1239
|
+
});
|
|
1240
|
+
}
|
|
1241
|
+
}
|
|
1242
|
+
return formattedTransactions;
|
|
1243
|
+
}
|
|
1244
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1245
|
+
// Decode the transactions to access their properties.
|
|
1246
|
+
const decodedTxns = transactions.map((txn) => {
|
|
1247
|
+
return this.algosdk.decodeObj(txn);
|
|
1248
|
+
});
|
|
1249
|
+
// Marshal the transactions,
|
|
1250
|
+
// and add the signers property if they shouldn't be signed.
|
|
1251
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1252
|
+
if (!("txn" in txn) &&
|
|
1253
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1254
|
+
acc.push({
|
|
1255
|
+
txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1258
|
+
else {
|
|
1259
|
+
acc.push({
|
|
1260
|
+
txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
|
|
1261
|
+
signers: [],
|
|
1262
|
+
});
|
|
1263
|
+
}
|
|
1264
|
+
return acc;
|
|
1265
|
+
}, []);
|
|
1266
|
+
// Play an audio file to keep Wallet Connect's web socket open on iOS
|
|
1267
|
+
// when the user goes into background mode.
|
|
1268
|
+
this.keepWCAliveStart();
|
|
1269
|
+
// Sign them with the client.
|
|
1270
|
+
const result = await this.#client.signTransaction([txnsToSign]);
|
|
1271
|
+
this.keepWCAliveStop();
|
|
1272
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
1273
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
1274
|
+
if (!("txn" in txn)) {
|
|
1275
|
+
const signedByUser = result.shift();
|
|
1276
|
+
signedByUser && acc.push(signedByUser);
|
|
1277
|
+
}
|
|
1278
|
+
else {
|
|
1279
|
+
acc.push(transactions[i]);
|
|
1280
|
+
}
|
|
1281
|
+
return acc;
|
|
1282
|
+
}, []);
|
|
1283
|
+
return signedTxns;
|
|
1284
|
+
}
|
|
1285
|
+
async signEncodedTransactions(transactions) {
|
|
1286
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1287
|
+
this.keepWCAliveStart();
|
|
1288
|
+
const result = (await this.#client.signTransaction([
|
|
1289
|
+
transactionsToSign,
|
|
1290
|
+
]));
|
|
1291
|
+
this.keepWCAliveStop();
|
|
1292
|
+
const signedTransactions = [];
|
|
1293
|
+
let resultIndex = 0;
|
|
1294
|
+
for (const [type, txn] of transactions) {
|
|
1295
|
+
if (type === "u") {
|
|
1296
|
+
signedTransactions.push(result[resultIndex]);
|
|
1297
|
+
resultIndex++;
|
|
1298
|
+
}
|
|
1299
|
+
else {
|
|
1300
|
+
signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
return signedTransactions;
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
/**
|
|
1308
|
+
* Helpful resources:
|
|
1309
|
+
* https://github.com/randlabs/myalgo-connect
|
|
1310
|
+
*/
|
|
1311
|
+
class MyAlgoWalletClient extends BaseWallet {
|
|
1312
|
+
#client;
|
|
1313
|
+
id;
|
|
1314
|
+
provider;
|
|
1315
|
+
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1316
|
+
super(algosdk, algodClient);
|
|
1317
|
+
this.#client = client;
|
|
1318
|
+
this.id = id;
|
|
1319
|
+
this.provider = provider;
|
|
1320
|
+
}
|
|
1321
|
+
static async init() {
|
|
1322
|
+
const { algosdk, algodClient } = await Algod.init();
|
|
1323
|
+
const MyAlgoConnect = (await import('@randlabs/myalgo-connect')).default;
|
|
1324
|
+
const myAlgo = new MyAlgoConnect({ disableLedgerNano: false });
|
|
1325
|
+
return new MyAlgoWalletClient({
|
|
1326
|
+
id: exports.PROVIDER_ID.MYALGO_WALLET,
|
|
1327
|
+
client: myAlgo,
|
|
1328
|
+
provider: providers[exports.PROVIDER_ID.MYALGO_WALLET],
|
|
1329
|
+
algosdk: algosdk,
|
|
1330
|
+
algodClient: algodClient,
|
|
1331
|
+
});
|
|
1332
|
+
}
|
|
1333
|
+
async connect() {
|
|
1334
|
+
const accounts = await this.#client.connect();
|
|
1335
|
+
if (accounts.length === 0) {
|
|
1336
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
1337
|
+
}
|
|
1338
|
+
const mappedAccounts = accounts.map((account) => ({
|
|
1339
|
+
...account,
|
|
1340
|
+
providerId: this.provider.id,
|
|
1341
|
+
}));
|
|
1342
|
+
return {
|
|
1343
|
+
...this.provider,
|
|
1344
|
+
accounts: mappedAccounts,
|
|
1345
|
+
};
|
|
1346
|
+
}
|
|
1347
|
+
async reconnect() {
|
|
1348
|
+
return null;
|
|
1349
|
+
}
|
|
1350
|
+
async disconnect() {
|
|
1351
|
+
return;
|
|
1352
|
+
}
|
|
1353
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1354
|
+
// Decode the transactions to access their properties.
|
|
1355
|
+
const decodedTxns = transactions.map((txn) => {
|
|
1356
|
+
return this.algosdk.decodeObj(txn);
|
|
1357
|
+
});
|
|
1358
|
+
// Get the unsigned transactions.
|
|
1359
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1360
|
+
// If the transaction isn't already signed and is to be sent from a connected account,
|
|
1361
|
+
// add it to the arrays of transactions to be signed.
|
|
1362
|
+
if (!("txn" in txn) &&
|
|
1363
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1364
|
+
acc.push(transactions[i]);
|
|
1365
|
+
}
|
|
1366
|
+
return acc;
|
|
1367
|
+
}, []);
|
|
1368
|
+
// Sign them with the client.
|
|
1369
|
+
const result = await this.#client.signTransaction(txnsToSign);
|
|
1370
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
1371
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
1372
|
+
if (!("txn" in txn)) {
|
|
1373
|
+
const signedByUser = result.shift()?.blob;
|
|
1374
|
+
signedByUser && acc.push(signedByUser);
|
|
1375
|
+
}
|
|
1376
|
+
else {
|
|
1377
|
+
acc.push(transactions[i]);
|
|
1378
|
+
}
|
|
1379
|
+
return acc;
|
|
1380
|
+
}, []);
|
|
1381
|
+
return signedTxns;
|
|
1382
|
+
}
|
|
1383
|
+
async signEncodedTransactions(transactions) {
|
|
1384
|
+
const transactionsToSign = [];
|
|
1385
|
+
const signedRawTransactions = [];
|
|
1386
|
+
for (const [type, txn] of transactions) {
|
|
1387
|
+
if (type === "u") {
|
|
1388
|
+
transactionsToSign.push(txn);
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
const result = await this.#client.signTransaction(transactionsToSign);
|
|
1392
|
+
if (!result) {
|
|
1393
|
+
throw new Error("Signing failed.");
|
|
1394
|
+
}
|
|
1395
|
+
let resultIndex = 0;
|
|
1396
|
+
for (const [type, txn] of transactions) {
|
|
1397
|
+
if (type === "u") {
|
|
1398
|
+
signedRawTransactions.push(result[resultIndex].blob);
|
|
1399
|
+
resultIndex++;
|
|
1400
|
+
}
|
|
1401
|
+
else {
|
|
1402
|
+
signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1405
|
+
return signedRawTransactions;
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
class AlgoSignerClient extends BaseWallet {
|
|
1410
|
+
#client;
|
|
1411
|
+
id;
|
|
1412
|
+
provider;
|
|
1413
|
+
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1414
|
+
super(algosdk, algodClient);
|
|
1415
|
+
this.#client = client;
|
|
1416
|
+
this.id = id;
|
|
1417
|
+
this.provider = provider;
|
|
1418
|
+
}
|
|
1419
|
+
static async init() {
|
|
1420
|
+
if (typeof window == "undefined" ||
|
|
1421
|
+
window.AlgoSigner === undefined) {
|
|
1422
|
+
throw new Error("AlgoSigner is not available.");
|
|
1423
|
+
}
|
|
1424
|
+
const { algosdk, algodClient } = await Algod.init();
|
|
1425
|
+
const algoSigner = window.AlgoSigner;
|
|
1426
|
+
return new AlgoSignerClient({
|
|
1427
|
+
id: exports.PROVIDER_ID.ALGO_SIGNER,
|
|
1428
|
+
client: algoSigner,
|
|
1429
|
+
provider: providers[exports.PROVIDER_ID.ALGO_SIGNER],
|
|
1430
|
+
algosdk: algosdk,
|
|
1431
|
+
algodClient: algodClient,
|
|
1432
|
+
});
|
|
1433
|
+
}
|
|
1434
|
+
async connect() {
|
|
1435
|
+
await this.#client.connect();
|
|
1436
|
+
let ledger = "MainNet";
|
|
1437
|
+
if (NODE_NETWORK === "mainnet") {
|
|
1438
|
+
ledger = "MainNet";
|
|
1439
|
+
}
|
|
1440
|
+
else if (NODE_NETWORK === "betanet") {
|
|
1441
|
+
ledger = "BetaNet";
|
|
1442
|
+
}
|
|
1443
|
+
else if (NODE_NETWORK === "testnet") {
|
|
1444
|
+
ledger = "TestNet";
|
|
1445
|
+
}
|
|
1446
|
+
else if (!!NODE_NETWORK) {
|
|
1447
|
+
ledger = NODE_NETWORK;
|
|
1448
|
+
}
|
|
1449
|
+
const accounts = await this.#client.accounts({
|
|
1450
|
+
ledger,
|
|
1451
|
+
});
|
|
1452
|
+
if (accounts.length === 0) {
|
|
1453
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
1454
|
+
}
|
|
1455
|
+
const mappedAccounts = accounts.map(({ address }, index) => ({
|
|
1456
|
+
name: `AlgoSigner ${index + 1}`,
|
|
1457
|
+
address,
|
|
1458
|
+
providerId: this.provider.id,
|
|
1459
|
+
}));
|
|
1460
|
+
return {
|
|
1461
|
+
...this.provider,
|
|
1462
|
+
accounts: mappedAccounts,
|
|
1463
|
+
};
|
|
1464
|
+
}
|
|
1465
|
+
async reconnect(onDisconnect) {
|
|
1466
|
+
if (window === undefined ||
|
|
1467
|
+
window.AlgoSigner === undefined) {
|
|
1468
|
+
onDisconnect();
|
|
1469
|
+
}
|
|
1470
|
+
return null;
|
|
1471
|
+
}
|
|
1472
|
+
async disconnect() {
|
|
1473
|
+
return;
|
|
1474
|
+
}
|
|
1475
|
+
formatTransactionsArray(transactions) {
|
|
1476
|
+
const formattedTransactions = transactions.map(([type, txn]) => {
|
|
1477
|
+
const formattedTxn = {
|
|
1478
|
+
txn: txn[1],
|
|
1479
|
+
};
|
|
1480
|
+
if (type === "s") {
|
|
1481
|
+
formattedTxn.signers = [];
|
|
1482
|
+
const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1483
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
|
|
1484
|
+
}
|
|
1485
|
+
else {
|
|
1486
|
+
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
1487
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
|
|
1488
|
+
}
|
|
1489
|
+
return formattedTxn;
|
|
1490
|
+
});
|
|
1491
|
+
return formattedTransactions;
|
|
1492
|
+
}
|
|
1493
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1494
|
+
// Decode the transactions to access their properties.
|
|
1495
|
+
const decodedTxns = transactions.map((txn) => {
|
|
1496
|
+
return this.algosdk.decodeObj(txn);
|
|
1497
|
+
});
|
|
1498
|
+
// Marshal the transactions,
|
|
1499
|
+
// and add the signers property if they shouldn't be signed.
|
|
1500
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1501
|
+
const txnObj = {
|
|
1502
|
+
txn: this.#client.encoding.msgpackToBase64(transactions[i]),
|
|
1503
|
+
};
|
|
1504
|
+
if ("txn" in txn ||
|
|
1505
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1506
|
+
txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
|
|
1507
|
+
txnObj.signers = [];
|
|
1508
|
+
}
|
|
1509
|
+
acc.push(txnObj);
|
|
1510
|
+
return acc;
|
|
1511
|
+
}, []);
|
|
1512
|
+
// Sign them with the client.
|
|
1513
|
+
const result = await this.#client.signTxn(txnsToSign);
|
|
1514
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
1515
|
+
const signedTxns = result.reduce((acc, txn, i) => {
|
|
1516
|
+
if (txn) {
|
|
1517
|
+
acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1518
|
+
}
|
|
1519
|
+
else {
|
|
1520
|
+
acc.push(transactions[i]);
|
|
1521
|
+
}
|
|
1522
|
+
return acc;
|
|
1523
|
+
}, []);
|
|
1524
|
+
return signedTxns;
|
|
1525
|
+
}
|
|
1526
|
+
async signEncodedTransactions(transactions) {
|
|
1527
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1528
|
+
const result = await this.#client.signTxn(transactionsToSign);
|
|
1529
|
+
if (!result) {
|
|
1530
|
+
throw new Error("Signing failed.");
|
|
1531
|
+
}
|
|
1532
|
+
const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
|
|
1533
|
+
if (txn) {
|
|
1534
|
+
signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
1535
|
+
}
|
|
1536
|
+
if (txn === null) {
|
|
1537
|
+
signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
|
|
1538
|
+
}
|
|
1539
|
+
return signedTxns;
|
|
1540
|
+
}, []);
|
|
1541
|
+
return signedRawTransactions;
|
|
1542
|
+
}
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
class DeflyWalletClient extends BaseWallet {
|
|
1546
|
+
#client;
|
|
1547
|
+
id;
|
|
1548
|
+
provider;
|
|
1549
|
+
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1550
|
+
super(algosdk, algodClient);
|
|
1551
|
+
this.#client = client;
|
|
1552
|
+
this.id = id;
|
|
1553
|
+
this.provider = provider;
|
|
1554
|
+
}
|
|
1555
|
+
static async init() {
|
|
1556
|
+
const { algosdk, algodClient } = await Algod.init();
|
|
1557
|
+
const DeflyWalletConnect = (await import('@blockshake/defly-connect'))
|
|
1558
|
+
.DeflyWalletConnect;
|
|
1559
|
+
const deflyWallet = new DeflyWalletConnect({
|
|
1560
|
+
shouldShowSignTxnToast: false,
|
|
1561
|
+
});
|
|
1562
|
+
return new DeflyWalletClient({
|
|
1563
|
+
id: exports.PROVIDER_ID.DEFLY,
|
|
1564
|
+
client: deflyWallet,
|
|
1565
|
+
provider: providers[exports.PROVIDER_ID.DEFLY],
|
|
1566
|
+
algosdk,
|
|
1567
|
+
algodClient,
|
|
1568
|
+
});
|
|
1569
|
+
}
|
|
1570
|
+
async connect(onDisconnect) {
|
|
1571
|
+
const accounts = await this.#client.connect();
|
|
1572
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1573
|
+
if (accounts.length === 0) {
|
|
1574
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
1575
|
+
}
|
|
1576
|
+
const mappedAccounts = accounts.map((address, index) => ({
|
|
1577
|
+
name: `Defly Wallet ${index + 1}`,
|
|
1578
|
+
address,
|
|
1579
|
+
providerId: this.provider.id,
|
|
1580
|
+
}));
|
|
1581
|
+
return {
|
|
1582
|
+
...this.provider,
|
|
1583
|
+
accounts: mappedAccounts,
|
|
1584
|
+
};
|
|
1585
|
+
}
|
|
1586
|
+
async reconnect(onDisconnect) {
|
|
1587
|
+
const accounts = await this.#client.reconnectSession();
|
|
1588
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
1589
|
+
if (!accounts) {
|
|
1590
|
+
return null;
|
|
1591
|
+
}
|
|
1592
|
+
return {
|
|
1593
|
+
...this.provider,
|
|
1594
|
+
accounts: accounts.map((address, index) => ({
|
|
1595
|
+
name: `Defly Wallet ${index + 1}`,
|
|
1596
|
+
address,
|
|
1597
|
+
providerId: this.provider.id,
|
|
1598
|
+
})),
|
|
1599
|
+
};
|
|
1600
|
+
}
|
|
1601
|
+
async disconnect() {
|
|
1602
|
+
await this.#client.disconnect();
|
|
1603
|
+
}
|
|
1604
|
+
formatTransactionsArray(transactions) {
|
|
1605
|
+
const formattedTransactions = [];
|
|
1606
|
+
for (const [type, txn] of transactions) {
|
|
1607
|
+
if (type === "s") {
|
|
1608
|
+
formattedTransactions.push({
|
|
1609
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1610
|
+
signers: [],
|
|
1611
|
+
});
|
|
1612
|
+
}
|
|
1613
|
+
else {
|
|
1614
|
+
formattedTransactions.push({
|
|
1615
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
1616
|
+
});
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
return formattedTransactions;
|
|
1620
|
+
}
|
|
1621
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1622
|
+
// Decode the transactions to access their properties.
|
|
1623
|
+
const decodedTxns = transactions.map((txn) => {
|
|
1624
|
+
return this.algosdk.decodeObj(txn);
|
|
1625
|
+
});
|
|
1626
|
+
// Marshal the transactions,
|
|
1627
|
+
// and add the signers property if they shouldn't be signed.
|
|
1628
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1629
|
+
if (!("txn" in txn) &&
|
|
1630
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1631
|
+
acc.push({
|
|
1632
|
+
txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
|
|
1633
|
+
});
|
|
1634
|
+
}
|
|
1635
|
+
else {
|
|
1636
|
+
acc.push({
|
|
1637
|
+
txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
|
|
1638
|
+
signers: [],
|
|
1639
|
+
});
|
|
1640
|
+
}
|
|
1641
|
+
return acc;
|
|
1642
|
+
}, []);
|
|
1643
|
+
// Sign them with the client.
|
|
1644
|
+
const result = await this.#client.signTransaction([txnsToSign]);
|
|
1645
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
1646
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
1647
|
+
if (!("txn" in txn)) {
|
|
1648
|
+
const signedByUser = result.shift();
|
|
1649
|
+
signedByUser && acc.push(signedByUser);
|
|
1650
|
+
}
|
|
1651
|
+
else {
|
|
1652
|
+
acc.push(transactions[i]);
|
|
1653
|
+
}
|
|
1654
|
+
return acc;
|
|
1655
|
+
}, []);
|
|
1656
|
+
return signedTxns;
|
|
1657
|
+
}
|
|
1658
|
+
async signEncodedTransactions(transactions) {
|
|
1659
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
1660
|
+
const result = await this.#client.signTransaction([
|
|
1661
|
+
transactionsToSign,
|
|
1662
|
+
]);
|
|
1663
|
+
const signedTransactions = [];
|
|
1664
|
+
let resultIndex = 0;
|
|
1665
|
+
for (const [type, txn] of transactions) {
|
|
1666
|
+
if (type === "u") {
|
|
1667
|
+
signedTransactions.push(result[resultIndex]);
|
|
1668
|
+
resultIndex++;
|
|
1669
|
+
}
|
|
1670
|
+
else {
|
|
1671
|
+
signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
return signedTransactions;
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
class ExodusClient extends BaseWallet {
|
|
1679
|
+
#client;
|
|
1680
|
+
id;
|
|
1681
|
+
provider;
|
|
1682
|
+
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1683
|
+
super(algosdk, algodClient);
|
|
1684
|
+
this.#client = client;
|
|
1685
|
+
this.id = id;
|
|
1686
|
+
this.provider = provider;
|
|
1687
|
+
}
|
|
1688
|
+
static async init() {
|
|
1689
|
+
if (typeof window == "undefined" ||
|
|
1690
|
+
window.exodus === undefined) {
|
|
1691
|
+
throw new Error("Exodus is not available.");
|
|
1692
|
+
}
|
|
1693
|
+
const { algosdk, algodClient } = await Algod.init();
|
|
1694
|
+
const exodus = window.exodus.algorand;
|
|
1695
|
+
return new ExodusClient({
|
|
1696
|
+
id: exports.PROVIDER_ID.EXODUS,
|
|
1697
|
+
client: exodus,
|
|
1698
|
+
provider: providers[exports.PROVIDER_ID.EXODUS],
|
|
1699
|
+
algosdk: algosdk,
|
|
1700
|
+
algodClient: algodClient,
|
|
1701
|
+
});
|
|
1702
|
+
}
|
|
1703
|
+
async connect() {
|
|
1704
|
+
const { address } = await this.#client.connect();
|
|
1705
|
+
if (!address) {
|
|
1706
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
1707
|
+
}
|
|
1708
|
+
const accounts = [
|
|
1709
|
+
{
|
|
1710
|
+
name: `Exodus 1`,
|
|
1711
|
+
address,
|
|
1712
|
+
providerId: this.provider.id,
|
|
1713
|
+
},
|
|
1714
|
+
];
|
|
1715
|
+
return {
|
|
1716
|
+
...this.provider,
|
|
1717
|
+
accounts,
|
|
1718
|
+
};
|
|
1719
|
+
}
|
|
1720
|
+
async reconnect(onDisconnect) {
|
|
1721
|
+
if (window === undefined ||
|
|
1722
|
+
window.exodus === undefined ||
|
|
1723
|
+
window.exodus.algorand.isConnected !== true) {
|
|
1724
|
+
onDisconnect();
|
|
1725
|
+
}
|
|
1726
|
+
return null;
|
|
1727
|
+
}
|
|
1728
|
+
async disconnect() {
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1731
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1732
|
+
// Decode the transactions to access their properties.
|
|
1733
|
+
const decodedTxns = transactions.map((txn) => {
|
|
1734
|
+
return this.algosdk.decodeObj(txn);
|
|
1735
|
+
});
|
|
1736
|
+
// Get the unsigned transactions.
|
|
1737
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
1738
|
+
// If the transaction isn't already signed and is to be sent from a connected account,
|
|
1739
|
+
// add it to the arrays of transactions to be signed.
|
|
1740
|
+
if (!("txn" in txn) &&
|
|
1741
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
1742
|
+
acc.push(transactions[i]);
|
|
1743
|
+
}
|
|
1744
|
+
return acc;
|
|
1745
|
+
}, []);
|
|
1746
|
+
// Sign them with the client.
|
|
1747
|
+
const result = await this.#client.signTransaction(txnsToSign);
|
|
1748
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
1749
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
1750
|
+
if (!("txn" in txn)) {
|
|
1751
|
+
const signedByUser = result.shift();
|
|
1752
|
+
signedByUser && acc.push(signedByUser);
|
|
1753
|
+
}
|
|
1754
|
+
else {
|
|
1755
|
+
acc.push(transactions[i]);
|
|
1756
|
+
}
|
|
1757
|
+
return acc;
|
|
1758
|
+
}, []);
|
|
1759
|
+
return signedTxns;
|
|
1760
|
+
}
|
|
1761
|
+
async signEncodedTransactions(transactions) {
|
|
1762
|
+
const transactionsToSign = [];
|
|
1763
|
+
const signedRawTransactions = [];
|
|
1764
|
+
for (const [type, txn] of transactions) {
|
|
1765
|
+
if (type === "u") {
|
|
1766
|
+
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
1767
|
+
transactionsToSign.push(decoded.toByte());
|
|
1768
|
+
}
|
|
1769
|
+
}
|
|
1770
|
+
const result = await this.#client.signTransaction(transactionsToSign);
|
|
1771
|
+
if (!result) {
|
|
1772
|
+
throw new Error("Signing failed.");
|
|
1773
|
+
}
|
|
1774
|
+
let resultIndex = 0;
|
|
1775
|
+
for (const [type, txn] of transactions) {
|
|
1776
|
+
if (type === "u") {
|
|
1777
|
+
signedRawTransactions.push(result[resultIndex]);
|
|
1778
|
+
resultIndex++;
|
|
1779
|
+
}
|
|
1780
|
+
else {
|
|
1781
|
+
signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
return signedRawTransactions;
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
|
|
1788
|
+
const DefaultKMDConfig = {
|
|
1789
|
+
host: KMD_HOST,
|
|
1790
|
+
token: KMD_TOKEN,
|
|
1791
|
+
port: KMD_PORT,
|
|
1792
|
+
};
|
|
1793
|
+
class KMDWallet extends BaseWallet {
|
|
1794
|
+
#client;
|
|
1795
|
+
walletId;
|
|
1796
|
+
id;
|
|
1797
|
+
provider;
|
|
1798
|
+
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1799
|
+
super(algosdk, algodClient);
|
|
1800
|
+
this.#client = client;
|
|
1801
|
+
this.id = id;
|
|
1802
|
+
this.provider = provider;
|
|
1803
|
+
this.walletId = "";
|
|
1804
|
+
}
|
|
1805
|
+
static async init() {
|
|
1806
|
+
// TODO: allow diff config options?
|
|
1807
|
+
const kmdConfig = DefaultKMDConfig;
|
|
1808
|
+
const { algosdk, algodClient } = await Algod.init();
|
|
1809
|
+
const kmdClient = new algosdk.Kmd(kmdConfig.token, kmdConfig.host, kmdConfig.port);
|
|
1810
|
+
return new KMDWallet({
|
|
1811
|
+
id: exports.PROVIDER_ID.KMD_WALLET,
|
|
1812
|
+
client: kmdClient,
|
|
1813
|
+
provider: providers[exports.PROVIDER_ID.KMD_WALLET],
|
|
1814
|
+
algosdk: algosdk,
|
|
1815
|
+
algodClient: algodClient,
|
|
1816
|
+
});
|
|
1817
|
+
}
|
|
1818
|
+
async connect() {
|
|
1819
|
+
// TODO: prompt for wallet and password?
|
|
1820
|
+
return {
|
|
1821
|
+
...this.provider,
|
|
1822
|
+
accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
|
|
1823
|
+
};
|
|
1824
|
+
}
|
|
1825
|
+
async disconnect() {
|
|
1826
|
+
return;
|
|
1827
|
+
}
|
|
1828
|
+
async reconnect() {
|
|
1829
|
+
return {
|
|
1830
|
+
...this.provider,
|
|
1831
|
+
accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
|
|
1832
|
+
};
|
|
1833
|
+
}
|
|
1834
|
+
async requestPassword() {
|
|
1835
|
+
// TODO: store it locally?
|
|
1836
|
+
const pw = prompt("gib password");
|
|
1837
|
+
return pw ? pw : "";
|
|
1838
|
+
}
|
|
1839
|
+
async getWalletToken(walletId, password) {
|
|
1840
|
+
const handleResp = await this.#client.initWalletHandle(walletId, password);
|
|
1841
|
+
return handleResp.wallet_handle_token;
|
|
1842
|
+
}
|
|
1843
|
+
async releaseToken(token) {
|
|
1844
|
+
await this.#client.releaseWalletHandle(token);
|
|
1845
|
+
}
|
|
1846
|
+
async listWallets() {
|
|
1847
|
+
const walletResponse = await this.#client.listWallets();
|
|
1848
|
+
const walletList = walletResponse["wallets"];
|
|
1849
|
+
const walletMap = {};
|
|
1850
|
+
for (const w of walletList) {
|
|
1851
|
+
walletMap[w.name] = w.id;
|
|
1852
|
+
}
|
|
1853
|
+
return walletMap;
|
|
1854
|
+
}
|
|
1855
|
+
async listAccounts(wallet, password) {
|
|
1856
|
+
const walletMap = await this.listWallets();
|
|
1857
|
+
if (!(wallet in walletMap))
|
|
1858
|
+
throw Error("No wallet named: " + wallet);
|
|
1859
|
+
this.walletId = walletMap[wallet];
|
|
1860
|
+
// Get a handle token
|
|
1861
|
+
const token = await this.getWalletToken(this.walletId, password);
|
|
1862
|
+
// Fetch accounts and format them as lib expects
|
|
1863
|
+
const listResponse = await this.#client.listKeys(token);
|
|
1864
|
+
const addresses = listResponse["addresses"];
|
|
1865
|
+
const mappedAccounts = addresses.map((address, index) => {
|
|
1866
|
+
return {
|
|
1867
|
+
name: `KMDWallet ${index + 1}`,
|
|
1868
|
+
address,
|
|
1869
|
+
providerId: this.provider.id,
|
|
1870
|
+
};
|
|
1871
|
+
});
|
|
1872
|
+
// Release handle token
|
|
1873
|
+
this.releaseToken(token);
|
|
1874
|
+
return mappedAccounts;
|
|
1875
|
+
}
|
|
1876
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
1877
|
+
// Decode the transactions to access their properties.
|
|
1878
|
+
const decodedTxns = transactions.map((txn) => {
|
|
1879
|
+
return this.algosdk.decodeObj(txn);
|
|
1880
|
+
});
|
|
1881
|
+
// Get a handle token
|
|
1882
|
+
const pw = await this.requestPassword();
|
|
1883
|
+
const token = await this.getWalletToken(this.walletId, pw);
|
|
1884
|
+
const signedTxns = [];
|
|
1885
|
+
// Sign them with the client.
|
|
1886
|
+
const signingPromises = [];
|
|
1887
|
+
for (const idx in decodedTxns) {
|
|
1888
|
+
const dtxn = decodedTxns[idx];
|
|
1889
|
+
// push the incoming txn into signed, we'll overwrite it later
|
|
1890
|
+
signedTxns.push(transactions[idx]);
|
|
1891
|
+
// Its already signed, skip it
|
|
1892
|
+
if (!("snd" in dtxn))
|
|
1893
|
+
continue;
|
|
1894
|
+
// Not to be signed by our signer, skip it
|
|
1895
|
+
if (!connectedAccounts.includes(this.algosdk.encodeAddress(dtxn.snd)))
|
|
1896
|
+
continue;
|
|
1897
|
+
// overwrite with an empty blob
|
|
1898
|
+
signedTxns[idx] = new Uint8Array();
|
|
1899
|
+
const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
|
|
1900
|
+
signingPromises.push(this.#client.signTransaction(token, pw, txn));
|
|
1901
|
+
}
|
|
1902
|
+
const signingResults = await Promise.all(signingPromises);
|
|
1903
|
+
// Restore the newly signed txns in the correct order
|
|
1904
|
+
let signedIdx = 0;
|
|
1905
|
+
for (const idx in signedTxns) {
|
|
1906
|
+
// If its an empty array, infer that it is one of the
|
|
1907
|
+
// ones we wanted to have signed and overwrite the empty buff
|
|
1908
|
+
if (signedTxns[idx].length === 0) {
|
|
1909
|
+
signedTxns[idx] = signingResults[signedIdx];
|
|
1910
|
+
signedIdx += 1;
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
return signedTxns;
|
|
1914
|
+
}
|
|
1915
|
+
signEncodedTransactions(transactions) {
|
|
1916
|
+
throw new Error("Method not implemented.");
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
|
|
1920
|
+
class WalletConnectClient extends BaseWallet {
|
|
1921
|
+
#client;
|
|
1922
|
+
id;
|
|
1923
|
+
provider;
|
|
1924
|
+
constructor({ client, id, provider, algosdk, algodClient }) {
|
|
1925
|
+
super(algosdk, algodClient);
|
|
1926
|
+
this.#client = client;
|
|
1927
|
+
this.id = id;
|
|
1928
|
+
this.provider = provider;
|
|
1929
|
+
}
|
|
1930
|
+
static async init() {
|
|
1931
|
+
const { algosdk, algodClient } = await Algod.init();
|
|
1932
|
+
const WalletConnect = (await import('@walletconnect/client')).default;
|
|
1933
|
+
const QRCodeModal = (await import('algorand-walletconnect-qrcode-modal'))
|
|
1934
|
+
.default;
|
|
1935
|
+
const walletConnect = new WalletConnect({
|
|
1936
|
+
bridge: "https://bridge.walletconnect.org",
|
|
1937
|
+
qrcodeModal: QRCodeModal,
|
|
1938
|
+
});
|
|
1939
|
+
const initWallet = {
|
|
1940
|
+
id: exports.PROVIDER_ID.WALLET_CONNECT,
|
|
1941
|
+
client: walletConnect,
|
|
1942
|
+
provider: providers[exports.PROVIDER_ID.WALLET_CONNECT],
|
|
1943
|
+
algosdk: algosdk,
|
|
1944
|
+
algodClient: algodClient,
|
|
1945
|
+
};
|
|
1946
|
+
return new WalletConnectClient(initWallet);
|
|
1947
|
+
}
|
|
1948
|
+
async connect() {
|
|
1949
|
+
let chainId = 416001;
|
|
1950
|
+
if (NODE_NETWORK === "betanet") {
|
|
1951
|
+
chainId = 416003;
|
|
1952
|
+
}
|
|
1953
|
+
else if (NODE_NETWORK === "testnet") {
|
|
1954
|
+
chainId = 416002;
|
|
1955
|
+
}
|
|
1956
|
+
if (!this.#client.connected) {
|
|
1957
|
+
await this.#client.createSession({ chainId });
|
|
1958
|
+
}
|
|
1959
|
+
return new Promise((resolve, reject) => {
|
|
1960
|
+
this.#client.on("connect", (error, payload) => {
|
|
1961
|
+
if (error) {
|
|
1962
|
+
reject(error);
|
|
1963
|
+
}
|
|
1964
|
+
const { accounts } = payload.params[0];
|
|
1965
|
+
resolve({
|
|
1966
|
+
...this.provider,
|
|
1967
|
+
accounts: accounts.map((address, index) => ({
|
|
1968
|
+
name: `Wallet Connect ${index + 1}`,
|
|
1969
|
+
address,
|
|
1970
|
+
providerId: this.provider.id,
|
|
1971
|
+
})),
|
|
1972
|
+
});
|
|
1973
|
+
});
|
|
1974
|
+
this.#client.on("session_update", (error, payload) => {
|
|
1975
|
+
if (error) {
|
|
1976
|
+
reject(error);
|
|
1977
|
+
}
|
|
1978
|
+
const { accounts } = payload.params[0];
|
|
1979
|
+
resolve({
|
|
1980
|
+
...this.provider,
|
|
1981
|
+
accounts: accounts.map((address, index) => ({
|
|
1982
|
+
name: `Wallet Connect ${index + 1}`,
|
|
1983
|
+
address,
|
|
1984
|
+
providerId: this.provider.id,
|
|
1985
|
+
})),
|
|
1986
|
+
});
|
|
1987
|
+
});
|
|
1988
|
+
});
|
|
1989
|
+
}
|
|
1990
|
+
async reconnect() {
|
|
1991
|
+
this.#client = (await WalletConnectClient.init()).#client;
|
|
1992
|
+
const accounts = this.#client.accounts;
|
|
1993
|
+
if (!accounts) {
|
|
1994
|
+
return null;
|
|
1995
|
+
}
|
|
1996
|
+
return {
|
|
1997
|
+
...this.provider,
|
|
1998
|
+
accounts: accounts.map((address, index) => ({
|
|
1999
|
+
name: `Wallet Connect ${index + 1}`,
|
|
2000
|
+
address,
|
|
2001
|
+
providerId: this.provider.id,
|
|
2002
|
+
})),
|
|
2003
|
+
};
|
|
2004
|
+
}
|
|
2005
|
+
check() {
|
|
2006
|
+
return this.#client.connected;
|
|
2007
|
+
}
|
|
2008
|
+
async disconnect() {
|
|
2009
|
+
try {
|
|
2010
|
+
await this.#client.killSession();
|
|
2011
|
+
}
|
|
2012
|
+
catch (e) {
|
|
2013
|
+
console.error("Error disconnecting", e);
|
|
2014
|
+
}
|
|
2015
|
+
}
|
|
2016
|
+
formatTransactionsArray(transactions) {
|
|
2017
|
+
const formattedTransactions = transactions.map((txn) => {
|
|
2018
|
+
const formattedTxn = {
|
|
2019
|
+
txn: txn[1],
|
|
2020
|
+
};
|
|
2021
|
+
if (txn[0] === "s") {
|
|
2022
|
+
const decodedTxn = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn[1], "base64")));
|
|
2023
|
+
formattedTxn.txn = Buffer.from(this.algosdk.encodeUnsignedTransaction(decodedTxn.txn)).toString("base64");
|
|
2024
|
+
formattedTxn.signers = [];
|
|
2025
|
+
}
|
|
2026
|
+
return formattedTxn;
|
|
2027
|
+
});
|
|
2028
|
+
return formattedTransactions;
|
|
2029
|
+
}
|
|
2030
|
+
async signTransactions(connectedAccounts, transactions) {
|
|
2031
|
+
// Decode the transactions to access their properties.
|
|
2032
|
+
const decodedTxns = transactions.map((txn) => {
|
|
2033
|
+
return this.algosdk.decodeObj(txn);
|
|
2034
|
+
});
|
|
2035
|
+
// Marshal the transactions,
|
|
2036
|
+
// and add the signers property if they shouldn't be signed.
|
|
2037
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
2038
|
+
if (!("txn" in txn) &&
|
|
2039
|
+
connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
|
|
2040
|
+
acc.push({
|
|
2041
|
+
txn: Buffer.from(transactions[i]).toString("base64"),
|
|
2042
|
+
});
|
|
2043
|
+
}
|
|
2044
|
+
else {
|
|
2045
|
+
acc.push({
|
|
2046
|
+
txn: Buffer.from(transactions[i]).toString("base64"),
|
|
2047
|
+
signers: [],
|
|
2048
|
+
});
|
|
2049
|
+
}
|
|
2050
|
+
return acc;
|
|
2051
|
+
}, []);
|
|
2052
|
+
const requestParams = [txnsToSign];
|
|
2053
|
+
const request = utils.formatJsonRpcRequest("algo_signTxn", requestParams);
|
|
2054
|
+
// Play an audio file to keep Wallet Connect's web socket open on iOS
|
|
2055
|
+
// when the user goes into background mode.
|
|
2056
|
+
this.keepWCAliveStart();
|
|
2057
|
+
// Sign them with the client.
|
|
2058
|
+
const result = await this.#client.sendCustomRequest(request);
|
|
2059
|
+
this.keepWCAliveStop();
|
|
2060
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
2061
|
+
const signedTxns = result.reduce((signedTxns, txn, i) => {
|
|
2062
|
+
if (txn) {
|
|
2063
|
+
signedTxns.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
2064
|
+
}
|
|
2065
|
+
if (txn === null) {
|
|
2066
|
+
signedTxns.push(transactions[i]);
|
|
2067
|
+
}
|
|
2068
|
+
return signedTxns;
|
|
2069
|
+
}, []);
|
|
2070
|
+
return signedTxns;
|
|
2071
|
+
}
|
|
2072
|
+
async signEncodedTransactions(transactions) {
|
|
2073
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
2074
|
+
const requestParams = [transactionsToSign];
|
|
2075
|
+
const request = utils.formatJsonRpcRequest("algo_signTxn", requestParams);
|
|
2076
|
+
this.keepWCAliveStart();
|
|
2077
|
+
const result = await this.#client.sendCustomRequest(request);
|
|
2078
|
+
this.keepWCAliveStop();
|
|
2079
|
+
const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
|
|
2080
|
+
if (txn) {
|
|
2081
|
+
signedTxns.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
2082
|
+
}
|
|
2083
|
+
if (txn === null) {
|
|
2084
|
+
signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
|
|
2085
|
+
}
|
|
2086
|
+
return signedTxns;
|
|
2087
|
+
}, []);
|
|
2088
|
+
return signedRawTransactions;
|
|
2089
|
+
}
|
|
2090
|
+
}
|
|
2091
|
+
|
|
2092
|
+
const clients = {
|
|
2093
|
+
[exports.PROVIDER_ID.KMD_WALLET]: KMDWallet.init().catch((e) => {
|
|
2094
|
+
if (typeof window !== "undefined") {
|
|
2095
|
+
console.info("error initializing client", e);
|
|
2096
|
+
return;
|
|
2097
|
+
}
|
|
2098
|
+
}),
|
|
2099
|
+
[exports.PROVIDER_ID.PERA_WALLET]: PeraWalletClient.init().catch((e) => {
|
|
2100
|
+
if (typeof window !== "undefined") {
|
|
2101
|
+
console.info("error initializing client", e);
|
|
2102
|
+
return;
|
|
2103
|
+
}
|
|
2104
|
+
}),
|
|
2105
|
+
[exports.PROVIDER_ID.MYALGO_WALLET]: MyAlgoWalletClient.init().catch((e) => {
|
|
2106
|
+
if (typeof window !== "undefined") {
|
|
2107
|
+
console.info("error initializing client", e);
|
|
2108
|
+
return;
|
|
2109
|
+
}
|
|
2110
|
+
}),
|
|
2111
|
+
[exports.PROVIDER_ID.ALGO_SIGNER]: AlgoSignerClient.init().catch((e) => {
|
|
2112
|
+
if (typeof window !== "undefined") {
|
|
2113
|
+
console.info("error initializing client", e);
|
|
2114
|
+
return;
|
|
2115
|
+
}
|
|
2116
|
+
}),
|
|
2117
|
+
[exports.PROVIDER_ID.DEFLY]: DeflyWalletClient.init().catch((e) => {
|
|
2118
|
+
if (typeof window !== "undefined") {
|
|
2119
|
+
console.info("error initializing client", e);
|
|
2120
|
+
return;
|
|
2121
|
+
}
|
|
2122
|
+
}),
|
|
2123
|
+
[exports.PROVIDER_ID.EXODUS]: ExodusClient.init().catch((e) => {
|
|
2124
|
+
if (typeof window !== "undefined") {
|
|
2125
|
+
console.info("error initializing client", e);
|
|
2126
|
+
return;
|
|
2127
|
+
}
|
|
2128
|
+
}),
|
|
2129
|
+
[exports.PROVIDER_ID.WALLET_CONNECT]: WalletConnectClient.init().catch((e) => {
|
|
2130
|
+
if (typeof window !== "undefined") {
|
|
2131
|
+
console.info("error initializing client", e);
|
|
2132
|
+
return;
|
|
2133
|
+
}
|
|
2134
|
+
}),
|
|
2135
|
+
};
|
|
2136
|
+
|
|
2137
|
+
const getWalletClient = async (id) => {
|
|
2138
|
+
if (!id) {
|
|
2139
|
+
throw new Error("No wallet provider id provided");
|
|
2140
|
+
}
|
|
2141
|
+
const client = await clients[id];
|
|
2142
|
+
if (!client) {
|
|
2143
|
+
throw new Error(`No wallet client found for provider id: ${id}`);
|
|
2144
|
+
}
|
|
2145
|
+
return client;
|
|
2146
|
+
};
|
|
504
2147
|
|
|
505
2148
|
function useWallet() {
|
|
506
2149
|
const allAccounts = useWalletStore((state) => state.accounts);
|
|
507
2150
|
const activeAccount = useWalletStore((state) => state.activeAccount);
|
|
508
|
-
const accounts =
|
|
2151
|
+
const accounts = require$$0.useMemo(() => allAccounts.filter((account) => account.providerId === activeAccount?.providerId), [allAccounts, activeAccount]);
|
|
509
2152
|
const signTransactions = async (transactions) => {
|
|
510
|
-
const walletClient = await
|
|
2153
|
+
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
511
2154
|
if (!walletClient || !activeAccount?.address) {
|
|
512
2155
|
throw new Error("No wallet found.");
|
|
513
2156
|
}
|
|
514
|
-
const signedTransactions = await walletClient.signTransactions(
|
|
2157
|
+
const signedTransactions = await walletClient.signTransactions(accounts.map((acct) => acct.address), transactions);
|
|
515
2158
|
return signedTransactions;
|
|
516
2159
|
};
|
|
517
|
-
const sendTransactions = async (transactions) => {
|
|
518
|
-
const walletClient = await
|
|
519
|
-
const result = await walletClient?.sendRawTransactions(transactions);
|
|
2160
|
+
const sendTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2161
|
+
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
2162
|
+
const result = await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
520
2163
|
return result;
|
|
521
2164
|
};
|
|
522
2165
|
const signer = async (txnGroup, indexesToSign) => {
|
|
523
|
-
const algosdk = await
|
|
2166
|
+
const algosdk = await getAlgosdk();
|
|
524
2167
|
const txnBlobs = txnGroup.map(algosdk.encodeUnsignedTransaction);
|
|
525
2168
|
const txns = await Promise.resolve(signTransactions(txnBlobs));
|
|
526
2169
|
return txns.filter((_, index) => indexesToSign.includes(index));
|
|
@@ -528,7 +2171,7 @@ function useWallet() {
|
|
|
528
2171
|
const getAccountInfo = async () => {
|
|
529
2172
|
if (!activeAccount)
|
|
530
2173
|
throw new Error("No selected account.");
|
|
531
|
-
const walletClient = await
|
|
2174
|
+
const walletClient = await getWalletClient(activeAccount.providerId);
|
|
532
2175
|
const accountInfo = await walletClient?.getAccountInfo(activeAccount.address);
|
|
533
2176
|
return accountInfo;
|
|
534
2177
|
};
|
|
@@ -538,20 +2181,20 @@ function useWallet() {
|
|
|
538
2181
|
const getAssets = async () => {
|
|
539
2182
|
if (!activeAccount)
|
|
540
2183
|
throw new Error("No selected account.");
|
|
541
|
-
const walletClient = await
|
|
2184
|
+
const walletClient = await getWalletClient(activeAccount.providerId);
|
|
542
2185
|
return await walletClient?.getAssets(activeAccount.address);
|
|
543
2186
|
};
|
|
544
2187
|
const groupTransactionsBySender = async (transactions) => {
|
|
545
|
-
const walletClient = await
|
|
2188
|
+
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
546
2189
|
return walletClient?.groupTransactionsBySender(transactions);
|
|
547
2190
|
};
|
|
548
2191
|
const signEncodedTransactions = async (transactions) => {
|
|
549
|
-
const walletClient = await
|
|
2192
|
+
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
550
2193
|
return await walletClient?.signEncodedTransactions(transactions);
|
|
551
2194
|
};
|
|
552
|
-
const sendRawTransactions = async (transactions) => {
|
|
553
|
-
const walletClient = await
|
|
554
|
-
return await walletClient?.sendRawTransactions(transactions);
|
|
2195
|
+
const sendRawTransactions = async (transactions, waitRoundsToConfirm) => {
|
|
2196
|
+
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
2197
|
+
return await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
|
|
555
2198
|
};
|
|
556
2199
|
return {
|
|
557
2200
|
accounts,
|
|
@@ -589,10 +2232,10 @@ function shallow(objA, objB) {
|
|
|
589
2232
|
|
|
590
2233
|
function useConnectWallet(options) {
|
|
591
2234
|
const { accounts, setActiveAccount: setActiveAccount, activeAccount, clearActiveAccount, addAccounts, removeAccounts, } = useWalletStore(walletStoreSelector, shallow);
|
|
592
|
-
const providers$1 =
|
|
2235
|
+
const providers$1 = require$$0.useMemo(() => Object.values(providers)
|
|
593
2236
|
.filter(({ id }) => options?.providers
|
|
594
2237
|
? options.providers.includes(id)
|
|
595
|
-
: id !==
|
|
2238
|
+
: id !== exports.PROVIDER_ID.KMD_WALLET)
|
|
596
2239
|
.map(({ id, name, icon, isWalletConnect }) => {
|
|
597
2240
|
return {
|
|
598
2241
|
id,
|
|
@@ -621,7 +2264,7 @@ function useConnectWallet(options) {
|
|
|
621
2264
|
});
|
|
622
2265
|
};
|
|
623
2266
|
const disconnectWCSessions = async (id) => {
|
|
624
|
-
if (!providers
|
|
2267
|
+
if (!providers[id].isWalletConnect) {
|
|
625
2268
|
return;
|
|
626
2269
|
}
|
|
627
2270
|
const wcSessions = Object.values(providers$1).filter((p) => p.id !== id && p.isWalletConnect && (p.isConnected || p.isActive));
|
|
@@ -632,7 +2275,7 @@ function useConnectWallet(options) {
|
|
|
632
2275
|
const connect = async (id) => {
|
|
633
2276
|
try {
|
|
634
2277
|
await disconnectWCSessions(id);
|
|
635
|
-
const walletClient = await
|
|
2278
|
+
const walletClient = await getWalletClient(id);
|
|
636
2279
|
const walletInfo = await walletClient.connect(() => disconnect(id));
|
|
637
2280
|
if (!walletInfo || !walletInfo.accounts.length) {
|
|
638
2281
|
throw new Error("Failed to connect " + id);
|
|
@@ -669,7 +2312,7 @@ function useConnectWallet(options) {
|
|
|
669
2312
|
};
|
|
670
2313
|
const reconnect = async (id) => {
|
|
671
2314
|
try {
|
|
672
|
-
const walletClient = await
|
|
2315
|
+
const walletClient = await getWalletClient(id);
|
|
673
2316
|
const walletInfo = await walletClient?.reconnect(() => disconnect(id));
|
|
674
2317
|
if (walletInfo && walletInfo.accounts.length) {
|
|
675
2318
|
addAccounts(walletInfo.accounts);
|
|
@@ -682,7 +2325,7 @@ function useConnectWallet(options) {
|
|
|
682
2325
|
};
|
|
683
2326
|
const disconnect = async (id) => {
|
|
684
2327
|
try {
|
|
685
|
-
const walletClient = await
|
|
2328
|
+
const walletClient = await getWalletClient(id);
|
|
686
2329
|
walletClient?.disconnect();
|
|
687
2330
|
}
|
|
688
2331
|
catch (e) {
|
|
@@ -706,19 +2349,16 @@ function useConnectWallet(options) {
|
|
|
706
2349
|
};
|
|
707
2350
|
}
|
|
708
2351
|
|
|
709
|
-
exports.KMD_HOST =
|
|
710
|
-
exports.KMD_PASSWORD =
|
|
711
|
-
exports.KMD_PORT =
|
|
712
|
-
exports.KMD_TOKEN =
|
|
713
|
-
exports.KMD_WALLET =
|
|
714
|
-
exports.NODE_NETWORK =
|
|
715
|
-
exports.NODE_PORT =
|
|
716
|
-
exports.NODE_SERVER =
|
|
717
|
-
exports.NODE_TOKEN =
|
|
718
|
-
|
|
719
|
-
enumerable: true,
|
|
720
|
-
get: function () { return constants.PROVIDER_ID; }
|
|
721
|
-
});
|
|
2352
|
+
exports.KMD_HOST = KMD_HOST;
|
|
2353
|
+
exports.KMD_PASSWORD = KMD_PASSWORD;
|
|
2354
|
+
exports.KMD_PORT = KMD_PORT;
|
|
2355
|
+
exports.KMD_TOKEN = KMD_TOKEN;
|
|
2356
|
+
exports.KMD_WALLET = KMD_WALLET$1;
|
|
2357
|
+
exports.NODE_NETWORK = NODE_NETWORK;
|
|
2358
|
+
exports.NODE_PORT = NODE_PORT;
|
|
2359
|
+
exports.NODE_SERVER = NODE_SERVER;
|
|
2360
|
+
exports.NODE_TOKEN = NODE_TOKEN;
|
|
2361
|
+
exports.getWalletClient = getWalletClient;
|
|
722
2362
|
exports.useConnectWallet = useConnectWallet;
|
|
723
2363
|
exports.useWallet = useWallet;
|
|
724
2364
|
//# sourceMappingURL=index.js.map
|