@btc-vision/walletconnect 1.4.1 → 1.5.1

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 (84) hide show
  1. package/.prettierrc.json +1 -1
  2. package/CHANGELOG.md +83 -0
  3. package/README.md +11 -11
  4. package/browser/consts.d.ts +2 -0
  5. package/browser/context/WalletConnectContext.d.ts +18 -0
  6. package/browser/hooks/WalletConnectHook.d.ts +2 -0
  7. package/browser/index.d.ts +4 -2
  8. package/browser/index.js +1 -1
  9. package/browser/index.js.LICENSE.txt +0 -2
  10. package/browser/provider/WalletConnectProvider.d.ts +9 -0
  11. package/browser/types.d.ts +11 -0
  12. package/browser/utils/accessibility/definitions.d.ts +2 -0
  13. package/browser/utils/accessibility/errorDecoder.d.ts +2 -0
  14. package/browser/utils/accessibility/patterns.d.ts +13 -0
  15. package/browser/wallets/controller.d.ts +29 -0
  16. package/browser/wallets/index.d.ts +4 -0
  17. package/browser/wallets/opwallet/controller.d.ts +26 -0
  18. package/browser/wallets/opwallet/interface.d.ts +5 -0
  19. package/browser/wallets/types.d.ts +34 -0
  20. package/browser/wallets/unisat/controller.d.ts +26 -0
  21. package/browser/wallets/unisat/interface.d.ts +5 -0
  22. package/build/consts.d.ts +2 -0
  23. package/build/consts.js +6 -0
  24. package/build/context/WalletConnectContext.d.ts +18 -0
  25. package/build/context/WalletConnectContext.js +2 -0
  26. package/build/hooks/WalletConnectHook.d.ts +2 -0
  27. package/build/hooks/WalletConnectHook.js +9 -0
  28. package/build/index.d.ts +4 -2
  29. package/build/index.js +4 -2
  30. package/build/provider/WalletConnectProvider.d.ts +9 -0
  31. package/build/provider/WalletConnectProvider.js +178 -0
  32. package/build/types.d.ts +11 -0
  33. package/build/types.js +1 -0
  34. package/build/utils/accessibility/definitions.d.ts +2 -0
  35. package/build/utils/accessibility/definitions.js +8 -0
  36. package/build/utils/accessibility/errorDecoder.d.ts +2 -0
  37. package/build/utils/accessibility/errorDecoder.js +73 -0
  38. package/build/utils/accessibility/patterns.d.ts +13 -0
  39. package/build/utils/accessibility/patterns.js +51 -0
  40. package/build/wallets/controller.d.ts +29 -0
  41. package/build/wallets/controller.js +205 -0
  42. package/build/wallets/index.d.ts +4 -0
  43. package/build/wallets/index.js +16 -0
  44. package/build/wallets/opwallet/controller.d.ts +26 -0
  45. package/build/wallets/opwallet/controller.js +132 -0
  46. package/build/wallets/opwallet/interface.d.ts +5 -0
  47. package/build/wallets/opwallet/interface.js +35 -0
  48. package/build/wallets/types.d.ts +34 -0
  49. package/build/wallets/types.js +1 -0
  50. package/build/wallets/unisat/controller.d.ts +26 -0
  51. package/build/wallets/unisat/controller.js +135 -0
  52. package/build/wallets/unisat/interface.d.ts +5 -0
  53. package/build/wallets/unisat/interface.js +285 -0
  54. package/eslint.config.js +23 -2
  55. package/package.json +15 -10
  56. package/src/README.md +24 -0
  57. package/src/consts.ts +8 -0
  58. package/src/context/WalletConnectContext.ts +21 -0
  59. package/src/hooks/WalletConnectHook.tsx +13 -0
  60. package/src/index.ts +5 -2
  61. package/src/provider/WalletConnectProvider.tsx +341 -0
  62. package/src/types.ts +13 -0
  63. package/src/utils/accessibility/definitions.ts +9 -0
  64. package/src/utils/accessibility/errorDecoder.ts +105 -0
  65. package/src/utils/accessibility/patterns.ts +86 -0
  66. package/src/utils/style.css +131 -0
  67. package/src/utils/theme.css +26 -0
  68. package/src/wallets/controller.ts +231 -0
  69. package/src/wallets/index.ts +22 -0
  70. package/src/wallets/opwallet/controller.ts +177 -0
  71. package/src/wallets/opwallet/interface.ts +42 -0
  72. package/src/wallets/types.ts +39 -0
  73. package/src/wallets/unisat/controller.ts +179 -0
  74. package/src/wallets/unisat/interface.ts +292 -0
  75. package/tsconfig.webpack.json +2 -6
  76. package/webpack.config.js +4 -0
  77. package/browser/WalletConnection.d.ts +0 -21
  78. package/browser/WalletProvider.d.ts +0 -25
  79. package/build/WalletConnection.d.ts +0 -21
  80. package/build/WalletConnection.js +0 -152
  81. package/build/WalletProvider.d.ts +0 -25
  82. package/build/WalletProvider.js +0 -178
  83. package/src/WalletConnection.ts +0 -210
  84. package/src/WalletProvider.tsx +0 -240
