@xyo-network/react-chain-provider 1.20.8 → 1.20.10

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 (36) hide show
  1. package/dist/browser/contexts/gateway/Provider.d.ts.map +1 -1
  2. package/dist/browser/hooks/client/helpers/findCaveat.d.ts +2 -2
  3. package/dist/browser/hooks/client/helpers/findCaveat.d.ts.map +1 -1
  4. package/dist/browser/hooks/client/permissions/usePermissions.d.ts +2 -6
  5. package/dist/browser/hooks/client/permissions/usePermissions.d.ts.map +1 -1
  6. package/dist/browser/hooks/client/permissions/usePermissionsAccounts.d.ts +2 -1
  7. package/dist/browser/hooks/client/permissions/usePermissionsAccounts.d.ts.map +1 -1
  8. package/dist/browser/hooks/client/useClientFromWallet.d.ts +2 -11
  9. package/dist/browser/hooks/client/useClientFromWallet.d.ts.map +1 -1
  10. package/dist/browser/hooks/client/useGatewayFromWallet.d.ts +2 -5
  11. package/dist/browser/hooks/client/useGatewayFromWallet.d.ts.map +1 -1
  12. package/dist/browser/hooks/gateway/useNetwork.d.ts +1 -1
  13. package/dist/browser/hooks/gateway/useNetwork.d.ts.map +1 -1
  14. package/dist/browser/hooks/gateway/useRunner.d.ts +1 -1
  15. package/dist/browser/hooks/gateway/useRunner.d.ts.map +1 -1
  16. package/dist/browser/hooks/gateway/useViewer.d.ts +1 -1
  17. package/dist/browser/hooks/gateway/useViewer.d.ts.map +1 -1
  18. package/dist/browser/hooks/helpers/getXyoClient.d.ts +2 -5
  19. package/dist/browser/hooks/helpers/getXyoClient.d.ts.map +1 -1
  20. package/dist/browser/hooks/useAddressBalance.d.ts.map +1 -1
  21. package/dist/browser/hooks/useConnectAccount.d.ts +1 -1
  22. package/dist/browser/index.mjs +200 -382
  23. package/dist/browser/index.mjs.map +1 -1
  24. package/dist/browser/types/GatewayFromWallet.d.ts +2 -7
  25. package/dist/browser/types/GatewayFromWallet.d.ts.map +1 -1
  26. package/package.json +12 -11
  27. package/src/contexts/gateway/Provider.tsx +24 -25
  28. package/src/contexts/gateway/story/ProviderWithWallet.stories.tsx +20 -25
  29. package/src/hooks/client/helpers/findCaveat.ts +2 -20
  30. package/src/hooks/client/permissions/usePermissions.ts +2 -14
  31. package/src/hooks/client/permissions/usePermissionsAccounts.ts +2 -38
  32. package/src/hooks/client/useClientFromWallet.ts +2 -98
  33. package/src/hooks/client/useGatewayFromWallet.ts +2 -30
  34. package/src/hooks/helpers/getXyoClient.ts +2 -46
  35. package/src/hooks/useAddressBalance.ts +0 -6
  36. package/src/types/GatewayFromWallet.ts +2 -8
@@ -27,9 +27,9 @@ var ConnectedAccount = /* @__PURE__ */ __name(({ address }) => {
27
27
  // src/components/connected/ConnectAccountsStack.tsx
28
28
  import { Alert, AlertTitle, Button, Stack as Stack2, Typography as Typography2 } from "@mui/material";
29
29
  import { ButtonEx } from "@xylabs/react-button";
30
- import { isDefined as isDefined8, isUndefined as isUndefined6 } from "@xylabs/sdk-js";
30
+ import { isDefined as isDefined5, isUndefined as isUndefined5 } from "@xylabs/sdk-js";
31
31
  import { ErrorRender as ErrorRender2 } from "@xyo-network/react-error";
32
- import React5, { useEffect as useEffect7 } from "react";
32
+ import React5, { useEffect as useEffect5 } from "react";
33
33
 
34
34
  // src/hooks/account/helpers/formatAccountBalanceHistory.ts
35
35
  import { hexToBigInt } from "@xylabs/sdk-js";
@@ -155,306 +155,17 @@ var useAccountBalanceHistory = /* @__PURE__ */ __name((address, viewer, maxPage
155
155
  ]);
156
156
  }, "useAccountBalanceHistory");
157
157
 
