@w3ux/react-connect-kit 1.2.1 → 1.3.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/cjs/ExtensionAccountsProvider/Extensions.js +129 -0
  2. package/cjs/ExtensionAccountsProvider/Extensions.js.map +1 -0
  3. package/cjs/ExtensionAccountsProvider/defaults.js +20 -0
  4. package/cjs/ExtensionAccountsProvider/defaults.js.map +1 -0
  5. package/cjs/ExtensionAccountsProvider/index.js +242 -0
  6. package/cjs/ExtensionAccountsProvider/index.js.map +1 -0
  7. package/cjs/ExtensionAccountsProvider/snap.js +73 -0
  8. package/cjs/ExtensionAccountsProvider/snap.js.map +1 -0
  9. package/cjs/ExtensionAccountsProvider/types.js +6 -0
  10. package/cjs/ExtensionAccountsProvider/types.js.map +1 -0
  11. package/cjs/ExtensionAccountsProvider/useImportExtension.js +53 -0
  12. package/cjs/ExtensionAccountsProvider/useImportExtension.js.map +1 -0
  13. package/cjs/ExtensionAccountsProvider/utils.js +47 -0
  14. package/cjs/ExtensionAccountsProvider/utils.js.map +1 -0
  15. package/cjs/ExtensionsProvider/defaults.js +16 -0
  16. package/cjs/ExtensionsProvider/defaults.js.map +1 -0
  17. package/cjs/ExtensionsProvider/index.js +117 -0
  18. package/cjs/ExtensionsProvider/index.js.map +1 -0
  19. package/cjs/ExtensionsProvider/types.js +6 -0
  20. package/cjs/ExtensionsProvider/types.js.map +1 -0
  21. package/cjs/ExtensionsProvider/utils.js +40 -0
  22. package/cjs/ExtensionsProvider/utils.js.map +1 -0
  23. package/cjs/LedgerAccountsProvider/defaults.js +16 -0
  24. package/cjs/LedgerAccountsProvider/defaults.js.map +1 -0
  25. package/cjs/LedgerAccountsProvider/index.js +88 -0
  26. package/cjs/LedgerAccountsProvider/index.js.map +1 -0
  27. package/cjs/LedgerAccountsProvider/types.js +6 -0
  28. package/cjs/LedgerAccountsProvider/types.js.map +1 -0
  29. package/cjs/LedgerAccountsProvider/utils.js +34 -0
  30. package/cjs/LedgerAccountsProvider/utils.js.map +1 -0
  31. package/cjs/VaultAccountsProvider/defaults.js +16 -0
  32. package/cjs/VaultAccountsProvider/defaults.js.map +1 -0
  33. package/cjs/VaultAccountsProvider/index.js +88 -0
  34. package/cjs/VaultAccountsProvider/index.js.map +1 -0
  35. package/cjs/VaultAccountsProvider/types.js +6 -0
  36. package/cjs/VaultAccountsProvider/types.js.map +1 -0
  37. package/cjs/VaultAccountsProvider/utils.js +17 -0
  38. package/cjs/VaultAccountsProvider/utils.js.map +1 -0
  39. package/cjs/index.js +24 -0
  40. package/cjs/index.js.map +1 -0
  41. package/cjs/types.js +24 -0
  42. package/cjs/types.js.map +1 -0
  43. package/mjs/ExtensionAccountsProvider/Extensions.d.ts +13 -0
  44. package/mjs/ExtensionAccountsProvider/Extensions.js +114 -0
  45. package/mjs/ExtensionAccountsProvider/Extensions.js.map +1 -0
  46. package/mjs/ExtensionAccountsProvider/defaults.d.ts +10 -0
  47. package/mjs/ExtensionAccountsProvider/defaults.js +17 -0
  48. package/mjs/ExtensionAccountsProvider/defaults.js.map +1 -0
  49. package/mjs/ExtensionAccountsProvider/index.d.ts +5 -0
  50. package/mjs/ExtensionAccountsProvider/index.js +227 -0
  51. package/mjs/ExtensionAccountsProvider/index.js.map +1 -0
  52. package/mjs/ExtensionAccountsProvider/snap.d.ts +2 -0
  53. package/mjs/ExtensionAccountsProvider/snap.js +60 -0
  54. package/mjs/ExtensionAccountsProvider/snap.js.map +1 -0
  55. package/mjs/ExtensionAccountsProvider/types.d.ts +24 -0
  56. package/mjs/ExtensionAccountsProvider/types.js +5 -0
  57. package/mjs/ExtensionAccountsProvider/types.js.map +1 -0
  58. package/mjs/ExtensionAccountsProvider/useImportExtension.d.ts +6 -0
  59. package/mjs/ExtensionAccountsProvider/useImportExtension.js +45 -0
  60. package/mjs/ExtensionAccountsProvider/useImportExtension.js.map +1 -0
  61. package/mjs/ExtensionAccountsProvider/utils.d.ts +8 -0
  62. package/mjs/ExtensionAccountsProvider/utils.js +34 -0
  63. package/mjs/ExtensionAccountsProvider/utils.js.map +1 -0
  64. package/mjs/ExtensionsProvider/defaults.d.ts +2 -0
  65. package/mjs/ExtensionsProvider/defaults.js +13 -0
  66. package/mjs/ExtensionsProvider/defaults.js.map +1 -0
  67. package/mjs/ExtensionsProvider/index.d.ts +11 -0
  68. package/mjs/ExtensionsProvider/index.js +106 -0
  69. package/mjs/ExtensionsProvider/index.js.map +1 -0
  70. package/mjs/ExtensionsProvider/types.d.ts +44 -0
  71. package/mjs/ExtensionsProvider/types.js +5 -0
  72. package/mjs/ExtensionsProvider/types.js.map +1 -0
  73. package/mjs/ExtensionsProvider/utils.d.ts +20 -0
  74. package/mjs/ExtensionsProvider/utils.js +26 -0
  75. package/mjs/ExtensionsProvider/utils.js.map +1 -0
  76. package/mjs/LedgerAccountsProvider/defaults.d.ts +2 -0
  77. package/mjs/LedgerAccountsProvider/defaults.js +13 -0
  78. package/mjs/LedgerAccountsProvider/defaults.js.map +1 -0
  79. package/mjs/LedgerAccountsProvider/index.d.ts +5 -0
  80. package/mjs/LedgerAccountsProvider/index.js +87 -0
  81. package/mjs/LedgerAccountsProvider/index.js.map +1 -0
  82. package/mjs/LedgerAccountsProvider/types.d.ts +21 -0
  83. package/mjs/LedgerAccountsProvider/types.js +5 -0
  84. package/mjs/LedgerAccountsProvider/types.js.map +1 -0
  85. package/mjs/LedgerAccountsProvider/utils.d.ts +9 -0
  86. package/mjs/LedgerAccountsProvider/utils.js +29 -0
  87. package/mjs/LedgerAccountsProvider/utils.js.map +1 -0
  88. package/mjs/VaultAccountsProvider/defaults.d.ts +2 -0
  89. package/mjs/VaultAccountsProvider/defaults.js +13 -0
  90. package/mjs/VaultAccountsProvider/defaults.js.map +1 -0
  91. package/mjs/VaultAccountsProvider/index.d.ts +5 -0
  92. package/mjs/VaultAccountsProvider/index.js +86 -0
  93. package/mjs/VaultAccountsProvider/index.js.map +1 -0
  94. package/mjs/VaultAccountsProvider/types.d.ts +15 -0
  95. package/mjs/VaultAccountsProvider/types.js +5 -0
  96. package/mjs/VaultAccountsProvider/types.js.map +1 -0
  97. package/mjs/VaultAccountsProvider/utils.d.ts +6 -0
  98. package/mjs/VaultAccountsProvider/utils.js +12 -0
  99. package/mjs/VaultAccountsProvider/utils.js.map +1 -0
  100. package/{index.js → mjs/index.d.ts} +0 -2
  101. package/mjs/index.js +8 -0
  102. package/mjs/index.js.map +1 -0
  103. package/mjs/types.d.ts +39 -0
  104. package/{types.js → mjs/types.js} +2 -0
  105. package/mjs/types.js.map +1 -0
  106. package/package.json +12 -5
  107. package/ExtensionAccountsProvider/Extensions.js +0 -206
  108. package/ExtensionAccountsProvider/Extensions.js.map +0 -1
  109. package/ExtensionAccountsProvider/defaults.js +0 -15
  110. package/ExtensionAccountsProvider/defaults.js.map +0 -1
  111. package/ExtensionAccountsProvider/index.js +0 -344
  112. package/ExtensionAccountsProvider/index.js.map +0 -1
  113. package/ExtensionAccountsProvider/snap.js +0 -129
  114. package/ExtensionAccountsProvider/snap.js.map +0 -1
  115. package/ExtensionAccountsProvider/types.js +0 -3
  116. package/ExtensionAccountsProvider/types.js.map +0 -1
  117. package/ExtensionAccountsProvider/useImportExtension.js +0 -65
  118. package/ExtensionAccountsProvider/useImportExtension.js.map +0 -1
  119. package/ExtensionAccountsProvider/utils.js +0 -37
  120. package/ExtensionAccountsProvider/utils.js.map +0 -1
  121. package/ExtensionsProvider/defaults.js +0 -11
  122. package/ExtensionsProvider/defaults.js.map +0 -1
  123. package/ExtensionsProvider/index.js +0 -165
  124. package/ExtensionsProvider/index.js.map +0 -1
  125. package/ExtensionsProvider/types.js +0 -3
  126. package/ExtensionsProvider/types.js.map +0 -1
  127. package/ExtensionsProvider/utils.js +0 -78
  128. package/ExtensionsProvider/utils.js.map +0 -1
  129. package/LedgerAccountsProvider/defaults.js +0 -11
  130. package/LedgerAccountsProvider/defaults.js.map +0 -1
  131. package/LedgerAccountsProvider/index.js +0 -116
  132. package/LedgerAccountsProvider/index.js.map +0 -1
  133. package/LedgerAccountsProvider/types.js +0 -3
  134. package/LedgerAccountsProvider/types.js.map +0 -1
  135. package/LedgerAccountsProvider/utils.js +0 -38
  136. package/LedgerAccountsProvider/utils.js.map +0 -1
  137. package/VaultAccountsProvider/defaults.js +0 -11
  138. package/VaultAccountsProvider/defaults.js.map +0 -1
  139. package/VaultAccountsProvider/index.js +0 -112
  140. package/VaultAccountsProvider/index.js.map +0 -1
  141. package/VaultAccountsProvider/types.js +0 -3
  142. package/VaultAccountsProvider/types.js.map +0 -1
  143. package/VaultAccountsProvider/utils.js +0 -10
  144. package/VaultAccountsProvider/utils.js.map +0 -1
  145. package/index.js.map +0 -1
  146. package/types.js.map +0 -1
  147. /package/{ExtensionAccountsProvider → cjs/ExtensionAccountsProvider}/Extensions.d.ts +0 -0
  148. /package/{ExtensionAccountsProvider → cjs/ExtensionAccountsProvider}/defaults.d.ts +0 -0
  149. /package/{ExtensionAccountsProvider → cjs/ExtensionAccountsProvider}/index.d.ts +0 -0
  150. /package/{ExtensionAccountsProvider → cjs/ExtensionAccountsProvider}/snap.d.ts +0 -0
  151. /package/{ExtensionAccountsProvider → cjs/ExtensionAccountsProvider}/types.d.ts +0 -0
  152. /package/{ExtensionAccountsProvider → cjs/ExtensionAccountsProvider}/useImportExtension.d.ts +0 -0
  153. /package/{ExtensionAccountsProvider → cjs/ExtensionAccountsProvider}/utils.d.ts +0 -0
  154. /package/{ExtensionsProvider → cjs/ExtensionsProvider}/defaults.d.ts +0 -0
  155. /package/{ExtensionsProvider → cjs/ExtensionsProvider}/index.d.ts +0 -0
  156. /package/{ExtensionsProvider → cjs/ExtensionsProvider}/types.d.ts +0 -0
  157. /package/{ExtensionsProvider → cjs/ExtensionsProvider}/utils.d.ts +0 -0
  158. /package/{LedgerAccountsProvider → cjs/LedgerAccountsProvider}/defaults.d.ts +0 -0
  159. /package/{LedgerAccountsProvider → cjs/LedgerAccountsProvider}/index.d.ts +0 -0
  160. /package/{LedgerAccountsProvider → cjs/LedgerAccountsProvider}/types.d.ts +0 -0
  161. /package/{LedgerAccountsProvider → cjs/LedgerAccountsProvider}/utils.d.ts +0 -0
  162. /package/{VaultAccountsProvider → cjs/VaultAccountsProvider}/defaults.d.ts +0 -0
  163. /package/{VaultAccountsProvider → cjs/VaultAccountsProvider}/index.d.ts +0 -0
  164. /package/{VaultAccountsProvider → cjs/VaultAccountsProvider}/types.d.ts +0 -0
  165. /package/{VaultAccountsProvider → cjs/VaultAccountsProvider}/utils.d.ts +0 -0
  166. /package/{index.d.ts → cjs/index.d.ts} +0 -0
  167. /package/{types.d.ts → cjs/types.d.ts} +0 -0
