@sundaeswap/wallet-lite 0.0.55 → 0.0.57
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/@types/observer.js.map +1 -1
- package/dist/cjs/classes/WalletObserver.class.js +27 -35
- package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/cjs/react-components/hooks/useAvailableExtensions.js +51 -59
- package/dist/cjs/react-components/hooks/useAvailableExtensions.js.map +1 -1
- package/dist/cjs/react-components/hooks/useWalletHandles.js +7 -10
- package/dist/cjs/react-components/hooks/useWalletHandles.js.map +1 -1
- package/dist/cjs/utils/getLibs.js +26 -1
- package/dist/cjs/utils/getLibs.js.map +1 -1
- package/dist/esm/@types/observer.js.map +1 -1
- package/dist/esm/classes/WalletObserver.class.js +4 -12
- package/dist/esm/classes/WalletObserver.class.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/esm/react-components/hooks/useAvailableExtensions.js +39 -35
- package/dist/esm/react-components/hooks/useAvailableExtensions.js.map +1 -1
- package/dist/esm/react-components/hooks/useWalletHandles.js +3 -2
- package/dist/esm/react-components/hooks/useWalletHandles.js.map +1 -1
- package/dist/esm/utils/getLibs.js +10 -0
- package/dist/esm/utils/getLibs.js.map +1 -1
- package/dist/types/@types/observer.d.ts +3 -7
- package/dist/types/@types/observer.d.ts.map +1 -1
- package/dist/types/classes/WalletObserver.class.d.ts +5 -12
- package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/WalletObserverProvider.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +3 -4
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
- package/dist/types/react-components/hooks/useAvailableExtensions.d.ts +3 -3
- package/dist/types/react-components/hooks/useAvailableExtensions.d.ts.map +1 -1
- package/dist/types/react-components/hooks/useWalletHandles.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/utils/getLibs.d.ts +5 -0
- package/dist/types/utils/getLibs.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/@types/observer.ts +4 -21
- package/src/classes/WalletObserver.class.ts +12 -29
- package/src/classes/__tests__/WalletObserver.test.ts +9 -22
- package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +3 -5
- package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +2 -4
- package/src/react-components/__tests__/__snapshots__/RenderWalletHandles.test.tsx.snap +0 -2
- package/src/react-components/__tests__/hooks/useAvailableExtensions.test.tsx +8 -6
- package/src/react-components/hooks/useAvailableExtensions.ts +52 -42
- package/src/react-components/hooks/useWalletHandles.ts +4 -6
- package/src/utils/getLibs.ts +11 -0
|
@@ -4,4 +4,9 @@ export declare const getCardanoCore: () => Promise<{
|
|
|
4
4
|
}>;
|
|
5
5
|
export declare const getCardanoUtil: () => Promise<(<T>(value: string, length?: number | undefined) => T)>;
|
|
6
6
|
export declare const getPeerConnect: () => Promise<typeof import("@fabianbormann/cardano-peer-connect").DAppPeerConnect>;
|
|
7
|
+
export declare const getHandleLib: () => Promise<{
|
|
8
|
+
HandleClient: typeof import("@koralabs/adahandle-sdk").default;
|
|
9
|
+
HandleClientContext: typeof import("@koralabs/adahandle-sdk").HandleClientContext;
|
|
10
|
+
KoraLabsProvider: typeof import("@koralabs/adahandle-sdk").KoraLabsProvider;
|
|
11
|
+
}>;
|
|
7
12
|
//# sourceMappingURL=getLibs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLibs.d.ts","sourceRoot":"","sources":["../../../src/utils/getLibs.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;EAO1B,CAAC;AAEF,eAAO,MAAM,cAAc,uEAI1B,CAAC;AAEF,eAAO,MAAM,cAAc,qFAI1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"getLibs.d.ts","sourceRoot":"","sources":["../../../src/utils/getLibs.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;EAO1B,CAAC;AAEF,eAAO,MAAM,cAAc,uEAI1B,CAAC;AAEF,eAAO,MAAM,cAAc,qFAI1B,CAAC;AAEF,eAAO,MAAM,YAAY;;;;EASxB,CAAC"}
|
package/package.json
CHANGED
package/src/@types/observer.ts
CHANGED
|
@@ -8,24 +8,6 @@ import { WalletAssetMap } from "../classes/WalletAssetMap.class.js";
|
|
|
8
8
|
import { WalletBalanceMap } from "../classes/WalletBalanceMap.class.js";
|
|
9
9
|
import { isAdaAsset, normalizeAssetIdWithDot } from "../utils/assets.js";
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
* A list of support CIP-30 wallet extensions in the browser.
|
|
13
|
-
*/
|
|
14
|
-
export type TSupportedWalletExtensions =
|
|
15
|
-
| "nami"
|
|
16
|
-
| "eternl"
|
|
17
|
-
| "typhoncip30"
|
|
18
|
-
| "ccvault"
|
|
19
|
-
| "typhon"
|
|
20
|
-
| "yoroi"
|
|
21
|
-
| "flint"
|
|
22
|
-
| "gerowallet"
|
|
23
|
-
| "cardwallet"
|
|
24
|
-
| "nufi"
|
|
25
|
-
| "begin"
|
|
26
|
-
| "lace"
|
|
27
|
-
| "sorbet";
|
|
28
|
-
|
|
29
11
|
/**
|
|
30
12
|
* Interface to describe window extension.
|
|
31
13
|
*/
|
|
@@ -34,14 +16,15 @@ export interface IWindowCip30Extension {
|
|
|
34
16
|
enable: () => Promise<Cip30WalletApi>;
|
|
35
17
|
icon: string;
|
|
36
18
|
isEnabled: () => Promise<boolean>;
|
|
37
|
-
name:
|
|
19
|
+
name: string;
|
|
38
20
|
}
|
|
39
21
|
|
|
40
22
|
/**
|
|
41
23
|
* Interface to describe our expected window configuration.
|
|
42
24
|
*/
|
|
43
25
|
export type TWindowCardano = {
|
|
44
|
-
|
|
26
|
+
// eslint-disable-next-line
|
|
27
|
+
[key: string]: any;
|
|
45
28
|
};
|
|
46
29
|
|
|
47
30
|
/**
|
|
@@ -93,7 +76,7 @@ export type TAssetAmountMap<
|
|
|
93
76
|
* data located in local storage.
|
|
94
77
|
*/
|
|
95
78
|
export interface IWalletObserverSeed {
|
|
96
|
-
activeWallet:
|
|
79
|
+
activeWallet: string;
|
|
97
80
|
mainAddress: string;
|
|
98
81
|
}
|
|
99
82
|
|
|
@@ -14,7 +14,6 @@ import type {
|
|
|
14
14
|
IWalletObserverSeed,
|
|
15
15
|
IWalletObserverSync,
|
|
16
16
|
TMetadataResolverFunc,
|
|
17
|
-
TSupportedWalletExtensions,
|
|
18
17
|
TWalletObserverOptions,
|
|
19
18
|
} from "../@types/observer.js";
|
|
20
19
|
import { isAdaAsset, normalizeAssetIdWithDot } from "../utils/assets.js";
|
|
@@ -48,20 +47,12 @@ export class WalletObserver<
|
|
|
48
47
|
static ADA_ASSET_ID = "ada.lovelace";
|
|
49
48
|
public network: number = 0;
|
|
50
49
|
public api?: Cip30WalletApi;
|
|
51
|
-
public activeWallet?:
|
|
50
|
+
public activeWallet?: string;
|
|
52
51
|
public utils?: WalletObserverUtils;
|
|
53
52
|
public peerConnectInstance?: import("@fabianbormann/cardano-peer-connect").DAppPeerConnect;
|
|
54
53
|
|
|
55
54
|
private _performingSync: boolean = false;
|
|
56
55
|
private _options: IResolvedWalletObserverOptions<AssetMetadata>;
|
|
57
|
-
private _supportedExtensions: TSupportedWalletExtensions[] = [
|
|
58
|
-
"eternl",
|
|
59
|
-
"lace",
|
|
60
|
-
"typhon",
|
|
61
|
-
"sorbet",
|
|
62
|
-
"flint",
|
|
63
|
-
"nami",
|
|
64
|
-
];
|
|
65
56
|
|
|
66
57
|
// Caching
|
|
67
58
|
private _cachedMetadata: Map<string, AssetMetadata> = new Map();
|
|
@@ -92,7 +83,7 @@ export class WalletObserver<
|
|
|
92
83
|
},
|
|
93
84
|
onApiInject: (name, address) => {
|
|
94
85
|
options?.peerConnectArgs?.onApiInject?.(name, address);
|
|
95
|
-
this.connectWallet(name
|
|
86
|
+
this.connectWallet(name);
|
|
96
87
|
},
|
|
97
88
|
verifyConnection(walletInfo, callback) {
|
|
98
89
|
return callback(true, walletInfo.requestAutoconnect ?? true);
|
|
@@ -217,11 +208,11 @@ export class WalletObserver<
|
|
|
217
208
|
* Synchronizes the API with the wallet. This is useful if the account has changed,
|
|
218
209
|
* but the underlying intent has not.
|
|
219
210
|
*
|
|
220
|
-
* @param {
|
|
211
|
+
* @param {string} [activeWallet] - The wallet to sync with.
|
|
221
212
|
* @returns {Promise<Cip30WalletApi | undefined>} - A promise that resolves to the API instance.
|
|
222
213
|
*/
|
|
223
214
|
syncApi = async (
|
|
224
|
-
activeWallet?:
|
|
215
|
+
activeWallet?: string,
|
|
225
216
|
): Promise<Cip30WalletApi | undefined> => {
|
|
226
217
|
if (!activeWallet && !this.activeWallet) {
|
|
227
218
|
throw new Error(
|
|
@@ -229,8 +220,7 @@ export class WalletObserver<
|
|
|
229
220
|
);
|
|
230
221
|
}
|
|
231
222
|
|
|
232
|
-
const selectedWallet =
|
|
233
|
-
activeWallet || (this.activeWallet as TSupportedWalletExtensions);
|
|
223
|
+
const selectedWallet = (activeWallet || this.activeWallet) as string;
|
|
234
224
|
|
|
235
225
|
let attempts = 0;
|
|
236
226
|
let shouldContinue = true;
|
|
@@ -243,7 +233,8 @@ export class WalletObserver<
|
|
|
243
233
|
}
|
|
244
234
|
|
|
245
235
|
try {
|
|
246
|
-
const
|
|
236
|
+
const cardano = window?.cardano || window?.parent?.cardano;
|
|
237
|
+
const api = await cardano?.[selectedWallet]?.enable();
|
|
247
238
|
|
|
248
239
|
if (!api) {
|
|
249
240
|
throw Error;
|
|
@@ -254,7 +245,10 @@ export class WalletObserver<
|
|
|
254
245
|
shouldContinue = false;
|
|
255
246
|
} catch (e) {
|
|
256
247
|
if (
|
|
257
|
-
|
|
248
|
+
[
|
|
249
|
+
"user canceled connection",
|
|
250
|
+
"User declined to sign the data.",
|
|
251
|
+
].includes((e as Error)?.message) ||
|
|
258
252
|
(e as ApiError)?.code === APIErrorCode.Refused
|
|
259
253
|
) {
|
|
260
254
|
shouldContinue = false;
|
|
@@ -286,9 +280,7 @@ export class WalletObserver<
|
|
|
286
280
|
* @param {string} extension The name of the extension to enable.
|
|
287
281
|
* @return {Promise<void>}
|
|
288
282
|
*/
|
|
289
|
-
connectWallet = async (
|
|
290
|
-
extension: TSupportedWalletExtensions,
|
|
291
|
-
): Promise<void> => {
|
|
283
|
+
connectWallet = async (extension: string): Promise<void> => {
|
|
292
284
|
const start = performance.now();
|
|
293
285
|
this.dispatch(EWalletObserverEvents.CONNECT_WALLET_START);
|
|
294
286
|
|
|
@@ -366,15 +358,6 @@ export class WalletObserver<
|
|
|
366
358
|
getCachedAssetMetadata = (): Map<string, AssetMetadata> =>
|
|
367
359
|
this._cachedMetadata;
|
|
368
360
|
|
|
369
|
-
/**
|
|
370
|
-
* Helper function to retrieve a list of supported wallet extensions.
|
|
371
|
-
*
|
|
372
|
-
* @returns {keyof TSupportedWalletExtensions[] | undefined}
|
|
373
|
-
*/
|
|
374
|
-
getSupportedExtensions = (): TSupportedWalletExtensions[] => {
|
|
375
|
-
return this._supportedExtensions;
|
|
376
|
-
};
|
|
377
|
-
|
|
378
361
|
/**
|
|
379
362
|
* Helper function to restore the class instance to its initial state.
|
|
380
363
|
*
|
|
@@ -59,14 +59,6 @@ describe("WalletObserver", async () => {
|
|
|
59
59
|
expect(observer.activeWallet).toBeUndefined();
|
|
60
60
|
expect(observer.network).toEqual(0);
|
|
61
61
|
expect(observer.api).toBeUndefined();
|
|
62
|
-
expect(observer.getSupportedExtensions()).toEqual([
|
|
63
|
-
"eternl",
|
|
64
|
-
"lace",
|
|
65
|
-
"typhon",
|
|
66
|
-
"sorbet",
|
|
67
|
-
"flint",
|
|
68
|
-
"nami",
|
|
69
|
-
]);
|
|
70
62
|
expect(observer.peerConnectInstance).toBeUndefined();
|
|
71
63
|
expect(observer.getOptions()).toMatchObject({
|
|
72
64
|
metadataResolver: expect.anything(),
|
|
@@ -91,13 +83,13 @@ describe("WalletObserver", async () => {
|
|
|
91
83
|
});
|
|
92
84
|
|
|
93
85
|
test("with parameters", () => {
|
|
94
|
-
const handler: TMetadataResolverFunc<IAssetAmountMetadata> = async (
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
) => {
|
|
98
|
-
const metadata =
|
|
86
|
+
const handler: TMetadataResolverFunc<IAssetAmountMetadata> = async ({
|
|
87
|
+
assetIds,
|
|
88
|
+
normalizeAssetId,
|
|
89
|
+
}) => {
|
|
90
|
+
const metadata = assetIds.map((id) => ({ decimals: 6, assetId: id }));
|
|
99
91
|
const map = new Map<string, IAssetAmountMetadata>();
|
|
100
|
-
metadata.forEach((m) => map.set(
|
|
92
|
+
metadata.forEach((m) => map.set(normalizeAssetId(m.assetId), m));
|
|
101
93
|
return map;
|
|
102
94
|
};
|
|
103
95
|
const observer = new WalletObserver({
|
|
@@ -117,14 +109,6 @@ describe("WalletObserver", async () => {
|
|
|
117
109
|
expect(observer.activeWallet).toBeUndefined();
|
|
118
110
|
expect(observer.network).toEqual(0);
|
|
119
111
|
expect(observer.api).toBeUndefined();
|
|
120
|
-
expect(observer.getSupportedExtensions()).toEqual([
|
|
121
|
-
"eternl",
|
|
122
|
-
"lace",
|
|
123
|
-
"typhon",
|
|
124
|
-
"sorbet",
|
|
125
|
-
"flint",
|
|
126
|
-
"nami",
|
|
127
|
-
]);
|
|
128
112
|
expect(observer.getOptions()).toMatchObject({
|
|
129
113
|
metadataResolver: handler,
|
|
130
114
|
persistence: true,
|
|
@@ -297,6 +281,9 @@ describe("WalletObserver", async () => {
|
|
|
297
281
|
|
|
298
282
|
data.instance.shutdownServer();
|
|
299
283
|
expect(spiedOnDisconnect).toHaveBeenCalled();
|
|
284
|
+
|
|
285
|
+
// Restore window.
|
|
286
|
+
delete window.cardano?.["eternl-p2p"];
|
|
300
287
|
});
|
|
301
288
|
});
|
|
302
289
|
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { FC, PropsWithChildren, useEffect, useMemo } from "react";
|
|
2
2
|
|
|
3
|
-
import { TSupportedWalletExtensions } from "../../@types/observer.js";
|
|
4
3
|
import { WalletObserver } from "../../classes/WalletObserver.class.js";
|
|
5
4
|
import {
|
|
6
5
|
IWalletObserverProviderProps,
|
|
@@ -71,10 +70,9 @@ const WalletObserverProvider: FC<
|
|
|
71
70
|
return;
|
|
72
71
|
}
|
|
73
72
|
|
|
74
|
-
const wallet
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
) as TSupportedWalletExtensions;
|
|
73
|
+
const wallet = window.localStorage.getItem(
|
|
74
|
+
WalletObserver.PERSISTENCE_CACHE_KEY,
|
|
75
|
+
);
|
|
78
76
|
|
|
79
77
|
if (wallet && observerRef.current?.getOptions()?.persistence) {
|
|
80
78
|
state.connectWallet(JSON.parse(wallet).activeWallet);
|
|
@@ -2,7 +2,6 @@ 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 { TSupportedWalletExtensions } from "../../../@types/observer.js";
|
|
6
5
|
import { WalletBalanceMap } from "../../../classes/WalletBalanceMap.class.js";
|
|
7
6
|
import { WalletObserver } from "../../../classes/WalletObserver.class.js";
|
|
8
7
|
import { areAssetMapsEqual } from "../../../utils/comparisons.js";
|
|
@@ -18,8 +17,7 @@ export const useWalletObserverState = <
|
|
|
18
17
|
>(
|
|
19
18
|
observer: WalletObserver<AssetMetadata>,
|
|
20
19
|
) => {
|
|
21
|
-
const [activeWallet, setActiveWallet] =
|
|
22
|
-
useState<TSupportedWalletExtensions>();
|
|
20
|
+
const [activeWallet, setActiveWallet] = useState<string>();
|
|
23
21
|
const [adaBalance, setAdaBalance] = useState<AssetAmount<AssetMetadata>>(
|
|
24
22
|
new AssetAmount<AssetMetadata>(0n),
|
|
25
23
|
);
|
|
@@ -134,7 +132,7 @@ export const useWalletObserverState = <
|
|
|
134
132
|
}, [observer, disconnect]);
|
|
135
133
|
|
|
136
134
|
const connectWallet = useCallback(
|
|
137
|
-
async (wallet:
|
|
135
|
+
async (wallet: string) => {
|
|
138
136
|
if (observer.hasActiveConnection() && wallet !== observer.activeWallet) {
|
|
139
137
|
setSwitching(() => true);
|
|
140
138
|
}
|
|
@@ -3,5 +3,3 @@
|
|
|
3
3
|
exports[`RenderWalletHandles should successfully update state with handle metadata 1`] = `"<pre>falsefalse<button data-testid="connect-with-handles"></button></pre>"`;
|
|
4
4
|
|
|
5
5
|
exports[`RenderWalletHandles should successfully update state with handle metadata 2`] = `"<pre>eternltruefalse00c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0000c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d000c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e855cd3dbc30bad8ac8fffbed87d36325b407a8e934b1507725fcd80121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00129ee829b3cea5762f0c1077db667390a9ee007825a0ed7b1150d35d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00d98f028bd372ed61079c6ed5083e3a977d69ab5d0b17b25bc87343dd121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00c888866b693e1ae8cb237351ba4bdc7e16882a1dc4a53d4de0537e56121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0082d061e45a1ff5b30de61d3d1137e6ebdd44d6056be88a44d547b5a3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,009de2d448e439c970d94bf483f8bcc0eb47040d3f293e096a580d3aca121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00da3f1060013b6e9be44cd2890a6f20f524d2071d22410a5264de115b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00d1c9c1d95ce5ee7e666cc83b2b56dd25d82f0c91b5c34175fd8448b6121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0002659dc406e1d51c2695bc23962b30487d3ceb995beb13b698509c6f121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00c46c44a29807de8fa23693b3da1c1976ebe8858f74199ca840b557ee121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,005d48e3d5655bf8a05eda49ea6683ccaf5351d505c38ae7ad43cbd4ab121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0095f329c349c57bd4bcf021c8a96e68eca384627fee9ebea56ff8167d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0081378bb3d576f8dce84a9bb6d6761530ef8088f335d231bd98eaedc3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0070fc9c5a5d80650a87dce6dc4ea9a066f3185352e89f946165995593121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,008063fa1c1fb41cafd24f484e2a7d0014202ffef9407af05bf4279889121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00134fd13220198b9e8d0523cec39465b2bf3400fdeca305bf88fe0bb2121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00fccd5b37e433d56779cf1beb43440415eaca903ca92c61de2bbf0c72121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,003c0b43dcb3cee0988607c478f11c5c657cb31ebeafe495d8eca5b4ee121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,002e0f369f4fabf5f314fd2dbd34e7d6a03d0336b8d974f2208c75bc34121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00d38956d5d8c3e996880298b8e1534679e285f93475cf6aa3256205c7121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00486dede781535d8ff49d9a0dadeb5c0d38ef150f6fc80180921ebe85121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,002ea947a2d3c0c95ca5124f6b61b83a5f4e0b71223f863be838831168121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00b7a6f578ed78826a3c32cadf5ede889ee350e43c4d11f8f9b94cb03e121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e1a7fdf8d8010e238948dec7150e84fd158acdeaa76c200d8a4b1f63121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00af0a05d243de50100af100863c88b4f6524fa4ee86a84127cf15b82b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0022de41ad5b3628ecd8686bce555846bedde16ea7881bd63abf9198e2121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0075fcbf24479728322e5f128c84c15c27aeea10196f56d1ff44d40b94121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00be01633e07d001fff611b3d39ac3ca89127acecef79aabb812cea125121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,005b819971068bae01c3d411f2b5b8a12331df4d9fbeb899c0a59afb9e121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0018edec9fc995f6ea029f87b6142efdd4a132cbe4f3c14cdad54e1362121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00ce805857db7601ac7af226290a0f0bee4608736fea251b8813359805121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,008911a9404ee35265e5b39ca1e38a5d64a67384307bc47ea5b1c2f1f3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00b80d7dfef9f0e989a62aabdbc9aec4703bc38dcc0363bcb902aad20f121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00a3aabe29cf0d4cf0acd9c0c4231e69ae145e426fd40d9bc089117416121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,001f64ff5164c16467e229f4305e5cd05cea85f407d68ba5c8f33f6d5d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00c1ce344ee9f695a9bfa4230254c0008aa62cf09f5f4444f6ece352d8121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00412be6abc6a8d58aa914bed006e77c0e8e6870a5405a0a00db9119b0121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00ebc9713be7aa719a00d2be641418b59747b8ba846e1687253d6667b5121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00b5c852e07c831c968ae7e0388bd0ed591097238ca3a3742367facf0f121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e10a1ec68fe34887f87c4badc81f93c2d69999614683cf05c8e97069121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0066de96d2a1c75f99185f4d5a39e49adccf18515cc512c5a7392b98cc121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0032c425519672bec473a8971a79a2758356ad24ee99353c7020fd5cac121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0036e19cee7f33f141d34fbb899c27a68900ac6593f082edfbe6fc3fe5121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,001280d6db873a83fa7908f1416acbbc189624b392be7935ba787f3cb9121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00ce1657bbdc8cceabecad61bb8bff3f9865d7c46170c6555c9e406aa0121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00de2d51517b76fcb141908bfa07a93f1bf93b92124838d2ed24022819121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e35880324d3302478a8c48cc9c71b81710b50f8fb444a5a56462e4b5121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00eb4b163aa81b319275f796b7b19b50c945604f47f807a5a5b5acd19a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0016f85346dc9b1efccaa9a69e357b49d7a25c03936ea5d05ede3cfca0121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,004746a8792a9eb11769d7593eeb4d0bf1be04d68c00ef50d2752c4d02121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00f0ccab792b8e74acca2e08533b805afc59a38671c3c68d337f16c185121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0061831490182c6c68168cddf4c995dca27c8b8b144b2643a010f938bc121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,001a150c13e1b5a2c6f5aa49e53ce9fc20e06d844ff162fcbd691624cd121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00631b6ceb11ddd4afc4ed3d098f978ff0bfbceda084f263dfebca0e9b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00f282664fba7a04a7e2c3e782e6a23153ea5384b4c680d9dc1a98959b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e594ceb9f74bd9fb58473f225f443dbd7be9ad76ab1c45925fe1d8ee121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00f9369f45d0ae6a0ac710a02cf92277c091ef548e493e1fccb8b149e3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,007b1da5a2d2cdac17fba68066eb5cb135776f0badd0ec77790115f34d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00dfcdec7a63f0e2422e938cdf3df012a9eefeccb0c835e56419fe345c121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,009da13e2ed25bdc1df37e3eef351aaee057ac926cedd1bb1ce02122d4121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0033b94204fa0c33953e26834572de06f89496dd9b910c98d622e21612121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,60c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a,60e855cd3dbc30bad8ac8fffbed87d36325b407a8e934b1507725fcd80,60129ee829b3cea5762f0c1077db667390a9ee007825a0ed7b1150d35d,60d98f028bd372ed61079c6ed5083e3a977d69ab5d0b17b25bc87343dd,60c888866b693e1ae8cb237351ba4bdc7e16882a1dc4a53d4de0537e56,6082d061e45a1ff5b30de61d3d1137e6ebdd44d6056be88a44d547b5a3,609de2d448e439c970d94bf483f8bcc0eb47040d3f293e096a580d3aca,60da3f1060013b6e9be44cd2890a6f20f524d2071d22410a5264de115b,60d1c9c1d95ce5ee7e666cc83b2b56dd25d82f0c91b5c34175fd8448b6,6002659dc406e1d51c2695bc23962b30487d3ceb995beb13b698509c6f,60c46c44a29807de8fa23693b3da1c1976ebe8858f74199ca840b557ee,605d48e3d5655bf8a05eda49ea6683ccaf5351d505c38ae7ad43cbd4ab,6095f329c349c57bd4bcf021c8a96e68eca384627fee9ebea56ff8167d,6081378bb3d576f8dce84a9bb6d6761530ef8088f335d231bd98eaedc3,6070fc9c5a5d80650a87dce6dc4ea9a066f3185352e89f946165995593,608063fa1c1fb41cafd24f484e2a7d0014202ffef9407af05bf4279889,60134fd13220198b9e8d0523cec39465b2bf3400fdeca305bf88fe0bb2,60fccd5b37e433d56779cf1beb43440415eaca903ca92c61de2bbf0c72,603c0b43dcb3cee0988607c478f11c5c657cb31ebeafe495d8eca5b4ee,602e0f369f4fabf5f314fd2dbd34e7d6a03d0336b8d974f2208c75bc34,60d38956d5d8c3e996880298b8e1534679e285f93475cf6aa3256205c7,60486dede781535d8ff49d9a0dadeb5c0d38ef150f6fc80180921ebe85,602ea947a2d3c0c95ca5124f6b61b83a5f4e0b71223f863be838831168,60b7a6f578ed78826a3c32cadf5ede889ee350e43c4d11f8f9b94cb03e,60e1a7fdf8d8010e238948dec7150e84fd158acdeaa76c200d8a4b1f63,60af0a05d243de50100af100863c88b4f6524fa4ee86a84127cf15b82b,6022de41ad5b3628ecd8686bce555846bedde16ea7881bd63abf9198e2,6075fcbf24479728322e5f128c84c15c27aeea10196f56d1ff44d40b94,60be01633e07d001fff611b3d39ac3ca89127acecef79aabb812cea125,605b819971068bae01c3d411f2b5b8a12331df4d9fbeb899c0a59afb9e,6018edec9fc995f6ea029f87b6142efdd4a132cbe4f3c14cdad54e1362,60ce805857db7601ac7af226290a0f0bee4608736fea251b8813359805,608911a9404ee35265e5b39ca1e38a5d64a67384307bc47ea5b1c2f1f3,60b80d7dfef9f0e989a62aabdbc9aec4703bc38dcc0363bcb902aad20f,60a3aabe29cf0d4cf0acd9c0c4231e69ae145e426fd40d9bc089117416,601f64ff5164c16467e229f4305e5cd05cea85f407d68ba5c8f33f6d5d,60c1ce344ee9f695a9bfa4230254c0008aa62cf09f5f4444f6ece352d8,60412be6abc6a8d58aa914bed006e77c0e8e6870a5405a0a00db9119b0,60ebc9713be7aa719a00d2be641418b59747b8ba846e1687253d6667b5,60b5c852e07c831c968ae7e0388bd0ed591097238ca3a3742367facf0f,60e10a1ec68fe34887f87c4badc81f93c2d69999614683cf05c8e97069,6066de96d2a1c75f99185f4d5a39e49adccf18515cc512c5a7392b98cc,6032c425519672bec473a8971a79a2758356ad24ee99353c7020fd5cac,6036e19cee7f33f141d34fbb899c27a68900ac6593f082edfbe6fc3fe5,601280d6db873a83fa7908f1416acbbc189624b392be7935ba787f3cb9,60ce1657bbdc8cceabecad61bb8bff3f9865d7c46170c6555c9e406aa0,60de2d51517b76fcb141908bfa07a93f1bf93b92124838d2ed24022819,60e35880324d3302478a8c48cc9c71b81710b50f8fb444a5a56462e4b5,60eb4b163aa81b319275f796b7b19b50c945604f47f807a5a5b5acd19a,6016f85346dc9b1efccaa9a69e357b49d7a25c03936ea5d05ede3cfca0,604746a8792a9eb11769d7593eeb4d0bf1be04d68c00ef50d2752c4d02,60f0ccab792b8e74acca2e08533b805afc59a38671c3c68d337f16c185,6061831490182c6c68168cddf4c995dca27c8b8b144b2643a010f938bc,601a150c13e1b5a2c6f5aa49e53ce9fc20e06d844ff162fcbd691624cd,60631b6ceb11ddd4afc4ed3d098f978ff0bfbceda084f263dfebca0e9b,60f282664fba7a04a7e2c3e782e6a23153ea5384b4c680d9dc1a98959b,60e594ceb9f74bd9fb58473f225f443dbd7be9ad76ab1c45925fe1d8ee,60f9369f45d0ae6a0ac710a02cf92277c091ef548e493e1fccb8b149e3,607b1da5a2d2cdac17fba68066eb5cb135776f0badd0ec77790115f34d,60dfcdec7a63f0e2422e938cdf3df012a9eefeccb0c835e56419fe345c,609da13e2ed25bdc1df37e3eef351aaee057ac926cedd1bb1ce02122d4,6033b94204fa0c33953e26834572de06f89496dd9b910c98d622e21612<p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6976","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.666171","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.666472","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.68756773","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d696e69","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.72656b74","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.77656233","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6269703339","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.636f2d6f70","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.656964616e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6761746573","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.74616e7961","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.647275646765","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.66696e6c6579","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6b6f65706b65","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d616b657273","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d6f6465726e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.73796e746178","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.7a656b696168","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.636176656d616e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.64697372757074","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.656e6372797074","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.68757362616e64","decimals":0}</p><p data-testid="calvin">{"hex":"6d696e696d616c","name":"calvin","image":"ipfs://zdj7We5kz4op3HNodbzfRt14AqUJdygK2gHosAnbaDx7fGck2","standard_image":"ipfs://zb2rhenCxDXo56r7AwHsHuSBmK9x63diFzwxtsL6PsQnM3uUs","holder":"stake1uyyyruv2y289xm7laay8a9sgrn95q627q3q4v3z4eagjdrs4j0yqu","holder_type":"wallet","length":6,"og_number":0,"rarity":"common","utxo":"3911b59931d3f5e938bef6d773d4b0d6a48fab96d63c658aa4b240a50dcba679#1","characters":"letters","numeric_modifiers":"","default_in_wallet":"cal","pfp_image":"","bg_image":"ipfs://bafybeicuvareow6exu2ti6xtsxkzpcpsc7dj54q7oaratjm4uaqgd77ham","bg_asset":"c705d66dd826fa750a3fcc0a74c27fdb20db2ed18ad569232d7123ad001bc2804772616469656e7420536861706573202d2043616765","resolved_addresses":{"ada":"addr1qyzpu6dy0tp926q72qdsxmu3ydqg9qyavs7tanfcpudv24sgg8cc5g5w2dhalm6g06tqs8xtgp54upzp2ez9tn63y68qn5st78"},"created_slot_number":103834977,"updated_slot_number":115852137,"has_datum":false,"svg_version":"2.4.0","image_hash":"0291cbb9f046a27bb067b4310c6eab6ae8e755a49a3b7e1ae87314b569ab6548","standard_image_hash":"78e558e2c32e3de4e95cefad00857a98665cd323bf11bdd4b9b48a707de61910","version":1,"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d696e696d616c","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.70726f66696c65","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.70757273756974","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.736176696e6773","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.616c64657262696e","decimals":0}</p><p data-testid="pi">{"hex":"62726577636c7562","name":"pi","image":"ipfs://QmYKjoA9fsLaGnz92BJbC5kHFsSKsijAdmowQqbmzjfWBT","standard_image":"ipfs://QmYKjoA9fsLaGnz92BJbC5kHFsSKsijAdmowQqbmzjfWBT","holder":"stake1u8q07kgyuhffc8v9auvn4jlqcm4hehdu7wsd9fvna95nr3qynl7dk","holder_type":"wallet","length":2,"og_number":0,"rarity":"ultra_rare","utxo":"8ae62ab3631124197cdd4faac83428c404e529f07db510899c68a373a22fa77c#1","characters":"letters","numeric_modifiers":"","default_in_wallet":"pi","pfp_image":"","bg_image":"","resolved_addresses":{"ada":"addr1qyyrwcs73wk9cp9e7lxpn86d2n4wxgyduxqxmmj6psmjejkqlavsfewjnswctmce8t97p3ht0nwmeuaq62je86tfx8zq6lh9kr"},"created_slot_number":55725690,"updated_slot_number":104951843,"has_datum":false,"svg_version":"","image_hash":"","standard_image_hash":"","version":0,"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.62726577636c7562","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6f726967696e616c","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706c61793277696e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.7072656d69657265","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.646179747261646572","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.63687269737469616e6e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706f7274666f6c696f31","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706f7274666f6c696f32","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706f7274666f6c696f33","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.73756666696369656e74","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.73757270726973656d65","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6f70706f7274756e697374","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.736f6c6f7072656e657572","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.737572766976616c697374","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.74686562726577636c7562","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6472756467657265706f7274","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.68617070796e657779656172","decimals":0}</p><button data-testid="connect-with-handles"></button></pre>"`;
|
|
6
|
-
|
|
7
|
-
exports[`RenderWalletHandles should successfully update state with handle metadata 3`] = `"<pre>eternltruefalse00c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0000c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d000c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e855cd3dbc30bad8ac8fffbed87d36325b407a8e934b1507725fcd80121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00129ee829b3cea5762f0c1077db667390a9ee007825a0ed7b1150d35d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00d98f028bd372ed61079c6ed5083e3a977d69ab5d0b17b25bc87343dd121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00c888866b693e1ae8cb237351ba4bdc7e16882a1dc4a53d4de0537e56121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0082d061e45a1ff5b30de61d3d1137e6ebdd44d6056be88a44d547b5a3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,009de2d448e439c970d94bf483f8bcc0eb47040d3f293e096a580d3aca121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00da3f1060013b6e9be44cd2890a6f20f524d2071d22410a5264de115b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00d1c9c1d95ce5ee7e666cc83b2b56dd25d82f0c91b5c34175fd8448b6121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0002659dc406e1d51c2695bc23962b30487d3ceb995beb13b698509c6f121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00c46c44a29807de8fa23693b3da1c1976ebe8858f74199ca840b557ee121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,005d48e3d5655bf8a05eda49ea6683ccaf5351d505c38ae7ad43cbd4ab121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0095f329c349c57bd4bcf021c8a96e68eca384627fee9ebea56ff8167d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0081378bb3d576f8dce84a9bb6d6761530ef8088f335d231bd98eaedc3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0070fc9c5a5d80650a87dce6dc4ea9a066f3185352e89f946165995593121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,008063fa1c1fb41cafd24f484e2a7d0014202ffef9407af05bf4279889121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00134fd13220198b9e8d0523cec39465b2bf3400fdeca305bf88fe0bb2121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00fccd5b37e433d56779cf1beb43440415eaca903ca92c61de2bbf0c72121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,003c0b43dcb3cee0988607c478f11c5c657cb31ebeafe495d8eca5b4ee121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,002e0f369f4fabf5f314fd2dbd34e7d6a03d0336b8d974f2208c75bc34121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00d38956d5d8c3e996880298b8e1534679e285f93475cf6aa3256205c7121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00486dede781535d8ff49d9a0dadeb5c0d38ef150f6fc80180921ebe85121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,002ea947a2d3c0c95ca5124f6b61b83a5f4e0b71223f863be838831168121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00b7a6f578ed78826a3c32cadf5ede889ee350e43c4d11f8f9b94cb03e121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e1a7fdf8d8010e238948dec7150e84fd158acdeaa76c200d8a4b1f63121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00af0a05d243de50100af100863c88b4f6524fa4ee86a84127cf15b82b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0022de41ad5b3628ecd8686bce555846bedde16ea7881bd63abf9198e2121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0075fcbf24479728322e5f128c84c15c27aeea10196f56d1ff44d40b94121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00be01633e07d001fff611b3d39ac3ca89127acecef79aabb812cea125121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,005b819971068bae01c3d411f2b5b8a12331df4d9fbeb899c0a59afb9e121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0018edec9fc995f6ea029f87b6142efdd4a132cbe4f3c14cdad54e1362121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00ce805857db7601ac7af226290a0f0bee4608736fea251b8813359805121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,008911a9404ee35265e5b39ca1e38a5d64a67384307bc47ea5b1c2f1f3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00b80d7dfef9f0e989a62aabdbc9aec4703bc38dcc0363bcb902aad20f121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00a3aabe29cf0d4cf0acd9c0c4231e69ae145e426fd40d9bc089117416121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,001f64ff5164c16467e229f4305e5cd05cea85f407d68ba5c8f33f6d5d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00c1ce344ee9f695a9bfa4230254c0008aa62cf09f5f4444f6ece352d8121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00412be6abc6a8d58aa914bed006e77c0e8e6870a5405a0a00db9119b0121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00ebc9713be7aa719a00d2be641418b59747b8ba846e1687253d6667b5121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00b5c852e07c831c968ae7e0388bd0ed591097238ca3a3742367facf0f121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e10a1ec68fe34887f87c4badc81f93c2d69999614683cf05c8e97069121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0066de96d2a1c75f99185f4d5a39e49adccf18515cc512c5a7392b98cc121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0032c425519672bec473a8971a79a2758356ad24ee99353c7020fd5cac121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0036e19cee7f33f141d34fbb899c27a68900ac6593f082edfbe6fc3fe5121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,001280d6db873a83fa7908f1416acbbc189624b392be7935ba787f3cb9121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00ce1657bbdc8cceabecad61bb8bff3f9865d7c46170c6555c9e406aa0121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00de2d51517b76fcb141908bfa07a93f1bf93b92124838d2ed24022819121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e35880324d3302478a8c48cc9c71b81710b50f8fb444a5a56462e4b5121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00eb4b163aa81b319275f796b7b19b50c945604f47f807a5a5b5acd19a121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0016f85346dc9b1efccaa9a69e357b49d7a25c03936ea5d05ede3cfca0121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,004746a8792a9eb11769d7593eeb4d0bf1be04d68c00ef50d2752c4d02121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00f0ccab792b8e74acca2e08533b805afc59a38671c3c68d337f16c185121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0061831490182c6c68168cddf4c995dca27c8b8b144b2643a010f938bc121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,001a150c13e1b5a2c6f5aa49e53ce9fc20e06d844ff162fcbd691624cd121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00631b6ceb11ddd4afc4ed3d098f978ff0bfbceda084f263dfebca0e9b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00f282664fba7a04a7e2c3e782e6a23153ea5384b4c680d9dc1a98959b121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00e594ceb9f74bd9fb58473f225f443dbd7be9ad76ab1c45925fe1d8ee121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00f9369f45d0ae6a0ac710a02cf92277c091ef548e493e1fccb8b149e3121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,007b1da5a2d2cdac17fba68066eb5cb135776f0badd0ec77790115f34d121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,00dfcdec7a63f0e2422e938cdf3df012a9eefeccb0c835e56419fe345c121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,009da13e2ed25bdc1df37e3eef351aaee057ac926cedd1bb1ce02122d4121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,0033b94204fa0c33953e26834572de06f89496dd9b910c98d622e21612121fd22e0b57ac206fefc763f8bfa0771919f5218b40691eea4514d0,60c279a3fb3b4e62bbc78e288783b58045d4ae82a18867d8352d02775a,60e855cd3dbc30bad8ac8fffbed87d36325b407a8e934b1507725fcd80,60129ee829b3cea5762f0c1077db667390a9ee007825a0ed7b1150d35d,60d98f028bd372ed61079c6ed5083e3a977d69ab5d0b17b25bc87343dd,60c888866b693e1ae8cb237351ba4bdc7e16882a1dc4a53d4de0537e56,6082d061e45a1ff5b30de61d3d1137e6ebdd44d6056be88a44d547b5a3,609de2d448e439c970d94bf483f8bcc0eb47040d3f293e096a580d3aca,60da3f1060013b6e9be44cd2890a6f20f524d2071d22410a5264de115b,60d1c9c1d95ce5ee7e666cc83b2b56dd25d82f0c91b5c34175fd8448b6,6002659dc406e1d51c2695bc23962b30487d3ceb995beb13b698509c6f,60c46c44a29807de8fa23693b3da1c1976ebe8858f74199ca840b557ee,605d48e3d5655bf8a05eda49ea6683ccaf5351d505c38ae7ad43cbd4ab,6095f329c349c57bd4bcf021c8a96e68eca384627fee9ebea56ff8167d,6081378bb3d576f8dce84a9bb6d6761530ef8088f335d231bd98eaedc3,6070fc9c5a5d80650a87dce6dc4ea9a066f3185352e89f946165995593,608063fa1c1fb41cafd24f484e2a7d0014202ffef9407af05bf4279889,60134fd13220198b9e8d0523cec39465b2bf3400fdeca305bf88fe0bb2,60fccd5b37e433d56779cf1beb43440415eaca903ca92c61de2bbf0c72,603c0b43dcb3cee0988607c478f11c5c657cb31ebeafe495d8eca5b4ee,602e0f369f4fabf5f314fd2dbd34e7d6a03d0336b8d974f2208c75bc34,60d38956d5d8c3e996880298b8e1534679e285f93475cf6aa3256205c7,60486dede781535d8ff49d9a0dadeb5c0d38ef150f6fc80180921ebe85,602ea947a2d3c0c95ca5124f6b61b83a5f4e0b71223f863be838831168,60b7a6f578ed78826a3c32cadf5ede889ee350e43c4d11f8f9b94cb03e,60e1a7fdf8d8010e238948dec7150e84fd158acdeaa76c200d8a4b1f63,60af0a05d243de50100af100863c88b4f6524fa4ee86a84127cf15b82b,6022de41ad5b3628ecd8686bce555846bedde16ea7881bd63abf9198e2,6075fcbf24479728322e5f128c84c15c27aeea10196f56d1ff44d40b94,60be01633e07d001fff611b3d39ac3ca89127acecef79aabb812cea125,605b819971068bae01c3d411f2b5b8a12331df4d9fbeb899c0a59afb9e,6018edec9fc995f6ea029f87b6142efdd4a132cbe4f3c14cdad54e1362,60ce805857db7601ac7af226290a0f0bee4608736fea251b8813359805,608911a9404ee35265e5b39ca1e38a5d64a67384307bc47ea5b1c2f1f3,60b80d7dfef9f0e989a62aabdbc9aec4703bc38dcc0363bcb902aad20f,60a3aabe29cf0d4cf0acd9c0c4231e69ae145e426fd40d9bc089117416,601f64ff5164c16467e229f4305e5cd05cea85f407d68ba5c8f33f6d5d,60c1ce344ee9f695a9bfa4230254c0008aa62cf09f5f4444f6ece352d8,60412be6abc6a8d58aa914bed006e77c0e8e6870a5405a0a00db9119b0,60ebc9713be7aa719a00d2be641418b59747b8ba846e1687253d6667b5,60b5c852e07c831c968ae7e0388bd0ed591097238ca3a3742367facf0f,60e10a1ec68fe34887f87c4badc81f93c2d69999614683cf05c8e97069,6066de96d2a1c75f99185f4d5a39e49adccf18515cc512c5a7392b98cc,6032c425519672bec473a8971a79a2758356ad24ee99353c7020fd5cac,6036e19cee7f33f141d34fbb899c27a68900ac6593f082edfbe6fc3fe5,601280d6db873a83fa7908f1416acbbc189624b392be7935ba787f3cb9,60ce1657bbdc8cceabecad61bb8bff3f9865d7c46170c6555c9e406aa0,60de2d51517b76fcb141908bfa07a93f1bf93b92124838d2ed24022819,60e35880324d3302478a8c48cc9c71b81710b50f8fb444a5a56462e4b5,60eb4b163aa81b319275f796b7b19b50c945604f47f807a5a5b5acd19a,6016f85346dc9b1efccaa9a69e357b49d7a25c03936ea5d05ede3cfca0,604746a8792a9eb11769d7593eeb4d0bf1be04d68c00ef50d2752c4d02,60f0ccab792b8e74acca2e08533b805afc59a38671c3c68d337f16c185,6061831490182c6c68168cddf4c995dca27c8b8b144b2643a010f938bc,601a150c13e1b5a2c6f5aa49e53ce9fc20e06d844ff162fcbd691624cd,60631b6ceb11ddd4afc4ed3d098f978ff0bfbceda084f263dfebca0e9b,60f282664fba7a04a7e2c3e782e6a23153ea5384b4c680d9dc1a98959b,60e594ceb9f74bd9fb58473f225f443dbd7be9ad76ab1c45925fe1d8ee,60f9369f45d0ae6a0ac710a02cf92277c091ef548e493e1fccb8b149e3,607b1da5a2d2cdac17fba68066eb5cb135776f0badd0ec77790115f34d,60dfcdec7a63f0e2422e938cdf3df012a9eefeccb0c835e56419fe345c,609da13e2ed25bdc1df37e3eef351aaee057ac926cedd1bb1ce02122d4,6033b94204fa0c33953e26834572de06f89496dd9b910c98d622e21612<p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6976","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.666171","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.666472","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.68756773","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d696e69","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.72656b74","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.77656233","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6269703339","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.636f2d6f70","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.656964616e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6761746573","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.74616e7961","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.647275646765","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.66696e6c6579","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6b6f65706b65","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d616b657273","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d6f6465726e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.73796e746178","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.7a656b696168","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.636176656d616e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.64697372757074","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.656e6372797074","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.68757362616e64","decimals":0}</p><p data-testid="calvin">{"hex":"6d696e696d616c","name":"calvin","image":"ipfs://zdj7We5kz4op3HNodbzfRt14AqUJdygK2gHosAnbaDx7fGck2","standard_image":"ipfs://zb2rhenCxDXo56r7AwHsHuSBmK9x63diFzwxtsL6PsQnM3uUs","holder":"stake1uyyyruv2y289xm7laay8a9sgrn95q627q3q4v3z4eagjdrs4j0yqu","holder_type":"wallet","length":6,"og_number":0,"rarity":"common","utxo":"3911b59931d3f5e938bef6d773d4b0d6a48fab96d63c658aa4b240a50dcba679#1","characters":"letters","numeric_modifiers":"","default_in_wallet":"cal","pfp_image":"","bg_image":"ipfs://bafybeicuvareow6exu2ti6xtsxkzpcpsc7dj54q7oaratjm4uaqgd77ham","bg_asset":"c705d66dd826fa750a3fcc0a74c27fdb20db2ed18ad569232d7123ad001bc2804772616469656e7420536861706573202d2043616765","resolved_addresses":{"ada":"addr1qyzpu6dy0tp926q72qdsxmu3ydqg9qyavs7tanfcpudv24sgg8cc5g5w2dhalm6g06tqs8xtgp54upzp2ez9tn63y68qn5st78"},"created_slot_number":103834977,"updated_slot_number":115852137,"has_datum":false,"svg_version":"2.4.0","image_hash":"0291cbb9f046a27bb067b4310c6eab6ae8e755a49a3b7e1ae87314b569ab6548","standard_image_hash":"78e558e2c32e3de4e95cefad00857a98665cd323bf11bdd4b9b48a707de61910","version":1,"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d696e696d616c","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.70726f66696c65","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.70757273756974","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.736176696e6773","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.616c64657262696e","decimals":0}</p><p data-testid="pi">{"hex":"62726577636c7562","name":"pi","image":"ipfs://QmYKjoA9fsLaGnz92BJbC5kHFsSKsijAdmowQqbmzjfWBT","standard_image":"ipfs://QmYKjoA9fsLaGnz92BJbC5kHFsSKsijAdmowQqbmzjfWBT","holder":"stake1u8q07kgyuhffc8v9auvn4jlqcm4hehdu7wsd9fvna95nr3qynl7dk","holder_type":"wallet","length":2,"og_number":0,"rarity":"ultra_rare","utxo":"8ae62ab3631124197cdd4faac83428c404e529f07db510899c68a373a22fa77c#1","characters":"letters","numeric_modifiers":"","default_in_wallet":"pi","pfp_image":"","bg_image":"","resolved_addresses":{"ada":"addr1qyyrwcs73wk9cp9e7lxpn86d2n4wxgyduxqxmmj6psmjejkqlavsfewjnswctmce8t97p3ht0nwmeuaq62je86tfx8zq6lh9kr"},"created_slot_number":55725690,"updated_slot_number":104951843,"has_datum":false,"svg_version":"","image_hash":"","standard_image_hash":"","version":0,"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.62726577636c7562","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6f726967696e616c","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706c61793277696e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.7072656d69657265","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.646179747261646572","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.63687269737469616e6e","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706f7274666f6c696f31","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706f7274666f6c696f32","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.706f7274666f6c696f33","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.73756666696369656e74","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.73757270726973656d65","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6f70706f7274756e697374","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.736f6c6f7072656e657572","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.737572766976616c697374","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.74686562726577636c7562","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6472756467657265706f7274","decimals":0}</p><p>{"assetId":"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.68617070796e657779656172","decimals":0}</p><button data-testid="connect-with-handles"></button></pre>"`;
|
|
@@ -10,20 +10,22 @@ import {
|
|
|
10
10
|
WalletObserverProvider,
|
|
11
11
|
} from "../../../index.js";
|
|
12
12
|
|
|
13
|
-
const
|
|
13
|
+
const INTERVAL_AMOUNT = 10;
|
|
14
14
|
|
|
15
15
|
describe("useAvailableExtensions", () => {
|
|
16
16
|
it("should correctly retrieve the instance", async () => {
|
|
17
17
|
const { result } = renderHook<
|
|
18
18
|
IWalletObserverProviderProps,
|
|
19
19
|
ReturnType<typeof useAvailableExtensions>
|
|
20
|
-
>(() => useAvailableExtensions(
|
|
20
|
+
>(() => useAvailableExtensions(INTERVAL_AMOUNT), {
|
|
21
21
|
wrapper: (props) => <WalletObserverProvider {...props} />,
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
act(() => {
|
|
25
|
+
expect(result.current).toEqual([
|
|
26
|
+
{ name: "Eternl", property: "eternl", reference: mockedEternlWallet },
|
|
27
|
+
]);
|
|
28
|
+
});
|
|
27
29
|
|
|
28
30
|
await act(async () => {
|
|
29
31
|
// Inject a duplicate api.
|
|
@@ -34,7 +36,7 @@ describe("useAvailableExtensions", () => {
|
|
|
34
36
|
};
|
|
35
37
|
|
|
36
38
|
// Wait 10 milliseconds for interval to catch.
|
|
37
|
-
await new Promise((res) => setTimeout(res,
|
|
39
|
+
await new Promise((res) => setTimeout(res, INTERVAL_AMOUNT));
|
|
38
40
|
});
|
|
39
41
|
|
|
40
42
|
expect(result.current).toEqual([
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import capitalize from "lodash/capitalize.js";
|
|
2
|
+
import isEqual from "lodash/isEqual.js";
|
|
2
3
|
import { useCallback, useEffect, useState } from "react";
|
|
3
4
|
|
|
4
|
-
import {
|
|
5
|
-
IWindowCip30Extension,
|
|
6
|
-
TSupportedWalletExtensions,
|
|
7
|
-
} from "../../@types/observer.js";
|
|
8
|
-
import { useWalletObserverContext } from "../contexts/observer/context.js";
|
|
5
|
+
import { IWindowCip30Extension } from "../../@types/observer.js";
|
|
9
6
|
|
|
10
7
|
/**
|
|
11
8
|
* Defines the interface for a returned wallet
|
|
12
9
|
*/
|
|
13
10
|
export interface IWalletExtension {
|
|
14
|
-
property:
|
|
11
|
+
property: string;
|
|
15
12
|
name: string;
|
|
16
13
|
reference: IWindowCip30Extension;
|
|
17
14
|
}
|
|
@@ -23,29 +20,60 @@ export interface IWalletExtension {
|
|
|
23
20
|
*
|
|
24
21
|
* @returns {IWalletExtension[]} A list of available wallet extensions.
|
|
25
22
|
*/
|
|
26
|
-
export const useAvailableExtensions = (
|
|
27
|
-
const
|
|
28
|
-
|
|
23
|
+
export const useAvailableExtensions = (intervalAmount?: number) => {
|
|
24
|
+
const getSanitizedCardanoNamespace = useCallback(() => {
|
|
25
|
+
const newCardano = window?.cardano || window?.parent?.cardano;
|
|
26
|
+
const sanitizedExtension: { [key: string]: IWindowCip30Extension } = {};
|
|
27
|
+
for (const [key, val] of Object.entries(newCardano || {})) {
|
|
28
|
+
if (!val?.apiVersion) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
if (!window.cardano && !window.parent.cardano) {
|
|
32
|
-
return;
|
|
32
|
+
sanitizedExtension[key] = val;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
return sanitizedExtension;
|
|
36
|
+
}, []);
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
const [list, setList] = useState<IWalletExtension[]>([]);
|
|
39
|
+
const [cardano, setCardano] = useState<
|
|
40
|
+
| {
|
|
41
|
+
[key: string]: IWindowCip30Extension;
|
|
42
|
+
}
|
|
43
|
+
| undefined
|
|
44
|
+
>(getSanitizedCardanoNamespace());
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
const checkForUpdates = () => {
|
|
48
|
+
const supportedExtensions = getSanitizedCardanoNamespace();
|
|
49
|
+
setCardano((prevCardano) => {
|
|
50
|
+
if (isEqual(prevCardano, supportedExtensions)) {
|
|
51
|
+
return prevCardano;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return supportedExtensions;
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const interval = setInterval(checkForUpdates, intervalAmount || 1000);
|
|
59
|
+
|
|
60
|
+
// Stop checking after 5 minutes;
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
clearInterval(interval);
|
|
63
|
+
}, 60000 * 5);
|
|
42
64
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const extension = cardano?.[key];
|
|
65
|
+
return () => clearInterval(interval);
|
|
66
|
+
}, [cardano]);
|
|
46
67
|
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (!cardano) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const newList: IWalletExtension[] = [];
|
|
74
|
+
Object.entries(cardano).forEach(([key, extension]) => {
|
|
47
75
|
if (extension) {
|
|
48
|
-
|
|
76
|
+
newList.push({
|
|
49
77
|
name: capitalize(extension.name),
|
|
50
78
|
property: key,
|
|
51
79
|
reference: extension,
|
|
@@ -53,26 +81,8 @@ export const useAvailableExtensions = (refreshInterval?: number) => {
|
|
|
53
81
|
}
|
|
54
82
|
});
|
|
55
83
|
|
|
56
|
-
setList(
|
|
57
|
-
|
|
58
|
-
return list;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return prevExtensions;
|
|
62
|
-
});
|
|
63
|
-
}, [observerRef]);
|
|
64
|
-
|
|
65
|
-
useEffect(() => {
|
|
66
|
-
updateExtensions();
|
|
67
|
-
|
|
68
|
-
// Check every 2 seconds for 20 seconds (late loading extensions.)
|
|
69
|
-
(async () => {
|
|
70
|
-
for (let i = 0; i < 20; i++) {
|
|
71
|
-
updateExtensions();
|
|
72
|
-
await new Promise((res) => setTimeout(res, refreshInterval || 2000));
|
|
73
|
-
}
|
|
74
|
-
})();
|
|
75
|
-
}, []);
|
|
84
|
+
setList(newList);
|
|
85
|
+
}, [cardano]);
|
|
76
86
|
|
|
77
87
|
return list;
|
|
78
88
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IHandle } from "@koralabs/adahandle-sdk";
|
|
1
|
+
import type { IHandle } from "@koralabs/adahandle-sdk";
|
|
2
2
|
import { IAssetAmountMetadata } from "@sundaeswap/asset";
|
|
3
3
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useMemo } from "react";
|
|
@@ -6,6 +6,7 @@ import { useMemo } from "react";
|
|
|
6
6
|
import { TAssetAmountMap } from "../../@types/observer.js";
|
|
7
7
|
import { WalletAssetMap } from "../../classes/WalletAssetMap.class.js";
|
|
8
8
|
import { normalizeAssetIdWithDot } from "../../utils/assets.js";
|
|
9
|
+
import { getHandleLib } from "../../utils/getLibs.js";
|
|
9
10
|
import { THandleMetadata } from "../contexts/observer/types.js";
|
|
10
11
|
import { useWalletObserver } from "./useWalletObserver.js";
|
|
11
12
|
|
|
@@ -49,11 +50,8 @@ export const useWalletHandles = <
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
try {
|
|
52
|
-
const {
|
|
53
|
-
|
|
54
|
-
HandleClientContext,
|
|
55
|
-
KoraLabsProvider,
|
|
56
|
-
} = await import("@koralabs/adahandle-sdk");
|
|
53
|
+
const { HandleClient, HandleClientContext, KoraLabsProvider } =
|
|
54
|
+
await getHandleLib();
|
|
57
55
|
|
|
58
56
|
const context =
|
|
59
57
|
state.network === 1
|
package/src/utils/getLibs.ts
CHANGED
|
@@ -18,3 +18,14 @@ export const getPeerConnect = async () => {
|
|
|
18
18
|
return module?.DAppPeerConnect || module.default.DAppPeerConnect;
|
|
19
19
|
});
|
|
20
20
|
};
|
|
21
|
+
|
|
22
|
+
export const getHandleLib = async () => {
|
|
23
|
+
return import("@koralabs/adahandle-sdk").then((module) => {
|
|
24
|
+
const HandleClient = module?.default || module;
|
|
25
|
+
return {
|
|
26
|
+
HandleClient,
|
|
27
|
+
HandleClientContext: module.HandleClientContext,
|
|
28
|
+
KoraLabsProvider: module.KoraLabsProvider,
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
};
|