158
- // src/hooks/client/useClientFromWallet.ts
159
- import { isNull as isNull2 } from "@xylabs/sdk-js";
160
- import { useCallback, useEffect, useSyncExternalStore } from "react";
161
-
162
- // src/hooks/helpers/getXyoClient.ts
163
- import { isUndefined as isUndefined2 } from "@xylabs/sdk-js";
164
- var CLIENT_LISTENER_TIMEOUT = 500;
165
- var hasXyoClient = /* @__PURE__ */ __name(() => {
166
- return "client" in globalThis.xyo;
167
- }, "hasXyoClient");
168
- var listenForClientInjection = /* @__PURE__ */ __name((onClientReady, timeout, onTimeout) => {
169
- let resolved = false;
170
- const listener = /* @__PURE__ */ __name(() => {
171
- onClientReady();
172
- resolved = true;
173
- }, "listener");
174
- globalThis.addEventListener("xyo:plugin-ready", listener);
175
- setTimeout(() => {
176
- if (!resolved) {
177
- globalThis.removeEventListener("xyo:plugin-ready", listener);
178
- onTimeout();
179
- }
180
- }, timeout);
181
- }, "listenForClientInjection");
182
- async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT) {
183
- if (isUndefined2(globalThis.xyo)) {
184
- return null;
185
- }
186
- return hasXyoClient() ? globalThis.xyo.client : await new Promise((resolve) => {
187
- listenForClientInjection(() => {
188
- resolve(globalThis.xyo.client);
189
- }, timeout, () => {
190
- resolve(null);
191
- });
192
- });
193
- }
194
- __name(getXyoClient, "getXyoClient");
195
-
196
- // src/hooks/helpers/transaction/Confirmation.ts
197
- import { assertEx as assertEx2, delay, forget, isDefined as isDefined2, isNull } from "@xylabs/sdk-js";
198
- var TransactionConfirmationStatus = class _TransactionConfirmationStatus {
199
- static {
200
- __name(this, "TransactionConfirmationStatus");
201
- }
202
- _params;
203
- active = false;
204
- constructor(params) {
205
- this._params = params;
206
- }
207
- get exp() {
208
- return assertEx2(this.transaction[0].exp, () => "exp is not found, transaction is not set");
209
- }
210
- get nbf() {
211
- return assertEx2(this.transaction[0].nbf, () => "nbf is not found, transaction is not set");
212
- }
213
- get onStatusUpdate() {
214
- return this._params.onStatusUpdate;
215
- }
216
- get params() {
217
- return this._params;
218
- }
219
- get transaction() {
220
- return this.params.transaction;
221
- }
222
- get txHash() {
223
- return this.params.txHash;
224
- }
225
- get viewer() {
226
- return this.params.viewer;
227
- }
228
- static create(params) {
229
- return new _TransactionConfirmationStatus(params);
230
- }
231
- async start() {
232
- this.active = true;
233
- try {
234
- const currentBlockNumber = await this.viewer.currentBlockNumber();
235
- while (isDefined2(currentBlockNumber) && this.active) {
236
- await this.checkBlock(currentBlockNumber);
237
- await delay(1e3);
238
- }
239
- } catch (error) {
240
- await this.stop();
241
- forget(this.onStatusUpdate?.({
242
- error: error instanceof Error ? error : new Error("Unknown error occurred"),
243
- confirmed: false,
244
- blockNumber: 0,
245
- progress: 0,
246
- remainingBlocks: 0
247
- }));
248
- }
249
- }
250
- stop() {
251
- this.active = false;
252
- }
253
- async checkBlock(blockNumber) {
254
- if (blockNumber < this.nbf) {
255
- await this.stop();
256
- forget(this.onStatusUpdate?.({
257
- error: new Error(`Block number: ${blockNumber} is before ${this.nbf}`),
258
- confirmed: false,
259
- blockNumber,
260
- progress: 0,
261
- remainingBlocks: this.exp - blockNumber
262
- }));
263
- }
264
- if (blockNumber > this.exp) {
265
- forget(this.onStatusUpdate?.({
266
- confirmed: false,
267
- blockNumber,
268
- progress: 100,
269
- remainingBlocks: 0
270
- }));
271
- return;
272
- }
273
- if (blockNumber < this.exp) {
274
- await this.checkConfirmation(blockNumber);
275
- }
276
- }
277
- async checkConfirmation(blockNumber) {
278
- const remainingBlocks = this.exp - blockNumber;
279
- const progress = Math.round((blockNumber - this.nbf) / (this.exp - this.nbf) * 100);
280
- const tx = await this.viewer.transaction.byHash?.(this.txHash);
281
- if (isNull(tx)) {
282
- this.onStatusUpdate?.({
283
- confirmed: false,
284
- blockNumber,
285
- progress,
286
- remainingBlocks
287
- });
288
- } else {
289
- this.onStatusUpdate?.({
290
- confirmed: true,
291
- blockNumber,
292
- progress,
293
- remainingBlocks
294
- });
295
- await this.stop();
296
- }
297
- }
298
- };
299
-
300
- // src/hooks/client/useClientFromWallet.ts
301
- var currentState = {
302
- client: void 0,
303
- error: null,
304
- isLoading: false,
305
- timedout: false
306
- };
307
- var listeners = /* @__PURE__ */ new Set();
308
- var emitChange = /* @__PURE__ */ __name(() => {
309
- for (const listener of listeners) listener();
310
- }, "emitChange");
311
- var updateState = /* @__PURE__ */ __name((newState) => {
312
- currentState = {
313
- ...currentState,
314
- ...newState
315
- };
316
- emitChange();
317
- }, "updateState");
318
- var initializeClient = /* @__PURE__ */ __name(async (timeout) => {
319
- if (currentState.isLoading || currentState.client) return;
320
- updateState({
321
- isLoading: true,
322
- error: null
323
- });
324
- try {
325
- const client = await getXyoClient(timeout);
326
- if (client === null) {
327
- updateState({
328
- client: null,
329
- timedout: true,
330
- isLoading: false
331
- });
332
- return;
333
- }
334
- updateState({
335
- client,
336
- isLoading: false,
337
- error: null
338
- });
339
- } catch (error) {
340
- console.error("Error initializing XyoClient", error);
341
- updateState({
342
- error,
343
- isLoading: false
344
- });
345
- }
346
- }, "initializeClient");
347
- var subscribe = /* @__PURE__ */ __name((listener, timeout) => {
348
- listeners.add(listener);
349
- void initializeClient(timeout);
350
- return () => {
351
- listeners.delete(listener);
352
- };
353
- }, "subscribe");
354
- var getSnapshot = /* @__PURE__ */ __name(() => currentState, "getSnapshot");
355
- var useClientFromWallet = /* @__PURE__ */ __name((timeout) => {
356
- const subscribeWithTimeout = useCallback((listener) => subscribe(listener, timeout), [
357
- timeout
358
- ]);
359
- const clientState = useSyncExternalStore(subscribeWithTimeout, getSnapshot);
360
- useEffect(() => {
361
- let listener = /* @__PURE__ */ __name(() => {
362
- updateState({
363
- client: globalThis.xyo?.client,
364
- isLoading: false,
365
- error: null
366
- });
367
- emitChange();
368
- }, "listener");
369
- if (clientState.timedout && isNull2(clientState.client) && !clientState.isLoading) {
370
- globalThis.addEventListener("xyo:plugin-ready", listener);
371
- }
372
- return () => {
373
- globalThis.removeEventListener("xyo:plugin-ready", listener);
374
- };
375
- });
376
- return clientState;
377
- }, "useClientFromWallet");
378
- var useClient = useClientFromWallet;
379
-
380
158
  // src/hooks/client/permissions/usePermissions.ts
