@txnlab/use-wallet 2.8.0 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +3 -1009
  2. package/dist/index.cjs +2060 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +511 -0
  5. package/dist/index.d.ts +436 -902
  6. package/dist/index.js +2012 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +50 -119
  9. package/dist/cjs/index.js +0 -3934
  10. package/dist/cjs/index.js.map +0 -1
  11. package/dist/cjs/jest.config.d.ts +0 -11
  12. package/dist/cjs/jest.setup.d.ts +0 -0
  13. package/dist/cjs/src/algod/index.d.ts +0 -10
  14. package/dist/cjs/src/clients/algosigner/client.d.ts +0 -37
  15. package/dist/cjs/src/clients/algosigner/constants.d.ts +0 -2
  16. package/dist/cjs/src/clients/algosigner/index.d.ts +0 -2
  17. package/dist/cjs/src/clients/algosigner/types.d.ts +0 -39
  18. package/dist/cjs/src/clients/base/base.d.ts +0 -46
  19. package/dist/cjs/src/clients/base/index.d.ts +0 -2
  20. package/dist/cjs/src/clients/custom/client.d.ts +0 -18
  21. package/dist/cjs/src/clients/custom/constants.d.ts +0 -1
  22. package/dist/cjs/src/clients/custom/index.d.ts +0 -2
  23. package/dist/cjs/src/clients/custom/types.d.ts +0 -25
  24. package/dist/cjs/src/clients/daffi/client.d.ts +0 -34
  25. package/dist/cjs/src/clients/daffi/constants.d.ts +0 -1
  26. package/dist/cjs/src/clients/daffi/index.d.ts +0 -2
  27. package/dist/cjs/src/clients/daffi/types.d.ts +0 -27
  28. package/dist/cjs/src/clients/defly/client.d.ts +0 -34
  29. package/dist/cjs/src/clients/defly/constants.d.ts +0 -1
  30. package/dist/cjs/src/clients/defly/index.d.ts +0 -2
  31. package/dist/cjs/src/clients/defly/types.d.ts +0 -32
  32. package/dist/cjs/src/clients/exodus/client.d.ts +0 -33
  33. package/dist/cjs/src/clients/exodus/constants.d.ts +0 -1
  34. package/dist/cjs/src/clients/exodus/index.d.ts +0 -2
  35. package/dist/cjs/src/clients/exodus/types.d.ts +0 -34
  36. package/dist/cjs/src/clients/index.d.ts +0 -19
  37. package/dist/cjs/src/clients/kibisis/client.d.ts +0 -73
  38. package/dist/cjs/src/clients/kibisis/constants.d.ts +0 -37
  39. package/dist/cjs/src/clients/kibisis/index.d.ts +0 -2
  40. package/dist/cjs/src/clients/kibisis/types.d.ts +0 -86
  41. package/dist/cjs/src/clients/kibisis/utils.d.ts +0 -9
  42. package/dist/cjs/src/clients/kibisis/utils.test.d.ts +0 -1
  43. package/dist/cjs/src/clients/kmd/client.d.ts +0 -30
  44. package/dist/cjs/src/clients/kmd/constants.d.ts +0 -1
  45. package/dist/cjs/src/clients/kmd/index.d.ts +0 -2
  46. package/dist/cjs/src/clients/kmd/types.d.ts +0 -32
  47. package/dist/cjs/src/clients/lute/client.d.ts +0 -34
  48. package/dist/cjs/src/clients/lute/constants.d.ts +0 -1
  49. package/dist/cjs/src/clients/lute/index.d.ts +0 -2
  50. package/dist/cjs/src/clients/lute/types.d.ts +0 -15
  51. package/dist/cjs/src/clients/magic/client.d.ts +0 -35
  52. package/dist/cjs/src/clients/magic/constants.d.ts +0 -1
  53. package/dist/cjs/src/clients/magic/index.d.ts +0 -2
  54. package/dist/cjs/src/clients/magic/types.d.ts +0 -27
  55. package/dist/cjs/src/clients/mnemonic/client.d.ts +0 -35
  56. package/dist/cjs/src/clients/mnemonic/constants.d.ts +0 -1
  57. package/dist/cjs/src/clients/mnemonic/index.d.ts +0 -2
  58. package/dist/cjs/src/clients/mnemonic/types.d.ts +0 -21
  59. package/dist/cjs/src/clients/myalgo/client.d.ts +0 -33
  60. package/dist/cjs/src/clients/myalgo/constants.d.ts +0 -1
  61. package/dist/cjs/src/clients/myalgo/index.d.ts +0 -2
  62. package/dist/cjs/src/clients/myalgo/types.d.ts +0 -19
  63. package/dist/cjs/src/clients/pera/client.d.ts +0 -34
  64. package/dist/cjs/src/clients/pera/constants.d.ts +0 -1
  65. package/dist/cjs/src/clients/pera/index.d.ts +0 -2
  66. package/dist/cjs/src/clients/pera/types.d.ts +0 -27
  67. package/dist/cjs/src/clients/walletconnect2/client.d.ts +0 -36
  68. package/dist/cjs/src/clients/walletconnect2/constants.d.ts +0 -5
  69. package/dist/cjs/src/clients/walletconnect2/index.d.ts +0 -2
  70. package/dist/cjs/src/clients/walletconnect2/types.d.ts +0 -28
  71. package/dist/cjs/src/clients/walletconnect2/utils.d.ts +0 -2
  72. package/dist/cjs/src/constants/constants.d.ts +0 -20
  73. package/dist/cjs/src/constants/index.d.ts +0 -1
  74. package/dist/cjs/src/context/WalletContext.d.ts +0 -8
  75. package/dist/cjs/src/hooks/index.d.ts +0 -2
  76. package/dist/cjs/src/hooks/useInitializeProviders.d.ts +0 -10
  77. package/dist/cjs/src/hooks/useInitializeProviders.test.d.ts +0 -4
  78. package/dist/cjs/src/hooks/useWallet.d.ts +0 -31
  79. package/dist/cjs/src/hooks/useWallet.test.d.ts +0 -4
  80. package/dist/cjs/src/index.d.ts +0 -6
  81. package/dist/cjs/src/media/audio.d.ts +0 -1
  82. package/dist/cjs/src/store/index.d.ts +0 -2
  83. package/dist/cjs/src/store/state/debugStore.d.ts +0 -6
  84. package/dist/cjs/src/store/state/walletStore.d.ts +0 -52
  85. package/dist/cjs/src/testUtils/mockAccounts.d.ts +0 -3
  86. package/dist/cjs/src/testUtils/mockClients.d.ts +0 -45
  87. package/dist/cjs/src/types/api.d.ts +0 -14
  88. package/dist/cjs/src/types/index.d.ts +0 -4
  89. package/dist/cjs/src/types/node.d.ts +0 -44
  90. package/dist/cjs/src/types/providers.d.ts +0 -148
  91. package/dist/cjs/src/types/utilities.d.ts +0 -1
  92. package/dist/cjs/src/types/wallet.d.ts +0 -54
  93. package/dist/cjs/src/utils/clearAccounts.d.ts +0 -2
  94. package/dist/cjs/src/utils/clearAccounts.test.d.ts +0 -1
  95. package/dist/cjs/src/utils/debugLog.d.ts +0 -3
  96. package/dist/cjs/src/utils/encodeNFDTransactionArray.spec.d.ts +0 -1
  97. package/dist/cjs/src/utils/encodeNFDTransactionsArray.d.ts +0 -2
  98. package/dist/cjs/src/utils/index.d.ts +0 -3
  99. package/dist/cjs/src/utils/initializeProviders.d.ts +0 -3
  100. package/dist/cjs/src/utils/initializeProviders.test.d.ts +0 -4
  101. package/dist/cjs/src/utils/providers.d.ts +0 -3
  102. package/dist/cjs/src/utils/providers.spec.d.ts +0 -1
  103. package/dist/cjs/src/utils/reconnectProviders.d.ts +0 -2
  104. package/dist/cjs/src/utils/reconnectProviders.test.d.ts +0 -1
  105. package/dist/cjs/src/utils/svgToBase64.d.ts +0 -1
  106. package/dist/cjs/src/utils/types.d.ts +0 -2
  107. package/dist/esm/index.js +0 -3911
  108. package/dist/esm/jest.config.d.ts +0 -11
  109. package/dist/esm/jest.setup.d.ts +0 -0
  110. package/dist/esm/src/algod/index.d.ts +0 -10
  111. package/dist/esm/src/clients/algosigner/client.d.ts +0 -37
  112. package/dist/esm/src/clients/algosigner/constants.d.ts +0 -2
  113. package/dist/esm/src/clients/algosigner/index.d.ts +0 -2
  114. package/dist/esm/src/clients/algosigner/types.d.ts +0 -39
  115. package/dist/esm/src/clients/base/base.d.ts +0 -46
  116. package/dist/esm/src/clients/base/index.d.ts +0 -2
  117. package/dist/esm/src/clients/custom/client.d.ts +0 -18
  118. package/dist/esm/src/clients/custom/constants.d.ts +0 -1
  119. package/dist/esm/src/clients/custom/index.d.ts +0 -2
  120. package/dist/esm/src/clients/custom/types.d.ts +0 -25
  121. package/dist/esm/src/clients/daffi/client.d.ts +0 -34
  122. package/dist/esm/src/clients/daffi/constants.d.ts +0 -1
  123. package/dist/esm/src/clients/daffi/index.d.ts +0 -2
  124. package/dist/esm/src/clients/daffi/types.d.ts +0 -27
  125. package/dist/esm/src/clients/defly/client.d.ts +0 -34
  126. package/dist/esm/src/clients/defly/constants.d.ts +0 -1
  127. package/dist/esm/src/clients/defly/index.d.ts +0 -2
  128. package/dist/esm/src/clients/defly/types.d.ts +0 -32
  129. package/dist/esm/src/clients/exodus/client.d.ts +0 -33
  130. package/dist/esm/src/clients/exodus/constants.d.ts +0 -1
  131. package/dist/esm/src/clients/exodus/index.d.ts +0 -2
  132. package/dist/esm/src/clients/exodus/types.d.ts +0 -34
  133. package/dist/esm/src/clients/index.d.ts +0 -19
  134. package/dist/esm/src/clients/kibisis/client.d.ts +0 -73
  135. package/dist/esm/src/clients/kibisis/constants.d.ts +0 -37
  136. package/dist/esm/src/clients/kibisis/index.d.ts +0 -2
  137. package/dist/esm/src/clients/kibisis/types.d.ts +0 -86
  138. package/dist/esm/src/clients/kibisis/utils.d.ts +0 -9
  139. package/dist/esm/src/clients/kibisis/utils.test.d.ts +0 -1
  140. package/dist/esm/src/clients/kmd/client.d.ts +0 -30
  141. package/dist/esm/src/clients/kmd/constants.d.ts +0 -1
  142. package/dist/esm/src/clients/kmd/index.d.ts +0 -2
  143. package/dist/esm/src/clients/kmd/types.d.ts +0 -32
  144. package/dist/esm/src/clients/lute/client.d.ts +0 -34
  145. package/dist/esm/src/clients/lute/constants.d.ts +0 -1
  146. package/dist/esm/src/clients/lute/index.d.ts +0 -2
  147. package/dist/esm/src/clients/lute/types.d.ts +0 -15
  148. package/dist/esm/src/clients/magic/client.d.ts +0 -35
  149. package/dist/esm/src/clients/magic/constants.d.ts +0 -1
  150. package/dist/esm/src/clients/magic/index.d.ts +0 -2
  151. package/dist/esm/src/clients/magic/types.d.ts +0 -27
  152. package/dist/esm/src/clients/mnemonic/client.d.ts +0 -35
  153. package/dist/esm/src/clients/mnemonic/constants.d.ts +0 -1
  154. package/dist/esm/src/clients/mnemonic/index.d.ts +0 -2
  155. package/dist/esm/src/clients/mnemonic/types.d.ts +0 -21
  156. package/dist/esm/src/clients/myalgo/client.d.ts +0 -33
  157. package/dist/esm/src/clients/myalgo/constants.d.ts +0 -1
  158. package/dist/esm/src/clients/myalgo/index.d.ts +0 -2
  159. package/dist/esm/src/clients/myalgo/types.d.ts +0 -19
  160. package/dist/esm/src/clients/pera/client.d.ts +0 -34
  161. package/dist/esm/src/clients/pera/constants.d.ts +0 -1
  162. package/dist/esm/src/clients/pera/index.d.ts +0 -2
  163. package/dist/esm/src/clients/pera/types.d.ts +0 -27
  164. package/dist/esm/src/clients/walletconnect2/client.d.ts +0 -36
  165. package/dist/esm/src/clients/walletconnect2/constants.d.ts +0 -5
  166. package/dist/esm/src/clients/walletconnect2/index.d.ts +0 -2
  167. package/dist/esm/src/clients/walletconnect2/types.d.ts +0 -28
  168. package/dist/esm/src/clients/walletconnect2/utils.d.ts +0 -2
  169. package/dist/esm/src/constants/constants.d.ts +0 -20
  170. package/dist/esm/src/constants/index.d.ts +0 -1
  171. package/dist/esm/src/context/WalletContext.d.ts +0 -8
  172. package/dist/esm/src/hooks/index.d.ts +0 -2
  173. package/dist/esm/src/hooks/useInitializeProviders.d.ts +0 -10
  174. package/dist/esm/src/hooks/useInitializeProviders.test.d.ts +0 -4
  175. package/dist/esm/src/hooks/useWallet.d.ts +0 -31
  176. package/dist/esm/src/hooks/useWallet.test.d.ts +0 -4
  177. package/dist/esm/src/index.d.ts +0 -6
  178. package/dist/esm/src/media/audio.d.ts +0 -1
  179. package/dist/esm/src/store/index.d.ts +0 -2
  180. package/dist/esm/src/store/state/debugStore.d.ts +0 -6
  181. package/dist/esm/src/store/state/walletStore.d.ts +0 -52
  182. package/dist/esm/src/testUtils/mockAccounts.d.ts +0 -3
  183. package/dist/esm/src/testUtils/mockClients.d.ts +0 -45
  184. package/dist/esm/src/types/api.d.ts +0 -14
  185. package/dist/esm/src/types/index.d.ts +0 -4
  186. package/dist/esm/src/types/node.d.ts +0 -44
  187. package/dist/esm/src/types/providers.d.ts +0 -148
  188. package/dist/esm/src/types/utilities.d.ts +0 -1
  189. package/dist/esm/src/types/wallet.d.ts +0 -54
  190. package/dist/esm/src/utils/clearAccounts.d.ts +0 -2
  191. package/dist/esm/src/utils/clearAccounts.test.d.ts +0 -1
  192. package/dist/esm/src/utils/debugLog.d.ts +0 -3
  193. package/dist/esm/src/utils/encodeNFDTransactionArray.spec.d.ts +0 -1
  194. package/dist/esm/src/utils/encodeNFDTransactionsArray.d.ts +0 -2
  195. package/dist/esm/src/utils/index.d.ts +0 -3
  196. package/dist/esm/src/utils/initializeProviders.d.ts +0 -3
  197. package/dist/esm/src/utils/initializeProviders.test.d.ts +0 -4
  198. package/dist/esm/src/utils/providers.d.ts +0 -3
  199. package/dist/esm/src/utils/providers.spec.d.ts +0 -1
  200. package/dist/esm/src/utils/reconnectProviders.d.ts +0 -2
  201. package/dist/esm/src/utils/reconnectProviders.test.d.ts +0 -1
  202. package/dist/esm/src/utils/svgToBase64.d.ts +0 -1
  203. package/dist/esm/src/utils/types.d.ts +0 -2
