@sundaeswap/wallet-lite 0.0.84 → 0.0.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/classes/WalletObserver.class.js +31 -32
- package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js +28 -30
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +126 -109
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/esm/classes/WalletObserver.class.js +14 -14
- package/dist/esm/classes/WalletObserver.class.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +1 -1
- package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js +23 -13
- package/dist/esm/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +7 -6
- package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/types/classes/WalletObserver.class.d.ts +2 -2
- package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +2 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/classes/WalletObserver.class.ts +19 -16
- package/src/classes/__tests__/WalletObserver.test.ts +4 -0
- package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +1 -1
- package/src/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.ts +23 -13
- package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +107 -102
package/package.json
CHANGED
|
@@ -136,7 +136,6 @@ export class WalletObserver<
|
|
|
136
136
|
|
|
137
137
|
if (newNetwork instanceof Error) {
|
|
138
138
|
this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);
|
|
139
|
-
this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
|
|
140
139
|
this._performingSync = false;
|
|
141
140
|
throw newNetwork;
|
|
142
141
|
}
|
|
@@ -177,16 +176,11 @@ export class WalletObserver<
|
|
|
177
176
|
...result,
|
|
178
177
|
activeWallet: this.activeWallet!,
|
|
179
178
|
});
|
|
180
|
-
this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {
|
|
181
|
-
...result,
|
|
182
|
-
activeWallet: this.activeWallet!,
|
|
183
|
-
});
|
|
184
179
|
this._performingSync = false;
|
|
185
180
|
return result;
|
|
186
181
|
} catch (e) {
|
|
187
182
|
this._performingSync = false;
|
|
188
183
|
this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);
|
|
189
|
-
this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
|
|
190
184
|
throw e;
|
|
191
185
|
}
|
|
192
186
|
};
|
|
@@ -285,9 +279,11 @@ export class WalletObserver<
|
|
|
285
279
|
* 10 seconds before throw an error.
|
|
286
280
|
*
|
|
287
281
|
* @param {string} extension The name of the extension to enable.
|
|
288
|
-
* @return {Promise<
|
|
282
|
+
* @return {Promise<IWalletObserverSync<AssetMetadata> | Error>}
|
|
289
283
|
*/
|
|
290
|
-
connectWallet = async (
|
|
284
|
+
connectWallet = async (
|
|
285
|
+
extension: string,
|
|
286
|
+
): Promise<IWalletObserverSync<AssetMetadata> | Error> => {
|
|
291
287
|
const start = performance.now();
|
|
292
288
|
this.dispatch(EWalletObserverEvents.CONNECT_WALLET_START);
|
|
293
289
|
|
|
@@ -312,23 +308,24 @@ export class WalletObserver<
|
|
|
312
308
|
}
|
|
313
309
|
|
|
314
310
|
if (!extensionObject) {
|
|
311
|
+
this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
|
|
315
312
|
throw new Error("Wallet extension not found in the global context.");
|
|
316
313
|
}
|
|
317
314
|
|
|
318
|
-
const api = await this.syncApi(extension);
|
|
319
|
-
|
|
320
315
|
this.activeWallet = extension;
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
316
|
+
await this.syncApi(extension);
|
|
317
|
+
const data = await this.sync();
|
|
318
|
+
|
|
319
|
+
if (this._options.persistence) {
|
|
320
|
+
if (data.usedAddresses instanceof Error) {
|
|
321
|
+
data.usedAddresses.cause =
|
|
325
322
|
"Could not get a list of used addresses from the wallet when trying to save the connection.";
|
|
326
|
-
throw
|
|
323
|
+
throw data.usedAddresses;
|
|
327
324
|
}
|
|
328
325
|
|
|
329
326
|
const seed: IWalletObserverSeed = {
|
|
330
327
|
activeWallet: extension,
|
|
331
|
-
mainAddress:
|
|
328
|
+
mainAddress: data.usedAddresses[0],
|
|
332
329
|
};
|
|
333
330
|
|
|
334
331
|
window.localStorage.setItem(
|
|
@@ -337,10 +334,16 @@ export class WalletObserver<
|
|
|
337
334
|
);
|
|
338
335
|
}
|
|
339
336
|
|
|
337
|
+
this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {
|
|
338
|
+
...data,
|
|
339
|
+
activeWallet: extension,
|
|
340
|
+
});
|
|
340
341
|
const end = performance.now();
|
|
341
342
|
if (this._options.debug) {
|
|
342
343
|
console.log(`connectWallet: ${end - start}ms`);
|
|
343
344
|
}
|
|
345
|
+
|
|
346
|
+
return data;
|
|
344
347
|
};
|
|
345
348
|
|
|
346
349
|
getCip45Instance = async () => {
|
|
@@ -241,6 +241,10 @@ describe("WalletObserver", async () => {
|
|
|
241
241
|
).toBeNull();
|
|
242
242
|
expect(spiedDispatch).toHaveBeenNthCalledWith(
|
|
243
243
|
7,
|
|
244
|
+
EWalletObserverEvents.SYNCING_WALLET_START,
|
|
245
|
+
);
|
|
246
|
+
expect(spiedDispatch).toHaveBeenNthCalledWith(
|
|
247
|
+
11,
|
|
244
248
|
EWalletObserverEvents.DISCONNECT,
|
|
245
249
|
);
|
|
246
250
|
expect(spiedOnGetPeerConnect).not.toHaveBeenCalled();
|
|
@@ -27,7 +27,7 @@ const WalletObserverProvider: FC<
|
|
|
27
27
|
syncingWallet,
|
|
28
28
|
ready,
|
|
29
29
|
eventListenersAttached,
|
|
30
|
-
} = useProviderWalletObserverRef(options?.observerOptions);
|
|
30
|
+
} = useProviderWalletObserverRef(options?.observerOptions, options?.hooks);
|
|
31
31
|
const state = useWalletObserverState(observerRef.current);
|
|
32
32
|
|
|
33
33
|
useProviderRefreshInterval(
|
|
@@ -49,32 +49,42 @@ export const useProviderWalletObserverRef = (
|
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
const setConnectingStart =
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
const setConnectingStart = () => {
|
|
53
|
+
(async () => {
|
|
54
|
+
setConnecting(() => true);
|
|
55
|
+
await hooks?.onConnectWalletStart?.();
|
|
56
|
+
})().catch(console.error);
|
|
55
57
|
};
|
|
56
|
-
const setConnectingEnd =
|
|
58
|
+
const setConnectingEnd = (
|
|
57
59
|
data?: IWalletObserverSync<IAssetAmountMetadata> & {
|
|
58
60
|
activeWallet: string;
|
|
59
61
|
},
|
|
60
62
|
) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
(async () => {
|
|
64
|
+
setConnecting(() => false);
|
|
65
|
+
await hooks?.onConnectWalletEnd?.(data);
|
|
66
|
+
})().catch(console.error);
|
|
63
67
|
};
|
|
64
|
-
const setSyncingStart =
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
const setSyncingStart = () => {
|
|
69
|
+
(async () => {
|
|
70
|
+
setSyncing(() => true);
|
|
71
|
+
await hooks?.onSyncWalletStart?.();
|
|
72
|
+
})().catch(console.error);
|
|
67
73
|
};
|
|
68
|
-
const setSyncingEnd =
|
|
74
|
+
const setSyncingEnd = (
|
|
69
75
|
data?: IWalletObserverSync<IAssetAmountMetadata> & {
|
|
70
76
|
activeWallet: string;
|
|
71
77
|
},
|
|
72
78
|
) => {
|
|
73
|
-
|
|
74
|
-
|
|
79
|
+
(async () => {
|
|
80
|
+
await hooks?.onSyncWalletEnd?.(data);
|
|
81
|
+
setSyncing(() => false);
|
|
82
|
+
})().catch(console.error);
|
|
75
83
|
};
|
|
76
84
|
const onDisconnect = () => {
|
|
77
|
-
|
|
85
|
+
(async () => {
|
|
86
|
+
hooks?.onDisconnectWallet?.();
|
|
87
|
+
})().catch(console.error);
|
|
78
88
|
};
|
|
79
89
|
|
|
80
90
|
observerRef.current.addEventListener(
|
|
@@ -2,6 +2,7 @@ import type { TransactionUnspentOutput } from "@cardano-sdk/core/dist/cjs/Serial
|
|
|
2
2
|
import { AssetAmount, IAssetAmountMetadata } from "@sundaeswap/asset";
|
|
3
3
|
import { useCallback, useEffect, useState, useTransition } from "react";
|
|
4
4
|
|
|
5
|
+
import { IWalletObserverSync } from "src/@types/observer.js";
|
|
5
6
|
import { WalletBalanceMap } from "../../../classes/WalletBalanceMap.class.js";
|
|
6
7
|
import { WalletObserver } from "../../../classes/WalletObserver.class.js";
|
|
7
8
|
import { ADA_ASSET_ID } from "../../../constants.js";
|
|
@@ -66,127 +67,131 @@ export const useWalletObserverState = <
|
|
|
66
67
|
setSwitching(() => true);
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
await observer.connectWallet(wallet);
|
|
70
|
-
await syncWallet();
|
|
70
|
+
const data = await observer.connectWallet(wallet);
|
|
71
|
+
await syncWallet(data instanceof Error ? undefined : data);
|
|
71
72
|
setSwitching(() => false);
|
|
72
73
|
return observer.api;
|
|
73
74
|
},
|
|
74
75
|
[observer, setSwitching],
|
|
75
76
|
);
|
|
76
77
|
|
|
77
|
-
const syncWallet = useCallback(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
prevBalance
|
|
103
|
-
|
|
104
|
-
|
|
78
|
+
const syncWallet = useCallback(
|
|
79
|
+
async (importedData?: IWalletObserverSync<AssetMetadata> | undefined) => {
|
|
80
|
+
if (observer.isSyncing() || !observer.hasActiveConnection()) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const newWallet = observer.activeWallet;
|
|
85
|
+
if (!newWallet) {
|
|
86
|
+
disconnect();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
setIsCip45(newWallet.includes("p2p"));
|
|
91
|
+
setActiveWallet((prevWallet) =>
|
|
92
|
+
newWallet === prevWallet ? prevWallet : newWallet,
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
const freshData = importedData || (await observer.sync());
|
|
97
|
+
|
|
98
|
+
startTransition(() => {
|
|
99
|
+
const newBalanceMap = freshData.balanceMap;
|
|
100
|
+
if (newBalanceMap instanceof WalletBalanceMap) {
|
|
101
|
+
const newAdaBalance = newBalanceMap.get(ADA_ASSET_ID);
|
|
102
|
+
if (newAdaBalance) {
|
|
103
|
+
setAdaBalance((prevBalance) =>
|
|
104
|
+
prevBalance.amount === newAdaBalance.amount
|
|
105
|
+
? prevBalance
|
|
106
|
+
: newAdaBalance,
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
setBalance((prevBalance) =>
|
|
110
|
+
areAssetMapsEqual(prevBalance, newBalanceMap)
|
|
111
|
+
? prevBalance
|
|
112
|
+
: newBalanceMap,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const newUsedAddresses = freshData.usedAddresses;
|
|
118
|
+
if (newUsedAddresses instanceof Array) {
|
|
119
|
+
setUsedAddresses((prevValue) => {
|
|
120
|
+
return JSON.stringify(prevValue) ===
|
|
121
|
+
JSON.stringify(newUsedAddresses)
|
|
122
|
+
? prevValue
|
|
123
|
+
: newUsedAddresses;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const newUnusedAddresses = freshData.unusedAddresses;
|
|
128
|
+
if (newUnusedAddresses instanceof Array) {
|
|
129
|
+
setUnusedAddresses((prevValue) =>
|
|
130
|
+
JSON.stringify(prevValue) === JSON.stringify(newUnusedAddresses)
|
|
131
|
+
? prevValue
|
|
132
|
+
: newUnusedAddresses,
|
|
105
133
|
);
|
|
134
|
+
}
|
|
106
135
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
136
|
+
const newNetwork = freshData.network;
|
|
137
|
+
if (typeof newNetwork === "number") {
|
|
138
|
+
setNetwork((prevValue) =>
|
|
139
|
+
prevValue === newNetwork ? prevValue : newNetwork,
|
|
111
140
|
);
|
|
112
141
|
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const newUsedAddresses = freshData.usedAddresses;
|
|
116
|
-
if (newUsedAddresses instanceof Array) {
|
|
117
|
-
setUsedAddresses((prevValue) => {
|
|
118
|
-
return JSON.stringify(prevValue) ===
|
|
119
|
-
JSON.stringify(newUsedAddresses)
|
|
120
|
-
? prevValue
|
|
121
|
-
: newUsedAddresses;
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const newUnusedAddresses = freshData.unusedAddresses;
|
|
126
|
-
if (newUnusedAddresses instanceof Array) {
|
|
127
|
-
setUnusedAddresses((prevValue) =>
|
|
128
|
-
JSON.stringify(prevValue) === JSON.stringify(newUnusedAddresses)
|
|
129
|
-
? prevValue
|
|
130
|
-
: newUnusedAddresses,
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const newNetwork = freshData.network;
|
|
135
|
-
if (typeof newNetwork === "number") {
|
|
136
|
-
setNetwork((prevValue) =>
|
|
137
|
-
prevValue === newNetwork ? prevValue : newNetwork,
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const newUtxos = freshData.utxos;
|
|
142
|
-
if (newUtxos instanceof Array) {
|
|
143
|
-
setUtxos((prevValue) => {
|
|
144
|
-
const prevValueRep = prevValue?.map((v) => v.toCbor());
|
|
145
|
-
const newValueRep = newUtxos?.map((v) => v.toCbor());
|
|
146
|
-
if (prevValueRep !== newValueRep) {
|
|
147
|
-
return newUtxos;
|
|
148
|
-
}
|
|
149
142
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
143
|
+
const newUtxos = freshData.utxos;
|
|
144
|
+
if (newUtxos instanceof Array) {
|
|
145
|
+
setUtxos((prevValue) => {
|
|
146
|
+
const prevValueRep = prevValue?.map((v) => v.toCbor());
|
|
147
|
+
const newValueRep = newUtxos?.map((v) => v.toCbor());
|
|
148
|
+
if (prevValueRep !== newValueRep) {
|
|
149
|
+
return newUtxos;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return prevValue;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const newCollateral = freshData.collateral;
|
|
157
|
+
if (newCollateral instanceof Array) {
|
|
158
|
+
setCollateral((prevValue) => {
|
|
159
|
+
const prevValueRep = prevValue?.map((v) => v.toCbor());
|
|
160
|
+
const newValueRep = newCollateral?.map((v) => v.toCbor());
|
|
161
|
+
if (prevValueRep !== newValueRep) {
|
|
162
|
+
return newCollateral;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return prevValue;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
162
168
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
}, [observer, disconnect]);
|
|
169
|
+
const newFeeAddress = freshData.feeAddress;
|
|
170
|
+
if (typeof newFeeAddress === "string") {
|
|
171
|
+
setFeeAddress((prevValue) =>
|
|
172
|
+
prevValue === newFeeAddress ? prevValue : newFeeAddress,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
} catch (e) {
|
|
177
|
+
setErrorSyncing(true);
|
|
178
|
+
(e as Error).cause =
|
|
179
|
+
"The wallet threw an error while the app was trying to sync with it. Please try again or contact your wallet provider.";
|
|
180
|
+
throw e;
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
[observer, disconnect],
|
|
184
|
+
);
|
|
181
185
|
|
|
182
186
|
/**
|
|
183
187
|
* Ensure the wallet syncs on connect and disconnect.
|
|
184
188
|
*/
|
|
185
189
|
useEffect(() => {
|
|
186
|
-
|
|
190
|
+
const func = () => syncWallet();
|
|
191
|
+
window.addEventListener("focus", func);
|
|
187
192
|
|
|
188
193
|
return () => {
|
|
189
|
-
window.addEventListener("focus",
|
|
194
|
+
window.addEventListener("focus", func);
|
|
190
195
|
};
|
|
191
196
|
}, [syncWallet]);
|
|
192
197
|
|