381
- var usePermissions = /* @__PURE__ */ __name(() => {
382
- const { client, isLoading, error, timedout } = useClientFromWallet();
383
- const permissions = client?.permissions;
384
- return {
385
- permissions,
386
- isLoading,
387
- error,
388
- timedout
389
- };
390
- }, "usePermissions");
159
+ import { usePermissions } from "@xyo-network/react-chain-client";
391
160
 
392
161
  // src/hooks/client/permissions/usePermissionsAccounts.ts
393
- import { usePromise as usePromise2 } from "@xylabs/react-promise";
394
- import { isArray, isDefined as isDefined4, isDefinedNotNull, isString } from "@xylabs/sdk-js";
162
+ import { useAccountPermissions } from "@xyo-network/react-chain-client";
395
163
 
396
- // src/hooks/client/helpers/findCaveat.ts
397
- import { isDefined as isDefined3 } from "@xylabs/sdk-js";
398
- var findCaveat = /* @__PURE__ */ __name(async (permissions, targetCapability, targetCaveatType) => {
399
- const existingPermissions = await permissions.getPermissions();
400
- if (isDefined3(existingPermissions) && existingPermissions.length > 0) {
401
- const foundPermissions = existingPermissions.find((p) => p.parentCapability === targetCapability);
402
- if (isDefined3(foundPermissions)) {
403
- return foundPermissions.caveats?.find((caveat) => caveat.type === targetCaveatType)?.value ?? [];
404
- }
405
- }
406
- return existingPermissions;
407
- }, "findCaveat");
408
-
409
- // src/hooks/client/permissions/usePermissionsAccounts.ts
410
- var validateRestrictedAccounts = /* @__PURE__ */ __name((restrictedAccounts) => {
411
- if (isDefined4(restrictedAccounts)) {
412
- if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {
413
- return restrictedAccounts;
414
- }
415
- throw new Error(`Unrecognized format for restrictReturnedAccounts caveat found on permissions.
416
-
417
- Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`);
418
- }
419
- return [];
420
- }, "validateRestrictedAccounts");
421
- var useAccountPermissions = /* @__PURE__ */ __name(() => {
422
- const { permissions, error } = usePermissions();
423
- return usePromise2(async () => {
424
- if (isDefinedNotNull(error)) throw error;
425
- if (isDefined4(permissions)) {
426
- const restrictedAccounts = await findCaveat(
427
- permissions,
428
- // TODO - extract to constant in protocol package
429
- "xyoWallet_getAccounts",
430
- "restrictReturnedAccounts"
431
- );
432
- return validateRestrictedAccounts(restrictedAccounts);
433
- }
434
- }, [
435
- permissions
436
- ]);
437
- }, "useAccountPermissions");
164
+ // src/hooks/client/useClientFromWallet.ts
165
+ import { useClient, useClientFromWallet } from "@xyo-network/react-chain-client";
438
166
 
439
167
  // src/hooks/client/useGatewayFromWallet.ts
440
- import { isDefined as isDefined5, isNull as isNull3 } from "@xylabs/sdk-js";
441
- var useGatewayFromWallet = /* @__PURE__ */ __name((gatewayName, timeout) => {
442
- const { client, isLoading, error, timedout } = useClientFromWallet(timeout);
443
- const resolveGateway = /* @__PURE__ */ __name(() => {
444
- if (isNull3(client)) return null;
445
- if (timedout && !isLoading && isDefined5(gatewayName)) {
446
- return null;
447
- }
448
- return client?.gateways?.[gatewayName];
449
- }, "resolveGateway");
450
- return {
451
- gateway: gatewayName ? resolveGateway() : void 0,
452
- isLoading,
453
- error,
454
- timedout
455
- };
456
- }, "useGatewayFromWallet");
457
- var useGateway = useGatewayFromWallet;
168
+ import { useGateway, useGatewayFromWallet } from "@xyo-network/react-chain-client";
458
169
 
459
170
  // src/contexts/current-block/context.ts
460
171
  import { createContextEx } from "@xylabs/react-shared";
@@ -464,16 +175,16 @@ var XL1CurrentBlockContext = createContextEx();
464
175
  import React2, { useMemo } from "react";
465
176
 
466
177
  // src/contexts/current-block/usePollCurrentBlock.ts
467
- import { isDefinedNotNull as isDefinedNotNull2, isUndefinedOrNull } from "@xylabs/sdk-js";
468
- import { startTransition, useEffect as useEffect2, useState } from "react";
178
+ import { isDefinedNotNull, isUndefinedOrNull } from "@xylabs/sdk-js";
179
+ import { startTransition, useEffect, useState } from "react";
469
180
  var DEFAULT_POLL_INTERVAL = 1e4;