@@ -0,0 +1,60 @@
1
+ import { hasMetaMask, isMetamaskSnapsSupported, } from "@chainsafe/metamask-polkadot-adapter/src/utils";
2
+ import { enablePolkadotSnap } from "@chainsafe/metamask-polkadot-adapter";
3
+ const transformAccounts = (accounts) => accounts.map((address, index) => ({
4
+ address,
5
+ name: `Polkadot Snap ${index + 1}`,
6
+ source: "metamask-polkadot-snap",
7
+ type: "ethereum",
8
+ }));
9
+ const injectPolkadotSnap = (win, config) => {
10
+ win.injectedWeb3.Snap = {
11
+ enable: async () => {
12
+ const snap = (await enablePolkadotSnap(config)).getMetamaskSnapApi();
13
+ return {
14
+ accounts: {
15
+ get: async () => {
16
+ const response = await snap.getAddress();
17
+ return transformAccounts([response]);
18
+ },
19
+ subscribe: (_cb) => () => { },
20
+ },
21
+ signer: {
22
+ signPayload: async (payload) => {
23
+ const signature = (await snap.signPayloadJSON(payload));
24
+ return { id: 0, signature };
25
+ },
26
+ signRaw: async (raw) => {
27
+ const signature = (await snap.signPayloadRaw(raw));
28
+ return { id: 0, signature };
29
+ },
30
+ },
31
+ };
32
+ },
33
+ version: "0.1",
34
+ };
35
+ };
36
+ export const initPolkadotSnap = (config) => new Promise((resolve) => {
37
+ const win = window;
38
+ win.injectedWeb3 = win.injectedWeb3 || {};
39
+ if (hasMetaMask()) {
40
+ isMetamaskSnapsSupported().then((result) => {
41
+ if (result) {
42
+ injectPolkadotSnap(win, config);
43
+ window.injectedWeb3["metamask-polkadot-snap"] =
44
+ window.injectedWeb3["Snap"];
45
+ delete window.injectedWeb3["Snap"];
46
+ resolve(true);
47
+ }
48
+ else {
49
+ resolve(false);
50
+ }
51
+ });
52
+ }
53
+ else {
54
+ resolve(false);
55
+ }
56
+ });
57
+
58
+ //# sourceMappingURL=snap.js.map
59
+
60
+ //# sourceMappingURL=snap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/snap.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,WAAW,EACX,wBAAwB,GACzB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAc1E,MAAM,iBAAiB,GAAG,CAAC,QAAkB,EAAsB,EAAE,CACnE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,OAAO;IACP,IAAI,EAAE,iBAAiB,KAAK,GAAG,CAAC,EAAE;IAClC,MAAM,EAAE,wBAAwB;IAChC,IAAI,EAAE,UAAU;CACjB,CAAC,CAAC,CAAC;AAEN,MAAM,kBAAkB,GAAG,CAAC,GAAe,EAAE,MAAkB,EAAQ,EAAE;IACvE,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG;QACtB,MAAM,EAAE,KAAK,IAAuB,EAAE;YACpC,MAAM,IAAI,GAAG,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAErE,OAAO;gBACL,QAAQ,EAAE;oBACR,GAAG,EAAE,KAAK,IAAgC,EAAE;wBAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;wBACzC,OAAO,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACvC,CAAC;oBAED,SAAS,EACP,CAEE,GAA0C,EAC5B,EAAE,CAElB,GAAS,EAAE,GAAE,CAAC;iBACjB;gBACD,MAAM,EAAE;oBACN,WAAW,EAAE,KAAK,EAChB,OAA0B,EACH,EAAE;wBACzB,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAC3C,OAAO,CACR,CAAc,CAAC;wBAChB,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;oBAC9B,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,GAAqB,EAAyB,EAAE;wBAC9D,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAc,CAAC;wBAChE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;oBAC9B,CAAC;iBACF;aACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAkB,EAAoB,EAAE,CACvE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAQ,EAAE;IAC5B,MAAM,GAAG,GAAG,MAA6B,CAAC;IAC1C,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAG1C,IAAI,WAAW,EAAE,EAAE,CAAC;QAClB,wBAAwB,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAGhC,MAAM,CAAC,YAAY,CAAC,wBAAwB,CAAC;oBAC3C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC9B,OAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,CAAC","file":"snap.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\nimport type {\n Injected,\n InjectedAccount,\n InjectedWindow,\n} from \"@polkadot/extension-inject/types\";\nimport {\n hasMetaMask,\n isMetamaskSnapsSupported,\n} from \"@chainsafe/metamask-polkadot-adapter/src/utils\";\nimport { enablePolkadotSnap } from \"@chainsafe/metamask-polkadot-adapter\";\nimport type {\n SignerPayloadJSON,\n SignerPayloadRaw,\n SignerResult,\n} from \"@polkadot/types/types\";\nimport type { HexString } from \"@polkadot/util/types\";\nimport { SnapConfig } from \"@chainsafe/metamask-polkadot-types\";\nimport { ExtensionAccount } from \"../ExtensionsProvider/types\";\n\ninterface Web3Window extends InjectedWindow {\n ethereum: unknown;\n}\n\nconst transformAccounts = (accounts: string[]): ExtensionAccount[] =>\n accounts.map((address, index) => ({\n address,\n name: `Polkadot Snap ${index + 1}`,\n source: \"metamask-polkadot-snap\",\n type: \"ethereum\",\n }));\n\nconst injectPolkadotSnap = (win: Web3Window, config: SnapConfig): void => {\n win.injectedWeb3.Snap = {\n enable: async (): Promise<Injected> => {\n const snap = (await enablePolkadotSnap(config)).getMetamaskSnapApi();\n\n return {\n accounts: {\n get: async (): Promise<InjectedAccount[]> => {\n const response = await snap.getAddress();\n return transformAccounts([response]);\n },\n // Currently there is only available only one account, in that case this method will never return anything.\n subscribe:\n (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars\n _cb: (accounts: InjectedAccount[]) => void\n ): (() => void) =>\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n (): void => {},\n },\n signer: {\n signPayload: async (\n payload: SignerPayloadJSON\n ): Promise<SignerResult> => {\n const signature = (await snap.signPayloadJSON(\n payload\n )) as HexString;\n return { id: 0, signature };\n },\n signRaw: async (raw: SignerPayloadRaw): Promise<SignerResult> => {\n const signature = (await snap.signPayloadRaw(raw)) as HexString;\n return { id: 0, signature };\n },\n },\n };\n },\n version: \"0.1\",\n };\n};\n\n// Initiate Polkadot snap and inject it into `injectedWeb3`. as `metamask-polkadot-snap`.\nexport const initPolkadotSnap = (config: SnapConfig): Promise<boolean> =>\n new Promise((resolve): void => {\n const win = window as Window & Web3Window;\n win.injectedWeb3 = win.injectedWeb3 || {};\n\n // Attempt to inject into `injectedWeb3`.\n if (hasMetaMask()) {\n isMetamaskSnapsSupported().then((result) => {\n if (result) {\n injectPolkadotSnap(win, config);\n // Overwrite `injectedWeb3` key with correct id and delete stale version.\n // Issue at: https://github.com/ChainSafe/metamask-snap-polkadot/issues/204\n window.injectedWeb3[\"metamask-polkadot-snap\"] =\n window.injectedWeb3[\"Snap\"];\n delete window.injectedWeb3[\"Snap\"];\n resolve(true);\n } else {\n resolve(false);\n }\n });\n } else {\n resolve(false);\n }\n });\n"]}
@@ -0,0 +1,24 @@
1
+ import { ReactNode } from "react";
2
+ import { ExtensionAccount } from "../ExtensionsProvider/types";
3
+ import { ImportedAccount, MaybeAddress } from "../types";
4
+ import { Sync } from "@w3ux/types";
5
+ export interface ExtensionAccountsContextInterface {
6
+ connectExtensionAccounts: (id?: string) => Promise<boolean>;
7
+ extensionAccountsSynced: Sync;
8
+ getExtensionAccounts: (ss58: number) => ImportedAccount[];
9
+ }
10
+ export interface ExtensionAccountsProviderProps {
11
+ children: ReactNode;
12
+ network: string;
13
+ dappName: string;
14
+ activeAccount?: MaybeAddress;
15
+ setActiveAccount?: (address: MaybeAddress) => void;
16
+ onExtensionEnabled?: (id: string) => void;
17
+ }
18
+ export interface HandleImportExtension {
19
+ newAccounts: ExtensionAccount[];
20
+ meta: {
21
+ accountsToRemove: ExtensionAccount[];
22
+ removedActiveAccount: MaybeAddress;
23
+ };
24
+ }
@@ -0,0 +1,5 @@
1
+ export {};
2
+
3
+ //# sourceMappingURL=types.js.map
4
+
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { ReactNode } from \"react\";\nimport { ExtensionAccount } from \"../ExtensionsProvider/types\";\nimport { ImportedAccount, MaybeAddress } from \"../types\";\nimport { Sync } from \"@w3ux/types\";\n\nexport interface ExtensionAccountsContextInterface {\n connectExtensionAccounts: (id?: string) => Promise<boolean>;\n extensionAccountsSynced: Sync;\n getExtensionAccounts: (ss58: number) => ImportedAccount[];\n}\n\nexport interface ExtensionAccountsProviderProps {\n children: ReactNode;\n network: string;\n dappName: string;\n activeAccount?: MaybeAddress;\n setActiveAccount?: (address: MaybeAddress) => void;\n onExtensionEnabled?: (id: string) => void;\n}\n\nexport interface HandleImportExtension {\n newAccounts: ExtensionAccount[];\n meta: {\n accountsToRemove: ExtensionAccount[];\n removedActiveAccount: MaybeAddress;\n };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ExtensionAccount } from "../ExtensionsProvider/types";
2
+ import { HandleImportExtension } from "./types";
3
+ import { AnyFunction } from "@w3ux/types";
4
+ export declare const useImportExtension: () => {
5
+ handleImportExtension: (id: string, currentAccounts: ExtensionAccount[], signer: AnyFunction, newAccounts: ExtensionAccount[], network: string) => HandleImportExtension;
6
+ };
@@ -0,0 +1,45 @@
1
+ import Keyring from "@polkadot/keyring";
2
+ import { isValidAddress } from "@w3ux/utils";
3
+ import { getActiveAccountLocal, getInExternalAccounts } from "./utils";
4
+ import { DEFAULT_SS58, defaultHandleImportExtension } from "./defaults";
5
+ export const useImportExtension = () => {
6
+ const handleImportExtension = (id, currentAccounts, signer, newAccounts, network) => {
7
+ if (!newAccounts.length) {
8
+ return defaultHandleImportExtension;
9
+ }
10
+ const keyring = new Keyring();
11
+ keyring.setSS58Format(DEFAULT_SS58);
12
+ newAccounts = newAccounts.filter(({ address }) => isValidAddress(address));
13
+ newAccounts.map((account) => {
14
+ const { address } = keyring.addFromAddress(account.address);
15
+ account.address = address;
16
+ return account;
17
+ });
18
+ const inExternal = getInExternalAccounts(newAccounts, network);
19
+ const removedAccounts = currentAccounts
20
+ .filter((j) => j.source === id)
21
+ .filter((j) => !newAccounts.find((i) => i.address === j.address));
22
+ const removedActiveAccount = removedAccounts.find(({ address }) => address === getActiveAccountLocal(network))?.address || null;
23
+ newAccounts = newAccounts.filter(({ address }) => !currentAccounts.find((j) => j.address === address && j.source !== "external"));
24
+ newAccounts = newAccounts.map(({ address, name }) => ({
25
+ address,
26
+ name,
27
+ source: id,
28
+ signer,
29
+ }));
30
+ return {
31
+ newAccounts,
32
+ meta: {
33
+ accountsToRemove: [...inExternal, ...removedAccounts],
34
+ removedActiveAccount,
35
+ },
36
+ };
37
+ };
38
+ return {
39
+ handleImportExtension,
40
+ };
41
+ };
42
+
43
+ //# sourceMappingURL=useImportExtension.js.map
44
+
45
+ //# sourceMappingURL=useImportExtension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/useImportExtension.tsx"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAGxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAIrC,MAAM,qBAAqB,GAAG,CAC5B,EAAU,EACV,eAAmC,EACnC,MAAmB,EACnB,WAA+B,EAC/B,OAAe,EACQ,EAAE;QACzB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,4BAA4B,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAGpC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAG3E,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5D,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QAGH,MAAM,UAAU,GAAG,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAG/D,MAAM,eAAe,GAAG,eAAe;aACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAGpE,MAAM,oBAAoB,GACxB,eAAe,CAAC,IAAI,CAClB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,CAAC,CAC5D,EAAE,OAAO,IAAI,IAAI,CAAC;QAGrB,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACd,CAAC,eAAe,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CACxD,CACJ,CAAC;QAGF,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,EAAE;YACV,MAAM;SACP,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,WAAW;YACX,IAAI,EAAE;gBACJ,gBAAgB,EAAE,CAAC,GAAG,UAAU,EAAE,GAAG,eAAe,CAAC;gBACrD,oBAAoB;aACrB;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,qBAAqB;KACtB,CAAC;AACJ,CAAC,CAAC","file":"useImportExtension.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport Keyring from \"@polkadot/keyring\";\nimport { isValidAddress } from \"@w3ux/utils\";\nimport type { ExtensionAccount } from \"../ExtensionsProvider/types\";\nimport { HandleImportExtension } from \"./types\";\nimport { getActiveAccountLocal, getInExternalAccounts } from \"./utils\";\nimport { DEFAULT_SS58, defaultHandleImportExtension } from \"./defaults\";\nimport { AnyFunction } from \"@w3ux/types\";\n\nexport const useImportExtension = () => {\n // Handles importing of extension accounts.\n //\n // Gets accounts to be imported and commits them to state.\n const handleImportExtension = (\n id: string,\n currentAccounts: ExtensionAccount[],\n signer: AnyFunction,\n newAccounts: ExtensionAccount[],\n network: string\n ): HandleImportExtension => {\n if (!newAccounts.length) {\n return defaultHandleImportExtension;\n }\n\n const keyring = new Keyring();\n keyring.setSS58Format(DEFAULT_SS58);\n\n // Remove accounts that do not contain correctly formatted addresses.\n newAccounts = newAccounts.filter(({ address }) => isValidAddress(address));\n\n // Reformat addresses to ensure default ss58 format.\n newAccounts.map((account) => {\n const { address } = keyring.addFromAddress(account.address);\n account.address = address;\n return account;\n });\n\n // Remove `newAccounts` from local external accounts if present.\n const inExternal = getInExternalAccounts(newAccounts, network);\n\n // Find any accounts that have been removed from this extension.\n const removedAccounts = currentAccounts\n .filter((j) => j.source === id)\n .filter((j) => !newAccounts.find((i) => i.address === j.address));\n\n // Check whether active account is present in forgotten accounts.\n const removedActiveAccount =\n removedAccounts.find(\n ({ address }) => address === getActiveAccountLocal(network)\n )?.address || null;\n\n // Remove accounts that have already been added to `currentAccounts` via another extension.\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !currentAccounts.find(\n (j) => j.address === address && j.source !== \"external\"\n )\n );\n\n // Format accounts properties.\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source: id,\n signer,\n }));\n\n return {\n newAccounts,\n meta: {\n accountsToRemove: [...inExternal, ...removedAccounts],\n removedActiveAccount,\n },\n };\n };\n\n return {\n handleImportExtension,\n };\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import { ExtensionAccount } from "../ExtensionsProvider/types";
2
+ import { ExternalAccount } from "../types";
3
+ import { AnyFunction } from "@w3ux/types";
4
+ export declare const getActiveAccountLocal: (network: string) => any;
5
+ export declare const getActiveExtensionAccount: (network: string, accounts: ExtensionAccount[]) => ExtensionAccount;
6
+ export declare const connectActiveExtensionAccount: (account: ExtensionAccount | null, callback: AnyFunction) => void;
7
+ export declare const getInExternalAccounts: (accounts: ExtensionAccount[], network: string) => ExternalAccount[];
8
+ export declare const getLocalExternalAccounts: (network?: string) => ExternalAccount[];
@@ -0,0 +1,34 @@
1
+ import { localStorageOrDefault } from "@w3ux/utils";
2
+ import Keyring from "@polkadot/keyring";
3
+ import { DEFAULT_SS58 } from "./defaults";
4
+ export const getActiveAccountLocal = (network) => {
5
+ const keyring = new Keyring();
6
+ keyring.setSS58Format(DEFAULT_SS58);
7
+ let account = localStorageOrDefault(`${network}_active_account`, null);
8
+ if (account !== null) {
9
+ account = keyring.addFromAddress(account).address;
10
+ }
11
+ return account;
12
+ };
13
+ export const getActiveExtensionAccount = (network, accounts) => accounts.find(({ address }) => address === getActiveAccountLocal(network)) ??
14
+ null;
15
+ export const connectActiveExtensionAccount = (account, callback) => {
16
+ if (account !== null) {
17
+ callback(account);
18
+ }
19
+ };
20
+ export const getInExternalAccounts = (accounts, network) => {
21
+ const localExternalAccounts = getLocalExternalAccounts(network);
22
+ return (localExternalAccounts.filter((a) => (accounts || []).find((b) => b.address === a.address) !== undefined) || []);
23
+ };
24
+ export const getLocalExternalAccounts = (network) => {
25
+ let localAccounts = localStorageOrDefault("external_accounts", [], true);
26
+ if (network) {
27
+ localAccounts = localAccounts.filter((l) => l.network === network);
28
+ }
29
+ return localAccounts;
30
+ };
31
+
32
+ //# sourceMappingURL=utils.js.map
33
+
34
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAEpC,IAAI,OAAO,GAAG,qBAAqB,CAAC,GAAG,OAAO,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;IACpD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAAe,EACf,QAA4B,EAC5B,EAAE,CACF,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,CAAC;AAGP,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,OAAgC,EAChC,QAAqB,EACrB,EAAE;IACF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;AACH,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA4B,EAC5B,OAAe,EACf,EAAE;IACF,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAEhE,OAAO,CACL,qBAAqB,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAC3E,IAAI,EAAE,CACR,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC3D,IAAI,aAAa,GAAG,qBAAqB,CACvC,mBAAmB,EACnB,EAAE,EACF,IAAI,CACgB,CAAC;IACvB,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from \"@w3ux/utils\";\nimport Keyring from \"@polkadot/keyring\";\nimport { ExtensionAccount } from \"../ExtensionsProvider/types\";\nimport { ExternalAccount } from \"../types\";\nimport { DEFAULT_SS58 } from \"./defaults\";\nimport { AnyFunction } from \"@w3ux/types\";\n\n/*------------------------------------------------------------\n Active account utils.\n ------------------------------------------------------------*/\n\n// Gets local `active_acount` for a network.\nexport const getActiveAccountLocal = (network: string) => {\n const keyring = new Keyring();\n keyring.setSS58Format(DEFAULT_SS58);\n\n let account = localStorageOrDefault(`${network}_active_account`, null);\n if (account !== null) {\n account = keyring.addFromAddress(account).address;\n }\n\n return account;\n};\n\n// Checks if the local active account is the provided accounts.\nexport const getActiveExtensionAccount = (\n network: string,\n accounts: ExtensionAccount[]\n) =>\n accounts.find(({ address }) => address === getActiveAccountLocal(network)) ??\n null;\n\n// Connects to active account, and calls an optional callback, if provided.\nexport const connectActiveExtensionAccount = (\n account: ExtensionAccount | null,\n callback: AnyFunction\n) => {\n if (account !== null) {\n callback(account);\n }\n};\n\n/*------------------------------------------------------------\n External account utils.\n ------------------------------------------------------------*/\n\n// Gets accounts that exist in local `external_accounts`.\nexport const getInExternalAccounts = (\n accounts: ExtensionAccount[],\n network: string\n) => {\n const localExternalAccounts = getLocalExternalAccounts(network);\n\n return (\n localExternalAccounts.filter(\n (a) => (accounts || []).find((b) => b.address === a.address) !== undefined\n ) || []\n );\n};\n\n// Gets local external accounts for a network.\nexport const getLocalExternalAccounts = (network?: string) => {\n let localAccounts = localStorageOrDefault<ExternalAccount[]>(\n \"external_accounts\",\n [],\n true\n ) as ExternalAccount[];\n if (network) {\n localAccounts = localAccounts.filter((l) => l.network === network);\n }\n return localAccounts;\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import type { ExtensionsContextInterface } from "./types";
2
+ export declare const defaultExtensionsContext: ExtensionsContextInterface;
@@ -0,0 +1,13 @@
1
+ export const defaultExtensionsContext = {
2
+ checkingInjectedWeb3: false,
3
+ extensionsStatus: {},
4
+ setExtensionStatus: (id, status) => { },
5
+ removeExtensionStatus: (id) => { },
6
+ extensionInstalled: (id) => false,
7
+ extensionCanConnect: (id) => false,
8
+ extensionHasFeature: (id, feature) => false,
9
+ };
10
+
11
+ //# sourceMappingURL=defaults.js.map
12
+
13
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionsProvider/defaults.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,wBAAwB,GAA+B;IAClE,oBAAoB,EAAE,KAAK;IAC3B,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAE,CAAC;IACtC,qBAAqB,EAAE,CAAC,EAAE,EAAE,EAAE,GAAE,CAAC;IACjC,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK;IACjC,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK;IAClC,mBAAmB,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK;CAC5C,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function, no-unused-vars */\n\nimport type { ExtensionsContextInterface } from \"./types\";\n\nexport const defaultExtensionsContext: ExtensionsContextInterface = {\n checkingInjectedWeb3: false,\n extensionsStatus: {},\n setExtensionStatus: (id, status) => {},\n removeExtensionStatus: (id) => {},\n extensionInstalled: (id) => false,\n extensionCanConnect: (id) => false,\n extensionHasFeature: (id, feature) => false,\n};\n"]}
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from "react";
2
+ import type { ExtensionsContextInterface } from "./types";
3
+ export declare const ExtensionsContext: import("react").Context<ExtensionsContextInterface>;
4
+ export declare const useExtensions: () => ExtensionsContextInterface;
5
+ export declare const ExtensionsProvider: ({ children, options, }: {
6
+ children: ReactNode;
7
+ options?: {
8
+ chainSafeSnapEnabled?: boolean;
9
+ polkagateSnapEnabled?: boolean;
10
+ };
11
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,106 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { setStateWithRef, withTimeout } from "@w3ux/utils";
3
+ import { useEffect, useRef, useState, createContext, useContext, } from "react";
4
+ import { defaultExtensionsContext } from "./defaults";
5
+ import { polkadotSnapAvailable } from "./utils";
6
+ import extensions from "@w3ux/extension-assets";
7
+ import { web3Enable } from "@polkagate/extension-dapp";
8
+ export const ExtensionsContext = createContext(defaultExtensionsContext);
9
+ export const useExtensions = () => useContext(ExtensionsContext);
10
+ export const ExtensionsProvider = ({ children, options, }) => {
11
+ const [checkingInjectedWeb3, setCheckingInjectedWeb3] = useState(true);
12
+ const checkingInjectedWeb3Ref = useRef(checkingInjectedWeb3);
13
+ const intervalInitialisedRef = useRef(false);
14
+ const [extensionsStatus, setExtensionsStatus] = useState({});
15
+ const extensionsStatusRef = useRef(extensionsStatus);
16
+ const [chainSafeSnapEnabled] = useState(options?.chainSafeSnapEnabled || false);
17
+ const [polkaGateSnapEnabled] = useState(options?.polkagateSnapEnabled || false);
18
+ let injectedWeb3Interval;
19
+ const injectCounter = useRef(0);
20
+ const handleClearInterval = (hasInjectedWeb3) => {
21
+ clearInterval(injectedWeb3Interval);
22
+ handleSnapInjection(hasInjectedWeb3);
23
+ };
24
+ const handleSnapInjection = async (hasInjectedWeb3) => {
25
+ const snapAvailable = (await polkadotSnapAvailable()) && chainSafeSnapEnabled;
26
+ if (polkaGateSnapEnabled) {
27
+ await withTimeout(500, web3Enable("snap_only"));
28
+ }
29
+ if (hasInjectedWeb3 || snapAvailable) {
30
+ setStateWithRef(getExtensionsStatus(snapAvailable), setExtensionsStatus, extensionsStatusRef);
31
+ }
32
+ setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);
33
+ };
34
+ const setExtensionStatus = (id, status) => {
35
+ setStateWithRef({
36
+ ...extensionsStatusRef.current,
37
+ [id]: status,
38
+ }, setExtensionsStatus, extensionsStatusRef);
39
+ };
40
+ const removeExtensionStatus = (id) => {
41
+ const newExtensionsStatus = { ...extensionsStatusRef.current };
42
+ delete newExtensionsStatus[id];
43
+ setStateWithRef(newExtensionsStatus, setExtensionsStatus, extensionsStatusRef);
44
+ };
45
+ const getExtensionsStatus = (snapAvailable) => {
46
+ const { injectedWeb3 } = window;
47
+ const newExtensionsStatus = { ...extensionsStatus };
48
+ if (snapAvailable) {
49
+ newExtensionsStatus["metamask-polkadot-snap"] = "installed";
50
+ }
51
+ const extensionsAsArray = Object.entries(extensions).map(([key, value]) => ({
52
+ id: key,
53
+ ...value,
54
+ }));
55
+ extensionsAsArray.forEach((e) => {
56
+ if (injectedWeb3[e.id] !== undefined) {
57
+ newExtensionsStatus[e.id] = "installed";
58
+ }
59
+ });
60
+ return newExtensionsStatus;
61
+ };
62
+ const extensionInstalled = (id) => extensionsStatus[id] !== undefined;
63
+ const extensionCanConnect = (id) => extensionInstalled(id) && extensionsStatus[id] !== "connected";
64
+ const extensionHasFeature = (id, feature) => {
65
+ const { features } = extensions[id];
66
+ if (features === "*" || features.includes(feature)) {
67
+ return true;
68
+ }
69
+ else {
70
+ return false;
71
+ }
72
+ };
73
+ const checkEveryMs = 300;
74
+ const totalChecks = 10;
75
+ useEffect(() => {
76
+ if (!intervalInitialisedRef.current) {
77
+ intervalInitialisedRef.current = true;
78
+ injectedWeb3Interval = setInterval(() => {
79
+ injectCounter.current++;
80
+ if (injectCounter.current === totalChecks) {
81
+ handleClearInterval(false);
82
+ }
83
+ else {
84
+ const injectedWeb3 = window?.injectedWeb3 || null;
85
+ if (injectedWeb3 !== null) {
86
+ handleClearInterval(true);
87
+ }
88
+ }
89
+ }, checkEveryMs);
90
+ }
91
+ return () => clearInterval(injectedWeb3Interval);
92
+ });
93
+ return (_jsx(ExtensionsContext.Provider, { value: {
94
+ extensionsStatus: extensionsStatusRef.current,
95
+ checkingInjectedWeb3,
96
+ setExtensionStatus,
97
+ removeExtensionStatus,
98
+ extensionInstalled,
99
+ extensionCanConnect,
100
+ extensionHasFeature,
101
+ }, children: children }));
102
+ };
103
+
104
+ //# sourceMappingURL=index.js.map
105
+
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionsProvider/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { setStateWithRef, withTimeout } from \"@w3ux/utils\";\nimport {\n ReactNode,\n useEffect,\n useRef,\n useState,\n createContext,\n useContext,\n} from \"react\";\nimport type { ExtensionStatus, ExtensionsContextInterface } from \"./types\";\nimport { defaultExtensionsContext } from \"./defaults\";\nimport { polkadotSnapAvailable } from \"./utils\";\nimport extensions from \"@w3ux/extension-assets\";\nimport { web3Enable } from \"@polkagate/extension-dapp\";\n\nexport const ExtensionsContext = createContext<ExtensionsContextInterface>(\n defaultExtensionsContext\n);\n\nexport const useExtensions = () => useContext(ExtensionsContext);\n\nexport const ExtensionsProvider = ({\n children,\n options,\n}: {\n children: ReactNode;\n options?: {\n chainSafeSnapEnabled?: boolean;\n polkagateSnapEnabled?: boolean;\n };\n}) => {\n // Store whether initial `injectedWeb3` checking is underway.\n //\n // Injecting `injectedWeb3` is an asynchronous process, so we need to check for its existence for\n // a period of time.\n const [checkingInjectedWeb3, setCheckingInjectedWeb3] =\n useState<boolean>(true);\n const checkingInjectedWeb3Ref = useRef(checkingInjectedWeb3);\n\n // Store whether injected interval has been initialised.\n const intervalInitialisedRef = useRef<boolean>(false);\n\n // Store each extension's status in state.\n const [extensionsStatus, setExtensionsStatus] = useState<\n Record<string, ExtensionStatus>\n >({});\n const extensionsStatusRef = useRef(extensionsStatus);\n\n // Store whether Metamask Snaps are enabled.\n const [chainSafeSnapEnabled] = useState<boolean>(\n options?.chainSafeSnapEnabled || false\n );\n\n // Store whether Metamask Snaps are enabled.\n const [polkaGateSnapEnabled] = useState<boolean>(\n options?.polkagateSnapEnabled || false\n );\n\n // Listen for window.injectedWeb3 with an interval.\n let injectedWeb3Interval: ReturnType<typeof setInterval>;\n const injectCounter = useRef<number>(0);\n\n // Handle completed interval check for `injectedWeb3`.\n //\n // Clear interval and move on to checking for Metamask Polkadot Snap.\n const handleClearInterval = (hasInjectedWeb3: boolean) => {\n clearInterval(injectedWeb3Interval);\n // Check if Metamask Polkadot Snap is available.\n handleSnapInjection(hasInjectedWeb3);\n };\n\n // Handle injecting of `metamask-polkadot-snap` into injectedWeb3 if avaialble, and complete\n // `injectedWeb3` syncing process.\n const handleSnapInjection = async (hasInjectedWeb3: boolean) => {\n // Inject ChainSafe Snap if enabled.\n const snapAvailable =\n (await polkadotSnapAvailable()) && chainSafeSnapEnabled;\n\n // Inject PolkaGate Snap if enabled.\n if (polkaGateSnapEnabled) {\n await withTimeout(500, web3Enable(\"snap_only\"));\n }\n\n if (hasInjectedWeb3 || snapAvailable) {\n setStateWithRef(\n getExtensionsStatus(snapAvailable),\n setExtensionsStatus,\n extensionsStatusRef\n );\n }\n\n setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);\n };\n\n // Setter for an extension status.\n const setExtensionStatus = (id: string, status: ExtensionStatus) => {\n setStateWithRef(\n {\n ...extensionsStatusRef.current,\n [id]: status,\n },\n setExtensionsStatus,\n extensionsStatusRef\n );\n };\n\n // Removes an extension from the `extensionsStatus` state.\n const removeExtensionStatus = (id: string) => {\n const newExtensionsStatus = { ...extensionsStatusRef.current };\n delete newExtensionsStatus[id];\n\n setStateWithRef(\n newExtensionsStatus,\n setExtensionsStatus,\n extensionsStatusRef\n );\n };\n\n // Getter for the currently installed extensions.\n //\n // Loops through the supported extensios and checks if they are present in `injectedWeb3`. Adds\n // `installed` status to the extension if it is present.\n const getExtensionsStatus = (snapAvailable: boolean) => {\n const { injectedWeb3 } = window;\n\n const newExtensionsStatus = { ...extensionsStatus };\n if (snapAvailable) {\n newExtensionsStatus[\"metamask-polkadot-snap\"] = \"installed\";\n }\n\n const extensionsAsArray = Object.entries(extensions).map(\n ([key, value]) => ({\n id: key,\n ...value,\n })\n );\n\n extensionsAsArray.forEach((e) => {\n if (injectedWeb3[e.id] !== undefined) {\n newExtensionsStatus[e.id] = \"installed\";\n }\n });\n\n return newExtensionsStatus;\n };\n\n // Checks if an extension has been installed.\n const extensionInstalled = (id: string): boolean =>\n extensionsStatus[id] !== undefined;\n\n // Checks whether an extension can be connected to.\n const extensionCanConnect = (id: string): boolean =>\n extensionInstalled(id) && extensionsStatus[id] !== \"connected\";\n\n // Checks whether an extension supports a feature.\n const extensionHasFeature = (id: string, feature: string): boolean => {\n const { features } = extensions[id];\n if (features === \"*\" || features.includes(feature)) {\n return true;\n } else {\n return false;\n }\n };\n\n // Check for `injectedWeb3` and Metamask Snap on mount. To trigger interval on soft page\n // refreshes, no empty dependency array is provided to this `useEffect`. Checks for `injectedWeb3`\n // for a total of 3 seconds before giving up.\n //\n // Interval duration.\n const checkEveryMs = 300;\n // Total interval iterations.\n const totalChecks = 10;\n useEffect(() => {\n if (!intervalInitialisedRef.current) {\n intervalInitialisedRef.current = true;\n\n injectedWeb3Interval = setInterval(() => {\n injectCounter.current++;\n\n if (injectCounter.current === totalChecks) {\n handleClearInterval(false);\n } else {\n // `injectedWeb3` is present\n const injectedWeb3 = window?.injectedWeb3 || null;\n if (injectedWeb3 !== null) {\n handleClearInterval(true);\n }\n }\n }, checkEveryMs);\n }\n\n return () => clearInterval(injectedWeb3Interval);\n });\n\n return (\n <ExtensionsContext.Provider\n value={{\n extensionsStatus: extensionsStatusRef.current,\n checkingInjectedWeb3,\n setExtensionStatus,\n removeExtensionStatus,\n extensionInstalled,\n extensionCanConnect,\n extensionHasFeature,\n }}\n >\n {children}\n </ExtensionsContext.Provider>\n );\n};\n"]}
@@ -0,0 +1,44 @@
1
+ import type { FunctionComponent, SVGProps } from "react";
2
+ import { ExternalAccountAddedBy } from "../types";
3
+ import { AnyJson, VoidFn } from "@w3ux/types";
4
+ export interface ExtensionsContextInterface {
5
+ checkingInjectedWeb3: boolean;
6
+ extensionsStatus: Record<string, ExtensionStatus>;
7
+ setExtensionStatus: (id: string, status: ExtensionStatus) => void;
8
+ removeExtensionStatus: (id: string) => void;
9
+ extensionInstalled: (id: string) => boolean;
10
+ extensionCanConnect: (id: string) => boolean;
11
+ extensionHasFeature: (id: string, feature: string) => boolean;
12
+ }
13
+ export interface ExtensionInjected extends ExtensionConfig {
14
+ id: string;
15
+ enable: (n: string) => Promise<ExtensionInterface>;
16
+ }
17
+ export interface ExtensionInterface {
18
+ accounts: {
19
+ subscribe: (a: (b: ExtensionAccount[]) => void) => VoidFn;
20
+ get: () => Promise<ExtensionAccount[]>;
21
+ };
22
+ provider: AnyJson;
23
+ metadata: AnyJson;
24
+ signer: AnyJson;
25
+ }
26
+ export interface ExtensionAccount extends ExtensionMetadata {
27
+ address: string;
28
+ meta?: AnyJson;
29
+ name: string;
30
+ signer?: AnyJson;
31
+ }
32
+ export interface ExtensionConfig {
33
+ id: string;
34
+ title: string;
35
+ icon: FunctionComponent<SVGProps<SVGSVGElement> & {
36
+ title?: string | undefined;
37
+ }>;
38
+ url: string;
39
+ }
40
+ export interface ExtensionMetadata {
41
+ addedBy?: ExternalAccountAddedBy;
42
+ source: string;
43
+ }
44
+ export type ExtensionStatus = "installed" | "not_authenticated" | "connected";
@@ -0,0 +1,5 @@
1
+ export {};
2
+
3
+ //# sourceMappingURL=types.js.map
4
+
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { FunctionComponent, SVGProps } from \"react\";\nimport { ExternalAccountAddedBy } from \"../types\";\nimport { AnyJson, VoidFn } from \"@w3ux/types\";\n\n// Extensions context interface.\nexport interface ExtensionsContextInterface {\n checkingInjectedWeb3: boolean;\n extensionsStatus: Record<string, ExtensionStatus>;\n setExtensionStatus: (id: string, status: ExtensionStatus) => void;\n removeExtensionStatus: (id: string) => void;\n extensionInstalled: (id: string) => boolean;\n extensionCanConnect: (id: string) => boolean;\n extensionHasFeature: (id: string, feature: string) => boolean;\n}\n\n// Top level required properties the extension must expose via their `injectedWeb3` entry.\nexport interface ExtensionInjected extends ExtensionConfig {\n id: string;\n enable: (n: string) => Promise<ExtensionInterface>;\n}\n\n// Required properties `enable` must provide after resolution.\nexport interface ExtensionInterface {\n accounts: {\n subscribe: (a: (b: ExtensionAccount[]) => void) => VoidFn;\n get: () => Promise<ExtensionAccount[]>;\n };\n provider: AnyJson;\n metadata: AnyJson;\n signer: AnyJson;\n}\n\n// Required properties returned after subscribing to accounts.\nexport interface ExtensionAccount extends ExtensionMetadata {\n address: string;\n meta?: AnyJson;\n name: string;\n signer?: AnyJson;\n}\n\n// Configuration item of an extension.\nexport interface ExtensionConfig {\n id: string;\n title: string;\n icon: FunctionComponent<\n SVGProps<SVGSVGElement> & { title?: string | undefined }\n >;\n url: string;\n}\n\n// Miscellaneous metadata added to an extension.\nexport interface ExtensionMetadata {\n addedBy?: ExternalAccountAddedBy;\n source: string;\n}\n\nexport type ExtensionStatus = \"installed\" | \"not_authenticated\" | \"connected\";\n"]}
@@ -0,0 +1,20 @@
1
+ import { SnapRpcMethodRequest } from "@chainsafe/metamask-polkadot-types";
2
+ import { AnyJson } from "@w3ux/types";
3
+ declare global {
4
+ interface Window {
5
+ injectedWeb3?: AnyJson;
6
+ ethereum: {
7
+ isMetaMask: boolean;
8
+ send: (request: SnapRpcMethodRequest | {
9
+ method: string;
10
+ params?: never[];
11
+ }) => Promise<unknown>;
12
+ on: (eventName: unknown, callback: unknown) => unknown;
13
+ request: <T>(request: SnapRpcMethodRequest | {
14
+ method: string;
15
+ params?: AnyJson;
16
+ }) => Promise<T>;
17
+ };
18
+ }
19
+ }
20
+ export declare const polkadotSnapAvailable: () => Promise<boolean>;
@@ -0,0 +1,26 @@
1
+ import { hasMetaMask, } from "@chainsafe/metamask-polkadot-adapter/src/utils";
2
+ import { withTimeout } from "@w3ux/utils";
3
+ const getWalletSnaps = async () => {
4
+ const ethRequest = window?.ethereum?.request ? true : false;
5
+ if (ethRequest) {
6
+ const response = await withTimeout(200, window.ethereum.request({ method: "wallet_getSnaps" }));
7
+ return response;
8
+ }
9
+ return;
10
+ };
11
+ export const polkadotSnapAvailable = async () => {
12
+ if (!hasMetaMask()) {
13
+ return false;
14
+ }
15
+ try {
16
+ await getWalletSnaps();
17
+ return true;
18
+ }
19
+ catch (e) {
20
+ return false;
21
+ }
22
+ };
23
+
24
+ //# sourceMappingURL=utils.js.map
25
+
26
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ExtensionsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,WAAW,GACZ,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAwB1C,MAAM,cAAc,GAAG,KAAK,IAA+B,EAAE;IAC3D,MAAM,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,GAAG,EACH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CACvD,CAAC;QACF,OAAO,QAAqC,CAAC;IAC/C,CAAC;IACD,OAAO;AACT,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAsB,EAAE;IAChE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n GetSnapsResponse,\n hasMetaMask,\n} from \"@chainsafe/metamask-polkadot-adapter/src/utils\";\nimport { SnapRpcMethodRequest } from \"@chainsafe/metamask-polkadot-types\";\nimport { AnyJson } from \"@w3ux/types\";\nimport { withTimeout } from \"@w3ux/utils\";\n\n// Workaround for current `ethereum` snap types. See\n// https://github.com/ChainSafe/metamask-snap-polkadot/blob/e0f3d4fc0be7366c62211e29d3a276e4fab5669e/packages/adapter/src/types.ts#L40\n// for full type.\ndeclare global {\n interface Window {\n injectedWeb3?: AnyJson;\n ethereum: {\n isMetaMask: boolean;\n send: (\n request: SnapRpcMethodRequest | { method: string; params?: never[] }\n ) => Promise<unknown>;\n on: (eventName: unknown, callback: unknown) => unknown;\n request: <T>(\n request: SnapRpcMethodRequest | { method: string; params?: AnyJson }\n ) => Promise<T>;\n };\n }\n}\n\n// Checks if snaps are supported. Note that other extensions may inject `window.ethereum`, which may\n// break the request. We wrap the request in a timeout to ensure it doesn't hang the extension\n// discovery process.\nconst getWalletSnaps = async (): Promise<GetSnapsResponse> => {\n const ethRequest = window?.ethereum?.request ? true : false;\n if (ethRequest) {\n const response = await withTimeout(\n 200,\n window.ethereum.request({ method: \"wallet_getSnaps\" })\n );\n return response as Promise<GetSnapsResponse>;\n }\n return;\n};\n\n// Determines if Metamask Polkadot Snap is available and supported.\nexport const polkadotSnapAvailable = async (): Promise<boolean> => {\n if (!hasMetaMask()) {\n return false;\n }\n\n try {\n await getWalletSnaps();\n return true;\n } catch (e) {\n return false;\n }\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import { LedgerAccountsContextInterface } from "./types";
2
+ export declare const defaultLedgerAccountsContext: LedgerAccountsContextInterface;
@@ -0,0 +1,13 @@
1
+ export const defaultLedgerAccountsContext = {
2
+ ledgerAccountExists: (network, address) => false,
3
+ addLedgerAccount: (network, address, index, callback) => null,
4
+ removeLedgerAccount: (network, address, callback) => { },
5
+ renameLedgerAccount: (network, address, newName) => { },
6
+ getLedgerAccount: (network, address) => null,
7
+ getLedgerAccounts: (network) => [],
8
+ ledgerAccounts: [],
9
+ };
10
+
11
+ //# sourceMappingURL=defaults.js.map
12
+
13
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/LedgerAccountsProvider/defaults.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,4BAA4B,GAAmC;IAC1E,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK;IAChD,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI;IAC7D,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAE,CAAC;IACvD,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAE,CAAC;IACtD,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI;IAC5C,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;IAClC,cAAc,EAAE,EAAE;CACnB,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function, no-unused-vars */\n\nimport { LedgerAccountsContextInterface } from \"./types\";\n\nexport const defaultLedgerAccountsContext: LedgerAccountsContextInterface = {\n ledgerAccountExists: (network, address) => false,\n addLedgerAccount: (network, address, index, callback) => null,\n removeLedgerAccount: (network, address, callback) => {},\n renameLedgerAccount: (network, address, newName) => {},\n getLedgerAccount: (network, address) => null,\n getLedgerAccounts: (network) => [],\n ledgerAccounts: [],\n};\n"]}
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { LedgerAccountsContextInterface, LedgerAccountsProviderProps } from "./types";
3
+ export declare const LedgerAccountsContext: import("react").Context<LedgerAccountsContextInterface>;
4
+ export declare const useLedgerAccounts: () => LedgerAccountsContextInterface;
5
+ export declare const LedgerAccountsProvider: ({ children, }: LedgerAccountsProviderProps) => import("react/jsx-runtime").JSX.Element;