@@ -1,240 +0,0 @@
1
- import { Network } from '@btc-vision/bitcoin';
2
- import { Address } from '@btc-vision/transaction';
3
- import { AbstractRpcProvider } from 'opnet';
4
- import {
5
- createContext,
6
- ReactNode,
7
- useCallback,
8
- useContext,
9
- useEffect,
10
- useRef,
11
- useState,
12
- } from 'react';
13
- import WalletConnection, { Signers, SupportedWallets, Wallets } from './WalletConnection';
14
-
15
- export interface Account {
16
- isConnected: boolean;
17
- signer: Signers | null;
18
- address: Address;
19
- addressTyped: string;
20
- network: Network;
21
- provider: AbstractRpcProvider;
22
- }
23
-
24
- interface WalletContextType {
25
- connect: (wallet: SupportedWallets, signal?: AbortSignal) => Promise<void>;
26
- disconnect: () => void;
27
- walletType: SupportedWallets | null;
28
- walletWindowInstance: Wallets | null;
29
- account: Account | null;
30
- }
31
-
32
- const WalletContext = createContext<WalletContextType | undefined>(undefined);
33
-
34
- const MAX_RETRIES = 10;
35
- const RETRY_DELAY_MS = 2_000;
36
-
37
- function useDocumentComplete(fn: () => void) {
38
- const fired = useRef(false);
39
-
40
- useEffect(() => {
41
- if (fired.current) return;
42
- const run = () => {
43
- if (fired.current) return;
44
- fired.current = true;
45
- fn();
46
- };
47
-
48
- if (document.readyState === 'complete') {
49
- run();
50
- return;
51
- }
52
-
53
- const handler = () => {
54
- if (document.readyState === 'complete') {
55
- document.removeEventListener('readystatechange', handler);
56
- run();
57
- }
58
- };
59
- document.addEventListener('readystatechange', handler);
60
- return () => document.removeEventListener('readystatechange', handler);
61
- }, [fn]);
62
- }
63
-
64
- export const WalletProvider = ({ children }: { children: ReactNode }) => {
65
- const [walletConnection] = useState(() => new WalletConnection());
66
- const [walletType, setWalletType] = useState<SupportedWallets | null>(null);
67
- const [walletWindowInstance, setWalletWindowInstance] = useState<Wallets | null>(null);
68
- const [account, setAccount] = useState<Account | null>(null);
69
-
70
- /** keeps the latest listeners so they can be removed in `disconnect` */
71
- const listeners = useRef<{
72
- disconnect?: () => void;
73
- accountsChanged?: () => void;
74
- }>({});
75
-
76
- const disconnect = useCallback(() => {
77
- // detach previously attached listeners, if any
78
- const inst = walletWindowInstance;
79
- if (inst) {
80
- if (listeners.current.disconnect) {
81
- inst.removeListener?.('disconnect', listeners.current.disconnect);
82
- listeners.current.disconnect = undefined;
83
- }
84
- if (listeners.current.accountsChanged) {
85
- inst.removeListener?.('accountsChanged', listeners.current.accountsChanged);
86
- listeners.current.accountsChanged = undefined;
87
- }
88
- }
89
-
90
- walletConnection.disconnect();
91
- setWalletType(null);
92
- setWalletWindowInstance(null);
93
- localStorage.removeItem('walletType');
94
- setAccount(null);
95
- }, [walletConnection, walletWindowInstance]);
96
-
97
- const connect = useCallback(
98
- async (type: SupportedWallets, signal?: AbortSignal) => {
99
- let attempt = 0;
100
-
101
- const throwIfAborted = () => {
102
- if (signal?.aborted) throw new DOMException('Aborted', 'AbortError');
103
- };
104
-
105
- while (attempt < MAX_RETRIES) {
106
- throwIfAborted();
107
- try {
108
- await walletConnection.connect(type);
109
-
110
- if (
111
- (walletConnection.walletType !== SupportedWallets.OP_WALLET &&
112
- !walletConnection.signer) ||
113
- !walletConnection.walletWindowInstance
114
- ) {
115
- throw new Error('Wallet not fully loaded yet');
116
- }
117
- break; // success
118
- } catch (err) {
119
- attempt += 1;
120
- if (attempt >= MAX_RETRIES) {
121
- console.warn(`Failed to connect after ${MAX_RETRIES} attempts.`, err);
122
- disconnect();
123
- return;
124
- }
125
- console.warn(`Connection attempt ${attempt} failed:`, (err as Error).message);
126
-
127
- try {
128
- await new Promise<void>((res, rej) => {
129
- const t = setTimeout(res, RETRY_DELAY_MS);
130
- signal?.addEventListener('abort', () => {
131
- clearTimeout(t);
132
- rej(new DOMException('Aborted', 'AbortError'));
133
- });
134
- });
135
- } catch {
136
- console.debug('Connection aborted during retry delay.');
137
- return;
138
- }
139
- }
140
- }
141
-
142
- throwIfAborted();
143
-
144
- setWalletType(type);
145
- setWalletWindowInstance(walletConnection.walletWindowInstance);
146
- localStorage.setItem('walletType', type);
147
-
148
- try {
149
- const [signer, address, addressTyped, network, provider] = await Promise.all([
150
- walletConnection.signer,
151
- walletConnection.getAddress(),
152
- walletConnection.getAddressTyped(),
153
- walletConnection.getNetwork(),
154
- walletConnection.getProvider(),
155
- ]);
156
-
157
- setAccount({
158
- isConnected: true,
159
- signer,
160
- address,
161
- addressTyped,
162
- network,
163
- provider,
164
- });
165
-
166
- /* attach listeners exactly once per successful connect */
167
- const instance = walletConnection.walletWindowInstance;
168
- if (instance) {
169
- const onDisconnect = () => disconnect();
170
- const onAccountsChanged = async () => {
171
- try {
172
- const [updatedAddr, updatedAddrTyped, updatedNet, updatedProv] =
173
- await Promise.all([
174
- walletConnection.getAddress(),
175
- walletConnection.getAddressTyped(),
176
- walletConnection.getNetwork(),
177
- walletConnection.getProvider(),
178
- ]);
179
-
180
- setAccount((prev) =>
181
- prev
182
- ? {
183
- ...prev,
184
- address: updatedAddr,
185
- addressTyped: updatedAddrTyped,
186
- network: updatedNet,
187
- provider: updatedProv,
188
- }
189
- : prev,
190
- );
191
- } catch {
192
- disconnect();
193
- }
194
- };
195
-
196
- /* store for later removal */
197
- listeners.current.disconnect = onDisconnect;
198
- listeners.current.accountsChanged = onAccountsChanged;
199
-
200
- instance.on('disconnect', onDisconnect);
201
- instance.on('accountsChanged', onAccountsChanged);
202
- }
203
- } catch (err) {
204
- console.warn('Unable to finalize wallet connection:', err);
205
- disconnect();
206
- }
207
- },
208
- [walletConnection, disconnect],
209
- );
210
-
211
- useDocumentComplete(() => {
212
- const stored = localStorage.getItem('walletType') as SupportedWallets | null;
213
- if (!stored) return;
214
-
215
- const controller = new AbortController();
216
- connect(stored, controller.signal).catch((err: unknown) => {
217
- if ((err as DOMException).name !== 'AbortError') {
218
- console.warn('Failed to reconnect to wallet:', err);
219
- }
220
- });
221
-
222
- return () => controller.abort();
223
- });
224
-
225
- const ctx: WalletContextType = {
226
- connect,
227
- disconnect,
228
- walletType,
229
- walletWindowInstance,
230
- account,
231
- };
232
-
233
- return <WalletContext.Provider value={ctx}>{children}</WalletContext.Provider>;
234
- };
235
-
236
- export const useWallet = (): WalletContextType => {
237
- const ctx = useContext(WalletContext);
238
- if (!ctx) throw new Error('useWallet must be used within a WalletProvider');
239
- return ctx;
240
- };