470
181
  var usePollCurrentBlock = /* @__PURE__ */ __name((viewer, interval = DEFAULT_POLL_INTERVAL, pause = false) => {
471
182
  const [currentBlock, setCurrentBlock] = useState(null);
472
183
  const [error, setError] = useState();
473
- useEffect2(() => {
184
+ useEffect(() => {
474
185
  let isMounted = true;
475
186
  const fetchBlock = /* @__PURE__ */ __name(async () => {
476
- if (isDefinedNotNull2(viewer)) {
187
+ if (isDefinedNotNull(viewer)) {
477
188
  try {
478
189
  const block = await viewer.currentBlock();
479
190
  if (isMounted) {
@@ -482,7 +193,7 @@ var usePollCurrentBlock = /* @__PURE__ */ __name((viewer, interval = DEFAULT_POL
482
193
  if (isUndefinedOrNull(existingBlock)) {
483
194
  return block;
484
195
  }
485
- if (isDefinedNotNull2(block) && existingBlock?.[0].block !== block[0].block) {
196
+ if (isDefinedNotNull(block) && existingBlock?.[0].block !== block[0].block) {
486
197
  return block;
487
198
  }
488
199
  return existingBlock;
@@ -552,9 +263,10 @@ import { createContextEx as createContextEx2 } from "@xylabs/react-shared";
552
263
  var GatewayContext = createContextEx2();
553
264
 
554
265
  // src/contexts/gateway/Provider.tsx
555
- import { isDefinedNotNull as isDefinedNotNull3, isNull as isNull4 } from "@xylabs/sdk-js";
266
+ import { isDefinedNotNull as isDefinedNotNull2, isNull } from "@xylabs/sdk-js";
267
+ import { useGatewayFromWallet as useGatewayFromWallet2 } from "@xyo-network/react-chain-client";
556
268
  import { ErrorRender } from "@xyo-network/react-error";
557
- import React4, { useEffect as useEffect4, useMemo as useMemo3, useState as useState3 } from "react";
269
+ import React4, { useMemo as useMemo3 } from "react";
558
270
 
559
271
  // src/contexts/in-page-gateways/context.ts
560
272
  import { createContextEx as createContextEx3 } from "@xylabs/react-shared";
@@ -562,12 +274,12 @@ var InPageGatewaysContext = createContextEx3();
562
274
 
563
275
  // src/contexts/in-page-gateways/Provider.tsx
564
276
  import { DefaultNetworks as DefaultNetworks2 } from "@xyo-network/xl1-sdk";
565
- import React3, { startTransition as startTransition2, useCallback as useCallback2, useEffect as useEffect3, useMemo as useMemo2, useState as useState2 } from "react";
277
+ import React3, { startTransition as startTransition2, useCallback, useEffect as useEffect2, useMemo as useMemo2, useState as useState2 } from "react";
566
278
  var InPageGatewaysProvider = /* @__PURE__ */ __name(({ account, children }) => {
567
279
  const [gateways, setGateways] = useState2({});
568
280
  const [errors, setErrors] = useState2({});
569
281
  const [previousAccount, setPreviousAccount] = useState2(account);
570
- const clearAll = useCallback2(() => {
282
+ const clearAll = useCallback(() => {
571
283
  setGateways({});
572
284
  setErrors({});
573
285
  }, []);
@@ -575,7 +287,7 @@ var InPageGatewaysProvider = /* @__PURE__ */ __name(({ account, children }) => {
575
287
  clearAll();
576
288
  setPreviousAccount(account);
577
289
  }
578
- useEffect3(() => {
290
+ useEffect2(() => {
579
291
  let cancelled = false;
580
292
  const buildAll = /* @__PURE__ */ __name(async () => {
581
293
  const results = await Promise.allSettled(DefaultNetworks2.map(async (network) => {
@@ -632,29 +344,35 @@ var useProvidedInPageGateways = /* @__PURE__ */ __name((required = true) => useC
632
344
 
633
345
  // src/contexts/gateway/Provider.tsx
634
346
  var GatewayProvider = /* @__PURE__ */ __name(({ gatewayName, children }) => {
635
- const [defaultGateway, setDefaultGateway] = useState3();
636
- const [gateways, setGateways] = useState3({
637
- inPageGateway: void 0,
638
- walletGateway: void 0
639
- });
640
- const { gateway: gatewayFromWallet, error: gatewayFromWalletError } = useGatewayFromWallet(gatewayName);
347
+ const { gateway: gatewayFromWallet, error: gatewayFromWalletError } = useGatewayFromWallet2(gatewayName);
641
348
  const { gateways: allGateways, errors: allGatewayErrors, clearAll } = useProvidedInPageGateways(true);
642
349
  const gatewayFromConfig = gatewayName ? allGateways[gatewayName] : void 0;
643
350
  const gatewayFromConfigError = gatewayName ? allGatewayErrors[gatewayName] : void 0;
644
- useEffect4(() => {
645
- if (isNull4(gatewayFromWallet)) {
646
- setDefaultGateway(gatewayFromConfig);
647
- setGateways({
648
- inPageGateway: gatewayFromConfig,
649
- walletGateway: null
650
- });
651
- } else if (isDefinedNotNull3(gatewayFromWallet)) {
652
- setDefaultGateway(gatewayFromWallet);
653
- setGateways({
654
- inPageGateway: gatewayFromConfig,
655
- walletGateway: gatewayFromWallet
656
- });
351
+ const { defaultGateway, gateways } = useMemo3(() => {
352
+ if (isNull(gatewayFromWallet)) {
353
+ return {
354
+ defaultGateway: gatewayFromConfig,
355
+ gateways: {
356
+ inPageGateway: gatewayFromConfig,
357
+ walletGateway: null
358
+ }
359
+ };
360
+ } else if (isDefinedNotNull2(gatewayFromWallet)) {
361
+ return {
362
+ defaultGateway: gatewayFromWallet,
363
+ gateways: {
364
+ inPageGateway: gatewayFromConfig,
365
+ walletGateway: gatewayFromWallet
366
+ }
367
+ };
657
368
  }
369
+ return {
370
+ defaultGateway: void 0,
371
+ gateways: {
372
+ inPageGateway: void 0,
373
+ walletGateway: void 0
374
+ }
375
+ };
658
376
  }, [
659
377
  gatewayFromConfig,
660
378
  gatewayFromWallet
@@ -704,16 +422,123 @@ var useViewerFromGateway = /* @__PURE__ */ __name(() => {
704
422
  return defaultGateway?.connection?.viewer;
705
423
  }, "useViewerFromGateway");
706
424
 
425
+ // src/hooks/helpers/getXyoClient.ts
426
+ import { getXyoClient, listenForClientInjection } from "@xyo-network/react-chain-client";
427
+
428
+ // src/hooks/helpers/transaction/Confirmation.ts
429
+ import { assertEx as assertEx2, delay, forget, isDefined as isDefined2, isNull as isNull2 } from "@xylabs/sdk-js";
430
+ var TransactionConfirmationStatus = class _TransactionConfirmationStatus {
431
+ static {
432
+ __name(this, "TransactionConfirmationStatus");
433
+ }
434
+ _params;
435
+ active = false;
436
+ constructor(params) {
437
+ this._params = params;
438
+ }
439
+ get exp() {
440
+ return assertEx2(this.transaction[0].exp, () => "exp is not found, transaction is not set");
441
+ }
442
+ get nbf() {
443
+ return assertEx2(this.transaction[0].nbf, () => "nbf is not found, transaction is not set");
444
+ }
445
+ get onStatusUpdate() {
446
+ return this._params.onStatusUpdate;
447
+ }
448
+ get params() {
449
+ return this._params;
450
+ }
451
+ get transaction() {
452
+ return this.params.transaction;
453
+ }
454
+ get txHash() {
455
+ return this.params.txHash;
456
+ }
457
+ get viewer() {
458
+ return this.params.viewer;
459
+ }
460
+ static create(params) {
461
+ return new _TransactionConfirmationStatus(params);
462
+ }
463
+ async start() {
464
+ this.active = true;
465
+ try {
466
+ const currentBlockNumber = await this.viewer.currentBlockNumber();
467
+ while (isDefined2(currentBlockNumber) && this.active) {
468
+ await this.checkBlock(currentBlockNumber);
469
+ await delay(1e3);
470
+ }
471
+ } catch (error) {
472
+ await this.stop();
473
+ forget(this.onStatusUpdate?.({
474
+ error: error instanceof Error ? error : new Error("Unknown error occurred"),
475
+ confirmed: false,
476
+ blockNumber: 0,
477
+ progress: 0,
478
+ remainingBlocks: 0
479
+ }));
480
+ }
481
+ }
482
+ stop() {
483
+ this.active = false;
484
+ }
485
+ async checkBlock(blockNumber) {
486
+ if (blockNumber < this.nbf) {
487
+ await this.stop();
488
+ forget(this.onStatusUpdate?.({
489
+ error: new Error(`Block number: ${blockNumber} is before ${this.nbf}`),
490
+ confirmed: false,
491
+ blockNumber,
492
+ progress: 0,
493
+ remainingBlocks: this.exp - blockNumber
494
+ }));
495
+ }
496
+ if (blockNumber > this.exp) {
497
+ forget(this.onStatusUpdate?.({
498
+ confirmed: false,
499
+ blockNumber,
500
+ progress: 100,
501
+ remainingBlocks: 0
502
+ }));
503
+ return;
504
+ }
505
+ if (blockNumber < this.exp) {
506
+ await this.checkConfirmation(blockNumber);
507
+ }
508
+ }
509
+ async checkConfirmation(blockNumber) {
510
+ const remainingBlocks = this.exp - blockNumber;
511
+ const progress = Math.round((blockNumber - this.nbf) / (this.exp - this.nbf) * 100);
512
+ const tx = await this.viewer.transaction.byHash?.(this.txHash);
513
+ if (isNull2(tx)) {
514
+ this.onStatusUpdate?.({
515
+ confirmed: false,
516
+ blockNumber,
517
+ progress,
518
+ remainingBlocks
519
+ });
520
+ } else {
521
+ this.onStatusUpdate?.({
522
+ confirmed: true,
523
+ blockNumber,
524
+ progress,
525
+ remainingBlocks
526
+ });
527
+ await this.stop();
528
+ }
529
+ }
530
+ };
531
+
707
532
  // src/hooks/useAddressBalance.ts
708
- import { usePromise as usePromise3 } from "@xylabs/react-promise";
709
- import { isUndefined as isUndefined3, isUndefinedOrNull as isUndefinedOrNull2 } from "@xylabs/sdk-js";
533
+ import { usePromise as usePromise2 } from "@xylabs/react-promise";
534
+ import { isUndefined as isUndefined2, isUndefinedOrNull as isUndefinedOrNull2 } from "@xylabs/sdk-js";
710
535
  import { ShiftedBigInt } from "@xyo-network/xl1-sdk";
711
- import { useMemo as useMemo4, useRef, useState as useState4 } from "react";
536
+ import { useMemo as useMemo4, useRef, useState as useState3 } from "react";
712
537
  var useAddressBalance = /* @__PURE__ */ __name((address, viewer, refresh, reset) => {
713
- const [balancesResult, setBalancesResult] = useState4();
714
- const [loading, setLoading] = useState4(false);
715
- const [balancesError, setBalancesError] = useState4();
716
- const [previousReset, setPreviousReset] = useState4(reset);
538
+ const [balancesResult, setBalancesResult] = useState3();
539
+ const [loading, setLoading] = useState3(false);
540
+ const [balancesError, setBalancesError] = useState3();
541
+ const [previousReset, setPreviousReset] = useState3(reset);
717
542
  if (reset !== previousReset) {
718
543
  setPreviousReset(reset);
719
544
  setBalancesResult(void 0);
@@ -721,8 +546,8 @@ var useAddressBalance = /* @__PURE__ */ __name((address, viewer, refresh, reset)
721
546
  setLoading(false);
722
547
  }
723
548
  const balancePromiseRef = useRef(null);
724
- usePromise3(async () => {
725
- if (isUndefined3(viewer) || isUndefined3(address)) return;
549
+ usePromise2(async () => {
550
+ if (isUndefined2(viewer) || isUndefined2(address)) return;
726
551
  setLoading(true);
727
552
  setBalancesError(void 0);
728
553
  const currentPromise = viewer.account.balance.accountBalance(address);
@@ -746,13 +571,6 @@ var useAddressBalance = /* @__PURE__ */ __name((address, viewer, refresh, reset)
746
571
  viewer,
747
572
  refresh
748
573
  ]);
749
- useMemo4(() => {
750
- if (balancesError) {
751
- setLoading(false);
752
- }
753
- }, [
754
- balancesError
755
- ]);
756
574
  const shiftedBigInt = useMemo4(() => {
757
575
  if (typeof balancesResult !== "bigint") return;
758
576
  return new ShiftedBigInt(balancesResult, {
@@ -787,22 +605,22 @@ var useAddressBalance = /* @__PURE__ */ __name((address, viewer, refresh, reset)
787
605
  }, "useAddressBalance");
788
606
 
789
607
  // src/hooks/useConfirmTransactionBase.ts
790
- import { usePromise as usePromise4 } from "@xylabs/react-promise";
791
- import { forget as forget2, isDefined as isDefined6, isHash } from "@xylabs/sdk-js";
608
+ import { usePromise as usePromise3 } from "@xylabs/react-promise";
609
+ import { forget as forget2, isDefined as isDefined3, isHash } from "@xylabs/sdk-js";
792
610
  import { PayloadBuilder } from "@xyo-network/sdk-js";
793
- import { useEffect as useEffect5, useState as useState5 } from "react";
611
+ import { useEffect as useEffect3, useState as useState4 } from "react";
794
612
  var useConfirmTransactionBase = /* @__PURE__ */ __name((transaction, onBroadcast, onStatusUpdate, runner, viewer) => {
795
- const [status, setStatus] = useState5();
613
+ const [status, setStatus] = useState4();
796
614
  const onStatusUpdateLocal = /* @__PURE__ */ __name((newStatus) => {
797
615
  setStatus(newStatus);
798
616
  onStatusUpdate?.(newStatus);
799
617
  }, "onStatusUpdateLocal");
800
- const [transactionConfirmationStatus, transactionConfirmationError] = usePromise4(async () => {
801
- const hasRunner = isDefined6(runner);
618
+ const [transactionConfirmationStatus, transactionConfirmationError] = usePromise3(async () => {
619
+ const hasRunner = isDefined3(runner);
802
620
  if (transaction && viewer) {
803
621
  const hash = hasRunner ? await runner.broadcastTransaction(transaction) : await PayloadBuilder.hash(transaction[0]);
804
622
  if (isHash(hash)) {
805
- if (hasRunner && isDefined6(onBroadcast)) onBroadcast(hash);
623
+ if (hasRunner && isDefined3(onBroadcast)) onBroadcast(hash);
806
624
  const params = {
807
625
  onStatusUpdate: onStatusUpdateLocal,
808
626
  transaction,
@@ -821,7 +639,7 @@ var useConfirmTransactionBase = /* @__PURE__ */ __name((transaction, onBroadcast
821
639
  runner,
822
640
  viewer
823
641
  ]);
824
- useEffect5(() => {
642
+ useEffect3(() => {
825
643
  return () => {
826
644
  if (transactionConfirmationStatus) {
827
645
  forget2(transactionConfirmationStatus.stop());
@@ -840,13 +658,13 @@ var useConfirmTransactionBase = /* @__PURE__ */ __name((transaction, onBroadcast
840
658
  import { asAddress } from "@xylabs/sdk-js";
841
659
  import { assertEx as assertEx3 } from "@xylabs/sdk-js";
842
660
  import { MainNetwork } from "@xyo-network/xl1-sdk";
843
- import { useCallback as useCallback3, useState as useState6 } from "react";
661
+ import { useCallback as useCallback2, useState as useState5 } from "react";
844
662
  var useConnectAccount = /* @__PURE__ */ __name((gatewayName = MainNetwork.id, timeout) => {
845
- const [connectError, setConnectError] = useState6();
663
+ const [connectError, setConnectError] = useState5();
846
664
  const { gateway, error, timedout } = useGatewayFromWallet(gatewayName, timeout);
847
665
  const [accountPermissions, accountPermissionsError] = useAccountPermissions();
848
- const [address, setAddress] = useState6();
849
- const connectSigner = useCallback3(async () => {
666
+ const [address, setAddress] = useState5();
667
+ const connectSigner = useCallback2(async () => {
850
668
  try {
851
669
  setConnectError(void 0);
852
670
  const assertedGateway = assertEx3(gateway, () => `Gateway ${gatewayName} is not available`);
@@ -871,11 +689,11 @@ var useConnectAccount = /* @__PURE__ */ __name((gatewayName = MainNetwork.id, ti
871
689
  }, "useConnectAccount");
872
690
 
873
691
  // src/hooks/useCurrentBlock.ts
874
- import { usePromise as usePromise5 } from "@xylabs/react-promise";
875
- import { isDefinedNotNull as isDefinedNotNull4 } from "@xylabs/sdk-js";
692
+ import { usePromise as usePromise4 } from "@xylabs/react-promise";
693
+ import { isDefinedNotNull as isDefinedNotNull3 } from "@xylabs/sdk-js";
876
694
  var useCurrentBlock = /* @__PURE__ */ __name((refresh = 1, viewer) => {
877
- return usePromise5(async () => {
878
- if (isDefinedNotNull4(viewer) && refresh > 0) {
695
+ return usePromise4(async () => {
696
+ if (isDefinedNotNull3(viewer) && refresh > 0) {
879
697
  const block = await viewer.currentBlock();
880
698
  return block;
881
699
  }
@@ -886,8 +704,8 @@ var useCurrentBlock = /* @__PURE__ */ __name((refresh = 1, viewer) => {
886
704
  }, "useCurrentBlock");
887
705
  var useCurrentBlockFromGateway = /* @__PURE__ */ __name((refresh = 1) => {
888
706
  const viewer = useViewerFromGateway();
889
- return usePromise5(async () => {
890
- if (isDefinedNotNull4(viewer) && refresh > 0) {
707
+ return usePromise4(async () => {
708
+ if (isDefinedNotNull3(viewer) && refresh > 0) {
891
709
  const block = await viewer.currentBlock();
892
710
  return block;
893
711
  }
@@ -898,12 +716,12 @@ var useCurrentBlockFromGateway = /* @__PURE__ */ __name((refresh = 1) => {
898
716
  }, "useCurrentBlockFromGateway");
899
717
 
900
718
  // src/hooks/useNetwork.ts
901
- import { isUndefined as isUndefined4 } from "@xylabs/sdk-js";
719
+ import { isUndefined as isUndefined3 } from "@xylabs/sdk-js";
902
720
  import { SimpleXyoNetwork } from "@xyo-network/xl1-sdk";
903
721
  import { useMemo as useMemo5 } from "react";
904
722
  var useNetwork = /* @__PURE__ */ __name((id) => {
905
723
  const network = useMemo5(() => {
906
- if (isUndefined4(id)) return;
724
+ if (isUndefined3(id)) return;
907
725
  return new SimpleXyoNetwork(id);
908
726
  }, [
909
727
  id
@@ -912,10 +730,10 @@ var useNetwork = /* @__PURE__ */ __name((id) => {
912
730
  }, "useNetwork");
913
731
 
914
732
  // src/hooks/useSigner.ts
915
- import { usePromise as usePromise6 } from "@xylabs/react-promise";
733
+ import { usePromise as usePromise5 } from "@xylabs/react-promise";
916
734
  import { SimpleXyoSigner } from "@xyo-network/xl1-sdk";
917
735
  var useSigner = /* @__PURE__ */ __name((_provider, account) => {
918
- return usePromise6(async () => account ? await SimpleXyoSigner.create({
736
+ return usePromise5(async () => account ? await SimpleXyoSigner.create({
919
737
  account
920
738
  }) : void 0, [
921
739
  account
@@ -923,11 +741,11 @@ var useSigner = /* @__PURE__ */ __name((_provider, account) => {
923
741
  }, "useSigner");
924
742
 
925
743
  // src/hooks/viewer/useCheckRpc.ts
926
- import { usePromise as usePromise7 } from "@xylabs/react-promise";
927
- import { delay as delay2, isDefined as isDefined7, isUndefined as isUndefined5 } from "@xylabs/sdk-js";
744
+ import { usePromise as usePromise6 } from "@xylabs/react-promise";
745
+ import { delay as delay2, isDefined as isDefined4, isUndefined as isUndefined4 } from "@xylabs/sdk-js";
928
746
  import { basicRemoteViewerLocator as basicRemoteViewerLocator2 } from "@xyo-network/chain-orchestration";
929
747
  import { LocalNetwork, SequenceNetwork, XyoViewerMoniker } from "@xyo-network/xl1-sdk";
930
- import { useEffect as useEffect6, useState as useState7 } from "react";
748
+ import { useEffect as useEffect4, useState as useState6 } from "react";
931
749
  var INTERVAL = 5e3;
932
750
  var localRpcEndpoint = `${LocalNetwork.url}/rpc`;
933
751
  var sequenceRpcEndpoint = `${SequenceNetwork.url}/rpc`;
@@ -940,10 +758,10 @@ var useCheckSequenceRpc = /* @__PURE__ */ __name(() => {
940
758
  return isSequenceRpc;
941
759
  }, "useCheckSequenceRpc");
942
760
  var useCheckRpc = /* @__PURE__ */ __name((endpoint) => {
943
- const [isLocalProducer, setIsLocalProducer] = useState7(false);
944
- const [error, setError] = useState7();
945
- const [viewer] = usePromise7(async () => {
946
- if (isUndefined5(endpoint)) return;
761
+ const [isLocalProducer, setIsLocalProducer] = useState6(false);
762
+ const [error, setError] = useState6();
763
+ const [viewer] = usePromise6(async () => {
764
+ if (isUndefined4(endpoint)) return;
947
765
  const locator = await basicRemoteViewerLocator2(endpoint, {
948
766
  rpc: {
949
767
  protocol: "http",
@@ -955,14 +773,14 @@ var useCheckRpc = /* @__PURE__ */ __name((endpoint) => {
955
773
  }, [
956
774
  endpoint
957
775
  ]);
958
- useEffect6(() => {
959
- if (isUndefined5(viewer)) return;
776
+ useEffect4(() => {
777
+ if (isUndefined4(viewer)) return;
960
778
  void (async () => {
961
779
  setError(void 0);
962
780
  while (!isLocalProducer) {
963
781
  try {
964
782
  const block = await viewer.currentBlock();
965
- setIsLocalProducer(isDefined7(block));
783
+ setIsLocalProducer(isDefined4(block));
966
784
  } catch (err) {
967
785
  setError(err);
968
786
  setIsLocalProducer(false);
@@ -981,7 +799,7 @@ var useCheckRpc = /* @__PURE__ */ __name((endpoint) => {
981
799
  }, "useCheckRpc");
982
800
 
983
801
  // src/hooks/viewer/ViewerWithDataLake.ts
984
- import { isNull as isNull5 } from "@xylabs/sdk-js";
802
+ import { isNull as isNull3 } from "@xylabs/sdk-js";
985
803
  import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-js";
986
804
  import { addDataLakePayloads, addDataLakePayloadsToPayloads, DataLakeViewerMoniker, JsonRpcXyoViewer } from "@xyo-network/xl1-sdk";
987
805
  var ViewerWithDataLake = class extends JsonRpcXyoViewer {
@@ -1011,7 +829,7 @@ var ViewerWithDataLake = class extends JsonRpcXyoViewer {
1011
829
  await PayloadBuilder2.addHashMeta(transaction[0]),
1012
830
  await PayloadBuilder2.addHashMeta(transaction[1])
1013
831
  ] : null;
1014
- return isNull5(transaction) ? transaction : (await addDataLakePayloads([
832
+ return isNull3(transaction) ? transaction : (await addDataLakePayloads([
1015
833
  await PayloadBuilder2.addHashMeta(transaction[0]),
1016
834
  await PayloadBuilder2.addHashMeta(transaction[1])
1017
835
  ], this.dataLakeViewer))[0];
@@ -1041,16 +859,16 @@ var DefaultNoWalletInstalledComponent = /* @__PURE__ */ __name(() => /* @__PURE_
1041
859
  }, "Get XL1 Wallet")), "DefaultNoWalletInstalledComponent");
1042
860
  var ConnectAccountsStack = /* @__PURE__ */ __name(({ AccountComponent = ConnectedAccount, ConnectComponent = DefaultConnectComponent, NoWalletInstalledComponent = DefaultNoWalletInstalledComponent, onAccountConnected, onCancel, timeout, ...props }) => {
1043
861
  const { address, connectSigner, error, timedout } = useConnectAccount(void 0, timeout);
1044
- useEffect7(() => {
1045
- if (isDefined8(error) && isDefined8(onCancel)) {
862
+ useEffect5(() => {
863
+ if (isDefined5(error) && isDefined5(onCancel)) {
1046
864
  onCancel();
1047
865
  }
1048
866
  }, [
1049
867
  error,
1050
868
  onCancel
1051
869
  ]);
1052
- useEffect7(() => {
1053
- if (isDefined8(address) && isDefined8(onAccountConnected)) {
870
+ useEffect5(() => {
871
+ if (isDefined5(address) && isDefined5(onAccountConnected)) {
1054
872
  onAccountConnected(address);
1055
873
  }
1056
874
  }, [
@@ -1062,11 +880,11 @@ var ConnectAccountsStack = /* @__PURE__ */ __name(({ AccountComponent = Connecte
1062
880
  alignItems: "start",
1063
881
  spacing: 2,
1064
882
  ...props
1065
- }, isDefined8(address) ? /* @__PURE__ */ React5.createElement(AccountComponent, {
883
+ }, isDefined5(address) ? /* @__PURE__ */ React5.createElement(AccountComponent, {
1066
884
  address
1067
- }) : null, isUndefined6(address) && !timedout ? /* @__PURE__ */ React5.createElement(ConnectComponent, {
885
+ }) : null, isUndefined5(address) && !timedout ? /* @__PURE__ */ React5.createElement(ConnectComponent, {
1068
886
  onClick: /* @__PURE__ */ __name(() => void connectSigner(), "onClick")
1069
- }, "Connect") : null, isUndefined6(address) && timedout ? /* @__PURE__ */ React5.createElement(NoWalletInstalledComponent, null) : null, /* @__PURE__ */ React5.createElement(ErrorRender2, {
887
+ }, "Connect") : null, isUndefined5(address) && timedout ? /* @__PURE__ */ React5.createElement(NoWalletInstalledComponent, null) : null, /* @__PURE__ */ React5.createElement(ErrorRender2, {
1070
888
  error,
1071
889
  scope: "ConnectSigner:error"
1072
890
  }));