package/dist/cjs/index.js DELETED
@@ -1,3934 +0,0 @@
1
- 'use strict';
2
-
3
- var require$$0 = require('react');
4
- var buffer = require('buffer');
5
-
6
- exports.PROVIDER_ID = void 0;
7
- (function (PROVIDER_ID) {
8
- PROVIDER_ID["KMD"] = "kmd";
9
- PROVIDER_ID["CUSTOM"] = "custom";
10
- PROVIDER_ID["PERA"] = "pera";
11
- PROVIDER_ID["DAFFI"] = "daffi";
12
- PROVIDER_ID["LUTE"] = "lute";
13
- PROVIDER_ID["MYALGO"] = "myalgo";
14
- PROVIDER_ID["ALGOSIGNER"] = "algosigner";
15
- PROVIDER_ID["DEFLY"] = "defly";
16
- PROVIDER_ID["EXODUS"] = "exodus";
17
- PROVIDER_ID["KIBISIS"] = "kibisis";
18
- PROVIDER_ID["WALLETCONNECT"] = "walletconnect";
19
- PROVIDER_ID["MNEMONIC"] = "mnemonic";
20
- PROVIDER_ID["MAGIC"] = "magic";
21
- })(exports.PROVIDER_ID || (exports.PROVIDER_ID = {}));
22
- const DEFAULT_NETWORK = 'mainnet';
23
- const DEFAULT_NODE_BASEURL = 'https://mainnet-api.algonode.cloud';
24
- const DEFAULT_NODE_TOKEN = '';
25
- const DEFAULT_NODE_PORT = '';
26
-
27
- const getAlgosdk = async () => {
28
- return (await import('algosdk')).default;
29
- };
30
- const getAlgodClient = (algosdk, algodClientOptions) => {
31
- const [tokenOrBaseClient = DEFAULT_NODE_TOKEN, baseServer = DEFAULT_NODE_BASEURL, port = DEFAULT_NODE_PORT, headers] = algodClientOptions || [];
32
- return new algosdk.Algodv2(tokenOrBaseClient, baseServer, port, headers);
33
- };
34
- class Algod {
35
- algosdk;
36
- algodClient;
37
- constructor(algosdk, algodClient) {
38
- this.algosdk = algosdk;
39
- this.algodClient = algodClient;
40
- }
41
- static async init(algodOptions) {
42
- const algosdk = await getAlgosdk();
43
- const algodClient = getAlgodClient(algosdk, algodOptions);
44
- return new Algod(algosdk, algodClient);
45
- }
46
- }
47
-
48
- 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=';
49
-
50
- const getIsIOS = () => {
51
- if (typeof window !== 'undefined') {
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- return /iPad|iPhone|iPod/.test(navigator?.userAgent) && !window?.MSStream;
54
- }
55
- else {
56
- return false;
57
- }
58
- };
59
- const isIOS = getIsIOS();
60
- class BaseClient {
61
- algosdk;
62
- algodClient;
63
- clientOptions;
64
- keepWCAlive;
65
- metadata;
66
- static metadata;
67
- constructor(metadata, algosdk, algodClient, clientOptions) {
68
- this.algosdk = algosdk;
69
- this.algodClient = algodClient;
70
- this.clientOptions = clientOptions;
71
- this.keepWCAlive = new Audio();
72
- this.metadata = metadata;
73
- }
74
- async healthCheck() {
75
- return await this.algodClient.healthCheck().do();
76
- }
77
- async getAccountInfo(address) {
78
- const accountInfo = await this.algodClient.accountInformation(address).do();
79
- if (!accountInfo) {
80
- throw new Error('Unable to get account information');
81
- }
82
- return accountInfo;
83
- }
84
- async getAssets(address) {
85
- const accountInfo = await this.algodClient.accountInformation(address).do();
86
- if (!accountInfo || accountInfo.assets === undefined) {
87
- throw new Error('Unable to get account assets');
88
- }
89
- return accountInfo.assets;
90
- }
91
- async waitForConfirmation(txId, timeout = 4) {
92
- const confirmation = (await this.algosdk.waitForConfirmation(this.algodClient, txId, timeout));
93
- return { txId, ...confirmation };
94
- }
95
- decodeTransaction = (txn, isSigned) => {
96
- return isSigned
97
- ? this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, 'base64'))).txn
98
- : this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, 'base64')));
99
- };
100
- logEncodedTransaction(txn, isSigned) {
101
- const txnObj = this.decodeTransaction(txn, isSigned);
102
- console.log('TRANSACTION', {
103
- isSigned,
104
- from: txnObj.from && this.algosdk.encodeAddress(txnObj.from.publicKey),
105
- to: txnObj.to && this.algosdk.encodeAddress(txnObj.to.publicKey),
106
- type: txnObj.type,
107
- txn: txnObj
108
- });
109
- }
110
- groupTransactionsBySender(transactions) {
111
- function groupBySender(objectArray) {
112
- return objectArray.reduce(function (acc, obj) {
113
- const sender = obj.from;
114
- if (!acc[sender]) {
115
- acc[sender] = [];
116
- }
117
- acc[sender].push(obj);
118
- return acc;
119
- }, {});
120
- }
121
- const decodedGroup = transactions.reduce((acc, [type, txn], index) => {
122
- if (type === 'u') {
123
- const decodedTxn = this.decodeTransaction(txn, false);
124
- const from = decodedTxn.from ? this.algosdk.encodeAddress(decodedTxn.from.publicKey) : '';
125
- const to = decodedTxn.to ? this.algosdk.encodeAddress(decodedTxn.to.publicKey) : '';
126
- const type = decodedTxn.type || '';
127
- const amount = Number(decodedTxn.amount) || 0; // convert from bigint to number
128
- const txnObj = {
129
- groupIndex: index,
130
- amount,
131
- from,
132
- to,
133
- type,
134
- txn
135
- };
136
- acc.push(txnObj);
137
- }
138
- return acc;
139
- }, []);
140
- return groupBySender(decodedGroup);
141
- }
142
- async sendRawTransactions(transactions, waitRoundsToConfirm) {
143
- const sentTransaction = (await this.algodClient
144
- .sendRawTransaction(transactions)
145
- .do());
146
- if (!sentTransaction) {
147
- throw new Error('Transaction failed.');
148
- }
149
- const decodedTxn = this.algosdk.decodeSignedTransaction(transactions[0]);
150
- const waitRounds = waitRoundsToConfirm || decodedTxn.txn.lastRound - decodedTxn.txn.firstRound;
151
- const confirmedTransaction = await this.waitForConfirmation(sentTransaction.txId, waitRounds);
152
- return {
153
- id: sentTransaction.txId,
154
- ...confirmedTransaction
155
- };
156
- }
157
- async keepWCAliveStart() {
158
- // Playing an audio file prevents Wallet Connect's
159
- // web socket connection from being dropped when
160
- // iOS goes into background mode
161
- if (!isIOS) {
162
- return;
163
- }
164
- this.keepWCAlive.src = audio;
165
- this.keepWCAlive.autoplay = true;
166
- this.keepWCAlive.volume = 0;
167
- this.keepWCAlive.loop = true;
168
- await this.keepWCAlive.play();
169
- }
170
- keepWCAliveStop() {
171
- if (!isIOS) {
172
- return;
173
- }
174
- this.keepWCAlive.pause();
175
- }
176
- }
177
-
178
- 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){var r;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]||!!(null===(r=n.constructor)||void 0===r?void 0:r[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.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)||(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 g(n){O(n),n.p.forEach(S),n.p=null;}function O(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.g=!0;}function P(r,e){e._=e.p.length;var i=e.p[0],o=void 0!==r&&r!==i;return e.h.O||b("ES5").S(e,r,o),o?(i[Q].P&&(g(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,[]),g(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,u=o,a=!1;3===e.i&&(u=new Set(o),o.clear(),a=!0),i(u,(function(r,i){return A(n,e,o,r,i,t,a)})),x(n,o,!1),t&&n.u&&b("Patches").N(e,t,n.u,n.s);}return e.o}function A(e,i,o,a,c,s,v){if("production"!==process.env.NODE_ENV&&c===o&&n(5),r(c)){var p=M(e,c,s&&i&&3!==i.i&&!u(i.R,a)?s.concat(a):void 0);if(f(o,a,p),!r(p))return;e.m=!1;}else v&&o.add(c);if(t(c)&&!y(c)){if(!e.h.D&&e._<1)return;M(e,c),i&&i.A.l||x(e,c);}}function x(n,r,t){void 0===t&&(t=!1),!n.l&&n.h.D&&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 N(n,r,t){var e=s(r)?b("MapSet").F(r,t):v(r)?b("MapSet").T(r,t):n.O?function(n,r){var t=Array.isArray(n),e={i:t?1:0,A:r?r.A:_(),P:!1,I:!1,R:{},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 R(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=D(r,c),u.I=!1;}else e=D(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 D(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]=N(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.R[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&&(void 0!==t||r in n.o)||Number.isNaN(t)&&Number.isNaN(n.o[r])||(n.o[r]=t,n.R[r]=!0),!0},deleteProperty:function(n,r){return void 0!==z(n.t,r)||r in n.t?(n.R[r]=!1,E(n),k(n)):delete n.R[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.O=B,this.D=!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=N(e,r,void 0),v=!0;try{f=i(s),v=!1;}finally{v?g(c):O(c);}return "undefined"!=typeof Promise&&f instanceof Promise?f.then((function(n){return j(c,o),P(n,c)}),(function(n){throw g(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.D&&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=R(e));var i=w(this),o=N(this,e,void 0);return o[Q].C=!0,O(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.D=n;},i.setUseProxies=function(r){r&&!B&&n(20),this.O=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);
179
-
180
- const immerImpl = (initializer) => (set, get, store) => {
181
- store.setState = (updater, replace, ...a) => {
182
- const nextState = typeof updater === "function" ? fn(updater) : updater;
183
- return set(nextState, replace, ...a);
184
- };
185
- return initializer(store.setState, get, store);
186
- };
187
- const immer = immerImpl;
188
-
189
- const createStoreImpl = (createState) => {
190
- let state;
191
- const listeners = /* @__PURE__ */ new Set();
192
- const setState = (partial, replace) => {
193
- const nextState = typeof partial === "function" ? partial(state) : partial;
194
- if (!Object.is(nextState, state)) {
195
- const previousState = state;
196
- state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState);
197
- listeners.forEach((listener) => listener(state, previousState));
198
- }
199
- };
200
- const getState = () => state;
201
- const getInitialState = () => initialState;
202
- const subscribe = (listener) => {
203
- listeners.add(listener);
204
- return () => listeners.delete(listener);
205
- };
206
- const destroy = () => {
207
- if ((undefined ? undefined.MODE : void 0) !== "production") {
208
- console.warn(
209
- "[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."
210
- );
211
- }
212
- listeners.clear();
213
- };
214
- const api = { setState, getState, getInitialState, subscribe, destroy };
215
- const initialState = state = createState(setState, getState, api);
216
- return api;
217
- };
218
- const createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
219
-
220
- function getDefaultExportFromCjs (x) {
221
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
222
- }
223
-
224
- var withSelector = {exports: {}};
225
-
226
- var withSelector_production_min = {};
227
-
228
- var shim = {exports: {}};
229
-
230
- var useSyncExternalStoreShim_production_min = {};
231
-
232
- /**
233
- * @license React
234
- * use-sync-external-store-shim.production.min.js
235
- *
236
- * Copyright (c) Facebook, Inc. and its affiliates.
237
- *
238
- * This source code is licensed under the MIT license found in the
239
- * LICENSE file in the root directory of this source tree.
240
- */
241
-
242
- var hasRequiredUseSyncExternalStoreShim_production_min;
243
-
244
- function requireUseSyncExternalStoreShim_production_min () {
245
- if (hasRequiredUseSyncExternalStoreShim_production_min) return useSyncExternalStoreShim_production_min;
246
- hasRequiredUseSyncExternalStoreShim_production_min = 1;
247
- 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}
248
- 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;
249
- return useSyncExternalStoreShim_production_min;
250
- }
251
-
252
- var useSyncExternalStoreShim_development = {};
253
-
254
- /**
255
- * @license React
256
- * use-sync-external-store-shim.development.js
257
- *
258
- * Copyright (c) Facebook, Inc. and its affiliates.
259
- *
260
- * This source code is licensed under the MIT license found in the
261
- * LICENSE file in the root directory of this source tree.
262
- */
263
-
264
- var hasRequiredUseSyncExternalStoreShim_development;
265
-
266
- function requireUseSyncExternalStoreShim_development () {
267
- if (hasRequiredUseSyncExternalStoreShim_development) return useSyncExternalStoreShim_development;
268
- hasRequiredUseSyncExternalStoreShim_development = 1;
269
-
270
- if (process.env.NODE_ENV !== "production") {
271
- (function() {
272
-
273
- /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
274
- if (
275
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
276
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
277
- 'function'
278
- ) {
279
- __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
280
- }
281
- var React = require$$0;
282
-
283
- var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
284
-
285
- function error(format) {
286
- {
287
- {
288
- for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
289
- args[_key2 - 1] = arguments[_key2];
290
- }
291
-
292
- printWarning('error', format, args);
293
- }
294
- }
295
- }
296
-
297
- function printWarning(level, format, args) {
298
- // When changing this logic, you might want to also
299
- // update consoleWithStackDev.www.js as well.
300
- {
301
- var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
302
- var stack = ReactDebugCurrentFrame.getStackAddendum();
303
-
304
- if (stack !== '') {
305
- format += '%s';
306
- args = args.concat([stack]);
307
- } // eslint-disable-next-line react-internal/safe-string-coercion
308
-
309
-
310
- var argsWithFormat = args.map(function (item) {
311
- return String(item);
312
- }); // Careful: RN currently depends on this prefix
313
-
314
- argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
315
- // breaks IE9: https://github.com/facebook/react/issues/13610
316
- // eslint-disable-next-line react-internal/no-production-logging
317
-
318
- Function.prototype.apply.call(console[level], console, argsWithFormat);
319
- }
320
- }
321
-
322
- /**
323
- * inlined Object.is polyfill to avoid requiring consumers ship their own
324
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
325
- */
326
- function is(x, y) {
327
- return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
328
- ;
329
- }
330
-
331
- var objectIs = typeof Object.is === 'function' ? Object.is : is;
332
-
333
- // dispatch for CommonJS interop named imports.
334
-
335
- var useState = React.useState,
336
- useEffect = React.useEffect,
337
- useLayoutEffect = React.useLayoutEffect,
338
- useDebugValue = React.useDebugValue;
339
- var didWarnOld18Alpha = false;
340
- var didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works
341
- // because of a very particular set of implementation details and assumptions
342
- // -- change any one of them and it will break. The most important assumption
343
- // is that updates are always synchronous, because concurrent rendering is
344
- // only available in versions of React that also have a built-in
345
- // useSyncExternalStore API. And we only use this shim when the built-in API
346
- // does not exist.
347
- //
348
- // Do not assume that the clever hacks used by this hook also work in general.
349
- // The point of this shim is to replace the need for hacks by other libraries.
350
-
351
- function useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of
352
- // React do not expose a way to check if we're hydrating. So users of the shim
353
- // will need to track that themselves and return the correct value
354
- // from `getSnapshot`.
355
- getServerSnapshot) {
356
- {
357
- if (!didWarnOld18Alpha) {
358
- if (React.startTransition !== undefined) {
359
- didWarnOld18Alpha = true;
360
-
361
- 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.');
362
- }
363
- }
364
- } // Read the current snapshot from the store on every render. Again, this
365
- // breaks the rules of React, and only works here because of specific
366
- // implementation details, most importantly that updates are
367
- // always synchronous.
368
-
369
-
370
- var value = getSnapshot();
371
-
372
- {
373
- if (!didWarnUncachedGetSnapshot) {
374
- var cachedValue = getSnapshot();
375
-
376
- if (!objectIs(value, cachedValue)) {
377
- error('The result of getSnapshot should be cached to avoid an infinite loop');
378
-
379
- didWarnUncachedGetSnapshot = true;
380
- }
381
- }
382
- } // Because updates are synchronous, we don't queue them. Instead we force a
383
- // re-render whenever the subscribed state changes by updating an some
384
- // arbitrary useState hook. Then, during render, we call getSnapshot to read
385
- // the current value.
386
- //
387
- // Because we don't actually use the state returned by the useState hook, we
388
- // can save a bit of memory by storing other stuff in that slot.
389
- //
390
- // To implement the early bailout, we need to track some things on a mutable
391
- // object. Usually, we would put that in a useRef hook, but we can stash it in
392
- // our useState hook instead.
393
- //
394
- // To force a re-render, we call forceUpdate({inst}). That works because the
395
- // new object always fails an equality check.
396
-
397
-
398
- var _useState = useState({
399
- inst: {
400
- value: value,
401
- getSnapshot: getSnapshot
402
- }
403
- }),
404
- inst = _useState[0].inst,
405
- forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated
406
- // in the layout phase so we can access it during the tearing check that
407
- // happens on subscribe.
408
-
409
-
410
- useLayoutEffect(function () {
411
- inst.value = value;
412
- inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the
413
- // commit phase if there was an interleaved mutation. In concurrent mode
414
- // this can happen all the time, but even in synchronous mode, an earlier
415
- // effect may have mutated the store.
416
-
417
- if (checkIfSnapshotChanged(inst)) {
418
- // Force a re-render.
419
- forceUpdate({
420
- inst: inst
421
- });
422
- }
423
- }, [subscribe, value, getSnapshot]);
424
- useEffect(function () {
425
- // Check for changes right before subscribing. Subsequent changes will be
426
- // detected in the subscription handler.
427
- if (checkIfSnapshotChanged(inst)) {
428
- // Force a re-render.
429
- forceUpdate({
430
- inst: inst
431
- });
432
- }
433
-
434
- var handleStoreChange = function () {
435
- // TODO: Because there is no cross-renderer API for batching updates, it's
436
- // up to the consumer of this library to wrap their subscription event
437
- // with unstable_batchedUpdates. Should we try to detect when this isn't
438
- // the case and print a warning in development?
439
- // The store changed. Check if the snapshot changed since the last time we
440
- // read from the store.
441
- if (checkIfSnapshotChanged(inst)) {
442
- // Force a re-render.
443
- forceUpdate({
444
- inst: inst
445
- });
446
- }
447
- }; // Subscribe to the store and return a clean-up function.
448
-
449
-
450
- return subscribe(handleStoreChange);
451
- }, [subscribe]);
452
- useDebugValue(value);
453
- return value;
454
- }
455
-
456
- function checkIfSnapshotChanged(inst) {
457
- var latestGetSnapshot = inst.getSnapshot;
458
- var prevValue = inst.value;
459
-
460
- try {
461
- var nextValue = latestGetSnapshot();
462
- return !objectIs(prevValue, nextValue);
463
- } catch (error) {
464
- return true;
465
- }
466
- }
467
-
468
- function useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {
469
- // Note: The shim does not use getServerSnapshot, because pre-18 versions of
470
- // React do not expose a way to check if we're hydrating. So users of the shim
471
- // will need to track that themselves and return the correct value
472
- // from `getSnapshot`.
473
- return getSnapshot();
474
- }
475
-
476
- var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
477
-
478
- var isServerEnvironment = !canUseDOM;
479
-
480
- var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;
481
- var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;
482
-
483
- useSyncExternalStoreShim_development.useSyncExternalStore = useSyncExternalStore$2;
484
- /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
485
- if (
486
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
487
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
488
- 'function'
489
- ) {
490
- __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
491
- }
492
-
493
- })();
494
- }
495
- return useSyncExternalStoreShim_development;
496
- }
497
-
498
- var hasRequiredShim;
499
-
500
- function requireShim () {
501
- if (hasRequiredShim) return shim.exports;
502
- hasRequiredShim = 1;
503
-
504
- if (process.env.NODE_ENV === 'production') {
505
- shim.exports = requireUseSyncExternalStoreShim_production_min();
506
- } else {
507
- shim.exports = requireUseSyncExternalStoreShim_development();
508
- }
509
- return shim.exports;
510
- }
511
-
512
- /**
513
- * @license React
514
- * use-sync-external-store-shim/with-selector.production.min.js
515
- *
516
- * Copyright (c) Facebook, Inc. and its affiliates.
517
- *
518
- * This source code is licensed under the MIT license found in the
519
- * LICENSE file in the root directory of this source tree.
520
- */
521
-
522
- var hasRequiredWithSelector_production_min;
523
-
524
- function requireWithSelector_production_min () {
525
- if (hasRequiredWithSelector_production_min) return withSelector_production_min;
526
- hasRequiredWithSelector_production_min = 1;
527
- 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;
528
- 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]);
529
- u(function(){f.hasValue=!0;f.value=d;},[d]);w(d);return d};
530
- return withSelector_production_min;
531
- }
532
-
533
- var withSelector_development = {};
534
-
535
- /**
536
- * @license React
537
- * use-sync-external-store-shim/with-selector.development.js
538
- *
539
- * Copyright (c) Facebook, Inc. and its affiliates.
540
- *
541
- * This source code is licensed under the MIT license found in the
542
- * LICENSE file in the root directory of this source tree.
543
- */
544
-
545
- var hasRequiredWithSelector_development;
546
-
547
- function requireWithSelector_development () {
548
- if (hasRequiredWithSelector_development) return withSelector_development;
549
- hasRequiredWithSelector_development = 1;
550
-
551
- if (process.env.NODE_ENV !== "production") {
552
- (function() {
553
-
554
- /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
555
- if (
556
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
557
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
558
- 'function'
559
- ) {
560
- __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
561
- }
562
- var React = require$$0;
563
- var shim = requireShim();
564
-
565
- /**
566
- * inlined Object.is polyfill to avoid requiring consumers ship their own
567
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
568
- */
569
- function is(x, y) {
570
- return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
571
- ;
572
- }
573
-
574
- var objectIs = typeof Object.is === 'function' ? Object.is : is;
575
-
576
- var useSyncExternalStore = shim.useSyncExternalStore;
577
-
578
- // for CommonJS interop.
579
-
580
- var useRef = React.useRef,
581
- useEffect = React.useEffect,
582
- useMemo = React.useMemo,
583
- useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.
584
-
585
- function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
586
- // Use this to track the rendered snapshot.
587
- var instRef = useRef(null);
588
- var inst;
589
-
590
- if (instRef.current === null) {
591
- inst = {
592
- hasValue: false,
593
- value: null
594
- };
595
- instRef.current = inst;
596
- } else {
597
- inst = instRef.current;
598
- }
599
-
600
- var _useMemo = useMemo(function () {
601
- // Track the memoized state using closure variables that are local to this
602
- // memoized instance of a getSnapshot function. Intentionally not using a
603
- // useRef hook, because that state would be shared across all concurrent
604
- // copies of the hook/component.
605
- var hasMemo = false;
606
- var memoizedSnapshot;
607
- var memoizedSelection;
608
-
609
- var memoizedSelector = function (nextSnapshot) {
610
- if (!hasMemo) {
611
- // The first time the hook is called, there is no memoized result.
612
- hasMemo = true;
613
- memoizedSnapshot = nextSnapshot;
614
-
615
- var _nextSelection = selector(nextSnapshot);
616
-
617
- if (isEqual !== undefined) {
618
- // Even if the selector has changed, the currently rendered selection
619
- // may be equal to the new selection. We should attempt to reuse the
620
- // current value if possible, to preserve downstream memoizations.
621
- if (inst.hasValue) {
622
- var currentSelection = inst.value;
623
-
624
- if (isEqual(currentSelection, _nextSelection)) {
625
- memoizedSelection = currentSelection;
626
- return currentSelection;
627
- }
628
- }
629
- }
630
-
631
- memoizedSelection = _nextSelection;
632
- return _nextSelection;
633
- } // We may be able to reuse the previous invocation's result.
634
-
635
-
636
- // We may be able to reuse the previous invocation's result.
637
- var prevSnapshot = memoizedSnapshot;
638
- var prevSelection = memoizedSelection;
639
-
640
- if (objectIs(prevSnapshot, nextSnapshot)) {
641
- // The snapshot is the same as last time. Reuse the previous selection.
642
- return prevSelection;
643
- } // The snapshot has changed, so we need to compute a new selection.
644
-
645
-
646
- // The snapshot has changed, so we need to compute a new selection.
647
- var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data
648
- // has changed. If it hasn't, return the previous selection. That signals
649
- // to React that the selections are conceptually equal, and we can bail
650
- // out of rendering.
651
-
652
- // If a custom isEqual function is provided, use that to check if the data
653
- // has changed. If it hasn't, return the previous selection. That signals
654
- // to React that the selections are conceptually equal, and we can bail
655
- // out of rendering.
656
- if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {
657
- return prevSelection;
658
- }
659
-
660
- memoizedSnapshot = nextSnapshot;
661
- memoizedSelection = nextSelection;
662
- return nextSelection;
663
- }; // Assigning this to a constant so that Flow knows it can't change.
664
-
665
-
666
- // Assigning this to a constant so that Flow knows it can't change.
667
- var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;
668
-
669
- var getSnapshotWithSelector = function () {
670
- return memoizedSelector(getSnapshot());
671
- };
672
-
673
- var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {
674
- return memoizedSelector(maybeGetServerSnapshot());
675
- };
676
- return [getSnapshotWithSelector, getServerSnapshotWithSelector];
677
- }, [getSnapshot, getServerSnapshot, selector, isEqual]),
678
- getSelection = _useMemo[0],
679
- getServerSelection = _useMemo[1];
680
-
681
- var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);
682
- useEffect(function () {
683
- inst.hasValue = true;
684
- inst.value = value;
685
- }, [value]);
686
- useDebugValue(value);
687
- return value;
688
- }
689
-
690
- withSelector_development.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;
691
- /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
692
- if (
693
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
694
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
695
- 'function'
696
- ) {
697
- __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
698
- }
699
-
700
- })();
701
- }
702
- return withSelector_development;
703
- }
704
-
705
- if (process.env.NODE_ENV === 'production') {
706
- withSelector.exports = requireWithSelector_production_min();
707
- } else {
708
- withSelector.exports = requireWithSelector_development();
709
- }
710
-
711
- var withSelectorExports = withSelector.exports;
712
- var useSyncExternalStoreExports = /*@__PURE__*/getDefaultExportFromCjs(withSelectorExports);
713
-
714
- const { useDebugValue } = require$$0;
715
- const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
716
- let didWarnAboutEqualityFn = false;
717
- const identity = (arg) => arg;
718
- function useStore(api, selector = identity, equalityFn) {
719
- if ((undefined ? undefined.MODE : void 0) !== "production" && equalityFn && !didWarnAboutEqualityFn) {
720
- console.warn(
721
- "[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"
722
- );
723
- didWarnAboutEqualityFn = true;
724
- }
725
- const slice = useSyncExternalStoreWithSelector(
726
- api.subscribe,
727
- api.getState,
728
- api.getServerState || api.getInitialState,
729
- selector,
730
- equalityFn
731
- );
732
- useDebugValue(slice);
733
- return slice;
734
- }
735
- const createImpl = (createState) => {
736
- if ((undefined ? undefined.MODE : void 0) !== "production" && typeof createState !== "function") {
737
- console.warn(
738
- "[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`."
739
- );
740
- }
741
- const api = typeof createState === "function" ? createStore(createState) : createState;
742
- const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);
743
- Object.assign(useBoundStore, api);
744
- return useBoundStore;
745
- };
746
- const create = (createState) => createState ? createImpl(createState) : createImpl;
747
-
748
- const trackedConnections = /* @__PURE__ */ new Map();
749
- const getTrackedConnectionState = (name) => {
750
- const api = trackedConnections.get(name);
751
- if (!api)
752
- return {};
753
- return Object.fromEntries(
754
- Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])
755
- );
756
- };
757
- const extractConnectionInformation = (store, extensionConnector, options) => {
758
- if (store === void 0) {
759
- return {
760
- type: "untracked",
761
- connection: extensionConnector.connect(options)
762
- };
763
- }
764
- const existingConnection = trackedConnections.get(options.name);
765
- if (existingConnection) {
766
- return { type: "tracked", store, ...existingConnection };
767
- }
768
- const newConnection = {
769
- connection: extensionConnector.connect(options),
770
- stores: {}
771
- };
772
- trackedConnections.set(options.name, newConnection);
773
- return { type: "tracked", store, ...newConnection };
774
- };
775
- const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {
776
- const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;
777
- let extensionConnector;
778
- try {
779
- extensionConnector = (enabled != null ? enabled : (undefined ? undefined.MODE : void 0) !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__;
780
- } catch (e) {
781
- }
782
- if (!extensionConnector) {
783
- if ((undefined ? undefined.MODE : void 0) !== "production" && enabled) {
784
- console.warn(
785
- "[zustand devtools middleware] Please install/enable Redux devtools extension"
786
- );
787
- }
788
- return fn(set, get, api);
789
- }
790
- const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);
791
- let isRecording = true;
792
- api.setState = (state, replace, nameOrAction) => {
793
- const r = set(state, replace);
794
- if (!isRecording)
795
- return r;
796
- const action = nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction;
797
- if (store === void 0) {
798
- connection == null ? void 0 : connection.send(action, get());
799
- return r;
800
- }
801
- connection == null ? void 0 : connection.send(
802
- {
803
- ...action,
804
- type: `${store}/${action.type}`
805
- },
806
- {
807
- ...getTrackedConnectionState(options.name),
808
- [store]: api.getState()
809
- }
810
- );
811
- return r;
812
- };
813
- const setStateFromDevtools = (...a) => {
814
- const originalIsRecording = isRecording;
815
- isRecording = false;
816
- set(...a);
817
- isRecording = originalIsRecording;
818
- };
819
- const initialState = fn(api.setState, get, api);
820
- if (connectionInformation.type === "untracked") {
821
- connection == null ? void 0 : connection.init(initialState);
822
- } else {
823
- connectionInformation.stores[connectionInformation.store] = api;
824
- connection == null ? void 0 : connection.init(
825
- Object.fromEntries(
826
- Object.entries(connectionInformation.stores).map(([key, store2]) => [
827
- key,
828
- key === connectionInformation.store ? initialState : store2.getState()
829
- ])
830
- )
831
- );
832
- }
833
- if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
834
- let didWarnAboutReservedActionType = false;
835
- const originalDispatch = api.dispatch;
836
- api.dispatch = (...a) => {
837
- if ((undefined ? undefined.MODE : void 0) !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) {
838
- console.warn(
839
- '[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.'
840
- );
841
- didWarnAboutReservedActionType = true;
842
- }
843
- originalDispatch(...a);
844
- };
845
- }
846
- connection.subscribe((message) => {
847
- var _a;
848
- switch (message.type) {
849
- case "ACTION":
850
- if (typeof message.payload !== "string") {
851
- console.error(
852
- "[zustand devtools middleware] Unsupported action format"
853
- );
854
- return;
855
- }
856
- return parseJsonThen(
857
- message.payload,
858
- (action) => {
859
- if (action.type === "__setState") {
860
- if (store === void 0) {
861
- setStateFromDevtools(action.state);
862
- return;
863
- }
864
- if (Object.keys(action.state).length !== 1) {
865
- console.error(
866
- `
867
- [zustand devtools middleware] Unsupported __setState action format.
868
- When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),
869
- and value of this only key should be a state object. Example: { "type": "__setState", "state": { "abc123Store": { "foo": "bar" } } }
870
- `
871
- );
872
- }
873
- const stateFromDevtools = action.state[store];
874
- if (stateFromDevtools === void 0 || stateFromDevtools === null) {
875
- return;
876
- }
877
- if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {
878
- setStateFromDevtools(stateFromDevtools);
879
- }
880
- return;
881
- }
882
- if (!api.dispatchFromDevtools)
883
- return;
884
- if (typeof api.dispatch !== "function")
885
- return;
886
- api.dispatch(action);
887
- }
888
- );
889
- case "DISPATCH":
890
- switch (message.payload.type) {
891
- case "RESET":
892
- setStateFromDevtools(initialState);
893
- if (store === void 0) {
894
- return connection == null ? void 0 : connection.init(api.getState());
895
- }
896
- return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
897
- case "COMMIT":
898
- if (store === void 0) {
899
- connection == null ? void 0 : connection.init(api.getState());
900
- return;
901
- }
902
- return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
903
- case "ROLLBACK":
904
- return parseJsonThen(message.state, (state) => {
905
- if (store === void 0) {
906
- setStateFromDevtools(state);
907
- connection == null ? void 0 : connection.init(api.getState());
908
- return;
909
- }
910
- setStateFromDevtools(state[store]);
911
- connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
912
- });
913
- case "JUMP_TO_STATE":
914
- case "JUMP_TO_ACTION":
915
- return parseJsonThen(message.state, (state) => {
916
- if (store === void 0) {
917
- setStateFromDevtools(state);
918
- return;
919
- }
920
- if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {
921
- setStateFromDevtools(state[store]);
922
- }
923
- });
924
- case "IMPORT_STATE": {
925
- const { nextLiftedState } = message.payload;
926
- const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;
927
- if (!lastComputedState)
928
- return;
929
- if (store === void 0) {
930
- setStateFromDevtools(lastComputedState);
931
- } else {
932
- setStateFromDevtools(lastComputedState[store]);
933
- }
934
- connection == null ? void 0 : connection.send(
935
- null,
936
- // FIXME no-any
937
- nextLiftedState
938
- );
939
- return;
940
- }
941
- case "PAUSE_RECORDING":
942
- return isRecording = !isRecording;
943
- }
944
- return;
945
- }
946
- });
947
- return initialState;
948
- };
949
- const devtools = devtoolsImpl;
950
- const parseJsonThen = (stringified, f) => {
951
- let parsed;
952
- try {
953
- parsed = JSON.parse(stringified);
954
- } catch (e) {
955
- console.error(
956
- "[zustand devtools middleware] Could not parse the received json",
957
- e
958
- );
959
- }
960
- if (parsed !== void 0)
961
- f(parsed);
962
- };
963
-
964
- function createJSONStorage(getStorage, options) {
965
- let storage;
966
- try {
967
- storage = getStorage();
968
- } catch (e) {
969
- return;
970
- }
971
- const persistStorage = {
972
- getItem: (name) => {
973
- var _a;
974
- const parse = (str2) => {
975
- if (str2 === null) {
976
- return null;
977
- }
978
- return JSON.parse(str2, options == null ? void 0 : options.reviver);
979
- };
980
- const str = (_a = storage.getItem(name)) != null ? _a : null;
981
- if (str instanceof Promise) {
982
- return str.then(parse);
983
- }
984
- return parse(str);
985
- },
986
- setItem: (name, newValue) => storage.setItem(
987
- name,
988
- JSON.stringify(newValue, options == null ? void 0 : options.replacer)
989
- ),
990
- removeItem: (name) => storage.removeItem(name)
991
- };
992
- return persistStorage;
993
- }
994
- const toThenable = (fn) => (input) => {
995
- try {
996
- const result = fn(input);
997
- if (result instanceof Promise) {
998
- return result;
999
- }
1000
- return {
1001
- then(onFulfilled) {
1002
- return toThenable(onFulfilled)(result);
1003
- },
1004
- catch(_onRejected) {
1005
- return this;
1006
- }
1007
- };
1008
- } catch (e) {
1009
- return {
1010
- then(_onFulfilled) {
1011
- return this;
1012
- },
1013
- catch(onRejected) {
1014
- return toThenable(onRejected)(e);
1015
- }
1016
- };
1017
- }
1018
- };
1019
- const oldImpl = (config, baseOptions) => (set, get, api) => {
1020
- let options = {
1021
- getStorage: () => localStorage,
1022
- serialize: JSON.stringify,
1023
- deserialize: JSON.parse,
1024
- partialize: (state) => state,
1025
- version: 0,
1026
- merge: (persistedState, currentState) => ({
1027
- ...currentState,
1028
- ...persistedState
1029
- }),
1030
- ...baseOptions
1031
- };
1032
- let hasHydrated = false;
1033
- const hydrationListeners = /* @__PURE__ */ new Set();
1034
- const finishHydrationListeners = /* @__PURE__ */ new Set();
1035
- let storage;
1036
- try {
1037
- storage = options.getStorage();
1038
- } catch (e) {
1039
- }
1040
- if (!storage) {
1041
- return config(
1042
- (...args) => {
1043
- console.warn(
1044
- `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
1045
- );
1046
- set(...args);
1047
- },
1048
- get,
1049
- api
1050
- );
1051
- }
1052
- const thenableSerialize = toThenable(options.serialize);
1053
- const setItem = () => {
1054
- const state = options.partialize({ ...get() });
1055
- let errorInSync;
1056
- const thenable = thenableSerialize({ state, version: options.version }).then(
1057
- (serializedValue) => storage.setItem(options.name, serializedValue)
1058
- ).catch((e) => {
1059
- errorInSync = e;
1060
- });
1061
- if (errorInSync) {
1062
- throw errorInSync;
1063
- }
1064
- return thenable;
1065
- };
1066
- const savedSetState = api.setState;
1067
- api.setState = (state, replace) => {
1068
- savedSetState(state, replace);
1069
- void setItem();
1070
- };
1071
- const configResult = config(
1072
- (...args) => {
1073
- set(...args);
1074
- void setItem();
1075
- },
1076
- get,
1077
- api
1078
- );
1079
- let stateFromStorage;
1080
- const hydrate = () => {
1081
- var _a;
1082
- if (!storage)
1083
- return;
1084
- hasHydrated = false;
1085
- hydrationListeners.forEach((cb) => cb(get()));
1086
- const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;
1087
- return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {
1088
- if (storageValue) {
1089
- return options.deserialize(storageValue);
1090
- }
1091
- }).then((deserializedStorageValue) => {
1092
- if (deserializedStorageValue) {
1093
- if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
1094
- if (options.migrate) {
1095
- return options.migrate(
1096
- deserializedStorageValue.state,
1097
- deserializedStorageValue.version
1098
- );
1099
- }
1100
- console.error(
1101
- `State loaded from storage couldn't be migrated since no migrate function was provided`
1102
- );
1103
- } else {
1104
- return deserializedStorageValue.state;
1105
- }
1106
- }
1107
- }).then((migratedState) => {
1108
- var _a2;
1109
- stateFromStorage = options.merge(
1110
- migratedState,
1111
- (_a2 = get()) != null ? _a2 : configResult
1112
- );
1113
- set(stateFromStorage, true);
1114
- return setItem();
1115
- }).then(() => {
1116
- postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
1117
- hasHydrated = true;
1118
- finishHydrationListeners.forEach((cb) => cb(stateFromStorage));
1119
- }).catch((e) => {
1120
- postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
1121
- });
1122
- };
1123
- api.persist = {
1124
- setOptions: (newOptions) => {
1125
- options = {
1126
- ...options,
1127
- ...newOptions
1128
- };
1129
- if (newOptions.getStorage) {
1130
- storage = newOptions.getStorage();
1131
- }
1132
- },
1133
- clearStorage: () => {
1134
- storage == null ? void 0 : storage.removeItem(options.name);
1135
- },
1136
- getOptions: () => options,
1137
- rehydrate: () => hydrate(),
1138
- hasHydrated: () => hasHydrated,
1139
- onHydrate: (cb) => {
1140
- hydrationListeners.add(cb);
1141
- return () => {
1142
- hydrationListeners.delete(cb);
1143
- };
1144
- },
1145
- onFinishHydration: (cb) => {
1146
- finishHydrationListeners.add(cb);
1147
- return () => {
1148
- finishHydrationListeners.delete(cb);
1149
- };
1150
- }
1151
- };
1152
- hydrate();
1153
- return stateFromStorage || configResult;
1154
- };
1155
- const newImpl = (config, baseOptions) => (set, get, api) => {
1156
- let options = {
1157
- storage: createJSONStorage(() => localStorage),
1158
- partialize: (state) => state,
1159
- version: 0,
1160
- merge: (persistedState, currentState) => ({
1161
- ...currentState,
1162
- ...persistedState
1163
- }),
1164
- ...baseOptions
1165
- };
1166
- let hasHydrated = false;
1167
- const hydrationListeners = /* @__PURE__ */ new Set();
1168
- const finishHydrationListeners = /* @__PURE__ */ new Set();
1169
- let storage = options.storage;
1170
- if (!storage) {
1171
- return config(
1172
- (...args) => {
1173
- console.warn(
1174
- `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
1175
- );
1176
- set(...args);
1177
- },
1178
- get,
1179
- api
1180
- );
1181
- }
1182
- const setItem = () => {
1183
- const state = options.partialize({ ...get() });
1184
- return storage.setItem(options.name, {
1185
- state,
1186
- version: options.version
1187
- });
1188
- };
1189
- const savedSetState = api.setState;
1190
- api.setState = (state, replace) => {
1191
- savedSetState(state, replace);
1192
- void setItem();
1193
- };
1194
- const configResult = config(
1195
- (...args) => {
1196
- set(...args);
1197
- void setItem();
1198
- },
1199
- get,
1200
- api
1201
- );
1202
- api.getInitialState = () => configResult;
1203
- let stateFromStorage;
1204
- const hydrate = () => {
1205
- var _a, _b;
1206
- if (!storage)
1207
- return;
1208
- hasHydrated = false;
1209
- hydrationListeners.forEach((cb) => {
1210
- var _a2;
1211
- return cb((_a2 = get()) != null ? _a2 : configResult);
1212
- });
1213
- const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;
1214
- return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {
1215
- if (deserializedStorageValue) {
1216
- if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
1217
- if (options.migrate) {
1218
- return options.migrate(
1219
- deserializedStorageValue.state,
1220
- deserializedStorageValue.version
1221
- );
1222
- }
1223
- console.error(
1224
- `State loaded from storage couldn't be migrated since no migrate function was provided`
1225
- );
1226
- } else {
1227
- return deserializedStorageValue.state;
1228
- }
1229
- }
1230
- }).then((migratedState) => {
1231
- var _a2;
1232
- stateFromStorage = options.merge(
1233
- migratedState,
1234
- (_a2 = get()) != null ? _a2 : configResult
1235
- );
1236
- set(stateFromStorage, true);
1237
- return setItem();
1238
- }).then(() => {
1239
- postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
1240
- stateFromStorage = get();
1241
- hasHydrated = true;
1242
- finishHydrationListeners.forEach((cb) => cb(stateFromStorage));
1243
- }).catch((e) => {
1244
- postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
1245
- });
1246
- };
1247
- api.persist = {
1248
- setOptions: (newOptions) => {
1249
- options = {
1250
- ...options,
1251
- ...newOptions
1252
- };
1253
- if (newOptions.storage) {
1254
- storage = newOptions.storage;
1255
- }
1256
- },
1257
- clearStorage: () => {
1258
- storage == null ? void 0 : storage.removeItem(options.name);
1259
- },
1260
- getOptions: () => options,
1261
- rehydrate: () => hydrate(),
1262
- hasHydrated: () => hasHydrated,
1263
- onHydrate: (cb) => {
1264
- hydrationListeners.add(cb);
1265
- return () => {
1266
- hydrationListeners.delete(cb);
1267
- };
1268
- },
1269
- onFinishHydration: (cb) => {
1270
- finishHydrationListeners.add(cb);
1271
- return () => {
1272
- finishHydrationListeners.delete(cb);
1273
- };
1274
- }
1275
- };
1276
- if (!options.skipHydration) {
1277
- hydrate();
1278
- }
1279
- return stateFromStorage || configResult;
1280
- };
1281
- const persistImpl = (config, baseOptions) => {
1282
- if ("getStorage" in baseOptions || "serialize" in baseOptions || "deserialize" in baseOptions) {
1283
- if ((undefined ? undefined.MODE : void 0) !== "production") {
1284
- console.warn(
1285
- "[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead."
1286
- );
1287
- }
1288
- return oldImpl(config, baseOptions);
1289
- }
1290
- return newImpl(config, baseOptions);
1291
- };
1292
- const persist = persistImpl;
1293
-
1294
- const walletStoreSelector = (state) => ({
1295
- accounts: state.accounts,
1296
- activeAccount: state.activeAccount,
1297
- setActiveAccount: state.setActiveAccount,
1298
- clearActiveAccount: state.clearActiveAccount,
1299
- addAccounts: state.addAccounts,
1300
- removeAccounts: state.removeAccounts
1301
- });
1302
- const emptyState = {
1303
- accounts: [],
1304
- activeAccount: undefined,
1305
- setActiveAccount: () => {
1306
- return;
1307
- },
1308
- clearActiveAccount: () => {
1309
- return;
1310
- },
1311
- addAccounts: () => {
1312
- return;
1313
- },
1314
- removeAccounts: () => {
1315
- return;
1316
- }
1317
- };
1318
- const useWalletStore = create()(immer(persist(devtools((set, _get) => ({
1319
- accounts: [],
1320
- activeAccount: null,
1321
- setActiveAccount: (account) => {
1322
- set((state) => {
1323
- state.activeAccount = account;
1324
- });
1325
- },
1326
- clearActiveAccount: (id) => {
1327
- set((state) => {
1328
- if (id === state.activeAccount?.providerId)
1329
- state.activeAccount = null;
1330
- });
1331
- },
1332
- addAccounts: (accounts) => {
1333
- set((state) => {
1334
- const uniqueAccounts = [...state.accounts, ...accounts].reduce((uniqueAccounts, o) => {
1335
- if (!uniqueAccounts.some((obj) => obj.providerId === o.providerId && obj.address === o.address)) {
1336
- uniqueAccounts.push(o);
1337
- }
1338
- return uniqueAccounts;
1339
- }, []);
1340
- // Remove duplicates that occur when a user reconnects Pera wallet
1341
- state.accounts = uniqueAccounts;
1342
- });
1343
- },
1344
- removeAccounts: (providerId) => {
1345
- set((state) => {
1346
- state.accounts = state.accounts.filter((account) => account.providerId !== providerId);
1347
- });
1348
- }
1349
- })), {
1350
- name: 'txnlab-use-wallet',
1351
- version: 1 // increment to deprecate stored data
1352
- })));
1353
- // This a fix to ensure zustand never hydrates the store before React hydrates the page
1354
- // otherwise it causes a mismatch between SSR and client render
1355
- // see: https://github.com/pmndrs/zustand/issues/1145
1356
- const useHydratedWalletStore = ((selector, compare) => {
1357
- const store = useWalletStore(selector, compare);
1358
- const [hydrated, setHydrated] = require$$0.useState(false);
1359
- require$$0.useEffect(() => setHydrated(true), []);
1360
- return hydrated ? store : selector(emptyState);
1361
- });
1362
-
1363
- const useDebugStore = create((set) => ({
1364
- debug: false,
1365
- setDebug: (debug) => set({ debug })
1366
- }));
1367
-
1368
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1369
- const debugLog = (...args) => {
1370
- const { debug } = useDebugStore.getState();
1371
- if (debug) {
1372
- console.log('%c[USE-WALLET]', 'color: #FF602E; font-weight: bold;', ...args);
1373
- }
1374
- };
1375
- const getProviderList = (providers) => {
1376
- return providers
1377
- .map((provider) => {
1378
- if (typeof provider === 'string') {
1379
- return provider;
1380
- }
1381
- return provider.id;
1382
- })
1383
- .map((id) => id.toUpperCase())
1384
- .join(', ');
1385
- };
1386
-
1387
- const ICON$c = 'data:image/svg+xml;base64,' +
1388
- 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=';
1389
-
1390
- /**
1391
- * Documentation:
1392
- * https://github.com/perawallet/connect
1393
- */
1394
- class PeraWalletClient extends BaseClient {
1395
- #client;
1396
- clientOptions;
1397
- network;
1398
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network }) {
1399
- super(metadata, algosdk, algodClient);
1400
- this.#client = client;
1401
- this.clientOptions = clientOptions;
1402
- this.network = network;
1403
- this.metadata = PeraWalletClient.metadata;
1404
- }
1405
- static metadata = {
1406
- id: exports.PROVIDER_ID.PERA,
1407
- name: 'Pera',
1408
- icon: ICON$c,
1409
- isWalletConnect: true
1410
- };
1411
- static async init({ clientOptions, algodOptions, clientStatic, getDynamicClient, algosdkStatic, network = DEFAULT_NETWORK }) {
1412
- try {
1413
- debugLog(`${exports.PROVIDER_ID.PERA.toUpperCase()} initializing...`);
1414
- let PeraWalletConnect;
1415
- if (clientStatic) {
1416
- PeraWalletConnect = clientStatic;
1417
- }
1418
- else if (getDynamicClient) {
1419
- PeraWalletConnect = await getDynamicClient();
1420
- }
1421
- else {
1422
- throw new Error('Pera Wallet provider missing required property: clientStatic or getDynamicClient');
1423
- }
1424
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
1425
- const algodClient = getAlgodClient(algosdk, algodOptions);
1426
- const peraWallet = new PeraWalletConnect({
1427
- ...(clientOptions && clientOptions)
1428
- });
1429
- const provider = new PeraWalletClient({
1430
- metadata: PeraWalletClient.metadata,
1431
- client: peraWallet,
1432
- clientOptions,
1433
- algosdk,
1434
- algodClient,
1435
- network
1436
- });
1437
- debugLog(`${exports.PROVIDER_ID.PERA.toUpperCase()} initialized`, '✅');
1438
- return provider;
1439
- }
1440
- catch (e) {
1441
- console.error('Error initializing...', e);
1442
- return null;
1443
- }
1444
- }
1445
- async connect(onDisconnect) {
1446
- const accounts = await this.#client.connect();
1447
- this.#client.connector?.on('disconnect', onDisconnect);
1448
- if (accounts.length === 0) {
1449
- throw new Error(`No accounts found for ${PeraWalletClient.metadata.id}`);
1450
- }
1451
- const mappedAccounts = accounts.map((address, index) => ({
1452
- name: `Pera Wallet ${index + 1}`,
1453
- address,
1454
- providerId: PeraWalletClient.metadata.id
1455
- }));
1456
- return {
1457
- ...PeraWalletClient.metadata,
1458
- accounts: mappedAccounts
1459
- };
1460
- }
1461
- async reconnect(onDisconnect) {
1462
- const accounts = await this.#client.reconnectSession().catch(console.info);
1463
- this.#client.connector?.on('disconnect', onDisconnect);
1464
- if (!accounts) {
1465
- onDisconnect();
1466
- return null;
1467
- }
1468
- return {
1469
- ...PeraWalletClient.metadata,
1470
- accounts: accounts.map((address, index) => ({
1471
- name: `Pera Wallet ${index + 1}`,
1472
- address,
1473
- providerId: PeraWalletClient.metadata.id
1474
- }))
1475
- };
1476
- }
1477
- async disconnect() {
1478
- await this.#client.disconnect();
1479
- }
1480
- async signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
1481
- // If txnGroups is a nested array, flatten it
1482
- const transactions = Array.isArray(txnGroups[0])
1483
- ? txnGroups.flatMap((txn) => txn)
1484
- : txnGroups;
1485
- // Decode the transactions to access their properties.
1486
- const decodedTxns = transactions.map((txn) => {
1487
- return this.algosdk.decodeObj(txn);
1488
- });
1489
- const signedIndexes = [];
1490
- // Marshal the transactions,
1491
- // and add the signers property if they shouldn't be signed.
1492
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1493
- const isSigned = 'txn' in txn;
1494
- // If the indexes to be signed is specified, designate that it should be signed
1495
- if (indexesToSign && indexesToSign.length && indexesToSign.includes(i)) {
1496
- signedIndexes.push(i);
1497
- acc.push({
1498
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i])
1499
- });
1500
- // If the indexes to be signed is specified, but it's not included in it,
1501
- // designate that it should not be signed
1502
- }
1503
- else if (indexesToSign && indexesToSign.length && !indexesToSign.includes(i)) {
1504
- acc.push({
1505
- txn: isSigned
1506
- ? this.algosdk.decodeSignedTransaction(transactions[i]).txn
1507
- : this.algosdk.decodeUnsignedTransaction(transactions[i]),
1508
- signers: []
1509
- });
1510
- // If the transaction is unsigned and is to be sent from a connected account,
1511
- // designate that it should be signed
1512
- }
1513
- else if (!isSigned && connectedAccounts.includes(this.algosdk.encodeAddress(txn['snd']))) {
1514
- signedIndexes.push(i);
1515
- acc.push({
1516
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i])
1517
- });
1518
- // Otherwise, designate that it should not be signed
1519
- }
1520
- else if (isSigned) {
1521
- acc.push({
1522
- txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
1523
- signers: []
1524
- });
1525
- }
1526
- else if (!isSigned) {
1527
- acc.push({
1528
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
1529
- signers: []
1530
- });
1531
- }
1532
- return acc;
1533
- }, []);
1534
- // Sign them with the client.
1535
- const result = await this.#client.signTransaction([txnsToSign]);
1536
- // Join the newly signed transactions with the original group of transactions.
1537
- const signedTxns = transactions.reduce((acc, txn, i) => {
1538
- if (signedIndexes.includes(i)) {
1539
- const signedByUser = result.shift();
1540
- signedByUser && acc.push(signedByUser);
1541
- }
1542
- else if (returnGroup) {
1543
- acc.push(transactions[i]);
1544
- }
1545
- return acc;
1546
- }, []);
1547
- return signedTxns;
1548
- }
1549
- }
1550
-
1551
- const ICON$b = 'data:image/png;base64,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';
1552
-
1553
- /**
1554
- * Documentation:
1555
- * https://github.com/RDinitiativ/daffiwallet_connect
1556
- */
1557
- class DaffiWalletClient extends BaseClient {
1558
- #client;
1559
- clientOptions;
1560
- network;
1561
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network }) {
1562
- super(metadata, algosdk, algodClient);
1563
- this.#client = client;
1564
- this.clientOptions = clientOptions;
1565
- this.network = network;
1566
- this.metadata = DaffiWalletClient.metadata;
1567
- }
1568
- static metadata = {
1569
- id: exports.PROVIDER_ID.DAFFI,
1570
- name: 'Daffi',
1571
- icon: ICON$b,
1572
- isWalletConnect: true
1573
- };
1574
- static async init({ clientOptions, algodOptions, clientStatic, getDynamicClient, algosdkStatic, network = DEFAULT_NETWORK }) {
1575
- try {
1576
- debugLog(`${exports.PROVIDER_ID.DAFFI.toUpperCase()} initializing...`);
1577
- let DaffiWalletConnect;
1578
- if (clientStatic) {
1579
- DaffiWalletConnect = clientStatic;
1580
- }
1581
- else if (getDynamicClient) {
1582
- DaffiWalletConnect = await getDynamicClient();
1583
- }
1584
- else {
1585
- throw new Error('Daffi Wallet provider missing required property: clientStatic or getDynamicClient');
1586
- }
1587
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
1588
- const algodClient = getAlgodClient(algosdk, algodOptions);
1589
- const daffiWallet = new DaffiWalletConnect({
1590
- ...(clientOptions && clientOptions)
1591
- });
1592
- const provider = new DaffiWalletClient({
1593
- metadata: DaffiWalletClient.metadata,
1594
- client: daffiWallet,
1595
- clientOptions,
1596
- algosdk,
1597
- algodClient,
1598
- network
1599
- });
1600
- debugLog(`${exports.PROVIDER_ID.DAFFI.toUpperCase()} initialized`, '✅');
1601
- return provider;
1602
- }
1603
- catch (e) {
1604
- console.error('Error initializing...', e);
1605
- return null;
1606
- }
1607
- }
1608
- async connect(onDisconnect) {
1609
- const accounts = await this.#client.connect();
1610
- this.#client.connector?.on('disconnect', onDisconnect);
1611
- if (accounts.length === 0) {
1612
- throw new Error(`No accounts found for ${DaffiWalletClient.metadata.id}`);
1613
- }
1614
- const mappedAccounts = accounts.map((address, index) => ({
1615
- name: `Daffi Wallet ${index + 1}`,
1616
- address,
1617
- providerId: DaffiWalletClient.metadata.id
1618
- }));
1619
- return {
1620
- ...DaffiWalletClient.metadata,
1621
- accounts: mappedAccounts
1622
- };
1623
- }
1624
- async reconnect(onDisconnect) {
1625
- const accounts = await this.#client.reconnectSession().catch(console.info);
1626
- this.#client.connector?.on('disconnect', onDisconnect);
1627
- if (!accounts) {
1628
- onDisconnect();
1629
- return null;
1630
- }
1631
- return {
1632
- ...DaffiWalletClient.metadata,
1633
- accounts: accounts.map((address, index) => ({
1634
- name: `Daffi Wallet ${index + 1}`,
1635
- address,
1636
- providerId: DaffiWalletClient.metadata.id
1637
- }))
1638
- };
1639
- }
1640
- async disconnect() {
1641
- await this.#client.disconnect();
1642
- }
1643
- async signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
1644
- // If txnGroups is a nested array, flatten it
1645
- const transactions = Array.isArray(txnGroups[0])
1646
- ? txnGroups.flatMap((txn) => txn)
1647
- : txnGroups;
1648
- // Decode the transactions to access their properties.
1649
- const decodedTxns = transactions.map((txn) => {
1650
- return this.algosdk.decodeObj(txn);
1651
- });
1652
- const signedIndexes = [];
1653
- // Marshal the transactions,
1654
- // and add the signers property if they shouldn't be signed.
1655
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1656
- const isSigned = 'txn' in txn;
1657
- // If the indexes to be signed is specified, designate that it should be signed
1658
- if (indexesToSign && indexesToSign.length && indexesToSign.includes(i)) {
1659
- signedIndexes.push(i);
1660
- acc.push({
1661
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i])
1662
- });
1663
- // If the indexes to be signed is specified, but it's not included in it,
1664
- // designate that it should not be signed
1665
- }
1666
- else if (indexesToSign && indexesToSign.length && !indexesToSign.includes(i)) {
1667
- acc.push({
1668
- txn: isSigned
1669
- ? this.algosdk.decodeSignedTransaction(transactions[i]).txn
1670
- : this.algosdk.decodeUnsignedTransaction(transactions[i]),
1671
- signers: []
1672
- });
1673
- // If the transaction is unsigned and is to be sent from a connected account,
1674
- // designate that it should be signed
1675
- }
1676
- else if (!isSigned && connectedAccounts.includes(this.algosdk.encodeAddress(txn['snd']))) {
1677
- signedIndexes.push(i);
1678
- acc.push({
1679
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i])
1680
- });
1681
- // Otherwise, designate that it should not be signed
1682
- }
1683
- else if (isSigned) {
1684
- acc.push({
1685
- txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
1686
- signers: []
1687
- });
1688
- }
1689
- else if (!isSigned) {
1690
- acc.push({
1691
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
1692
- signers: []
1693
- });
1694
- }
1695
- return acc;
1696
- }, []);
1697
- // Sign them with the client.
1698
- const result = await this.#client.signTransaction([txnsToSign]);
1699
- // Join the newly signed transactions with the original group of transactions.
1700
- const signedTxns = transactions.reduce((acc, txn, i) => {
1701
- if (signedIndexes.includes(i)) {
1702
- const signedByUser = result.shift();
1703
- signedByUser && acc.push(signedByUser);
1704
- }
1705
- else if (returnGroup) {
1706
- acc.push(transactions[i]);
1707
- }
1708
- return acc;
1709
- }, []);
1710
- return signedTxns;
1711
- }
1712
- }
1713
-
1714
- const ICON$a = 'data:image/svg+xml;base64,' +
1715
- 'PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogIDxjaXJjbGUgZmlsbD0iIzI0NUVDNiIgY3g9IjE2IiBjeT0iMTYiIHI9IjE2Ii8+CiAgPHBvbHlnb24gZmlsbD0iI0ZGRkZGRiIgcG9pbnRzPSIxMi40LDIxLjIgMTQuNSwyMS4yIDE1LjMsMTkuOSAxNi42LDE3LjYgMTguMSwxNC45IDE5LjksMTEuNyAyMC4yLDExLjIgMjAuMywxMS43IDIyLjksMjEuMiAyNSwyMS4yIDIxLjUsOC45IDIxLjQsOC42IDE5LjUsOC42IDE5LjUsOC43IDE3LjgsMTEuOCAxNiwxNC45IDE1LjgsMTQuMSAxNS4yLDExLjcgMTUuMSwxMS41IDE0LjQsOC45IDE0LjMsOC42IDEyLjQsOC42IDEyLjQsOC43IDEwLjcsMTEuOCA4LjksMTUgNy4xLDE4IDUuMywyMS4yIDcuNCwyMS4yIDkuMiwxOCAxMSwxNC44IDEyLjgsMTEuNiAxMy4xLDExLjEgMTMuMiwxMS42IDEzLjcsMTMuNyAxNC40LDE2LjMgMTQuNiwxNy4yIDE0LjIsMTgiLz4KPC9zdmc+';
1716
-
1717
- /**
1718
- * Documentation:
1719
- * https://github.com/randlabs/myalgo-connect
1720
- */
1721
- class MyAlgoWalletClient extends BaseClient {
1722
- #client;
1723
- clientOptions;
1724
- network;
1725
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network }) {
1726
- super(metadata, algosdk, algodClient);
1727
- this.#client = client;
1728
- this.clientOptions = clientOptions;
1729
- this.network = network;
1730
- this.metadata = MyAlgoWalletClient.metadata;
1731
- }
1732
- static metadata = {
1733
- id: exports.PROVIDER_ID.MYALGO,
1734
- name: 'MyAlgo',
1735
- icon: ICON$a,
1736
- isWalletConnect: false
1737
- };
1738
- static async init({ clientOptions, algodOptions, clientStatic, getDynamicClient, algosdkStatic, network = DEFAULT_NETWORK }) {
1739
- try {
1740
- debugLog(`${exports.PROVIDER_ID.MYALGO.toUpperCase()} initializing...`);
1741
- let MyAlgoConnect;
1742
- if (clientStatic) {
1743
- MyAlgoConnect = clientStatic;
1744
- }
1745
- else if (getDynamicClient) {
1746
- MyAlgoConnect = await getDynamicClient();
1747
- }
1748
- else {
1749
- throw new Error('MyAlgo Wallet provider missing required property: clientStatic or getDynamicClient');
1750
- }
1751
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
1752
- const algodClient = getAlgodClient(algosdk, algodOptions);
1753
- const myAlgo = new MyAlgoConnect({
1754
- ...(clientOptions ? clientOptions : { disableLedgerNano: false })
1755
- });
1756
- const provider = new MyAlgoWalletClient({
1757
- metadata: MyAlgoWalletClient.metadata,
1758
- client: myAlgo,
1759
- clientOptions,
1760
- algosdk: algosdk,
1761
- algodClient: algodClient,
1762
- network
1763
- });
1764
- debugLog(`${exports.PROVIDER_ID.MYALGO.toUpperCase()} initialized`, '✅');
1765
- return provider;
1766
- }
1767
- catch (e) {
1768
- console.error('Error initializing...', e);
1769
- return null;
1770
- }
1771
- }
1772
- async connect() {
1773
- const accounts = await this.#client.connect();
1774
- if (accounts.length === 0) {
1775
- throw new Error(`No accounts found for ${MyAlgoWalletClient.metadata.id}`);
1776
- }
1777
- const mappedAccounts = accounts.map((account) => ({
1778
- ...account,
1779
- providerId: MyAlgoWalletClient.metadata.id
1780
- }));
1781
- return {
1782
- ...MyAlgoWalletClient.metadata,
1783
- accounts: mappedAccounts
1784
- };
1785
- }
1786
- // eslint-disable-next-line @typescript-eslint/require-await
1787
- async reconnect() {
1788
- return null;
1789
- }
1790
- // eslint-disable-next-line @typescript-eslint/require-await
1791
- async disconnect() {
1792
- return;
1793
- }
1794
- async signTransactions(connectedAccounts, transactions, indexesToSign, returnGroup = true) {
1795
- // Decode the transactions to access their properties.
1796
- const decodedTxns = transactions.map((txn) => {
1797
- return this.algosdk.decodeObj(txn);
1798
- });
1799
- const signedIndexes = [];
1800
- // Get the transactions to be signed
1801
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1802
- const isSigned = 'txn' in txn;
1803
- // If the indexes to be signed is specified, add it to the transactions to be signed,
1804
- if (indexesToSign && indexesToSign.length && indexesToSign?.includes(i)) {
1805
- signedIndexes.push(i);
1806
- acc.push(transactions[i]);
1807
- // Otherwise, if the transaction is unsigned and is to be sent from a connected account,
1808
- // add it to the transactions to be signed
1809
- }
1810
- else if (!isSigned && connectedAccounts.includes(this.algosdk.encodeAddress(txn['snd']))) {
1811
- signedIndexes.push(i);
1812
- acc.push(transactions[i]);
1813
- }
1814
- return acc;
1815
- }, []);
1816
- // Sign them with the client.
1817
- const result = await this.#client.signTransaction(txnsToSign);
1818
- const signedTxns = transactions.reduce((acc, txn, i) => {
1819
- if (signedIndexes.includes(i)) {
1820
- const signedByUser = result.shift()?.blob;
1821
- signedByUser && acc.push(signedByUser);
1822
- }
1823
- else if (returnGroup) {
1824
- acc.push(txn);
1825
- }
1826
- return acc;
1827
- }, []);
1828
- return signedTxns;
1829
- }
1830
- }
1831
-
1832
- const ICON$9 = 'data:image/svg+xml;base64,' +
1833
- 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==';
1834
-
1835
- /**
1836
- * Helpful resources:
1837
- * https://github.com/blockshake-io/defly-connect
1838
- */
1839
- class DeflyWalletClient extends BaseClient {
1840
- #client;
1841
- clientOptions;
1842
- network;
1843
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network }) {
1844
- super(metadata, algosdk, algodClient);
1845
- this.#client = client;
1846
- this.clientOptions = clientOptions;
1847
- this.network = network;
1848
- this.metadata = DeflyWalletClient.metadata;
1849
- }
1850
- static metadata = {
1851
- id: exports.PROVIDER_ID.DEFLY,
1852
- name: 'Defly',
1853
- icon: ICON$9,
1854
- isWalletConnect: true
1855
- };
1856
- static async init({ clientOptions, algodOptions, clientStatic, getDynamicClient, algosdkStatic, network = DEFAULT_NETWORK }) {
1857
- try {
1858
- debugLog(`${exports.PROVIDER_ID.DEFLY.toUpperCase()} initializing...`);
1859
- let DeflyWalletConnect;
1860
- if (clientStatic) {
1861
- DeflyWalletConnect = clientStatic;
1862
- }
1863
- else if (getDynamicClient) {
1864
- DeflyWalletConnect = await getDynamicClient();
1865
- }
1866
- else {
1867
- throw new Error('Defly Wallet provider missing required property: clientStatic or getDynamicClient');
1868
- }
1869
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
1870
- const algodClient = getAlgodClient(algosdk, algodOptions);
1871
- const deflyWallet = new DeflyWalletConnect({
1872
- ...(clientOptions && clientOptions)
1873
- });
1874
- const provider = new DeflyWalletClient({
1875
- metadata: DeflyWalletClient.metadata,
1876
- client: deflyWallet,
1877
- algosdk,
1878
- algodClient,
1879
- network
1880
- });
1881
- debugLog(`${exports.PROVIDER_ID.DEFLY.toUpperCase()} initialized`, '✅');
1882
- return provider;
1883
- }
1884
- catch (e) {
1885
- console.error('Error initializing...', e);
1886
- return null;
1887
- }
1888
- }
1889
- async connect(onDisconnect) {
1890
- const accounts = await this.#client.connect().catch(console.info);
1891
- this.#client.connector?.on('disconnect', onDisconnect);
1892
- if (!accounts || accounts.length === 0) {
1893
- throw new Error(`No accounts found for ${DeflyWalletClient.metadata.id}`);
1894
- }
1895
- const mappedAccounts = accounts.map((address, index) => ({
1896
- name: `Defly Wallet ${index + 1}`,
1897
- address,
1898
- providerId: DeflyWalletClient.metadata.id
1899
- }));
1900
- return {
1901
- ...DeflyWalletClient.metadata,
1902
- accounts: mappedAccounts
1903
- };
1904
- }
1905
- async reconnect(onDisconnect) {
1906
- const accounts = await this.#client.reconnectSession().catch(console.info);
1907
- this.#client.connector?.on('disconnect', onDisconnect);
1908
- if (!accounts) {
1909
- return null;
1910
- }
1911
- return {
1912
- ...DeflyWalletClient.metadata,
1913
- accounts: accounts.map((address, index) => ({
1914
- name: `Defly Wallet ${index + 1}`,
1915
- address,
1916
- providerId: DeflyWalletClient.metadata.id
1917
- }))
1918
- };
1919
- }
1920
- async disconnect() {
1921
- await this.#client.disconnect();
1922
- }
1923
- async signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
1924
- // If txnGroups is a nested array, flatten it
1925
- const transactions = Array.isArray(txnGroups[0])
1926
- ? txnGroups.flatMap((txn) => txn)
1927
- : txnGroups;
1928
- // Decode the transactions to access their properties.
1929
- const decodedTxns = transactions.map((txn) => {
1930
- return this.algosdk.decodeObj(txn);
1931
- });
1932
- const signedIndexes = [];
1933
- // Marshal the transactions,
1934
- // and add the signers property if they shouldn't be signed.
1935
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1936
- const isSigned = 'txn' in txn;
1937
- // If the indexes to be signed is specified, designate that it should be signed
1938
- if (indexesToSign && indexesToSign.length && indexesToSign.includes(i)) {
1939
- signedIndexes.push(i);
1940
- acc.push({
1941
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i])
1942
- });
1943
- // If the indexes to be signed is specified, but it's not included in it,
1944
- // designate that it should not be signed
1945
- }
1946
- else if (indexesToSign && indexesToSign.length && !indexesToSign.includes(i)) {
1947
- acc.push({
1948
- txn: isSigned
1949
- ? this.algosdk.decodeSignedTransaction(transactions[i]).txn
1950
- : this.algosdk.decodeUnsignedTransaction(transactions[i]),
1951
- signers: []
1952
- });
1953
- // If the transaction is unsigned and is to be sent from a connected account,
1954
- // designate that it should be signed
1955
- }
1956
- else if (!isSigned && connectedAccounts.includes(this.algosdk.encodeAddress(txn['snd']))) {
1957
- signedIndexes.push(i);
1958
- acc.push({
1959
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i])
1960
- });
1961
- // Otherwise, designate that it should not be signed
1962
- }
1963
- else if (isSigned) {
1964
- acc.push({
1965
- txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
1966
- signers: []
1967
- });
1968
- }
1969
- else if (!isSigned) {
1970
- acc.push({
1971
- txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
1972
- signers: []
1973
- });
1974
- }
1975
- return acc;
1976
- }, []);
1977
- // Sign them with the client.
1978
- const result = await this.#client.signTransaction([txnsToSign]);
1979
- // Join the newly signed transactions with the original group of transactions.
1980
- const signedTxns = transactions.reduce((acc, txn, i) => {
1981
- if (signedIndexes.includes(i)) {
1982
- const signedByUser = result.shift();
1983
- signedByUser && acc.push(signedByUser);
1984
- }
1985
- else if (returnGroup) {
1986
- acc.push(transactions[i]);
1987
- }
1988
- return acc;
1989
- }, []);
1990
- return signedTxns;
1991
- }
1992
- }
1993
-
1994
- const ICON$8 = 'data:image/svg+xml;base64,' +
1995
- 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==';
1996
-
1997
- /**
1998
- * Documentation:
1999
- * https://docs.exodus.com/api-reference/algorand-provider-api/
2000
- */
2001
- class ExodusClient extends BaseClient {
2002
- #client;
2003
- clientOptions;
2004
- network;
2005
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network }) {
2006
- super(metadata, algosdk, algodClient);
2007
- this.#client = client;
2008
- this.clientOptions = clientOptions;
2009
- this.network = network;
2010
- this.metadata = ExodusClient.metadata;
2011
- }
2012
- static metadata = {
2013
- id: exports.PROVIDER_ID.EXODUS,
2014
- name: 'Exodus',
2015
- icon: ICON$8,
2016
- isWalletConnect: false
2017
- };
2018
- static async init({ clientOptions, algodOptions, algosdkStatic, network = DEFAULT_NETWORK }) {
2019
- try {
2020
- debugLog(`${exports.PROVIDER_ID.EXODUS.toUpperCase()} initializing...`);
2021
- if (typeof window == 'undefined' || window.exodus === undefined) {
2022
- throw new Error('Exodus is not available.');
2023
- }
2024
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
2025
- const algodClient = getAlgodClient(algosdk, algodOptions);
2026
- const exodus = window.exodus.algorand;
2027
- const provider = new ExodusClient({
2028
- metadata: ExodusClient.metadata,
2029
- client: exodus,
2030
- algosdk: algosdk,
2031
- algodClient: algodClient,
2032
- clientOptions: clientOptions || { onlyIfTrusted: false },
2033
- network
2034
- });
2035
- debugLog(`${exports.PROVIDER_ID.EXODUS.toUpperCase()} initialized`, '✅');
2036
- return provider;
2037
- }
2038
- catch (e) {
2039
- console.warn(e);
2040
- console.warn(`Error initializing ${ExodusClient.metadata.name}.`, 'Do you have the extension installed?', 'https://www.exodus.com/web3-wallet');
2041
- return null;
2042
- }
2043
- }
2044
- async connect() {
2045
- const { address } = await this.#client.connect({
2046
- onlyIfTrusted: this.clientOptions.onlyIfTrusted
2047
- });
2048
- if (!address) {
2049
- throw new Error(`No accounts found for ${ExodusClient.metadata.id}`);
2050
- }
2051
- const accounts = [
2052
- {
2053
- name: `Exodus 1`,
2054
- address,
2055
- providerId: ExodusClient.metadata.id
2056
- }
2057
- ];
2058
- return {
2059
- ...ExodusClient.metadata,
2060
- accounts
2061
- };
2062
- }
2063
- // eslint-disable-next-line @typescript-eslint/require-await
2064
- async reconnect(onDisconnect) {
2065
- if (window === undefined ||
2066
- window.exodus === undefined ||
2067
- window.exodus.algorand.isConnected !== true) {
2068
- onDisconnect();
2069
- }
2070
- return null;
2071
- }
2072
- // eslint-disable-next-line @typescript-eslint/require-await
2073
- async disconnect() {
2074
- return;
2075
- }
2076
- async signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
2077
- // If txnGroups is a nested array, flatten it
2078
- const transactions = Array.isArray(txnGroups[0])
2079
- ? txnGroups.flatMap((txn) => txn)
2080
- : txnGroups;
2081
- // Decode the transactions to access their properties.
2082
- const decodedTxns = transactions.map((txn) => {
2083
- return this.algosdk.decodeObj(txn);
2084
- });
2085
- const signedIndexes = [];
2086
- // Get the unsigned transactions.
2087
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
2088
- const isSigned = 'txn' in txn;
2089
- // If the indexes to be signed is specified
2090
- // add it to the arrays of transactions to be signed.
2091
- if (indexesToSign && indexesToSign.length && indexesToSign.includes(i)) {
2092
- signedIndexes.push(i);
2093
- acc.push(transactions[i]);
2094
- // If the transaction isn't already signed and is to be sent from a connected account,
2095
- // add it to the arrays of transactions to be signed
2096
- }
2097
- else if (!isSigned && connectedAccounts.includes(this.algosdk.encodeAddress(txn['snd']))) {
2098
- signedIndexes.push(i);
2099
- acc.push(transactions[i]);
2100
- }
2101
- return acc;
2102
- }, []);
2103
- // Sign them with the client.
2104
- const result = await this.#client.signTransaction(txnsToSign);
2105
- // Join the newly signed transactions with the original group of transactions.
2106
- const signedTxns = transactions.reduce((acc, txn, i) => {
2107
- if (signedIndexes.includes(i)) {
2108
- const signedByUser = result.shift();
2109
- signedByUser && acc.push(signedByUser);
2110
- }
2111
- else if (returnGroup) {
2112
- acc.push(transactions[i]);
2113
- }
2114
- return acc;
2115
- }, []);
2116
- return signedTxns;
2117
- }
2118
- }
2119
-
2120
- const ICON$7 = 'data:image/svg+xml;base64,' +
2121
- 'PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==';
2122
-
2123
- /**
2124
- * Documentation:
2125
- * https://github.com/PureStake/algosigner/blob/develop/docs/dApp-integration.md
2126
- */
2127
- class AlgoSignerClient extends BaseClient {
2128
- #client;
2129
- network;
2130
- walletStore;
2131
- constructor({ metadata, client, algosdk, algodClient, network }) {
2132
- super(metadata, algosdk, algodClient);
2133
- this.#client = client;
2134
- this.network = network;
2135
- this.walletStore = useWalletStore;
2136
- }
2137
- static metadata = {
2138
- id: exports.PROVIDER_ID.ALGOSIGNER,
2139
- name: 'AlgoSigner',
2140
- icon: ICON$7,
2141
- isWalletConnect: false
2142
- };
2143
- static async init({ algodOptions, algosdkStatic, network = DEFAULT_NETWORK }) {
2144
- try {
2145
- debugLog(`${exports.PROVIDER_ID.ALGOSIGNER.toUpperCase()} initializing...`);
2146
- if (typeof window == 'undefined' || window.algorand === undefined) {
2147
- throw new Error('AlgoSigner is not available.');
2148
- }
2149
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
2150
- const algodClient = getAlgodClient(algosdk, algodOptions);
2151
- const algosigner = window.algorand;
2152
- const provider = new AlgoSignerClient({
2153
- metadata: AlgoSignerClient.metadata,
2154
- client: algosigner,
2155
- algosdk: algosdk,
2156
- algodClient: algodClient,
2157
- network
2158
- });
2159
- debugLog(`${exports.PROVIDER_ID.ALGOSIGNER.toUpperCase()} initialized`, '✅');
2160
- return provider;
2161
- }
2162
- catch (e) {
2163
- console.warn(e);
2164
- console.warn(`Error initializing ${AlgoSignerClient.metadata.name}.`, 'Do you have the extension installed?', 'https://www.purestake.com/technology/algosigner');
2165
- return null;
2166
- }
2167
- }
2168
- async connect() {
2169
- const { accounts } = await this.#client.enable({ genesisID: this.getGenesisID() });
2170
- if (accounts.length === 0) {
2171
- throw new Error(`No accounts found for ${AlgoSignerClient.metadata.id}`);
2172
- }
2173
- const mappedAccounts = await Promise.all(accounts.map(async (address, index) => {
2174
- // check to see if this is a rekeyed account
2175
- const { 'auth-addr': authAddr } = await this.getAccountInfo(address);
2176
- return {
2177
- name: `AlgoSigner ${index + 1}`,
2178
- address,
2179
- providerId: AlgoSignerClient.metadata.id,
2180
- ...(authAddr && { authAddr })
2181
- };
2182
- }));
2183
- // sort the accounts in the order they were returned by AlgoSigner
2184
- mappedAccounts.sort((a, b) => accounts.indexOf(a.address) - accounts.indexOf(b.address));
2185
- return {
2186
- ...AlgoSignerClient.metadata,
2187
- accounts: mappedAccounts
2188
- };
2189
- }
2190
- // eslint-disable-next-line @typescript-eslint/require-await
2191
- async reconnect(onDisconnect) {
2192
- if (window === undefined || window.algorand === undefined) {
2193
- onDisconnect();
2194
- }
2195
- return null;
2196
- }
2197
- // eslint-disable-next-line @typescript-eslint/require-await
2198
- async disconnect() {
2199
- return;
2200
- }
2201
- async signTransactions(connectedAccounts, transactions, indexesToSign, returnGroup = true) {
2202
- // Decode the transactions to access their properties.
2203
- const decodedTxns = transactions.map((txn) => {
2204
- return this.algosdk.decodeObj(txn);
2205
- });
2206
- const signedIndexes = [];
2207
- // Marshal the transactions,
2208
- // and add the signers property if they shouldn't be signed.
2209
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
2210
- const isSigned = 'txn' in txn;
2211
- const sender = this.algosdk.encodeAddress(isSigned ? txn.txn.snd : txn.snd);
2212
- const authAddress = this.getAuthAddress(sender); // rekeyed-to account, or undefined
2213
- if (indexesToSign && indexesToSign.length && indexesToSign.includes(i)) {
2214
- signedIndexes.push(i);
2215
- acc.push({
2216
- txn: this.#client.encoding.msgpackToBase64(transactions[i]),
2217
- ...(authAddress && { authAddr: authAddress })
2218
- });
2219
- }
2220
- else if (!isSigned && connectedAccounts.includes(sender)) {
2221
- signedIndexes.push(i);
2222
- acc.push({
2223
- txn: this.#client.encoding.msgpackToBase64(transactions[i]),
2224
- ...(authAddress && { authAddr: authAddress })
2225
- });
2226
- }
2227
- else {
2228
- acc.push({
2229
- txn: this.#client.encoding.msgpackToBase64(isSigned
2230
- ? this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte()
2231
- : this.algosdk.decodeUnsignedTransaction(transactions[i]).toByte()),
2232
- signers: []
2233
- });
2234
- }
2235
- return acc;
2236
- }, []);
2237
- // Sign them with the client.
2238
- const result = await this.#client.signTxns(txnsToSign);
2239
- // Join the newly signed transactions with the original group of transactions
2240
- // if `returnGroup` is true
2241
- const signedTxns = transactions.reduce((acc, txn, i) => {
2242
- if (signedIndexes.includes(i)) {
2243
- const signedByUser = result[i];
2244
- signedByUser && acc.push(new Uint8Array(Buffer.from(signedByUser, 'base64')));
2245
- }
2246
- else if (returnGroup) {
2247
- acc.push(txn);
2248
- }
2249
- return acc;
2250
- }, []);
2251
- return signedTxns;
2252
- }
2253
- getGenesisID() {
2254
- if (this.network === 'betanet') {
2255
- return 'betanet-v1.0';
2256
- }
2257
- if (this.network === 'testnet') {
2258
- return 'testnet-v1.0';
2259
- }
2260
- if (this.network === 'mainnet') {
2261
- return 'mainnet-v1.0';
2262
- }
2263
- return this.network;
2264
- }
2265
- getAuthAddress(address) {
2266
- const accounts = this.walletStore.getState().accounts;
2267
- const account = accounts.find((acct) => acct.address === address && acct.providerId === this.metadata.id);
2268
- return account?.authAddr;
2269
- }
2270
- }
2271
-
2272
- function svgToBase64(svg) {
2273
- const base64EncodedSvg = btoa(svg);
2274
- return `data:image/svg+xml;base64,${base64EncodedSvg}`;
2275
- }
2276
-
2277
- const svgMarkup = `<svg fill="#ab47bc" version="1.1" viewBox="0 0 1e3 1e3" xmlns="http://www.w3.org/2000/svg">
2278
- <path d="m708.49 604.22c-1.4434 0.0745-3.1495-0.29645-4.4397-0.9439-1.3774-0.69087-2.7586-1.9213-3.6501-3.1772-0.99228-1.3985-1.7378-3.3014-2.0311-4.9904-0.33364-1.92-0.21829-4.2204 0.23071-6.1167 0.51227-2.1618 1.6138-4.5296 2.8762-6.3571 1.4314-2.0747 3.535-4.1505 5.5871-5.6136 2.3137-1.648 5.3114-3.0703 8.033-3.8824 3.0387-0.90794 6.7097-1.3576 9.8803-1.2757 3.5102 0.0868 7.5298 0.85335 10.85 1.9967 3.6487 1.2571 7.6157 3.3634 10.733 5.6374 3.403 2.4814 6.8762 5.9359 9.4195 9.2928 2.7585 3.6421 5.2967 8.305 6.9078 12.58 1.7391 4.6113 2.9488 10.207 3.3251 15.12 0.40311 5.2743-0.0248 11.403-1.0977 16.582-1.151 5.5358-3.3952 11.705-6.0243 16.71-2.7996 5.3284-6.8947 10.99-11.044 15.352-4.4027 4.6272-10.217 9.2227-15.71 12.479-5.8105 3.4453-13.046 6.4589-19.57 8.2046-6.8814 1.8421-15.085 2.8458-22.208 2.7666-7.494-0.0744-16.088-1.3814-23.285-3.4703-7.5522-2.1935-15.879-5.9201-22.569-10.051-7.0069-4.3275-14.368-10.414-19.969-16.452-5.8527-6.3096-11.576-14.487-15.54-22.128-4.136-7.9708-7.6261-17.78-9.5-26.562-1.9518-9.1463-2.7495-19.962-2.2093-29.297 0.56311-9.7088 2.7361-20.773 5.8448-29.986 3.2286-9.5687 8.4395-20.053 14.078-28.43 5.8474-8.6867 13.927-17.748 21.856-24.586 8.2138-7.0821 18.756-13.932 28.546-18.601 10.126-4.8319 22.512-8.7987 33.552-10.797 11.408-2.0639 24.834-2.6556 36.384-1.6506 11.923 1.0382 25.458 4.087 36.69 8.2179 11.584 4.2613 24.229 10.957 34.288 18.104 10.368 7.3672 21.132 17.439 29.204 27.264 8.313 10.115 16.291 23.023 21.664 34.963 5.5266 12.281 9.9714 27.244 12.091 40.543 2.179 13.671 2.5659 29.71 1.0927 43.474-1.512 14.136-5.4366 30.142-10.591 43.391-5.2914 13.6-13.473 28.404-22.133 40.149-8.8847 12.047-20.949 24.513-32.671 33.822-12.016 9.5423-27.291 18.649-41.38 24.724-14.435 6.2239-31.976 11.147-47.535 13.388-15.931 2.295-34.584 2.476-50.561 0.53458-16.351-1.9848-34.826-6.7838-50.094-12.964-15.616-6.3215-32.58-15.987-46.008-26.16-13.728-10.401-27.896-24.46-38.439-38.077-10.773-13.917-21.009-31.555-27.785-47.799-6.9211-16.587-12.322-36.707-14.683-54.525-2.2001-14.805-6.9646-31.487-12.954-45.204-5.8408-13.373-14.573-27.859-23.704-39.242-8.8966-11.09-20.796-22.49-32.282-30.868-11.184-8.1571-25.267-15.843-38.195-20.789-12.577-4.8147-27.759-8.4462-41.158-9.801-13.026-1.3166-28.194-0.86079-41.11 1.2795-12.546 2.0786-26.65 6.3651-38.212 11.659-11.222 5.1382-23.343 12.741-32.826 20.643-9.1934 7.6619-18.6 17.858-25.462 27.665-6.6459 9.5-12.846 21.424-16.763 32.336-3.79 10.559-6.5473 23.271-7.4269 34.454-0.84963 10.813-0.18976 23.368 1.8369 34.023 1.9566 10.287 5.765 21.814 10.364 31.222 4.435 9.0723 10.909 18.827 17.582 26.407 6.4257 7.2985 14.92 14.713 23.047 20.055 7.8149 5.1356 17.581 9.8513 26.475 12.736 8.5427 2.7679 18.784 4.6496 27.754 5.0524 8.5981 0.38699 18.542-0.48002 26.934-2.3941 8.029-1.8316 16.98-5.1633 24.231-9.0682 6.9236-3.7292 14.314-9.0762 19.989-14.521 5.4078-5.1872 10.83-11.981 14.647-18.43 3.6302-6.13 6.8629-13.737 8.7091-20.617 1.7496-6.5234 2.7573-14.296 2.6794-21.051-0.0745-6.3861-1.1461-13.719-2.9528-19.845-1.7021-5.7735-4.5573-12.152-7.7714-17.239-3.0202-4.7805-7.2421-9.8078-11.46-13.572-3.9472-3.5221-9.0433-6.9541-13.812-9.2425-4.4423-2.1314-9.8936-3.8813-14.756-4.6802-4.5084-0.74172-9.8158-0.87692-14.35-0.30759-4.1782 0.52466-8.9071 1.8039-12.757 3.5114-3.5284 1.5634-7.3369 3.9445-10.25 6.4761-2.6502 2.3043-5.3192 5.4037-7.1534 8.3986-1.656 2.7044-3.102 6.1103-3.8349 9.195-0.65861 2.7626-0.9253 6.0706-0.65366 8.8966 0.24063 2.509 0.98608 5.3679 2.0668 7.646 0.95259 2.0072 2.4523 4.1452 4.0686 5.6691 1.417 1.3365 3.3516 2.587 5.1805 3.2579 1.6097 0.59286 3.6302 0.89676 5.3377 0.73676 1.5331-0.1439 3.2895-0.72436 4.577-1.5715 1.2068-0.79382 2.381-2.0865 3.0373-3.3726 0.65491-1.2876 1.8301-2.5803 3.0372-3.3741 1.2861-0.84593 3.0426-1.4274 4.577-1.5714 1.7075-0.16001 3.7267 0.14759 5.3363 0.73676 1.829 0.67102 3.7649 1.9214 5.1819 3.2577 1.6164 1.524 3.1165 3.662 4.0686 5.6692 1.0803 2.2778 1.825 5.1369 2.0668 7.6459 0.2704 2.8272 2e-3 6.1352-0.65366 8.8966-0.73426 3.0861-2.1803 6.4904-3.8364 9.1949-1.8329 2.9952-4.503 6.0944-7.1533 8.3988-2.9131 2.5316-6.7216 4.9124-10.249 6.4759-3.8508 1.7075-8.5783 2.9871-12.758 3.5114-4.5322 0.56684-9.8407 0.43411-14.348-0.30635-4.8636-0.80003-10.313-2.55-14.758-4.6813-4.7698-2.2887-9.8646-5.7207-13.812-9.2425-4.219-3.7635-8.4396-8.7909-11.46-13.572-3.2155-5.0881-6.0705-11.466-7.7727-17.239-1.8064-6.1259-2.8788-13.459-2.9528-19.845-0.0745-6.7545 0.92904-14.527 2.6808-21.051 1.8461-6.88 5.0776-14.486 8.7077-20.617 3.8191-6.4483 9.2413-13.242 14.648-18.429 5.6744-5.4447 13.064-10.792 19.989-14.521 7.2498-3.905 16.201-7.2366 24.231-9.0683 8.3908-1.9134 18.335-2.7811 26.934-2.3941 8.9705 0.4031 19.21 2.2846 27.753 5.0536 8.8964 2.8828 18.661 7.5985 26.476 12.736 8.1267 5.3403 16.622 12.756 23.048 20.054 6.6727 7.5798 13.146 17.335 17.582 26.407 4.5981 9.4076 8.4066 20.934 10.364 31.222 2.0258 10.654 2.6873 23.21 1.8371 34.023-0.8794 11.185-3.6369 23.895-7.4268 34.454-3.9169 10.913-10.117 22.836-16.763 32.337-6.8604 9.8062-16.268 20.002-25.462 27.665-9.4814 7.9024-21.602 15.504-32.823 20.643-11.563 5.2943-25.668 9.5806-38.214 11.659-12.914 2.1406-28.084 2.5962-41.11 1.2795-13.398-1.355-28.58-4.9864-41.158-9.7998-12.927-4.9482-27.011-12.634-38.195-20.791-11.487-8.3775-23.385-19.778-32.282-30.868-9.132-11.382-17.862-25.869-23.703-39.242-5.9911-13.717-10.755-30.399-12.955-45.204-2.2562-15.177-2.5054-32.96-0.72188-48.198 1.8276-15.613 6.335-33.265 12.173-47.86 5.9781-14.944 15.148-31.188 24.817-44.054 9.8948-13.167 23.289-26.769 36.275-36.9 13.282-10.364 30.135-20.223 45.659-26.765 15.87-6.6887 35.129-11.93 52.195-14.252 17.438-2.3715 37.834-2.4152 55.286-0.16248 17.827 2.3003 37.951 7.6829 54.563 14.547 13.923 5.4961 30.751 9.7114 45.625 11.382 14.502 1.6283 31.412 1.31 45.837-0.9067 14.052-2.1603 29.875-6.7638 42.874-12.522 12.656-5.6071 26.355-13.962 37.102-22.683 10.457-8.4858 21.195-19.818 29.066-30.743 7.6526-10.623 14.843-23.987 19.447-36.243 4.4716-11.905 7.8124-26.262 9.009-38.923 1.1609-12.288 0.63878-26.585-1.4646-38.748-2.039-11.792-6.1657-25.037-11.229-35.882-4.9033-10.506-12.131-21.839-19.622-30.686-7.2498-8.5611-16.88-17.304-26.125-23.659-8.9375-6.1419-20.143-11.848-30.382-15.42-9.887-3.4493-21.774-5.9148-32.222-6.6358-10.075-0.69459-21.759 0.0373-31.658 2.0231-9.5342 1.9148-20.203 5.5636-28.892 9.9319-8.3552 4.1993-17.321 10.298-24.266 16.561-6.6689 6.0137-13.419 13.941-18.254 21.507-4.6325 7.2539-8.8543 16.298-11.392 24.523-2.4286 7.8692-4.0197 17.288-4.2628 25.52-0.23069 7.8598 0.70453 16.933 2.5817 24.57 1.7881 7.2776 4.9614 15.37 8.6351 21.902 3.4943 6.208 8.4648 12.81 13.501 17.85 4.7737 4.7778 11.002 9.537 16.89 12.846 5.5674 3.1284 12.455 5.8672 18.663 7.366 5.8513 1.4118 12.802 2.1288 18.816 1.8884 5.6494-0.22452 12.113-1.3667 17.483-3.1389 5.0234-1.6573 10.543-4.354 14.91-7.3396 4.0672-2.7824 8.3076-6.6292 11.432-10.44 2.8958-3.5324 5.6651-8.0619 7.4387-12.272 1.6361-3.881 2.892-8.6153 3.3396-12.804 0.41056-3.8376 0.25055-8.3262-0.48495-12.114-0.67104-3.448-2.0205-7.3093-3.6962-10.395-1.5146-2.7864-3.7411-5.7404-6.0454-7.918-2.0641-1.9506-4.7949-3.8376-7.3779-5.0156-2.2938-1.0468-5.1422-1.8304-7.6551-2.0323-2.2134-0.17984-4.8162 0.0496-6.9437 0.68838-1.8658 0.55939-3.9167 1.6097-5.4128 2.8578-1.3166 1.0989-2.5908 2.6952-3.3054 4.2547-0.64374 1.3998-1.0183 3.2116-0.92776 4.7488 0.0745 1.4422 0.6152 3.1059 1.4024 4.3169 0.78637 1.2118 1.3192 2.8749 1.4037 4.3182 0.0745 1.537-0.2865 3.3489-0.92778 4.7486-0.71442 1.5583-1.9901 3.1548-3.3068 4.2535-1.4946 1.2493-3.5454 2.2991-5.4115 2.8591-2.1273 0.63628-4.7302 0.867-6.9436 0.68839-2.5129-0.20343-5.3614-0.98607-7.6551-2.0337-2.5842-1.1783-5.3152-3.0635-7.3779-5.0141-2.3057-2.1775-4.5308-5.1329-6.0455-7.9181-1.6771-3.0861-3.0267-6.9486-3.6961-10.395-0.738-3.7888-0.89305-8.2773-0.48498-12.115 0.44653-4.1874 1.7035-8.9215 3.3384-12.803 1.7749-4.2101 4.5441-8.7407 7.4401-12.273 3.1244-3.8112 7.3646-7.6566 11.432-10.439 4.3656-2.9871 9.887-5.6837 14.91-7.341 5.3693-1.7708 11.833-2.913 17.483-3.1377 6.0152-0.24063 12.965 0.47505 18.816 1.8884 6.2079 1.499 13.096 4.2364 18.663 7.3661 5.8883 3.3092 12.115 8.0685 16.89 12.846 5.0353 5.0391 10.007 11.641 13.5 17.85 3.6751 6.5302 6.847 14.624 8.6364 21.899 1.8779 7.6367 2.8128 16.71 2.5803 24.571-0.24187 8.2324-1.8329 17.649-4.2613 25.519-2.5381 8.2243-6.7598 17.27-11.394 24.523-4.8334 7.568-11.584 15.496-18.253 21.509-6.9448 6.262-15.911 12.36-24.268 16.561-8.6878 4.3671-19.357 8.0172-28.891 9.932-9.9003 1.9886-21.586 2.7176-31.658 2.023-10.447-0.72188-22.335-3.1866-32.222-6.6358-10.241-3.5734-21.444-9.2781-30.383-15.421-9.2468-6.3531-18.874-15.096-26.127-23.659-7.4915-8.8477-14.718-20.179-19.622-30.685-5.0616-10.844-9.1883-24.09-11.227-35.883-2.1024-12.162-2.6253-26.46-1.4644-38.747 1.1969-12.66 4.536-27.018 9.0088-38.923 4.6048-12.256 11.794-25.62 19.447-36.243 7.8717-10.926 18.608-22.257 29.065-30.743 10.749-8.7223 24.446-17.076 37.102-22.683 12.999-5.7589 28.822-10.364 42.875-12.524 14.423-2.2172 31.333-2.5354 45.837-0.90668 14.874 1.6705 31.703 5.8857 45.625 11.383 14.271 5.6346 29.795 14.31 42.102 23.475 12.607 9.3891 25.642 22.119 35.361 34.473 9.9529 12.649 19.436 28.713 25.744 43.52 6.4562 15.152 11.538 33.552 13.82 49.864 2.3333 16.685 2.4456 36.209 0.34853 52.925-2.1434 17.088-7.234 36.388-13.757 52.327-6.6648 16.287-16.825 33.972-27.502 47.961-10.906 14.287-25.629 29.023-39.879 39.979-11.721 9.3085-23.787 21.774-32.671 33.822-8.6602 11.744-16.841 26.548-22.133 40.147-5.1554 13.251-9.0788 29.256-10.591 43.392-1.4724 13.764-1.0865 29.804 1.0927 43.474 2.1209 13.298 6.5657 28.262 12.092 40.543 5.372 11.938 13.351 24.848 21.663 34.963 8.0738 9.825 18.837 19.896 29.204 27.263 10.061 7.1496 22.706 13.845 34.289 18.106 11.233 4.1308 24.767 7.18 36.689 8.218 11.551 1.0047 24.977 0.41179 36.385-1.6508 11.04-1.9981 23.426-5.9663 33.552-10.797 9.7879-4.6695 20.332-11.519 28.545-18.601 7.9312-6.8377 16.01-15.899 21.857-24.586 5.6387-8.3775 10.85-18.862 14.078-28.43 3.1087-9.2135 5.2822-20.278 5.8435-29.986 0.54081-9.3363-0.25674-20.151-2.2078-29.297-1.874-8.7816-5.3642-18.59-9.5001-26.562-3.9656-7.6393-9.6876-15.818-15.541-22.128-5.6005-6.0376-12.962-12.125-19.968-16.452-6.6925-4.1307-15.017-7.8587-22.569-10.051-7.1971-2.0892-15.792-3.3885-23.285-3.4705-7.1231-0.0745-15.326 0.92406-22.207 2.7664-6.5263 1.7458-13.76 4.7594-19.57 8.2047-5.4936 3.2565-11.309 7.8518-15.71 12.479-4.1492 4.3617-8.2455 10.022-11.045 15.352-2.6291 5.0048-4.8728 11.174-6.023 16.71-1.0766 5.1792-1.5013 11.308-1.0964 16.582 0.37706 4.9138 1.5859 10.509 3.3237 15.12 1.6125 4.2745 4.1507 8.9374 6.9092 12.58 2.5434 3.3568 6.015 6.8113 9.4195 9.2928 3.1178 2.274 7.0846 4.3803 10.733 5.6374 3.3199 1.1436 7.3396 1.9056 10.85 1.9967 3.1707 0.0745 6.8418-0.36962 9.8804-1.2756 2.7216-0.81242 5.7193-2.2345 8.0316-3.8824 2.0535-1.4646 4.1558-3.5391 5.5885-5.6138 1.2624-1.8276 2.3639-4.1967 2.8762-6.3571 0.44901-1.8964 0.56434-4.1967 0.2307-6.1167-0.2952-1.689-1.0394-3.5919-2.031-4.9903-0.89181-1.2561-2.2739-2.4867-3.6501-3.1774-1.2914-0.64869-2.9962-1.0196-4.4397-0.94389z" stroke-width=".13206"/>
2279
- </svg>`;
2280
- const ICON$6 = svgToBase64(svgMarkup);
2281
-
2282
- class LuteClient extends BaseClient {
2283
- #client;
2284
- clientOptions;
2285
- network;
2286
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network }) {
2287
- super(metadata, algosdk, algodClient);
2288
- this.#client = client;
2289
- this.clientOptions = clientOptions;
2290
- this.network = network;
2291
- this.metadata = LuteClient.metadata;
2292
- }
2293
- static metadata = {
2294
- id: exports.PROVIDER_ID.LUTE,
2295
- name: 'Lute',
2296
- icon: ICON$6,
2297
- isWalletConnect: false
2298
- };
2299
- static async init({ clientOptions, algodOptions, clientStatic, getDynamicClient, algosdkStatic, network = DEFAULT_NETWORK }) {
2300
- try {
2301
- debugLog(`${exports.PROVIDER_ID.LUTE.toUpperCase()} initializing...`);
2302
- let LuteConnect;
2303
- if (clientStatic) {
2304
- LuteConnect = clientStatic;
2305
- }
2306
- else if (getDynamicClient) {
2307
- LuteConnect = await getDynamicClient();
2308
- }
2309
- else {
2310
- throw new Error('Lute provider missing required property: clientStatic or getDynamicClient');
2311
- }
2312
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
2313
- const algodClient = getAlgodClient(algosdk, algodOptions);
2314
- if (!clientOptions) {
2315
- throw new Error('Lute provider missing required property: clientOptions');
2316
- }
2317
- const lute = new LuteConnect(clientOptions.siteName);
2318
- const provider = new LuteClient({
2319
- metadata: LuteClient.metadata,
2320
- client: lute,
2321
- clientOptions,
2322
- algosdk: algosdk,
2323
- algodClient: algodClient,
2324
- network
2325
- });
2326
- debugLog(`${exports.PROVIDER_ID.LUTE.toUpperCase()} initialized`, '✅');
2327
- return provider;
2328
- }
2329
- catch (e) {
2330
- console.error('Error initializing...', e);
2331
- return null;
2332
- }
2333
- }
2334
- async connect() {
2335
- const genesis = (await this.algodClient.genesis().do());
2336
- const genesisID = `${genesis.network}-${genesis.id}`;
2337
- const addresses = await this.#client.connect(genesisID);
2338
- if (addresses.length === 0) {
2339
- throw new Error(`No accounts found for ${LuteClient.metadata.id}`);
2340
- }
2341
- const mappedAccounts = addresses.map((address, index) => ({
2342
- name: `Lute Wallet ${index + 1}`,
2343
- address,
2344
- providerId: LuteClient.metadata.id
2345
- }));
2346
- return {
2347
- ...LuteClient.metadata,
2348
- accounts: mappedAccounts
2349
- };
2350
- }
2351
- // eslint-disable-next-line @typescript-eslint/require-await
2352
- async reconnect() {
2353
- return null;
2354
- }
2355
- // eslint-disable-next-line @typescript-eslint/require-await
2356
- async disconnect() {
2357
- return;
2358
- }
2359
- shouldSignTxnObject(txn, addresses, indexesToSign, idx) {
2360
- const isIndexMatch = !indexesToSign || indexesToSign.includes(idx);
2361
- const isSigned = 'txn' in txn;
2362
- const canSign = !isSigned && addresses.includes(this.algosdk.encodeAddress(txn.snd));
2363
- const shouldSign = isIndexMatch && canSign;
2364
- return shouldSign;
2365
- }
2366
- async signTransactions(connectedAccounts, transactions, indexesToSign, returnGroup = true) {
2367
- // Decode the transactions to access their properties.
2368
- const decodedTxns = transactions.map((txn) => {
2369
- return this.algosdk.decodeObj(txn);
2370
- });
2371
- const signedIndexes = [];
2372
- // Marshal the transactions,
2373
- // and add the signers property if they shouldn't be signed.
2374
- const txnsToSign = decodedTxns.reduce((acc, txn, idx) => {
2375
- const isSigned = 'txn' in txn;
2376
- const shouldSign = this.shouldSignTxnObject(txn, connectedAccounts, indexesToSign, idx);
2377
- if (shouldSign) {
2378
- signedIndexes.push(idx);
2379
- acc.push({
2380
- txn: Buffer.from(transactions[idx]).toString('base64')
2381
- });
2382
- }
2383
- else {
2384
- acc.push({
2385
- txn: isSigned
2386
- ? Buffer.from(this.algosdk.decodeSignedTransaction(transactions[idx]).txn.toByte()).toString('base64')
2387
- : Buffer.from(transactions[idx]).toString('base64'),
2388
- stxn: isSigned ? Buffer.from(transactions[idx]).toString('base64') : undefined,
2389
- signers: []
2390
- });
2391
- }
2392
- return acc;
2393
- }, []);
2394
- // Sign them with the client.
2395
- const result = await this.#client.signTxns(txnsToSign);
2396
- const signedTxns = transactions.reduce((acc, txn, i) => {
2397
- if (signedIndexes.includes(i)) {
2398
- const signedByUser = result.shift();
2399
- signedByUser && acc.push(signedByUser);
2400
- }
2401
- else if (returnGroup) {
2402
- acc.push(txn);
2403
- }
2404
- return acc;
2405
- }, []);
2406
- return signedTxns;
2407
- }
2408
- }
2409
-
2410
- const isPublicNetwork = (network) => {
2411
- return network === 'betanet' || network === 'testnet' || network === 'mainnet';
2412
- };
2413
-
2414
- const ICON$5 = 'data:image/svg+xml;base64,' +
2415
- 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==';
2416
- const ALGORAND_CHAINS = {
2417
- mainnet: 'algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73k',
2418
- testnet: 'algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe',
2419
- betanet: 'algorand:mFgazF-2uRS1tMiL9dsj01hJGySEmPN2'
2420
- };
2421
-
2422
- const getPayloadId = () => {
2423
- const date = Date.now() * Math.pow(10, 3);
2424
- const extra = Math.floor(Math.random() * Math.pow(10, 3));
2425
- return date + extra;
2426
- };
2427
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2428
- const formatJsonRpcRequest = (method, params) => {
2429
- return {
2430
- id: getPayloadId(),
2431
- jsonrpc: '2.0',
2432
- method,
2433
- params
2434
- };
2435
- };
2436
-
2437
- /**
2438
- * Documentation:
2439
- * https://docs.walletconnect.com/2.0/
2440
- */
2441
- class WalletConnectClient extends BaseClient {
2442
- #client;
2443
- clientOptions;
2444
- network;
2445
- chain;
2446
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network, chain }) {
2447
- super(metadata, algosdk, algodClient);
2448
- this.#client = client;
2449
- this.clientOptions = clientOptions;
2450
- this.network = network;
2451
- this.chain = chain;
2452
- this.metadata = WalletConnectClient.metadata;
2453
- }
2454
- static metadata = {
2455
- id: exports.PROVIDER_ID.WALLETCONNECT,
2456
- name: 'WalletConnect',
2457
- icon: ICON$5,
2458
- isWalletConnect: true
2459
- };
2460
- static async init({ clientOptions, algodOptions, clientStatic, getDynamicClient, algosdkStatic, network = DEFAULT_NETWORK }) {
2461
- try {
2462
- debugLog(`${exports.PROVIDER_ID.WALLETCONNECT.toUpperCase()} initializing...`);
2463
- let Client;
2464
- if (clientStatic) {
2465
- Client = clientStatic;
2466
- }
2467
- else if (getDynamicClient) {
2468
- Client = await getDynamicClient();
2469
- }
2470
- else {
2471
- throw new Error('WalletConnect provider missing required property: clientStatic or getDynamicClient');
2472
- }
2473
- if (!clientOptions) {
2474
- throw new Error('WalletConnect provider missing required property: clientOptions');
2475
- }
2476
- if (!isPublicNetwork(network)) {
2477
- throw new Error(`WalletConnect only supports Algorand mainnet, testnet, and betanet. "${network}" is not supported.`);
2478
- }
2479
- const chain = ALGORAND_CHAINS[network];
2480
- // Initialize client
2481
- const client = new Client({
2482
- ...clientOptions,
2483
- modalOptions: {
2484
- explorerExcludedWalletIds: 'ALL',
2485
- ...clientOptions.modalOptions
2486
- }
2487
- });
2488
- // Initialize algod client
2489
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
2490
- const algodClient = getAlgodClient(algosdk, algodOptions);
2491
- // Initialize provider client
2492
- const provider = new WalletConnectClient({
2493
- metadata: WalletConnectClient.metadata,
2494
- client,
2495
- clientOptions,
2496
- algosdk,
2497
- algodClient,
2498
- network,
2499
- chain
2500
- });
2501
- debugLog(`${exports.PROVIDER_ID.WALLETCONNECT.toUpperCase()} initialized`, '✅');
2502
- return provider;
2503
- }
2504
- catch (error) {
2505
- console.error('Error initializing WalletConnect client', error);
2506
- return null;
2507
- }
2508
- }
2509
- async connect() {
2510
- const requiredNamespaces = {
2511
- algorand: {
2512
- chains: [this.chain],
2513
- methods: ['algo_signTxn'],
2514
- events: []
2515
- }
2516
- };
2517
- try {
2518
- const session = await this.#client.connect({
2519
- requiredNamespaces
2520
- });
2521
- const { accounts } = session.namespaces.algorand;
2522
- return {
2523
- ...WalletConnectClient.metadata,
2524
- accounts: this.#mapAccounts(accounts)
2525
- };
2526
- }
2527
- catch (error) {
2528
- console.error('Error connecting to WalletConnect', error);
2529
- throw error;
2530
- }
2531
- }
2532
- async reconnect() {
2533
- const session = await this.#client.getSession();
2534
- if (typeof session === 'undefined') {
2535
- return null;
2536
- }
2537
- const { accounts } = session.namespaces.algorand;
2538
- return {
2539
- ...WalletConnectClient.metadata,
2540
- accounts: this.#mapAccounts(accounts)
2541
- };
2542
- }
2543
- async disconnect() {
2544
- try {
2545
- const session = await this.#getSession();
2546
- await this.#client.disconnect({
2547
- topic: session.topic,
2548
- // replicates getSdkError('USER_DISCONNECTED') from @walletconnect/utils
2549
- reason: {
2550
- message: 'User disconnected.',
2551
- code: 6000
2552
- }
2553
- });
2554
- }
2555
- catch (error) {
2556
- console.error('Error disconnecting', error);
2557
- }
2558
- }
2559
- async signTransactions(connectedAccounts, txnGroups, indexesToSign = [], returnGroup = true) {
2560
- // Flatten transactions array if nested
2561
- const transactions = Array.isArray(txnGroups[0])
2562
- ? txnGroups.flatMap((txn) => txn)
2563
- : txnGroups;
2564
- const { txnsToSign, signedIndexes } = this.#composeTransactions(transactions, connectedAccounts, indexesToSign);
2565
- const request = formatJsonRpcRequest('algo_signTxn', [txnsToSign]);
2566
- const session = await this.#getSession();
2567
- const response = await this.#client.request({
2568
- chainId: this.chain,
2569
- topic: session.topic,
2570
- request
2571
- });
2572
- // Check if the result is the same length as the transactions
2573
- const lengthsMatch = response.length === transactions.length;
2574
- // Join the signed transactions with the original group of transactions
2575
- const signedTxns = transactions.reduce((acc, txn, i) => {
2576
- if (signedIndexes.includes(i)) {
2577
- const signedTxn = lengthsMatch ? response[i] : response.shift();
2578
- signedTxn && acc.push(new Uint8Array(Buffer.from(signedTxn, 'base64')));
2579
- }
2580
- else if (returnGroup) {
2581
- acc.push(txn);
2582
- }
2583
- return acc;
2584
- }, []);
2585
- return signedTxns;
2586
- }
2587
- #composeTransactions(transactions, connectedAccounts, indexesToSign) {
2588
- // Decode the transactions
2589
- const decodedTxns = transactions.map((txn) => {
2590
- return this.algosdk.decodeObj(txn);
2591
- });
2592
- // Track signed transactions
2593
- const signedIndexes = [];
2594
- // Marshal the transactions into WalletConnect format
2595
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
2596
- const isSigned = 'txn' in txn;
2597
- const senderAccount = !isSigned
2598
- ? this.algosdk.encodeAddress(txn['snd'])
2599
- : this.algosdk.encodeAddress(txn.txn['snd']);
2600
- const shouldSign = indexesToSign.includes(i) || (!isSigned && connectedAccounts.includes(senderAccount));
2601
- if (shouldSign) {
2602
- signedIndexes.push(i);
2603
- acc.push({
2604
- txn: Buffer.from(transactions[i]).toString('base64')
2605
- });
2606
- }
2607
- else {
2608
- acc.push({
2609
- txn: isSigned
2610
- ? Buffer.from(this.algosdk.encodeUnsignedTransaction(this.algosdk.decodeSignedTransaction(transactions[i]).txn)).toString('base64')
2611
- : Buffer.from(transactions[i]).toString('base64'),
2612
- signers: []
2613
- });
2614
- }
2615
- return acc;
2616
- }, []);
2617
- return { txnsToSign, signedIndexes };
2618
- }
2619
- async #getSession() {
2620
- const session = await this.#client.getSession();
2621
- if (typeof session === 'undefined') {
2622
- throw new Error('Session is not connected');
2623
- }
2624
- return session;
2625
- }
2626
- #mapAccounts(accounts) {
2627
- return accounts.map((accountStr, index) => ({
2628
- name: `WalletConnect ${index + 1}`,
2629
- address: accountStr.split(':').pop(),
2630
- providerId: WalletConnectClient.metadata.id
2631
- }));
2632
- }
2633
- }
2634
-
2635
- const ICON$4 = 'data:image/svg+xml;base64,' +
2636
- 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBHZW5lcmF0ZWQgYnkgUGl4ZWxtYXRvciBQcm8gMy40LjMgLS0+Cjxzdmcgd2lkdGg9IjQ3IiBoZWlnaHQ9IjQ3IiB2aWV3Qm94PSIwIDAgNDcgNDciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBpZD0iUGF0aCIgZmlsbD0iIzY4NTFmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9Im5vbmUiIGQ9Ik0gMjMuOTYwODYxIDEuODA3NjkgQyAyNS44MzUwNzcgNC4xMDMxNTMgMjcuOTAyMjE2IDYuMjM0ODkgMzAuMTM3NTM5IDguMTc4MTY5IEMgMjguNjQ3OTY4IDEzLjAwOTMyMyAyNy44NDYwOTIgMTguMTQyMDk0IDI3Ljg0NjA5MiAyMy40NjIxNTQgQyAyNy44NDYwOTIgMjguNzgyMzA3IDI4LjY0ODA2MiAzMy45MTUxNjkgMzAuMTM3NjMgMzguNzQ2MzY4IEMgMjcuOTAyMjE2IDQwLjY4OTcyNCAyNS44MzUwNzcgNDIuODIxNDc2IDIzLjk2MDg2MSA0NS4xMTY5ODUgQyAyMi4wODY1NTQgNDIuODIxNDc2IDIwLjAxOTQxNSA0MC42ODk2MzIgMTcuNzgzOTk4IDM4Ljc0NjM2OCBDIDE5LjI3MzQ3NiAzMy45MTUxNjkgMjAuMDc1NDQ1IDI4Ljc4MjQgMjAuMDc1NDQ1IDIzLjQ2MjMzNyBDIDIwLjA3NTQ0NSAxOC4xNDIyNzcgMTkuMjczNDc2IDEzLjAwOTUwNiAxNy43ODM5OTggOC4xNzgzMTggQyAyMC4wMTk0MTUgNi4yMzUwMDEgMjIuMDg2NTU0IDQuMTAzMjEgMjMuOTYwODYxIDEuODA3NjkgWiBNIDEzLjUxMTQyNyAzNS40MDY0MDMgQyAxMS4xNDUxMzkgMzMuNzQ3ODE0IDguNjMzODE2IDMyLjI4MjA2MyA2LjAwMDI2OSAzMS4wMzE5MzcgQyA2LjczMDc3NiAyOC42Mzc0NzYgNy4xMjM3NTQgMjYuMDk1NzgzIDcuMTIzNzU0IDIzLjQ2MjQyOSBDIDcuMTIzNzU0IDIwLjgyODg5MiA2LjczMDc2MiAxOC4yODcyMDEgNi4wMDAyMzUgMTUuODkyNzM4IEMgOC42MzM4MTYgMTQuNjQyNjE2IDExLjE0NTE3NSAxMy4xNzY4NjEgMTMuNTExNTAxIDExLjUxODI3NiBDIDE0LjQxNjMxMSAxNS4zNTI1NTQgMTQuODk1MDc0IDE5LjM1MTQxNCAxNC44OTUwNzQgMjMuNDYyMTU0IEMgMTQuODk1MDc0IDI3LjU3Mjk4NSAxNC40MTYyODMgMzEuNTcxOTM4IDEzLjUxMTQyNyAzNS40MDY0MDMgWiBNIDMzLjAyNzA0NiAyMy40NjIzMzcgQyAzMy4wMjcwNDYgMjcuNTcyOTg1IDMzLjUwNTc1MyAzMS41NzE4NDYgMzQuNDEwNTUzIDM1LjQwNjEyNCBDIDM2Ljc3Njg1OSAzMy43NDc2MzEgMzkuMjg4MDk0IDMyLjI4MTg3NiA0MS45MjE1MzkgMzEuMDMxODQ1IEMgNDEuMTkxMDE3IDI4LjYzNzM4NCA0MC43OTgwNjEgMjYuMDk1NjkyIDQwLjc5ODA2MSAyMy40NjIyNDYgQyA0MC43OTgwNjEgMjAuODI4OCA0MS4xOTEwMTcgMTguMjg3MjAxIDQxLjkyMTUzOSAxNS44OTI4MyBDIDM5LjI4ODA5NCAxNC42NDI3MDggMzYuNzc2NzY4IDEzLjE3NzA0OCAzNC40MTA1NTMgMTEuNTE4NTU1IEMgMzMuNTA1NzUzIDE1LjM1MjgzMSAzMy4wMjcwNDYgMTkuMzUxNjkyIDMzLjAyNzA0NiAyMy40NjIzMzcgWiIvPgo8L3N2Zz4K';
2637
-
2638
- /**
2639
- * Documentation:
2640
- * https://magic.link/docs/blockchains/other-chains/other/algorand
2641
- */
2642
- class MagicAuth extends BaseClient {
2643
- #client;
2644
- clientOptions;
2645
- network;
2646
- constructor({ metadata, client, clientOptions, algosdk, algodClient, network }) {
2647
- super(metadata, algosdk, algodClient);
2648
- this.#client = client;
2649
- this.clientOptions = clientOptions;
2650
- this.network = network;
2651
- this.metadata = MagicAuth.metadata;
2652
- }
2653
- static metadata = {
2654
- id: exports.PROVIDER_ID.MAGIC,
2655
- name: 'Magic',
2656
- icon: ICON$4,
2657
- isWalletConnect: true
2658
- };
2659
- static async init({ clientOptions, algodOptions, clientStatic, getDynamicClient, extensionStatic, getDynamicExtension, algosdkStatic, network = DEFAULT_NETWORK }) {
2660
- try {
2661
- debugLog(`${exports.PROVIDER_ID.MAGIC.toUpperCase()} initializing...`);
2662
- let Magic;
2663
- if (clientStatic) {
2664
- Magic = clientStatic;
2665
- }
2666
- else if (getDynamicClient) {
2667
- Magic = await getDynamicClient();
2668
- }
2669
- else {
2670
- throw new Error('Magic provider missing required property: clientStatic or getDynamicClient');
2671
- }
2672
- let AlgorandExtension;
2673
- if (extensionStatic) {
2674
- AlgorandExtension = extensionStatic;
2675
- }
2676
- else if (getDynamicExtension) {
2677
- AlgorandExtension = await getDynamicExtension();
2678
- }
2679
- else {
2680
- throw new Error('Magic provider missing required property: extensionStatic or getDynamicExtension');
2681
- }
2682
- if (!clientOptions || !clientOptions.apiKey) {
2683
- throw new Error('Magic provider missing API Key to be passed by required property: clientOptions');
2684
- }
2685
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
2686
- const algodClient = getAlgodClient(algosdk, algodOptions);
2687
- const magic = new Magic(clientOptions?.apiKey, {
2688
- extensions: {
2689
- algorand: new AlgorandExtension({
2690
- rpcUrl: ''
2691
- })
2692
- }
2693
- });
2694
- const provider = new MagicAuth({
2695
- metadata: MagicAuth.metadata,
2696
- client: magic,
2697
- clientOptions: clientOptions,
2698
- algosdk,
2699
- algodClient,
2700
- network
2701
- });
2702
- debugLog(`${exports.PROVIDER_ID.MAGIC.toUpperCase()} initialized`, '✅');
2703
- return provider;
2704
- }
2705
- catch (e) {
2706
- console.error('Error initializing...', e);
2707
- return null;
2708
- }
2709
- }
2710
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2711
- async connect(_, arg) {
2712
- if (!arg || typeof arg !== 'string') {
2713
- throw new Error('Magic Link provider requires an email (string) to connect');
2714
- }
2715
- const email = arg;
2716
- await this.#client.auth.loginWithMagicLink({ email: email });
2717
- const userInfo = await this.#client.user.getInfo();
2718
- return {
2719
- ...MagicAuth.metadata,
2720
- accounts: [
2721
- {
2722
- name: `MagicWallet ${userInfo.email ?? ''} 1`,
2723
- address: userInfo.publicAddress ?? 'N/A',
2724
- providerId: MagicAuth.metadata.id,
2725
- email: userInfo.email ?? ''
2726
- }
2727
- ]
2728
- };
2729
- }
2730
- async reconnect() {
2731
- const isLoggedIn = await this.#client.user.isLoggedIn();
2732
- if (!isLoggedIn) {
2733
- return null;
2734
- }
2735
- const userInfo = await this.#client.user.getInfo();
2736
- return {
2737
- ...MagicAuth.metadata,
2738
- accounts: [
2739
- {
2740
- name: `MagicWallet ${userInfo.email ?? ''} 1`,
2741
- address: userInfo.publicAddress ?? 'N/A',
2742
- providerId: MagicAuth.metadata.id,
2743
- email: userInfo.email ?? ''
2744
- }
2745
- ]
2746
- };
2747
- }
2748
- async disconnect() {
2749
- await this.#client.user.logout();
2750
- }
2751
- async signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
2752
- // If txnGroups is a nested array, flatten it
2753
- const transactions = Array.isArray(txnGroups[0])
2754
- ? txnGroups.flatMap((txn) => txn)
2755
- : txnGroups;
2756
- // Decode the transactions to access their properties.
2757
- const decodedTxns = transactions.map((txn) => {
2758
- return this.algosdk.decodeObj(txn);
2759
- });
2760
- const signedIndexes = [];
2761
- // Marshal the transactions,
2762
- // and add the signers property if they shouldn't be signed.
2763
- const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
2764
- const isSigned = 'txn' in txn;
2765
- // If the indexes to be signed is specified, designate that it should be signed
2766
- if (indexesToSign && indexesToSign.length && indexesToSign.includes(i)) {
2767
- signedIndexes.push(i);
2768
- acc.push({
2769
- txn: Buffer.from(transactions[i]).toString('base64')
2770
- });
2771
- // If the indexes to be signed is specified, but it's not included in it,
2772
- // designate that it should not be signed
2773
- }
2774
- else if (indexesToSign && indexesToSign.length && !indexesToSign.includes(i)) {
2775
- acc.push({
2776
- txn: isSigned
2777
- ? Buffer.from(this.algosdk.encodeUnsignedTransaction(this.algosdk.decodeSignedTransaction(transactions[i]).txn)).toString('base64')
2778
- : Buffer.from(transactions[i]).toString('base64'),
2779
- signers: []
2780
- });
2781
- // If the transaction is unsigned and is to be sent from a connected account,
2782
- // designate that it should be signed
2783
- }
2784
- else if (!isSigned && connectedAccounts.includes(this.algosdk.encodeAddress(txn['snd']))) {
2785
- signedIndexes.push(i);
2786
- acc.push({
2787
- txn: Buffer.from(transactions[i]).toString('base64')
2788
- });
2789
- // Otherwise, designate that it should not be signed
2790
- }
2791
- else if (isSigned) {
2792
- acc.push({
2793
- txn: Buffer.from(this.algosdk.encodeUnsignedTransaction(this.algosdk.decodeSignedTransaction(transactions[i]).txn)).toString('base64'),
2794
- signers: []
2795
- });
2796
- }
2797
- else if (!isSigned) {
2798
- acc.push({
2799
- txn: Buffer.from(transactions[i]).toString('base64'),
2800
- signers: []
2801
- });
2802
- }
2803
- return acc;
2804
- }, []);
2805
- // Sign them with the client.
2806
- try {
2807
- console.log(txnsToSign);
2808
- const result = await this.#client.algorand.signGroupTransactionV2(txnsToSign);
2809
- console.log(result);
2810
- const decodedSignedTxns = result.map((txn) => {
2811
- return Buffer.from(txn, 'base64');
2812
- });
2813
- // Join the newly signed transactions with the original group of transactions.
2814
- const signedTxns = transactions.reduce((acc, txn, i) => {
2815
- if (signedIndexes.includes(i)) {
2816
- const signedByUser = decodedSignedTxns.shift();
2817
- signedByUser && acc.push(signedByUser);
2818
- }
2819
- else if (returnGroup) {
2820
- acc.push(transactions[i]);
2821
- }
2822
- return acc;
2823
- }, []);
2824
- return signedTxns;
2825
- }
2826
- catch (e) {
2827
- console.error(e);
2828
- return [];
2829
- }
2830
- }
2831
- }
2832
-
2833
- const ICON$3 = 'data:image/svg+xml;base64,' +
2834
- 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+';
2835
-
2836
- class KMDWalletClient extends BaseClient {
2837
- #client;
2838
- #wallet;
2839
- #password;
2840
- walletId;
2841
- network;
2842
- constructor({ metadata, client, wallet, password, algosdk, algodClient, network }) {
2843
- super(metadata, algosdk, algodClient);
2844
- this.#client = client;
2845
- this.#wallet = wallet;
2846
- this.#password = password;
2847
- this.walletId = '';
2848
- this.network = network;
2849
- this.metadata = KMDWalletClient.metadata;
2850
- }
2851
- static metadata = {
2852
- id: exports.PROVIDER_ID.KMD,
2853
- name: 'KMD',
2854
- icon: ICON$3,
2855
- isWalletConnect: false
2856
- };
2857
- static async init({ clientOptions, algodOptions, algosdkStatic, network = DEFAULT_NETWORK }) {
2858
- try {
2859
- debugLog(`${exports.PROVIDER_ID.KMD.toUpperCase()} initializing...`);
2860
- const { token = 'a'.repeat(64), host = 'http://localhost', port = '4002', wallet = 'unencrypted-default-wallet', password = '' } = clientOptions || {};
2861
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
2862
- const algodClient = getAlgodClient(algosdk, algodOptions);
2863
- const kmdClient = new algosdk.Kmd(token, host, port);
2864
- const provider = new KMDWalletClient({
2865
- metadata: KMDWalletClient.metadata,
2866
- password,
2867
- wallet,
2868
- client: kmdClient,
2869
- algosdk: algosdk,
2870
- algodClient: algodClient,
2871
- network
2872
- });
2873
- debugLog(`${exports.PROVIDER_ID.KMD.toUpperCase()} initialized`, '✅');
2874
- return provider;
2875
- }
2876
- catch (e) {
2877
- console.error('Error initializing...', e);
2878
- return null;
2879
- }
2880
- }
2881
- async connect() {
2882
- // TODO: prompt for wallet and password?
2883
- return {
2884
- ...KMDWalletClient.metadata,
2885
- accounts: await this.listAccounts(this.#wallet, this.requestPassword())
2886
- };
2887
- }
2888
- // eslint-disable-next-line @typescript-eslint/require-await
2889
- async disconnect() {
2890
- return;
2891
- }
2892
- // eslint-disable-next-line @typescript-eslint/require-await
2893
- async reconnect() {
2894
- return null;
2895
- }
2896
- requestPassword() {
2897
- // TODO: store it locally?
2898
- const pw = prompt('KMD password');
2899
- return pw ? pw : '';
2900
- }
2901
- async getWalletToken(walletId, password) {
2902
- const handleResp = await this.#client.initWalletHandle(walletId, password);
2903
- return handleResp.wallet_handle_token;
2904
- }
2905
- async releaseToken(token) {
2906
- await this.#client.releaseWalletHandle(token);
2907
- }
2908
- async listWallets() {
2909
- const walletResponse = await this.#client.listWallets();
2910
- const walletList = walletResponse['wallets'];
2911
- const walletMap = {};
2912
- for (const w of walletList) {
2913
- walletMap[w.name] = w.id;
2914
- }
2915
- return walletMap;
2916
- }
2917
- async listAccounts(wallet, password) {
2918
- // Get a handle token
2919
- const walletId = await this.getWalletId();
2920
- const token = await this.getWalletToken(walletId, password);
2921
- // Fetch accounts and format them as lib expects
2922
- const listResponse = await this.#client.listKeys(token);
2923
- const addresses = listResponse['addresses'];
2924
- const mappedAccounts = addresses.map((address, index) => {
2925
- return {
2926
- name: `KMDWallet ${index + 1}`,
2927
- address,
2928
- providerId: KMDWalletClient.metadata.id
2929
- };
2930
- });
2931
- // Release handle token
2932
- await this.releaseToken(token);
2933
- return mappedAccounts;
2934
- }
2935
- async getWalletId() {
2936
- // Use cached if available
2937
- if (this.walletId !== '')
2938
- return this.walletId;
2939
- const walletMap = await this.listWallets();
2940
- if (!(this.#wallet in walletMap))
2941
- throw Error('No wallet named: ' + this.#wallet);
2942
- this.walletId = walletMap[this.#wallet];
2943
- return this.walletId;
2944
- }
2945
- async signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
2946
- // If txnGroups is a nested array, flatten it
2947
- const transactions = Array.isArray(txnGroups[0])
2948
- ? txnGroups.flatMap((txn) => txn)
2949
- : txnGroups;
2950
- // Decode the transactions to access their properties.
2951
- const decodedTxns = transactions.map((txn) => {
2952
- return this.algosdk.decodeObj(txn);
2953
- });
2954
- // Get a handle token
2955
- const walletId = await this.getWalletId();
2956
- const pw = this.requestPassword();
2957
- const token = await this.getWalletToken(walletId, pw);
2958
- const signedTxns = [];
2959
- // Sign them with the client.
2960
- const signingPromises = [];
2961
- decodedTxns.forEach((dtxn, idx) => {
2962
- const isSigned = 'txn' in dtxn;
2963
- // push the incoming txn into signed, we'll overwrite it later
2964
- signedTxns.push(transactions[idx]);
2965
- // Its already signed, skip it
2966
- if (isSigned) {
2967
- return;
2968
- // Not specified in indexes to sign, skip it
2969
- }
2970
- else if (indexesToSign && indexesToSign.length && !indexesToSign.includes(Number(idx))) {
2971
- return;
2972
- }
2973
- // Not to be signed by our signer, skip it
2974
- else {
2975
- const senderAddress = this.algosdk.encodeAddress(dtxn.snd);
2976
- const rekeyAddress = dtxn.rekey ? this.algosdk.encodeAddress(dtxn.rekey) : null;
2977
- const isSignerConnected = rekeyAddress
2978
- ? connectedAccounts.includes(rekeyAddress) && connectedAccounts.includes(senderAddress)
2979
- : connectedAccounts.includes(senderAddress);
2980
- if (!isSignerConnected) {
2981
- return;
2982
- }
2983
- }
2984
- // overwrite with an empty blob
2985
- signedTxns[idx] = new Uint8Array();
2986
- const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
2987
- const promise = txn.reKeyTo
2988
- ? this.#client.signTransactionWithSpecificPublicKey(token, pw, txn, txn.reKeyTo.publicKey)
2989
- : this.#client.signTransaction(token, pw, txn);
2990
- signingPromises.push(promise);
2991
- });
2992
- const signingResults = await Promise.all(signingPromises);
2993
- // Restore the newly signed txns in the correct order
2994
- let signedIdx = 0;
2995
- const formattedTxns = signedTxns.reduce((acc, txn) => {
2996
- // If its an empty array, infer that it is one of the
2997
- // ones we wanted to have signed and overwrite the empty buff
2998
- if (txn.length === 0) {
2999
- acc.push(signingResults[signedIdx]);
3000
- signedIdx += 1;
3001
- }
3002
- else if (returnGroup) {
3003
- acc.push(txn);
3004
- }
3005
- return acc;
3006
- }, []);
3007
- return formattedTxns;
3008
- }
3009
- }
3010
-
3011
- const ICON$2 = "data:image/svg+xml,%3c%3fxml version='1.0' encoding='UTF-8'%3f%3e %3c!-- Generated by Pixelmator Pro 3.2.2 --%3e %3csvg width='409' height='210' viewBox='0 0 409 210' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3ctext id='MNEMONIC' xml:space='preserve' x='0' y='129' font-family='Helvetica' font-size='72' fill='black'%3eMNEMONIC%3c/text%3e%3c/svg%3e";
3012
-
3013
- class MnemonicWalletClient extends BaseClient {
3014
- #client;
3015
- network;
3016
- constructor({ metadata, algosdk, algodClient, network }) {
3017
- super(metadata, algosdk, algodClient);
3018
- this.network = network;
3019
- this.metadata = MnemonicWalletClient.metadata;
3020
- }
3021
- static metadata = {
3022
- id: exports.PROVIDER_ID.MNEMONIC,
3023
- name: 'MNEMONIC',
3024
- icon: ICON$2,
3025
- isWalletConnect: false
3026
- };
3027
- static async init({ algodOptions, algosdkStatic, network = DEFAULT_NETWORK }) {
3028
- try {
3029
- debugLog(`${exports.PROVIDER_ID.MNEMONIC.toUpperCase()} initializing...`);
3030
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
3031
- const algodClient = getAlgodClient(algosdk, algodOptions);
3032
- const provider = new MnemonicWalletClient({
3033
- metadata: MnemonicWalletClient.metadata,
3034
- algosdk: algosdk,
3035
- algodClient: algodClient,
3036
- network
3037
- });
3038
- debugLog(`${exports.PROVIDER_ID.MNEMONIC.toUpperCase()} initialized`);
3039
- return provider;
3040
- }
3041
- catch (e) {
3042
- console.error('Error initializing...', e);
3043
- return null;
3044
- }
3045
- }
3046
- // eslint-disable-next-line @typescript-eslint/require-await
3047
- async connect() {
3048
- const password = this.requestPassword();
3049
- if (!password) {
3050
- this.#client = undefined;
3051
- throw new Error('Mnemonic passphrase is required');
3052
- }
3053
- this.#client = this.algosdk.mnemonicToSecretKey(password);
3054
- return {
3055
- ...MnemonicWalletClient.metadata,
3056
- accounts: [
3057
- {
3058
- name: `MnemonicWallet 1`,
3059
- address: this.#client.addr,
3060
- providerId: MnemonicWalletClient.metadata.id
3061
- }
3062
- ]
3063
- };
3064
- }
3065
- // eslint-disable-next-line @typescript-eslint/require-await
3066
- async disconnect() {
3067
- this.#client = undefined;
3068
- return;
3069
- }
3070
- // eslint-disable-next-line @typescript-eslint/require-await
3071
- async reconnect() {
3072
- return null;
3073
- }
3074
- requestPassword() {
3075
- // TODO: store it locally?
3076
- const pass = prompt('enter mnemonic passphrase, 25 words');
3077
- return pass ? pass : '';
3078
- }
3079
- signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
3080
- if (!this.#client) {
3081
- throw new Error('Client not connected');
3082
- }
3083
- // If txnGroups is a nested array, flatten it
3084
- const transactions = Array.isArray(txnGroups[0])
3085
- ? txnGroups.flatMap((txn) => txn)
3086
- : txnGroups;
3087
- // Decode the transactions to access their properties.
3088
- const decodedTxns = transactions.map((txn) => {
3089
- return this.algosdk.decodeObj(txn);
3090
- });
3091
- const signedTxns = [];
3092
- // Sign them with the client.
3093
- const signingResults = [];
3094
- decodedTxns.forEach((dtxn, idx) => {
3095
- const isSigned = 'txn' in dtxn;
3096
- // push the incoming txn into signed, we'll overwrite it later
3097
- signedTxns.push(transactions[idx]);
3098
- // Its already signed, skip it
3099
- if (isSigned) {
3100
- return;
3101
- // Not specified in indexes to sign, skip it
3102
- }
3103
- else if (indexesToSign && indexesToSign.length && !indexesToSign.includes(Number(idx))) {
3104
- return;
3105
- }
3106
- // Not to be signed by our signer, skip it
3107
- else if (!connectedAccounts.includes(this.algosdk.encodeAddress(dtxn.snd))) {
3108
- return;
3109
- }
3110
- // overwrite with an empty blob
3111
- signedTxns[idx] = new Uint8Array();
3112
- const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
3113
- const signedTxn = txn.signTxn(this.#client?.sk);
3114
- signingResults.push(signedTxn);
3115
- });
3116
- // Restore the newly signed txns in the correct order
3117
- let signedIdx = 0;
3118
- const formattedTxns = signedTxns.reduce((acc, txn) => {
3119
- // If its an empty array, infer that it is one of the
3120
- // ones we wanted to have signed and overwrite the empty buff
3121
- if (txn.length === 0) {
3122
- acc.push(signingResults[signedIdx]);
3123
- signedIdx += 1;
3124
- }
3125
- else if (returnGroup) {
3126
- acc.push(txn);
3127
- }
3128
- return acc;
3129
- }, []);
3130
- return Promise.resolve(formattedTxns);
3131
- }
3132
- signEncodedTransactions(_transactions) {
3133
- throw new Error('Method not implemented.');
3134
- }
3135
- }
3136
-
3137
- const ICON$1 = "data:image/svg+xml,%3Csvg fill='%23000000' width='800px' height='800px' viewBox='0 0 24 24' id='wallet' data-name='Flat Line' xmlns='http://www.w3.org/2000/svg' class='icon flat-line'%3E%3Cpath id='secondary' d='M16,12h5V8H5A2,2,0,0,1,3,6V19a1,1,0,0,0,1,1H20a1,1,0,0,0,1-1V16H16a1,1,0,0,1-1-1V13A1,1,0,0,1,16,12Z' style='fill: rgb(44, 169, 188); stroke-width: 2;'%3E%3C/path%3E%3Cpath id='primary' d='M19,4H5A2,2,0,0,0,3,6H3A2,2,0,0,0,5,8H21' style='fill: none; stroke: rgb(0, 0, 0); stroke-linecap: round; stroke-linejoin: round; stroke-width: 2;'%3E%3C/path%3E%3Cpath id='primary-2' data-name='primary' d='M21,8V19a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V6A2,2,0,0,0,5,8Zm0,4H16a1,1,0,0,0-1,1v2a1,1,0,0,0,1,1h5Z' style='fill: none; stroke: rgb(0, 0, 0); stroke-linecap: round; stroke-linejoin: round; stroke-width: 2;'%3E%3C/path%3E%3C/svg%3E";
3138
-
3139
- class CustomWalletClient extends BaseClient {
3140
- network;
3141
- providerProxy;
3142
- static metadata = {
3143
- id: exports.PROVIDER_ID.CUSTOM,
3144
- icon: ICON$1,
3145
- isWalletConnect: false,
3146
- name: 'Custom'
3147
- };
3148
- constructor({ providerProxy, metadata, algosdk, algodClient, network }) {
3149
- super(metadata, algosdk, algodClient);
3150
- this.providerProxy = providerProxy;
3151
- this.network = network;
3152
- }
3153
- static async init({ clientOptions, algodOptions, algosdkStatic, network = DEFAULT_NETWORK }) {
3154
- try {
3155
- debugLog(`${exports.PROVIDER_ID.CUSTOM.toUpperCase()} initializing...`);
3156
- if (!clientOptions) {
3157
- throw new Error(`Attempt to create custom wallet with no provider specified.`);
3158
- }
3159
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
3160
- const algodClient = getAlgodClient(algosdk, algodOptions);
3161
- try {
3162
- return new CustomWalletClient({
3163
- providerProxy: clientOptions.getProvider({
3164
- algod: algodClient,
3165
- algosdkStatic: algosdk,
3166
- network
3167
- }),
3168
- metadata: {
3169
- ...CustomWalletClient.metadata,
3170
- name: clientOptions.name,
3171
- icon: clientOptions.icon ?? CustomWalletClient.metadata.icon
3172
- },
3173
- algodClient,
3174
- algosdk,
3175
- network
3176
- });
3177
- }
3178
- finally {
3179
- debugLog(`${exports.PROVIDER_ID.CUSTOM.toUpperCase()} initialized`, '✅');
3180
- }
3181
- }
3182
- catch (e) {
3183
- console.error('Error initializing...', e);
3184
- return null;
3185
- }
3186
- }
3187
- async connect() {
3188
- return await this.providerProxy.connect(this.metadata);
3189
- }
3190
- async disconnect() {
3191
- await this.providerProxy.disconnect();
3192
- }
3193
- async reconnect() {
3194
- return await this.providerProxy.reconnect(this.metadata);
3195
- }
3196
- async signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup = true) {
3197
- return await this.providerProxy.signTransactions(connectedAccounts, txnGroups, indexesToSign, returnGroup);
3198
- }
3199
- }
3200
-
3201
- /**
3202
- * arc-0027
3203
- */
3204
- const ARC_0027_PREFIX = 'arc0027';
3205
- const ARC_0027_CHANNEL_NAME = `${ARC_0027_PREFIX}:channel`;
3206
- const ARC_0027_ENABLE_REQUEST = `${ARC_0027_PREFIX}:enable:request`;
3207
- const ARC_0027_GET_PROVIDERS_REQUEST = `${ARC_0027_PREFIX}:get_providers:request`;
3208
- const ARC_0027_PROVIDER_ID = 'f6d1c86b-4493-42fb-b88d-a62407b4cdf6';
3209
- const ARC_0027_SIGN_TXNS_REQUEST = `${ARC_0027_PREFIX}:sign_txns:request`;
3210
- /**
3211
- * errors
3212
- */
3213
- const UNKNOWN_ERROR = 4000;
3214
- const METHOD_TIMED_OUT_ERROR = 4002;
3215
- const METHOD_NOT_SUPPORTED_ERROR = 4003;
3216
- const NETWORK_NOT_SUPPORTED_ERROR = 4004;
3217
- /**
3218
- * timeouts
3219
- */
3220
- const DEFAULT_REQUEST_TIMEOUT = 180000; // 3 minutes in milliseconds
3221
- const LOWER_REQUEST_TIMEOUT = 750; // 0.75 seconds in milliseconds
3222
- /**
3223
- * icon
3224
- */
3225
- const ICON = 'data:image/svg+xml;base64,' +
3226
- 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDEzNjUuMzMzMyAxMzY1LjMzMzMiCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGgKICAgIGQ9Im0gNjY3Ljk5OTk4LDEwNDguNjY2MiBjIDAsLTY0LjE2Njk4IC0wLjYyMDQ0LC0xMjguODE2OTggLTEuMzc4NzcsLTE0My42NjY3IC0yLjgxMTA3LC01NS4wNDczNyAtMTIuMDY3NDksLTkzLjA1MjU5IC0zMy4yNDA1OSwtMTM2LjQ3OTkyIC0yMS41MDczNCwtNDQuMTEyODkgLTUxLjA3MDU3LC04Mi42MzAyMiAtODQuNzM2ODYsLTExMC40MDE5OCAtMjMuNjQ4MjEsLTE5LjUwNzcxIC0yOS4zOTQ4NCwtMjMuNTc5NjMgLTUzLjU5NzA3LC0zNy45Nzc1NSAtMTAuMzU1NTMsLTYuMTYwNDkgLTQ1Ljk3MTAyLC0yMi44MDY3MyAtNDguNzk2MjIsLTIyLjgwNjczIC0wLjk0NDQzLDAgLTIuMjg3MTUsLTAuNTUyODkgLTIuOTgzODEsLTEuMjI4NjUgLTEuNDkxOTUsLTEuNDQ3MTYgLTM0LjAwNzg3LC0xMS4wNzg0NyAtNDQuNiwtMTMuMjEwNjQgLTE5LjUwOTI4LC0zLjkyNzE4IC00Ni4xMDEzMSwtNi44NjQxMiAtNjUuOTI5MTUsLTcuMjgxNTIgbCAtMTMuMjYyNDksLTAuMjc5MTkgLTEuNzk0NCwxMi42NjY2NyBjIC0yLjQ3MjMzLDE3LjQ1MjI1IC0yLjk5NDMyLDQ4LjMxNTQzIC0zLjAwNDg3LDE3Ny42NjY2NiBsIC0wLjAwOSwxMTEuNjY2NjYgaCAtMjggLTI4IGwgMC4wMjg5LC0xMzAuMzMzMzMgYyAwLjAyNjQsLTExOC45MzM1NyAwLjI1Mjg0LC0xMzIuNDkwODIgMi41ODg1NiwtMTU0Ljk5OTk5IDIuNjU1MjMsLTI1LjU4ODI2IDYuMzY3NjgsLTQ4LjY4Njg2IDkuODU3NTksLTYxLjMzMzM0IDcuMDU0NTIsLTI1LjU2MzU4IDEwLjYyNTc5LC0zNy4yNjIyMSAxMi44MjE0MywtNDIgMC42Nzk3LC0xLjQ2NjY2IDIuMTI2MzMsLTUuMzY2NjYgMy4yMTQ3MywtOC42NjY2NiA2LjY5Njc2LC0yMC4zMDQ0NyAyNi40NDAxNSwtNTguNzgxMzYgNDMuNDg4NzMsLTg0Ljc1MzAzIDI4LjA3NzM3LC00Mi43NzI4MSA2MC4zNDY2OSwtNzYuODgwNzQgMTA0LjY2NjY3LC0xMTAuNjMwMjYgNC42ODc3NywtMy41Njk3MiAyOS40ODMwNSwtMjAuMDcxOTkgMzkuNjU5OTgsLTI2LjM5NTMyIDEzLjU2MjQxLC04LjQyNjg5IDUxLjgwNDgsLTI2LjY4OTI1IDY1LjAwNjY4LC0zMS4wNDM0NSAzLjMsLTEuMDg4NCA3LjIsLTIuNTMxMiA4LjY2NjY3LC0zLjIwNjIzIDcuNjYxMzMsLTMuNTI2MDkgNDEuMjA5ODgsLTEzLjE5MDY5IDU2LC0xNi4xMzIzNyA3OS45NTg3OCwtMTUuOTAzMzkgMTU3Ljk3ODkyLC0xMC43Njc3MSAyMzMuOTk5OTksMTUuNDAzMDYgNDEuOTE4NjEsMTQuNDMwNzYgNzUuOTk2NDksMzIuMTc3NzkgMTE0Ljc1MTY2LDU5Ljc2MDE5IDE2Ljg4MDQ3LDEyLjAxMzk5IDQ3LjIyMTc2LDM4Ljk4MjMxIDU5LjkxMTE2LDUzLjI1MTAzIDUuNDE5Myw2LjA5MzgzIDExLjUxMDgsMTIuNzc1MDMgMTMuNTM2NSwxNC44NDcxIDMuNTYzNiwzLjY0NTA5IDI0LjIyOTQsMzAuNTQ2NDkgMjkuODI3OCwzOC44Mjc4NyAyNC4xNjc3LDM1Ljc0OTczIDQ1LjkxMjYsODEuODc4OTQgNTcuMjI5MSwxMjEuNDA0NzQgMS4yNTk4LDQuNCAyLjgxMjQsOS41IDMuNDUwNCwxMS4zMzMzMyAxLjYxNDgsNC42NDA3OCA2LjUzMDksMjguMjM1NiA4LjA1NjMsMzguNjY2NjcgMC42OTcxLDQuNzY2NjcgMS41ODAzLDkuNTE2OTUgMS45NjI2LDEwLjU1NjE2IDAuMzgyNCwxLjAzOTIzIDEuNTcxNiwxMy4wMzkyMyAyLjY0MjcsMjYuNjY2NjcgMS41MTk3LDE5LjMzNDgzIDEuOTQ5NSw1Mi42NzI4MyAxLjk1NjMsMTUxLjc3NzE3IGwgMC4wMSwxMjYuOTk5OTkgaCAtMjcuOTA3NSAtMjcuOTA3NiBsIC0wLjYzOTIsLTEzOS42NjY2NiBjIC0wLjUwMTYsLTEwOS41Nzg2MyAtMS4wMzM5LC0xNDIuMTA4MTcgLTIuNDcxMSwtMTUxIGwgLTEuODMxOCwtMTEuMzMzMzMgLTEyLjYyMTQsMC4yMzMwNCBjIC00MS4xOTI1LDAuNzYwNTcgLTgwLjc3OTcyLDguNTI0MjEgLTExOC45NjgzMywyMy4zMzE0NyBsIC0xNC4zNDY4Nyw1LjU2Mjg2IDEuMDEzNTQsOC43Njk2NCBjIDAuNTU3NDQsNC44MjMzMSAxLjAxMzUzLDk4Ljc2OTY1IDEuMDEzNTMsMjA4Ljc2OTY1IFYgMTAyMiBsIC0yNy42NjY2NywwLjM2MDQgLTI3LjY2NjY2LDAuMzYwMyBWIDgyOS4yMTc3MSBjIDAsLTE2NC45MjU5MSAtMC4yNzQ1MiwtMTkzLjM5NzY5IC0xLjg1ODg4LC0xOTIuNzg5NzEgLTguMjY2MjcsMy4xNzIwNiAtNDMuNTg1MTcsMzQuMTczMzIgLTU5LjI2MDMyLDUyLjAxNTg5IC0zNy4wMDU5Niw0Mi4xMjI4MyAtNjMuMjI1MSw5MC40MjEzIC03Ni4xOTQ0NSwxNDAuMzU4NDEgLTExLjMzNTMxLDQzLjY0NTM2IC0xMi4wODU5Miw1Ny45ODA0NCAtMTEuMDc1NDMsMjExLjUxNzMgbCAwLjgyMjc4LDEyNS4wMTM3IGggLTI4LjIxNjg2IC0yOC4yMTY4NCB6IG0gNDAuMTQ2OTYsLTMwNy4xMTM4IGMgMTYuMjcwNDgsLTM0LjI1NTk4IDM1LjE1MzYyLC02Mi4xNDM5IDYxLjk1NjQxLC05MS41MDE1OCAxMy40MDA5NiwtMTQuNjc4MzMgMzUuMTE3NTUsLTM1LjE5MzkgNDUuMjI5OTYsLTQyLjcyODUzIDIuOTMzMzQsLTIuMTg1NTggNS42MzMzNCwtNC4zMzE0IDYsLTQuNzY4NDYgMS4yMzM5NSwtMS40NzA4NyAyNC44ODc1OCwtMTguMjUzMzEgMjguNzk2MzYsLTIwLjQzMTI2IDIuMTI4NjcsLTEuMTg2MDggNC43NzAzMSwtMi43MzE3OCA1Ljg3MDMxLC0zLjQzNDg5IDEyLjk1MTY5LC04LjI3ODY4IDM0LjU3NzI4LC0xOS41MDUyMyA1Ni42NjY2NiwtMjkuNDE3NTIgMTAuODEzOTksLTQuODUyNjMgMzYuNDY4MjMsLTEzLjQ5NzE2IDUxLjMzMzM0LC0xNy4yOTc0NSAyNy40NzU5LC03LjAyNDI3IDQ4LjI1OTMyLC0xMC4yNDc0NiA3My44ODM0MiwtMTEuNDU4MiAxMC42OTc0LC0wLjUwNTQ2IDE5LjQ0OTksLTEuMzI4OTEgMTkuNDQ5OSwtMS44Mjk5IDAsLTYuNDQ4NzYgLTE4LjI2MTEsLTQ4LjI1NTY2IC0zMC43MTgsLTcwLjMyNTYzIC04LjAxMjIsLTE0LjE5NTQ0IC0yMi40MzU4LC0zNi41MTA0OCAtMjUuMjI0NiwtMzkuMDI1NjYgLTAuNDA2NiwtMC4zNjY2NiAtMi40OTYxMiwtMy4wNjY2NiAtNC42NDM0MywtNiAtMTkuNzAwOTEsLTI2LjkxMjM4IC01NS4wMzY2OSwtNjAuMzg0NDkgLTg2Ljc0NzI5LC04Mi4xNzIwNiAtNTkuNzQyMzksLTQxLjA0NzU1IC0xMzAuNzM1NzYsLTYzLjgxMDUxIC0yMDYuMjMzOTIsLTY2LjEyNTgzIC00Ny42MDY0OCwtMS40NTk5NiAtMTAwLjIwMDE5LDguMDk0NzUgLTE0OS43NjYwNywyNy4yMDgwNCAtMjUuOTQ2OTksMTAuMDA1NTEgLTY5LjMxNzMxLDM0LjU2MDI2IC05MCw1MC45NTQ4MiAtNDkuNTM0MTEsMzkuMjY0MjIgLTgyLjY1Njg4LDc5LjkwNjkzIC0xMTAuNDA0OCwxMzUuNDcwMjYgLTcuMzMwNDcsMTQuNjc4NzQgLTIwLjI2MTg2LDQ1Ljk1MjM3IC0yMC4yNjE4Niw0OS4wMDE4IDAsMS41NTMwNiAzLjcyMDk2LDIuMTE2NjEgMTguOTUzNzcsMi44NzA1OCAxNy41MzYzOCwwLjg2OCA0NS40MjI4NSw0LjA0Mzc0IDQ3LjY2MjM3LDUuNDI3ODMgMC41MjkzMywwLjMyNzE1IDQuMjA3MjQsMS4xNDE1MiA4LjE3MzEzLDEuODA5NzIgMTQuOTMwODQsMi41MTU2NSA1NS45NDQ3MSwxNC44NjkwOCA2NS40Nzc4NCwxOS43MjIgMS45ODAyNiwxLjAwODA3IDQuMTM1NDYsMS44MzI4NCA0Ljc4OTM1LDEuODMyODQgMC42NTM4OSwwIDIuNzc5NDUsLTQuMDUgNC43MjM0NSwtOSAzLjQzMjkxLC04Ljc0MTE3IDE1Ljc1MDI3LC0zMC41ODg5MyAyMS40MTg4NCwtMzcuOTkxNCAxNi4xODI5MSwtMjEuMTMyOTEgMjQuNTgwMDksLTMwLjI1OTM4IDM5LjQ2NzkxLC00Mi44OTU3MiAxNS4yMDUxNywtMTIuOTA1NjkgMjEuMTgwMjksLTE3LjAxOTI4IDM5LjU3MTg0LC0yNy4yNDMzNCAzOC4wNTIxNSwtMjEuMTUzNjMgODYuNzgzNjEsLTMxLjc5NzQ0IDEyOS4yMjUxMSwtMjguMjI1MDcgMzMuMjQ3NTksMi43OTg0OSA1NS4wODQ4Nyw4LjYxODU1IDgyLjUzNjM3LDIxLjk5NzUzIDM2LjA4NzA0LDE3LjU4NzY2IDYzLjQ4NTY0LDQwLjYyMzEgODguNzc4NzEsNzQuNjQwOTYgOC43OTcwOCwxMS44MzE2MSA4Ljc3NDY2LDEyLjA3NyAtMS40NDUzNywxNS44MjIyOCAtMy4zLDEuMjA5MzMgLTEzLjQ2Mzg3LDYuMzQyODUgLTIyLjU4NjM4LDExLjQwNzgzIC05LjEyMjUsNS4wNjQ5NyAtMTcuMzQ0MTcsOC45MTgyNCAtMTguMjcwMzcsOC41NjI4MiAtMC45MjYyLC0wLjM1NTQxIC0zLjQ4MzY3LC0zLjQ1MDczIC01LjY4MzI1LC02Ljg3ODQ5IC01LjcyMjE1LC04LjkxNzIgLTI5LjcxMjY3LC0zMS45NDA4NSAtNDEuNDYsLTM5Ljc4OTA4IC0zNS4xNTk2NywtMjMuNDg5NjYgLTc0LjE0MzY3LC0zMy4zODg4OCAtMTE2Ljk5NzM2LC0yOS43MDkxNCAtNTkuMDAwNDcsNS4wNjYyMiAtMTE0Ljc3MzQ4LDQ0LjUxMzk1IC0xNDEuNzIwOTQsMTAwLjIzNzg5IC0yLjkwNDk0LDYuMDA3MDIgLTUuMjgxNywxMS45OTE0MSAtNS4yODE3LDEzLjI5ODY0IDAsMS40MjQ2NiAyLjEwNTM0LDMuNDUwODIgNS4yNTU2Nyw1LjA1OCAxNC45NTUwMSw3LjYyOTQ4IDQ2LjQ3OTc1LDMzLjAzNjg0IDY5LjQ4NTQ5LDU2LjAwMTg1IDI3LjcxMDExLDI3LjY2MTAyIDQ1Ljc4OTkzLDUwLjkwNTk4IDY1LjI2NjE1LDgzLjkxMTY1IDguNjE2OTYsMTQuNjAyODcgMTIuNDU5NzQsMjIuNDUxMTMgMjIuMTIxMDYsNDUuMTc4NjggbCAyLjQzMTIsNS43MTkyMiAyLjU1NDMyLC01LjcxOTIyIGMgMS40MDQ4OCwtMy4xNDU1OCA2LjA2OTc2LC0xMy4xMjA2NCAxMC4zNjY0LC0yMi4xNjY4MSB6IG0gLTI0NS40ODAyOCw5Ni42Njk4MSBjIDAsLTEwMS40NDQ0NSAwLjM1MDAxLC0xODQuNzk0NDUgMC43Nzc4LC0xODUuMjIyMjQgMS45NjYwNCwtMS45NjYwNSAyMS4zMTA0MSw5LjU3ODU5IDQxLjIyMjE5LDI0LjYwMTI1IGwgMTQuNjY2NjcsMTEuMDY1NDMgMC4zMzg1MSwxNjcgMC4zMzg0OSwxNjYuOTk5OTUgaCAtMjguNjcxODMgLTI4LjY3MTgzIHoiCiAgICBmaWxsPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICBkPSJNIDAsNjgyLjY2NjY1IFYgMCBIIDY4Mi42NjY2NSAxMzY1LjMzMzMgViA2ODIuNjY2NjUgMTM2NS4zMzMzIEggNjgyLjY2NjY1IDAgWiBNIDcyNC4zMTE4NiwxMDI1IGMgMC4zNTI2OCwtMTI3LjE2NjgyIDAuNjI1NTYsLTE0Mi44MjY2NyAyLjY2NjE0LC0xNTMuMDAwMDIgMS4yNTAyOSwtNi4yMzMzMyAzLjI0NjY1LC0xNy4wMzMzMyA0LjQzNjM0LC0yNCAyLjE2OTM0LC0xMi43MDMxMyA1LjkyODM5LC0yNy4yNzg3MiA5LjI4NDQ0LC0zNiAwLjk4NzcsLTIuNTY2NjcgMi41Mjc0NCwtNy4wNjY2NyAzLjQyMTY3LC0xMCAwLjg5NDIzLC0yLjkzMzMzIDMuNjMyOTUsLTkuNjg1ODcgNi4wODYwNCwtMTUuMDA1NjQgMi40NTMwOSwtNS4zMTk3NiA0LjQ2MDE2LC0xMC4wNzIzNSA0LjQ2MDE2LC0xMC41NjEyOSAwLC0wLjc5MDE1IDYuMDI2NDQsLTEzLjI1NjM1IDkuMzk0MzgsLTE5LjQzMzA3IDAuNjk5NzUsLTEuMjgzMzMgMS44NDY1OCwtMy4zODMzMyAyLjU0ODUsLTQuNjY2NjcgMy4xOTMwNCwtNS44Mzc5MyAxNC4wMDg2NCwtMjMuNzM0ODkgMTQuNzA1MjUsLTI0LjMzMzMzIDAuNDI2ODMsLTAuMzY2NjYgMy43NDE1OSwtNC44NjY2NiA3LjM2NjE1LC0xMCAzLjYyNDU0LC01LjEzMzMzIDcuNTg0ODgsLTEwLjUzMzMzIDguODAwNzIsLTEyIDE5LjI5NjI0LC0yMy4yNzcwMSAzNi4xMTI4OSwtNDAuNTI5ODQgNDguNzcyNTMsLTUwLjAzNzU4IDQuMjYwMTksLTMuMTk5NTIgOC4zNDU4LC02LjQ2MzQ0IDkuMDc5MTMsLTcuMjUzMTYgMC43MzMzNCwtMC43ODk3MSA0LjQ4MzM0LC0zLjcyMzQ2IDguMzMzMzQsLTYuNTE5NDQgbCA3LC01LjA4MzYgdiAxOTIuNzgwMjIgMTkyLjc4MDE4IGggMjkuMzY5NzQgMjkuMzY5NzYgbCAtMC41MDA1NywtMjA1LjY2NjYyIGMgLTAuMjc1MzIsLTExMy4xMTY2NiAtMC43NDE3MSwtMjA3LjA0ODc4IC0xLjAzNjQzLC0yMDguNzM4MDMgLTAuNDU0OTcsLTIuNjA3ODIgMC40NzAzMywtMy40ODc2MiA2LjEzMDgzLC01LjgyOTM1IDMuNjY2NjYsLTEuNTE2ODggOC41NTczNCwtMy41ODQ3NiAxMC44NjgxNywtNC41OTUyOSAyLjMxMDgzLC0xLjAxMDUyIDUuMTg0NzMsLTEuODM3MzIgNi4zODY0NSwtMS44MzczMiAxLjIwMTcyLDAgNC40MTEwNCwtMS4wOTQ5MSA3LjEzMTgzLC0yLjQzMzEyIDEzLjk1ODk2LC02Ljg2NTY4IDYxLjc1MzQ3LC0xNS42NTIxMSA5MS43NDg2NywtMTYuODY2ODQgbCAyMC4xMzUyLC0wLjgxNTQyIDAuODY3OCw4LjM5MTAyIGMgMC40Nzc0LDQuNjE1MDYgMS40NDY5LDEyLjU5MTAyIDIuMTU0NiwxNy43MjQzNiAwLjc1MTcsNS40NTI4MiAxLjMxMzMsNjQuNDkxODYgMS4zNTA3LDE0MS45OTk5OSAwLjAzNSw3Mi45NjY2NyAwLjU0OCwxMzMuNDI5MTYgMS4xMzk1LDEzNC4zNjExMSAwLjgyNjEsMS4zMDE1IDcuNTQ2NCwxLjYxMDcgMjguOTc5NiwxLjMzMzMzIGwgMjcuOTA0MSwtMC4zNjExMSAtMC4wOTcsLTEzNi42NjY2NiBjIC0wLjA5NCwtMTMyLjc3MDI1IC0wLjE4MTYsLTEzNy4zNTA5MiAtMy4wNTcyLC0xNjAuNjY2NjYgLTMuMTk4MiwtMjUuOTMxNjQgLTUuMzM2NSwtMzcuMzUwNjYgLTEwLjQ4NjQsLTU2IC0xLjgyMjUsLTYuNiAtMy40Mzk5LC0xMi42IC0zLjU5NCwtMTMuMzMzMzQgLTEuNTgsLTcuNTE1NzcgLTMuMDk5NiwtMTIuMjk4MyAtNi45Mzc0LC0yMS44MzQyNCAtMi40NzE5LC02LjE0MjE2IC00LjQ5NDQsLTExLjk5MDQ0IC00LjQ5NDQsLTEyLjk5NjE3IDAsLTMuMTI2NDEgLTIzLjUxMTEsLTUyLjEwOTQ0IC0yOC42NDgzLC01OS42ODU2OSAtMS41NDc4LC0yLjI4MjgxIC0zLjIwNzcsLTUuMTc3OTEgLTMuNjg4NSwtNi40MzM1NiAtMS43ODIxLC00LjY1MzggLTI2LjM0MTksLTQwLjUxNTIgLTMyLjMyOTksLTQ3LjIwNzA1IC0wLjczMzMsLTAuODE5NTQgLTQuMzMzMywtNS4yNDMxMiAtOCwtOS44MzAyIC04LjYxMTEsLTEwLjc3Mjc0IC00MS41MTU1OSwtNDQuMDgwNjQgLTUyLjU1NzYsLTUzLjIwMjAzIC00LjcwNjY4LC0zLjg4ODAyIC05LjM4ODc1LC03LjkwMDI4IC0xMC40MDQ2LC04LjkxNjEzIC0xLjg4MTk2LC0xLjg4MTk1IC01Ljk1NzMsLTQuNzQzIC0yOC4zNzExMiwtMTkuOTE3NzIgLTYuOTY2NjcsLTQuNzE2NiAtMTMuMzI4NTYsLTkuMTMyMzUgLTE0LjEzNzU1LC05LjgxMjc3IC0wLjgwODk5LC0wLjY4MDQyIC01LjMwODk5LC0zLjIxMzQzIC0xMCwtNS42Mjg5MiAtNC42OTEwMSwtMi40MTU1IC04LjgyOTEyLC00Ljc2NDU0IC05LjE5NTc5LC01LjIyMDA4IC0yLjI5NTY4LC0yLjg1MjIyIC01MC41MTMyMywtMjQuNTUwMTYgLTYzLjk5OTk5LC0yOC44MDAwNyAtMjQuNTAxMTQsLTcuNzIwNzMgLTM2LjQxNDI0LC0xMS4xODA0NyAtNDMuMzMzMzQsLTEyLjU4NDY1IC00LjQsLTAuODkyOTUgLTExLjksLTIuNjgwNiAtMTYuNjY2NjYsLTMuOTcyNTYgLTM5LjkyMDQ1LC0xMC44MjAwNyAtMTM4LjY2NjM5LC0xMC41MTUyIC0xNzkuMzMzMzMsMC41NTM2OSAtMy42NjY2NywwLjk5OCAtMTEuNDY2NjcsMi44NTc3MSAtMTcuMzMzMzMsNC4xMzI2NyAtNS44NjY2NywxLjI3NDk2IC0xNi40MzYyNCw0LjM1MTUyIC0yMy40ODc5NCw2LjgzNjggLTcuMDUxNywyLjQ4NTI4IC0xMy41NjEwMiw0LjUxODY5IC0xNC40NjUxNyw0LjUxODY5IC0wLjkwNDEzLDAgLTMuNTM0NTYsMC44NTY2NCAtNS44NDUzOSwxLjkwMzY0IC0xMC41NTQyMSw0Ljc4MTk1IC0xNi43ODI1Miw3LjQyOTY5IC0xNy40NzY4Niw3LjQyOTY5IC0yLjIyNzY4LDAgLTUzLjM0ODIsMjYuMTM1NiAtNTYuODIxOTUsMjkuMDUwNDggLTEuMDQ2NDgsMC44NzgxMiAtOC4yMDI2OSw1Ljc5Nzk2IC0xNS45MDI2OSwxMC45MzI5OCAtMjkuMzA3NjcsMTkuNTQ0ODEgLTQxLjg1MDI3LDI5Ljc5OTIyIC02Ni4wMjkyOCw1My45ODMzMyAtMTguNjM4MDEsMTguNjQxOTQgLTI4LjQ0MTg0LDI5Ljk0Mjg0IC00MS41NTE5OSw0Ny44OTcwNiAtMy44MDMwMiw1LjIwODIyIC04LjY3MTAyLDExLjg2OTQ4IC0xMC44MTc3OCwxNC44MDI4MiAtMi4xNDY3NiwyLjkzMzMzIC01LjYxNDkzLDguMzMzMzMgLTcuNzA3MDUsMTIgLTIuMDkyMTIsMy42NjY2NiAtNC42MTEzMSw3LjQ5NjczIC01LjU5ODIyLDguNTExMjQgLTAuOTg2ODksMS4wMTQ1MiAtMy4xNzM1OCw0LjYxNDUyIC00Ljg1OTMsOCAtMS42ODU3MiwzLjM4NTQ5IC02LjQ3NDEsMTIuNzU1NDIgLTEwLjY0MDgzLDIwLjgyMjA5IC00LjE2NjczLDguMDY2NjcgLTkuOTkwODMsMjAuMzY2NjcgLTEyLjk0MjQxLDI3LjMzMzMzIC0yLjk1MTYsNi45NjY2NyAtNi4yMjYwMywxNC41NTczNSAtNy4yNzY1MSwxNi44NjgxNyAtMS4wNTA0OCwyLjMxMDgzIC0xLjkyNjczLDUuMDEwODMgLTEuOTQ3MjMsNiAtMC4wMjA1LDAuOTg5MTggLTEuODQ5MDUsNi44OTg1IC00LjA2MzQ4LDEzLjEzMTgzIC0zLjY5MzIyLDEwLjM5NjAzIC01LjI5MTE3LDE2LjMwMDQ4IC0xMS4xODYyNCw0MS4zMzMzMyAtOC4zNDY4MSwzNS40NDM5OCAtOS4yNDY3OCw1Ni42MDI1IC04LjgxODg4LDIwNy4zMzMzMyAwLjE5OTg2LDcwLjQgMC42NDA4NCwxMjguNDUgMC45Nzk5OCwxMjkgMC43OTY2NCwxLjI5MTk5IDUyLjY0MjM4LDEuMjcyNjEgNTQuNjM2OTcsLTAuMDIwNCAxLjEwMTQ4LC0wLjcxNDA3IDEuNzIyMTEsLTM4LjM4NTk2IDIuMjg5NTksLTEzOC45Nzk1OCAwLjY5MDIsLTEyMi4zNDM2NiAxLjYzMDg1LC0xNjEuMjA5MjkgMy45NTgwMSwtMTYzLjUzNjQ3IDEuMjcwMzMsLTEuMjcwMzIgNDguMTg1MTYsMi4wMTgxNCA1OC45MDc5OCw0LjEyOTExIDUuODY2NjcsMS4xNTQ5NSAxNS40NjY2NywzLjAzNzk3IDIxLjMzMzM0LDQuMTg0NDkgMTkuNzA4MjUsMy44NTE1OSA0NS45NjkzMiwxMi41NTE2MiA2MS41OTE4OCwyMC40MDQ3OSA0LjU0MjIsMi4yODMyOCA5LjA3MjIsNC4xNTE0MSAxMC4wNjY2Niw0LjE1MTQxIDAuOTk0NDcsMCAyLjM3ODEyLDAuNTIwMzQgMy4wNzQ3OSwxLjE1NjMgMC42OTY2NywwLjYzNTk2IDYuMzg1MTMsMy44NDY2OSAxMi42NDEwNCw3LjEzNDk1IDYuMjU1ODksMy4yODgyNyAxNi42ODA5Miw5LjUxNzk0IDIzLjE2NjcsMTMuODQzNzEgNi40ODU4LDQuMzI1NzcgMTQuMTgyNiw5LjQzNTIzIDE3LjEwNCwxMS4zNTQzNiAyLjkyMTQyLDEuOTE5MTIgNS42OTYzOSw0LjAyMTU3IDYuMTY2NjMsNC42NzIxMSAwLjQ3MDIzLDAuNjUwNTQgNS4wNTQ5Niw0LjU0MDgxIDEwLjE4ODI5LDguNjQ1MDIgMTcuMTc0NSwxMy43MzE0MyA0MS45NjEzLDM5Ljc4NTUxIDUzLjYwNTkyLDU2LjM0NjYzIDEuNjE2NiwyLjI5OTE1IDMuNDQ4ODMsNC43ODAyNSA0LjA3MTYzLDUuNTEzNTkgNi4yMjMwNyw3LjMyNzUgMjAuMTQ3NjEsMzAuNzc2ODggMjkuNjkwNjYsNDkuOTk5OTkgOC44MDI1NiwxNy43MzE1NCAyMC4xNTU1OSw0Ny4xODIzIDIxLjg0NDUyLDU2LjY2NjY3IDAuNTIyMzYsMi45MzMzMyAxLjc2OTcsOC4zMzMzMyAyLjc3MTg2LDEyIDguNDY0NTcsMzAuOTY5OTcgOS45ODMxMiw2My4xMDkyMiAxMC4wMDEwOSwyMTEuNjY2NjQgbCAwLjAxNDMsMTE4LjMzMzMgaCAyOC42MjYxNiAyOC42MjYxNiB6IE0gNjkwLjk3NzU0LDc1Ni42MzQxNyBjIC0xMS4yNDM3LC0yOS4wNTY3MyAtMzYuOTc0MDgsLTY5Ljk3NDgxIC02Mi44NjA1MywtOTkuOTY0ODQgLTguNTY4MzYsLTkuOTI2NjUgLTQzLjYyMDkzLC00NC42MDUxIC00NS4xMTcwMiwtNDQuNjM1NDkgLTAuOTE2NjcsLTAuMDE4NyAtMS42NjY2NywtMC42MDUwMyAtMS42NjY2NywtMS4zMDMxMyAwLC0wLjY5ODExIC0yLjg1LC0zLjIxNjAzIC02LjMzMzMzLC01LjU5NTM5IC0zLjQ4MzM0LC0yLjM3OTM3IC02LjkzMzM0LC01LjAxNTE2IC03LjY2NjY3LC01Ljg1NzMxIC0wLjczMzMzLC0wLjg0MjE2IC0zLjQzMzMzLC0yLjk0NTMyIC02LC00LjY3MzcgLTIuNTY2NjcsLTEuNzI4MzggLTQuOTY2NjcsLTMuNTI2OTkgLTUuMzMzMzMsLTMuOTk2OTIgLTAuOTkyOTEsLTEuMjcyNTIgLTE0LjUyMjI2LC0xMC42MDc0IC0xNS4zNzM2NiwtMTAuNjA3NCAtMS43MDQxNCwwIC04LjYyNjM0LC01Ljk2NzQ3IC04LjYyNjM0LC03LjQzNjU4IDAsLTEuNzQ4MzIgMTAuNDY0MjYsLTIzLjQ4MTg1IDExLjgyNjgxLC0yNC41NjM0MiAwLjQ2MTkyLC0wLjM2NjY3IDIuMjk1MTEsLTMuMzY2NjcgNC4wNzM3NSwtNi42NjY2NyAxLjc3ODY0LC0zLjMgMy42MDc1NCwtNi4zIDQuMDY0MjQsLTYuNjY2NjcgMC40NTY2OSwtMC4zNjY2NiAyLjI0OTQyLC0yLjc2NjY2IDMuOTgzODUsLTUuMzMzMzMgNC41OTcwMywtNi44MDI4MSAyNS4wNzM1NSwtMjcuNDQzMTYgMzIuMDUxMzUsLTMyLjMwNzc1IDMuMywtMi4zMDA2MSA2LjMsLTQuNTY3MjYgNi42NjY2NiwtNS4wMzcwMiAwLjM2NjY3LC0wLjQ2OTc2IDMuMzY2NjcsLTIuMzA5MzYgNi42NjY2NywtNC4wODggMy4zLC0xLjc3ODY0IDYuMywtMy41Nzg2NCA2LjY2NjY3LC00IDIuNjg4NDQsLTMuMDg5NDQgMjcuODQ3ODMsLTE0LjA4NjMyIDM5LjMzMzMzLC0xNy4xOTIxMyAzMy42MzAyNCwtOS4wOTQwNCA1NS4xMzk4LC05LjM4MjUxIDkwLC0xLjIwNjk5IDE2LjgxNjgzLDMuOTQzOTUgMzYuNzI0OTUsMTIuMjUyOTMgNTIuMDUzMzcsMjEuNzI1MzQgMTQuMjYxMzgsOC44MTMwNCA0MC42MDY1OCwzNC4xMDg0NCA0OC4zNjcyLDQ2LjQzOTg4IDEuMjY5MTYsMi4wMTY2NyAzLjQyMDcyLDMuNjY2NjcgNC43ODEyNCwzLjY2NjY3IDEuMzYwNSwwIDcuNDk2NjgsLTIuNzk1MzEgMTMuNjM1OTIsLTYuMjExNzkgNi4xMzkyNSwtMy40MTY0OCAxNi44NjIyNiwtOC44ODE4MSAyMy44Mjg5MywtMTIuMTQ1MTggNi45NjY2NywtMy4yNjMzOCAxMi44NjQ2MSwtNi4xMTYwMiAxMy4xMDY1MywtNi4zMzkyIDEuNDQ2MiwtMS4zMzQxNiAtMTcuOTI1MzgsLTI2LjE5NDcgLTMwLjY2NjMsLTM5LjM1NTYxIC0xOC44ODk5NiwtMTkuNTEyNjcgLTM2LjM5MDE1LC0zMi45MzE2NCAtNTYuNzc0MTUsLTQzLjUzMzg2IC02LjQxNjM1LC0zLjMzNzI5IC0xMi4zMzE0NSwtNi41OTkwMSAtMTMuMTQ0NjgsLTcuMjQ4MjYgLTAuODEzMjMsLTAuNjQ5MjQgLTQuMTEzMjMsLTIuMDIyNzYgLTcuMzMzMzMsLTMuMDUyMjYgLTMuMjIwMTEsLTEuMDI5NSAtOS4xNTQ3NCwtMy4xNjQ4IC0xMy4xODgwNywtNC43NDUxMiAtOS44NzQ5OSwtMy44NjkxMyAtMTguODA1MTUsLTYuMjA4MTggLTMwLC03Ljg1Nzc4IC01LjEzMzMzLC0wLjc1NjQyIC0xMy4yMzMzMywtMi4wOTA2OCAtMTgsLTIuOTY1MDIgLTEyLjU4OTYxLC0yLjMwOTMgLTQzLjc5NDI4LC0yLjA2MDE3IC01Ny4zMzMzMywwLjQ1Nzc1IC02LjIzMzMzLDEuMTU5MjQgLTE0LjMzMzMzLDIuNTEwNzYgLTE4LDMuMDAzMzcgLTkuMDQ2MiwxLjIxNTM4IC0xNy41ODYwNSwzLjU4OTMyIC0zMi45Nzg1Myw5LjE2NzUxIC0xMy4xNTY2MSw0Ljc2NzkyIC0zOC42NDE5MSwxNi44NTMyNyAtNDIuMzM2MjUsMjAuMDc2MjMgLTEuMTEwMiwwLjk2ODU0IC00LjExODU1LDIuODExMzIgLTYuNjg1MjIsNC4wOTUwNSAtNC41NTE5MiwyLjI3NjY4IC01LjQ0OTk4LDIuOTM4MDkgLTExLjY2NjY2LDguNTkyMjggLTEuNjUsMS41MDA3MSAtMy4zNjAyNywyLjcyODU2IC0zLjgwMDU5LDIuNzI4NTYgLTEuODEyLDAgLTIxLjU1ODg1LDE4LjcwODc1IC0yOS43Mzk1OSwyOC4xNzYxMyAtMTYuMjAyNDIsMTguNzUwNzMgLTE3LjU2OTU4LDIwLjQ2NTE1IC0yMS4xMjQ4NCwyNi40OTA1MyAtMS45NDcxNiwzLjMgLTMuOTU3NzgsNi4zIC00LjQ2ODA2LDYuNjY2NjcgLTEuNTI4ODIsMS4wOTg1NSAtMTUuODY2OTIsMjkuNjY3ODggLTE1Ljg2NjkyLDMxLjYxNTU2IDAsMi43ODQ2OSAtMy42OTUxMiwzLjU1MDI3IC03LjAxMDI5LDEuNDUyNDEgLTYuNDkyNjMsLTQuMTA4NTQgLTQ1LjI1Mjc1LC0xNi4xMDc2IC02MS42NTYzOCwtMTkuMDg3MDkgLTYuNiwtMS4xOTg3OSAtMTcuNywtMy4zMDEwNSAtMjQuNjY2NjYsLTQuNjcxNjkgLTYuOTY2NjcsLTEuMzcwNjQgLTIxLjUxNjY3LC0yLjkxMjc4IC0zMi4zMzMzNCwtMy40MjY5OCAtMTAuODE2NjYsLTAuNTE0MTggLTE5LjY2NjY2LC0xLjQ2NjEyIC0xOS42NjY2NiwtMi4xMTU0IDAsLTAuNjQ5MjYgMS40Mjc2NywtNC42MTI0MiAzLjE3MjYsLTguODA2OTggMS43NDQ5MywtNC4xOTQ1OCAzLjYyNzEsLTkuMTI2NSA0LjE4MjYxLC0xMC45NTk4MyAwLjU1NTQ5LC0xLjgzMzMzIDMuMzI3ODMsLTguMjk0ODcgNi4xNjA3MywtMTQuMzU4OTYgMi44MzI5LC02LjA2NDA5IDUuMTUwNzIsLTExLjg3ODY4IDUuMTUwNzIsLTEyLjkyMTMgMCwtMS4wNDI2MyAwLjY1OTY3LC0yLjMwMzM5IDEuNDY1OTIsLTIuODAxNjggMC44MDYyNiwtMC40OTgzIDMuMDk1MDQsLTQuMjgzNyA1LjA4NjIsLTguNDEyMDIgMTcuMjM2MSwtMzUuNzM2MTMgNTcuNDAxMTgsLTg2LjE2NTIgODguNzgxMjIsLTExMS40Njg4MSA0LjQsLTMuNTQ3OTkgOS4yLC03LjU0OTI4IDEwLjY2NjY2LC04Ljg5MTc2IDUuNTY4MzIsLTUuMDk2ODUgMjkuNjUzOTksLTIxLjg2ODg0IDM4Ljk2NzgzLC0yNy4xMzUxMyAyLjAzNDM2LC0xLjE1MDI5IDUuNDk4ODQsLTMuMjEyMzEgNy42OTg4NCwtNC41ODIyNSAxMC40ODk1LC02LjUzMTkgNDYuODg5ODksLTIzLjU2MTM1IDU2Ljc3ODI2LC0yNi41NjI5OSAyLjUwNTI4LC0wLjc2MDQ5IDkuMzU1MDcsLTMuMTE1OTEgMTUuMjIxNzQsLTUuMjM0MjcgNS44NjY2NiwtMi4xMTgzNiAxNS40NjY2NiwtNC45MjAzNiAyMS4zMzMzMywtNi4yMjY2NiA1Ljg2NjY3LC0xLjMwNjMyIDE0Ljg2NjY3LC0zLjQ2ODEyIDIwLC00LjgwNDAyIDUuMTMzMzMsLTEuMzM1ODkgMTYuMjMzMzMsLTMuMjE3NDIgMjQuNjY2NjYsLTQuMTgxMTggMTkuOTc3NDgsLTIuMjgzMDMgODMuOTA4OTUsLTIuMzA3NzYgMTAzLjMzMzM0LC0wLjA0IDI5LjQ0Nzc1LDMuNDM4MDEgNzIuODYxNjksMTUuNzQ1MDggMTAyLjY2NjY2LDI5LjEwNDE0IDE1LjgzMzQzLDcuMDk2OCAzOC4xMjcyOCwxOC42OTk5OSAzOS4zMzMzMywyMC40NzE2NyAwLjM2NjY3LDAuNTM4NjMgMi4xNjY2NywxLjc1MjI5IDQsMi42OTcwMyA0Ljk1MTg0LDIuNTUxNzMgMjEuNzk2ODMsMTMuNjM3NDIgMjMuMzMzMzMsMTUuMzU1NjYgMC43MzMzNCwwLjgyMDA3IDUuMDI4MzQsMy45ODg4OCA5LjU0NDQ2LDcuMDQxNzkgNC41MTYxLDMuMDUyOTIgOC40MTYxLDYuMDE1NzUgOC42NjY2Niw2LjU4NDA3IDAuMjUwNTUsMC41NjgzMyAzLjQ1MTc0LDMuNDMzMzEgNy4xMTM3NSw2LjM2NjY1IDEwLjUwMTE3LDguNDExNjQgMzEuMzM5MTksMjkuNDkyOTIgNDIuODMzMjgsNDMuMzMzMzMgMTEuOTcyNDQsMTQuNDE2NDEgMjUuMjYyMjEsMzEuOTMxMTYgMjcuNTk3MDEsMzYuMzcwMzUgMC44NjgsMS42NTAyOCAzLjAyMzMsNS4wMTgzNCA0Ljc4OTYsNy40ODQ1NiAxLjc2NjQsMi40NjYyMiA0Ljk5MzEsNy44NTc3OCA3LjE3MDYsMTEuOTgxMjQgMTAuNzMxOCwyMC4zMjI0OSAxOC41NzM2LDM2LjEzOTYzIDIwLjkwMzksNDIuMTYzODUgMS40MTg0LDMuNjY2NjYgNC40MDkzLDExLjA3ODg0IDYuNjQ2NSwxNi40NzE0OCAyLjIzNzEsNS4zOTI2NSA0LjA2NzYsMTAuNTU1OCA0LjA2NzYsMTEuNDczNjYgMCwxLjIxNzgzIC01LjMxNTEsMS45MjU5IC0xOS42NjY3LDIuNjE5OTQgLTEwLjgxNjcsMC41MjMxIC0yNC4xNjY3LDEuODQ2MjIgLTI5LjY2NjcsMi45NDAyOCAtNS41LDEuMDk0MDQgLTEyLjk5OTk2LDIuNDg4NCAtMTYuNjY2NjIsMy4wOTg1NiAtMy42NjY2NywwLjYxMDE2IC0xMC4yNjY2NywxLjgxMDk3IC0xNC42NjY2NywyLjY2ODQ1IC0xMi44MTMwNCwyLjQ5NzA1IC01NC4wNiwxNS42NTU3OSAtNTguNjY2NjcsMTguNzE2MDMgLTAuNzMzMzMsMC40ODcxNiAtNC4zMzMzMywxLjk4NzA5IC04LDMuMzMzMTggLTYuMDE3NjksMi4yMDkxOSAtMjMuNjI2NzMsMTAuOTYxMjcgLTQzLjMzMzMzLDIxLjUzNzYgLTUwLjMyMTQsMjcuMDA3MDIgLTExMi4xODU5NCw4Ny4zMjgyNCAtMTQxLjMzMzMzLDEzNy44MDc1MSAtMy4xODgxNyw1LjUyMTQ4IC00Ljg3MjYxLDguNDkzMjEgLTYuNjEyOTIsMTEuNjY2NjYgLTAuNzAzNzcsMS4yODMzNCAtMi42NTk1Niw0LjczMzM0IC00LjM0NjIxLDcuNjY2NjcgLTIuODAxNjUsNC44NzI1MyAtMTMuMzgzMjEsMjcuMzY0OTIgLTE2LjYwNzMxLDM1LjMwMDg1IC0xLjI0MDQ5LDMuMDUzNDQgLTEuNjQ5NDYsMi41MDM3NiAtNS40NTYsLTcuMzMzMzMgeiBtIC0xNzAuOTk3OTcsOTkuNjk5MTQgYyAtMC4wMTA3LC05MS40ODMzMyAtMC40NjEyMiwtMTY3LjAwNDkgLTEsLTE2Ny44MjU3IC0xLjI3NzQ4LC0xLjk0NjIgLTIwLjMzMzcyLC0xNy4wNDQ2OSAtMjMuOTY2MzIsLTE4Ljk4ODggLTEuNTQyOTMsLTAuODI1NzUgLTMuNjAyMTIsLTIuMjc5NDMgLTQuNTc1OTYsLTMuMjMwMzkgLTMuNDkwNDEsLTMuNDA4MzYgLTIxLjgzNjgzLC0xMy4yMTIyNiAtMjUuMTAzOTcsLTEzLjQxNDk2IGwgLTMuMzMzMzMsLTAuMjA2ODEgLTAuMzM4MDEsMTg1IC0wLjMzODAyLDE4NC45OTk5NSBoIDI5LjMzODAxIDI5LjMzODAyIHoiCiAgICBmaWxsPSIjOGMwMTlhIiAvPgo8L3N2Zz4K';
3227
-
3228
- /**
3229
- * Generates a UUID version 4 string. This function attempts to use the `crypto.randomUUID()` function from the Web
3230
- * Crypto API if it is available, otherwise it uses a polyfill method.
3231
- *
3232
- * NOTE: `crypto.randomUUID()` is not available in non-secure contexts; only localhost and HTTPS.
3233
- * @returns {string} a valid UUID version 4 string.
3234
- * @see {@link https://stackoverflow.com/a/2117523}
3235
- */
3236
- function generateUuid() {
3237
- if (window.crypto.randomUUID) {
3238
- return window.crypto.randomUUID();
3239
- }
3240
- return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (value) => {
3241
- const valueAsNumber = parseInt(value);
3242
- return (valueAsNumber ^
3243
- (window.crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (valueAsNumber / 4)))).toString(16);
3244
- });
3245
- }
3246
-
3247
- class KibisisClient extends BaseClient {
3248
- genesisHash;
3249
- methods;
3250
- network;
3251
- constructor({ metadata, algosdk, algodClient, genesisHash, methods, network }) {
3252
- super(metadata, algosdk, algodClient);
3253
- this.genesisHash = genesisHash;
3254
- this.methods = methods;
3255
- this.network = network;
3256
- }
3257
- static metadata = {
3258
- id: exports.PROVIDER_ID.KIBISIS,
3259
- icon: ICON,
3260
- isWalletConnect: false,
3261
- name: 'Kibisis'
3262
- };
3263
- /**
3264
- * public static functions
3265
- */
3266
- static async init({ algodOptions, algosdkStatic, network = DEFAULT_NETWORK }) {
3267
- try {
3268
- debugLog(`${exports.PROVIDER_ID.KIBISIS.toUpperCase()}#${KibisisClient.init.name}: initializing...`);
3269
- const algosdk = algosdkStatic || (await Algod.init(algodOptions)).algosdk;
3270
- const algodClient = getAlgodClient(algosdk, algodOptions);
3271
- const version = await algodClient.versionsCheck().do();
3272
- const genesisHash = version['genesis_hash_b64']; // get the genesis hash of the network
3273
- const result = await KibisisClient.sendRequestWithTimeout({
3274
- method: 'getProviders',
3275
- params: {
3276
- providerId: ARC_0027_PROVIDER_ID
3277
- },
3278
- reference: ARC_0027_GET_PROVIDERS_REQUEST,
3279
- timeout: LOWER_REQUEST_TIMEOUT
3280
- });
3281
- // check for a result
3282
- if (!result) {
3283
- throw {
3284
- code: UNKNOWN_ERROR,
3285
- message: `received response, but provider details were empty for provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3286
- providerId: ARC_0027_PROVIDER_ID
3287
- };
3288
- }
3289
- const networkConfiguration = result.networks.find((value) => value.genesisHash === genesisHash);
3290
- // check if the network is supported
3291
- if (!networkConfiguration) {
3292
- throw {
3293
- code: NETWORK_NOT_SUPPORTED_ERROR,
3294
- data: {
3295
- genesisHash
3296
- },
3297
- message: `network "${network}" not supported on provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3298
- providerId: ARC_0027_PROVIDER_ID
3299
- };
3300
- }
3301
- const provider = new KibisisClient({
3302
- metadata: KibisisClient.metadata,
3303
- algosdk: algosdk,
3304
- algodClient: algodClient,
3305
- genesisHash,
3306
- methods: networkConfiguration.methods,
3307
- network
3308
- });
3309
- debugLog(`${exports.PROVIDER_ID.KIBISIS.toUpperCase()}#${KibisisClient.init.name}: initialized`, '✅');
3310
- return provider;
3311
- }
3312
- catch (error) {
3313
- console.error('Error initializing...', error);
3314
- return null;
3315
- }
3316
- }
3317
- static mapAccountsToWallet(accounts) {
3318
- return {
3319
- ...KibisisClient.metadata,
3320
- accounts: accounts.map(({ address, name }) => ({
3321
- address,
3322
- name: name || '',
3323
- providerId: exports.PROVIDER_ID.KIBISIS
3324
- }))
3325
- };
3326
- }
3327
- static async sendRequestWithTimeout({ method, params, timeout, reference }) {
3328
- return new Promise((resolve, reject) => {
3329
- const channel = new BroadcastChannel(ARC_0027_CHANNEL_NAME);
3330
- const requestId = generateUuid();
3331
- // eslint-disable-next-line prefer-const
3332
- let timer;
3333
- // listen to responses
3334
- channel.onmessage = (message) => {
3335
- // if the response's request id does not match the intended request, just ignore
3336
- if (!message.data || message.data.requestId !== requestId) {
3337
- return;
3338
- }
3339
- // clear the timer, we can handle it from here
3340
- window.clearTimeout(timer);
3341
- // if there is an error, reject
3342
- if (message.data.error) {
3343
- reject(message.data.error);
3344
- // close the channel, we are done here
3345
- return channel.close();
3346
- }
3347
- // return the result
3348
- resolve(message.data.result);
3349
- // close the channel, we are done here
3350
- return channel.close();
3351
- };
3352
- timer = window.setTimeout(() => {
3353
- // close the channel connection
3354
- channel.close();
3355
- reject({
3356
- code: METHOD_TIMED_OUT_ERROR,
3357
- data: {
3358
- method
3359
- },
3360
- message: `no response from provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3361
- providerId: ARC_0027_PROVIDER_ID
3362
- });
3363
- }, timeout || DEFAULT_REQUEST_TIMEOUT);
3364
- // broadcast the request on the next tick
3365
- // this allows the channel to be ready before the request is sent
3366
- window.setTimeout(() => {
3367
- channel.postMessage({
3368
- id: requestId,
3369
- params,
3370
- reference
3371
- });
3372
- }, 0);
3373
- });
3374
- }
3375
- /**
3376
- * private functions
3377
- */
3378
- convertBytesToBase64(bytes) {
3379
- return buffer.Buffer.from(bytes).toString('base64');
3380
- }
3381
- convertBase64ToBytes(input) {
3382
- return buffer.Buffer.from(input, 'base64');
3383
- }
3384
- /**
3385
- * Calls the enable method on the provider that returns the authorized accounts.
3386
- * @returns {Arc0027Account[]} the authorized accounts.
3387
- * @throws {METHOD_CANCELED_ERROR} if the method was cancelled by the user.
3388
- * @throws {METHOD_NOT_SUPPORTED_ERROR} if the method is not supported for the configured network.
3389
- * @throws {METHOD_TIMED_OUT_ERROR} if the method timed out by lack of response.
3390
- * @throws {NETWORK_NOT_SUPPORTED_ERROR} if the network is not supported for the configured network.
3391
- * @throws {UNKNOWN_ERROR} if the response result was empty.
3392
- */
3393
- async enable() {
3394
- const method = 'enable';
3395
- debugLog(`${exports.PROVIDER_ID.KIBISIS.toUpperCase()}#${this.refreshSupportedMethods.name}(): check if "${method}" is supported on "${this.network}"`);
3396
- // check the method is supported
3397
- this.validateMethod(method);
3398
- const result = await KibisisClient.sendRequestWithTimeout({
3399
- method,
3400
- params: {
3401
- genesisHash: this.genesisHash,
3402
- providerId: ARC_0027_PROVIDER_ID
3403
- },
3404
- reference: ARC_0027_ENABLE_REQUEST
3405
- });
3406
- // check for a result
3407
- if (!result) {
3408
- throw {
3409
- code: UNKNOWN_ERROR,
3410
- message: `received response, but "${method}" request details were empty for provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3411
- providerId: ARC_0027_PROVIDER_ID
3412
- };
3413
- }
3414
- return result.accounts;
3415
- }
3416
- /**
3417
- * Convenience function that gets the provider information and updates the supported methods. This should be called
3418
- * before interacting with the provider to ensure methods are supported.
3419
- * @throws {METHOD_TIMED_OUT_ERROR} if the method timed out by lack of response.
3420
- * @throws {NETWORK_NOT_SUPPORTED_ERROR} if the network is not supported for the configured network.
3421
- * @throws {UNKNOWN_ERROR} if the response result was empty.
3422
- */
3423
- async refreshSupportedMethods() {
3424
- const method = 'getProviders';
3425
- debugLog(`${exports.PROVIDER_ID.KIBISIS.toUpperCase()}#${this.refreshSupportedMethods.name}(): refreshing supported methods`);
3426
- const result = await KibisisClient.sendRequestWithTimeout({
3427
- method,
3428
- params: {
3429
- providerId: ARC_0027_PROVIDER_ID
3430
- },
3431
- reference: ARC_0027_GET_PROVIDERS_REQUEST,
3432
- timeout: LOWER_REQUEST_TIMEOUT
3433
- });
3434
- // check for a result
3435
- if (!result) {
3436
- throw {
3437
- code: UNKNOWN_ERROR,
3438
- message: `received response, but enable request details were empty for provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3439
- providerId: ARC_0027_PROVIDER_ID
3440
- };
3441
- }
3442
- const networkConfiguration = result.networks.find((value) => value.genesisHash === this.genesisHash);
3443
- // check if the network is supported
3444
- if (!networkConfiguration) {
3445
- throw {
3446
- code: NETWORK_NOT_SUPPORTED_ERROR,
3447
- data: {
3448
- genesisHash: this.genesisHash
3449
- },
3450
- message: `network "${this.network}" not supported on provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3451
- providerId: ARC_0027_PROVIDER_ID
3452
- };
3453
- }
3454
- debugLog(`${exports.PROVIDER_ID.KIBISIS.toUpperCase()}#${this.refreshSupportedMethods.name}(): methods [${networkConfiguration.methods.join(',')}] found for "${this.network}"`);
3455
- // update the methods
3456
- this.methods = networkConfiguration.methods;
3457
- }
3458
- /**
3459
- * Calls the signTxns methods to sign the supplied transactions.
3460
- * @param {Arc0001SignTxns[]} txns - the unsigned or signed transactions as defined in ARC-0001.
3461
- * @returns {(string | null)[]} the authorized accounts.
3462
- * @throws {INVALID_INPUT_ERROR} if computed group ID for the txns does not match the assigned group ID.
3463
- * @throws {INVALID_GROUP_ID_ERROR} if the unsigned txns is malformed or not conforming to ARC-0001.
3464
- * @throws {METHOD_CANCELED_ERROR} if the method was cancelled by the user.
3465
- * @throws {METHOD_NOT_SUPPORTED_ERROR} if the method is not supported for the configured network.
3466
- * @throws {METHOD_TIMED_OUT_ERROR} if the method timed out by lack of response.
3467
- * @throws {NETWORK_NOT_SUPPORTED_ERROR} if the network is not supported for the configured network.
3468
- * @throws {UNAUTHORIZED_SIGNER_ERROR} if a signer in the request is not authorized by the provider.
3469
- * @throws {UNKNOWN_ERROR} if the response result was empty.
3470
- */
3471
- async signTxns(txns) {
3472
- const method = 'signTxns';
3473
- debugLog(`${exports.PROVIDER_ID.KIBISIS.toUpperCase()}#${this.signTransactions.name}(): check if "${method}" is supported on "${this.network}"`);
3474
- // check the method is supported
3475
- this.validateMethod(method);
3476
- const result = await KibisisClient.sendRequestWithTimeout({
3477
- method,
3478
- params: {
3479
- providerId: ARC_0027_PROVIDER_ID,
3480
- txns
3481
- },
3482
- reference: ARC_0027_SIGN_TXNS_REQUEST
3483
- });
3484
- // check for a result
3485
- if (!result) {
3486
- throw {
3487
- code: UNKNOWN_ERROR,
3488
- message: `received response, but "${method}" request details were empty for provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3489
- providerId: ARC_0027_PROVIDER_ID
3490
- };
3491
- }
3492
- return result.stxns;
3493
- }
3494
- /**
3495
- * Validates whether a method is supported with the provider.
3496
- * @param {ProviderMethods} method - the method to validate.
3497
- * @throws {METHOD_NOT_SUPPORTED_ERROR} if the method is not supported for the configured network.
3498
- */
3499
- validateMethod(method) {
3500
- if (!this.methods.includes(method)) {
3501
- throw {
3502
- code: METHOD_NOT_SUPPORTED_ERROR,
3503
- data: {
3504
- method
3505
- },
3506
- message: `"${method}" operation not supported on "${this.network}" for provider "${exports.PROVIDER_ID.KIBISIS.toUpperCase()}"`,
3507
- providerId: ARC_0027_PROVIDER_ID
3508
- };
3509
- }
3510
- }
3511
- /**
3512
- * public functions
3513
- */
3514
- async connect() {
3515
- await this.refreshSupportedMethods(); // refresh the supported methods
3516
- const accounts = await this.enable();
3517
- return KibisisClient.mapAccountsToWallet(accounts);
3518
- }
3519
- // eslint-disable-next-line @typescript-eslint/require-await
3520
- async disconnect() {
3521
- return;
3522
- }
3523
- async reconnect() {
3524
- return await this.connect();
3525
- }
3526
- async signTransactions(connectedAccounts, transactions, indexesToSign, returnGroup = true) {
3527
- await this.refreshSupportedMethods(); // refresh the supported methods
3528
- const txns = await Promise.all(transactions.map(async (value, index) => {
3529
- const decodedTxn = this.algosdk.decodeObj(value);
3530
- const isSigned = !!decodedTxn.txn;
3531
- const sender = this.algosdk.encodeAddress(isSigned
3532
- ? decodedTxn.txn.snd
3533
- : decodedTxn.snd);
3534
- const accountInfo = await this.getAccountInfo(sender);
3535
- const authAddr = accountInfo['auth-addr'];
3536
- const txn = this.convertBytesToBase64(this.algosdk.decodeUnsignedTransaction(value).toByte());
3537
- // if the transaction is signed, instruct the provider not to sign by providing an empty signers array
3538
- if (isSigned) {
3539
- return {
3540
- txn: this.convertBytesToBase64(this.algosdk.decodeSignedTransaction(value).txn.toByte()),
3541
- signers: [],
3542
- ...(authAddr && { authAddr })
3543
- };
3544
- }
3545
- // if the sender is not authorized or the index has not been included in the to be signed indexes, instruct the provider not to sign by providing an empty signers array
3546
- if (!connectedAccounts.includes(sender) ||
3547
- (indexesToSign && !indexesToSign.includes(index))) {
3548
- return {
3549
- txn,
3550
- signers: [],
3551
- ...(authAddr && { authAddr })
3552
- };
3553
- }
3554
- // if the transaction is not signed, has been authorized and/or is in the index, instruct the provider not to sign
3555
- return {
3556
- txn,
3557
- ...(authAddr && { authAddr })
3558
- };
3559
- }));
3560
- const result = await this.signTxns(txns);
3561
- // null values indicate transactions that were not signed by the provider, as defined in ARC-0001, see https://arc.algorand.foundation/ARCs/arc-0001#semantic-and-security-requirements
3562
- return result.reduce((acc, value, index) => {
3563
- if (value) {
3564
- return [...acc, this.convertBase64ToBytes(value)];
3565
- }
3566
- // if the group wants to be returned, get the transaction from the input
3567
- return returnGroup ? [...acc, transactions[index]] : acc;
3568
- }, []);
3569
- }
3570
- }
3571
-
3572
- var allClients = {
3573
- [PeraWalletClient.metadata.id]: PeraWalletClient,
3574
- [DaffiWalletClient.metadata.id]: DaffiWalletClient,
3575
- [MyAlgoWalletClient.metadata.id]: MyAlgoWalletClient,
3576
- [DeflyWalletClient.metadata.id]: DeflyWalletClient,
3577
- [ExodusClient.metadata.id]: ExodusClient,
3578
- [AlgoSignerClient.metadata.id]: AlgoSignerClient,
3579
- [LuteClient.metadata.id]: LuteClient,
3580
- [WalletConnectClient.metadata.id]: WalletConnectClient,
3581
- [KMDWalletClient.metadata.id]: KMDWalletClient,
3582
- [MnemonicWalletClient.metadata.id]: MnemonicWalletClient,
3583
- [CustomWalletClient.metadata.id]: CustomWalletClient,
3584
- [KibisisClient.metadata.id]: KibisisClient,
3585
- [MagicAuth.metadata.id]: MagicAuth
3586
- };
3587
-
3588
- const initializeProviders = async (providers, nodeConfig, algosdkStatic) => {
3589
- if (typeof window === 'undefined') {
3590
- debugLog('Window object is not available, skipping initialization');
3591
- return {};
3592
- }
3593
- // Set all providers to null to preserve order
3594
- const initializedProviders = providers.reduce((acc, provider) => {
3595
- const providerId = typeof provider === 'string' ? provider : provider.id;
3596
- acc[providerId] = null;
3597
- return acc;
3598
- }, {});
3599
- const { network = DEFAULT_NETWORK, nodeServer = DEFAULT_NODE_BASEURL, nodePort = DEFAULT_NODE_PORT, nodeToken = DEFAULT_NODE_TOKEN } = nodeConfig || {};
3600
- const initClient = async (provider) => {
3601
- const { id, ...providerConfig } = typeof provider === 'string' ? { id: provider } : provider;
3602
- const initParams = {
3603
- network,
3604
- algodOptions: [nodeToken, nodeServer, nodePort],
3605
- algosdkStatic,
3606
- ...providerConfig
3607
- };
3608
- const client = await allClients[id].init(initParams);
3609
- initializedProviders[id] = client;
3610
- };
3611
- debugLog('Initializing providers:', getProviderList(providers));
3612
- const initPromises = providers.map((provider) => initClient(provider));
3613
- await Promise.all(initPromises);
3614
- return initializedProviders;
3615
- };
3616
-
3617
- const clearAccounts = (id) => {
3618
- const { clearActiveAccount, removeAccounts } = useWalletStore.getState();
3619
- clearActiveAccount(id);
3620
- removeAccounts(id);
3621
- };
3622
-
3623
- const getActiveProviders = () => {
3624
- const accounts = useWalletStore.getState().accounts;
3625
- return [...new Set(accounts.map((acct) => acct.providerId))];
3626
- };
3627
- const isActiveProvider = (id) => {
3628
- const activeProviders = getActiveProviders();
3629
- return activeProviders.includes(id);
3630
- };
3631
-
3632
- const reconnectProviders = async (providers) => {
3633
- try {
3634
- const clients = Object.values(providers);
3635
- for (const client of clients) {
3636
- const id = client?.metadata.id;
3637
- // Only reconnect to active providers
3638
- if (id && isActiveProvider(id)) {
3639
- await client.reconnect(() => clearAccounts(id));
3640
- }
3641
- }
3642
- }
3643
- catch (e) {
3644
- console.error(e);
3645
- }
3646
- };
3647
-
3648
- function encodeNFDTransactionsArray(transactionsArray) {
3649
- return transactionsArray.map(([_type, txn]) => {
3650
- return new Uint8Array(Buffer.from(txn, 'base64'));
3651
- });
3652
- }
3653
-
3654
- const WalletContext = require$$0.createContext(null);
3655
- const useWalletContext = () => {
3656
- const context = require$$0.useContext(WalletContext);
3657
- if (context === undefined) {
3658
- throw new Error('useWallet must be used within the WalletProvider');
3659
- }
3660
- return context;
3661
- };
3662
- const WalletProvider = ({ children, value }) => {
3663
- return require$$0.createElement(WalletContext.Provider, { value: value }, children);
3664
- };
3665
-
3666
- function shallow$1(objA, objB) {
3667
- if (Object.is(objA, objB)) {
3668
- return true;
3669
- }
3670
- if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
3671
- return false;
3672
- }
3673
- if (objA instanceof Map && objB instanceof Map) {
3674
- if (objA.size !== objB.size)
3675
- return false;
3676
- for (const [key, value] of objA) {
3677
- if (!Object.is(value, objB.get(key))) {
3678
- return false;
3679
- }
3680
- }
3681
- return true;
3682
- }
3683
- if (objA instanceof Set && objB instanceof Set) {
3684
- if (objA.size !== objB.size)
3685
- return false;
3686
- for (const value of objA) {
3687
- if (!objB.has(value)) {
3688
- return false;
3689
- }
3690
- }
3691
- return true;
3692
- }
3693
- const keysA = Object.keys(objA);
3694
- if (keysA.length !== Object.keys(objB).length) {
3695
- return false;
3696
- }
3697
- for (let i = 0; i < keysA.length; i++) {
3698
- if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
3699
- return false;
3700
- }
3701
- }
3702
- return true;
3703
- }
3704
-
3705
- function useWallet() {
3706
- const [providers, setProviders] = require$$0.useState(null);
3707
- const clients = useWalletContext();
3708
- const { activeAccount, accounts: connectedAccounts, setActiveAccount: _setActiveAccount, addAccounts } = useHydratedWalletStore(walletStoreSelector, shallow$1);
3709
- const getAccountsByProvider = (id) => {
3710
- return connectedAccounts.filter((account) => account.providerId === id);
3711
- };
3712
- const connectedActiveAccounts = require$$0.useMemo(() => connectedAccounts.filter((account) => account.providerId === activeAccount?.providerId), [connectedAccounts, activeAccount]);
3713
- require$$0.useEffect(() => {
3714
- if (!clients) {
3715
- setProviders(null);
3716
- return;
3717
- }
3718
- const supportedClients = Object.keys(clients);
3719
- setProviders(supportedClients
3720
- // Remove any clients that didn't initialise
3721
- .filter((id) => !!clients?.[id])
3722
- .map((id) => {
3723
- return {
3724
- ...allClients[id],
3725
- // Override static details with any instance details
3726
- ...clients[id],
3727
- accounts: getAccountsByProvider(id),
3728
- isActive: activeAccount?.providerId === id,
3729
- isConnected: connectedAccounts.some((accounts) => accounts.providerId === id),
3730
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3731
- connect: (arg, throws) => connect(id, arg, throws),
3732
- disconnect: () => disconnect(id),
3733
- reconnect: () => reconnect(id),
3734
- setActiveProvider: () => setActive(id),
3735
- setActiveAccount: (account) => selectActiveAccount(id, account)
3736
- };
3737
- }));
3738
- // eslint-disable-next-line react-hooks/exhaustive-deps
3739
- }, [clients, connectedAccounts, connectedActiveAccounts, activeAccount]);
3740
- const getClient = (id) => {
3741
- if (!id)
3742
- throw new Error('Provider ID is missing.');
3743
- const walletClient = clients?.[id];
3744
- if (!walletClient)
3745
- throw new Error(`Client not found for ID: ${id}`);
3746
- return walletClient;
3747
- };
3748
- const status = require$$0.useMemo(() => {
3749
- if (activeAccount === undefined) {
3750
- return 'initializing';
3751
- }
3752
- if (activeAccount === null && connectedAccounts.length) {
3753
- return 'connected';
3754
- }
3755
- if (activeAccount === null && !connectedAccounts.length) {
3756
- return 'disconnected';
3757
- }
3758
- if (activeAccount && activeAccount.address) {
3759
- return 'active';
3760
- }
3761
- return 'error';
3762
- }, [activeAccount, connectedAccounts.length]);
3763
- const isActive = require$$0.useMemo(() => {
3764
- return status === 'active';
3765
- }, [status]);
3766
- const isReady = require$$0.useMemo(() => {
3767
- return status !== 'initializing';
3768
- }, [status]);
3769
- const selectActiveAccount = (providerId, address) => {
3770
- try {
3771
- const account = connectedAccounts.find((acct) => acct.address === address && acct.providerId === providerId);
3772
- if (!account) {
3773
- throw new Error(`No accounts with address ${address} found.`);
3774
- }
3775
- _setActiveAccount(account);
3776
- }
3777
- catch (e) {
3778
- console.error(e);
3779
- }
3780
- };
3781
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3782
- const connect = async (id, arg, throws = false) => {
3783
- try {
3784
- const walletClient = getClient(id);
3785
- const walletInfo = await walletClient?.connect(() => clearAccounts(id), arg);
3786
- _setActiveAccount(walletInfo.accounts[0]);
3787
- addAccounts(walletInfo.accounts);
3788
- }
3789
- catch (e) {
3790
- console.error(e);
3791
- if (throws) {
3792
- throw e;
3793
- }
3794
- }
3795
- };
3796
- const reconnect = async (id) => {
3797
- try {
3798
- const walletClient = getClient(id);
3799
- const walletInfo = await walletClient?.reconnect(() => clearAccounts(id));
3800
- if (walletInfo && walletInfo.accounts.length) {
3801
- addAccounts(walletInfo.accounts);
3802
- }
3803
- }
3804
- catch (e) {
3805
- console.error(e);
3806
- await disconnect(id);
3807
- }
3808
- };
3809
- const disconnect = async (id) => {
3810
- try {
3811
- const walletClient = getClient(id);
3812
- await walletClient?.disconnect();
3813
- }
3814
- catch (e) {
3815
- console.error(e);
3816
- }
3817
- finally {
3818
- clearAccounts(id);
3819
- }
3820
- };
3821
- const setActive = (id) => {
3822
- try {
3823
- const accounts = getAccountsByProvider(id);
3824
- _setActiveAccount(accounts[0]);
3825
- }
3826
- catch (e) {
3827
- console.error(e);
3828
- }
3829
- };
3830
- const signTransactions = async (transactions, indexesToSign, returnGroup = true) => {
3831
- const walletClient = getClient(activeAccount?.providerId);
3832
- if (!walletClient || !activeAccount?.address) {
3833
- throw new Error('No wallet found.');
3834
- }
3835
- const signedTransactions = await walletClient.signTransactions(connectedActiveAccounts.map((acct) => acct.address), transactions, indexesToSign, returnGroup);
3836
- return signedTransactions;
3837
- };
3838
- const sendTransactions = async (transactions, waitRoundsToConfirm) => {
3839
- const walletClient = getClient(activeAccount?.providerId);
3840
- const result = await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
3841
- return result;
3842
- };
3843
- const signer = async (txnGroup, indexesToSign) => {
3844
- const algosdk = await getAlgosdk();
3845
- const txnBlobs = txnGroup.map(algosdk.encodeUnsignedTransaction);
3846
- return await Promise.resolve(signTransactions(txnBlobs, indexesToSign, false));
3847
- };
3848
- const getAccountInfo = async () => {
3849
- if (!activeAccount)
3850
- throw new Error('No selected account.');
3851
- const walletClient = getClient(activeAccount.providerId);
3852
- const accountInfo = await walletClient?.getAccountInfo(activeAccount.address);
3853
- return accountInfo;
3854
- };
3855
- const getAddress = () => {
3856
- return activeAccount?.address;
3857
- };
3858
- const getAssets = async () => {
3859
- if (!activeAccount)
3860
- throw new Error('No selected account.');
3861
- const walletClient = getClient(activeAccount.providerId);
3862
- return await walletClient?.getAssets(activeAccount.address);
3863
- };
3864
- const groupTransactionsBySender = (transactions) => {
3865
- const walletClient = getClient(activeAccount?.providerId);
3866
- return walletClient?.groupTransactionsBySender(transactions);
3867
- };
3868
- return {
3869
- clients,
3870
- providers,
3871
- connectedAccounts,
3872
- connectedActiveAccounts,
3873
- activeAccount,
3874
- activeAddress: activeAccount?.address,
3875
- status,
3876
- isActive,
3877
- isReady,
3878
- signer,
3879
- signTransactions,
3880
- sendTransactions,
3881
- getAddress,
3882
- groupTransactionsBySender,
3883
- getAccountInfo,
3884
- getAssets
3885
- };
3886
- }
3887
-
3888
- function useInitializeProviders({ providers, nodeConfig, algosdkStatic, debug = false }) {
3889
- // Enable debug mode
3890
- const { setDebug } = useDebugStore();
3891
- require$$0.useEffect(() => setDebug(debug), [debug, setDebug]);
3892
- // Initialize providers
3893
- const [walletProviders, setWalletProviders] = require$$0.useState(null);
3894
- require$$0.useEffect(() => {
3895
- async function initializeAndConnect() {
3896
- try {
3897
- // Initialize with provided configuration
3898
- const initializedProviders = await initializeProviders(providers, nodeConfig, algosdkStatic);
3899
- setWalletProviders(initializedProviders);
3900
- // Reconnect the session when the user returns to the app
3901
- await reconnectProviders(initializedProviders);
3902
- }
3903
- catch (error) {
3904
- console.error('Error initializing wallet providers:', error);
3905
- }
3906
- }
3907
- void initializeAndConnect();
3908
- // eslint-disable-next-line react-hooks/exhaustive-deps
3909
- }, []);
3910
- return walletProviders;
3911
- }
3912
-
3913
- exports.DEFAULT_NETWORK = DEFAULT_NETWORK;
3914
- exports.DEFAULT_NODE_BASEURL = DEFAULT_NODE_BASEURL;
3915
- exports.DEFAULT_NODE_PORT = DEFAULT_NODE_PORT;
3916
- exports.DEFAULT_NODE_TOKEN = DEFAULT_NODE_TOKEN;
3917
- exports.WalletProvider = WalletProvider;
3918
- exports.algosigner = AlgoSignerClient;
3919
- exports.custom = CustomWalletClient;
3920
- exports.defly = DeflyWalletClient;
3921
- exports.encodeNFDTransactionsArray = encodeNFDTransactionsArray;
3922
- exports.exodus = ExodusClient;
3923
- exports.kibisis = KibisisClient;
3924
- exports.kmd = KMDWalletClient;
3925
- exports.lute = LuteClient;
3926
- exports.magic = MagicAuth;
3927
- exports.mnemonic = MnemonicWalletClient;
3928
- exports.myalgo = MyAlgoWalletClient;
3929
- exports.pera = PeraWalletClient;
3930
- exports.reconnectProviders = reconnectProviders;
3931
- exports.useInitializeProviders = useInitializeProviders;
3932
- exports.useWallet = useWallet;
3933
- exports.walletconnect = WalletConnectClient;
3934
- //# sourceMappingURL=index.js.map