@xyo-network/react-chain-network 1.19.12 → 1.19.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../../src/components/broadcast/Drawer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAIhD,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAKvE,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,2BAA2B,CAAA;IACnC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B;AAED,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAqDvE,CAAA;AAED,eAAO,MAAM,mCAAmC,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAUrE,CAAA"}
1
+ {"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../../src/components/broadcast/Drawer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAIhD,OAAO,KAAmB,MAAM,OAAO,CAAA;AAGvC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAKvE,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,2BAA2B,CAAA;IACnC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B;AAED,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAwDvE,CAAA;AAED,eAAO,MAAM,mCAAmC,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAUrE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SummaryStack.d.ts","sourceRoot":"","sources":["../../../../../src/components/broadcast/details/SummaryStack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAIpD,OAAO,EAEoB,KAAK,UAAU,EAEzC,MAAM,eAAe,CAAA;AAGtB,OAAO,KAAK,MAAM,OAAO,CAAA;AAkBzB,MAAM,WAAW,wCAAyC,SAAQ,UAAU;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AACD,eAAO,MAAM,qCAAqC,EAAE,KAAK,CAAC,EAAE,CAAC,wCAAwC,CAkCpG,CAAA"}
1
+ {"version":3,"file":"SummaryStack.d.ts","sourceRoot":"","sources":["../../../../../src/components/broadcast/details/SummaryStack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAIpD,OAAO,EAEoB,KAAK,UAAU,EAEzC,MAAM,eAAe,CAAA;AAKtB,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,WAAW,wCAAyC,SAAQ,UAAU;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,qCAAqC,EAAE,KAAK,CAAC,EAAE,CAAC,wCAAwC,CAyCpG,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import type { ChangeEvent } from 'react';
2
2
  import type { RpcRequestResponsePairsById } from '../../model/index.ts';
3
- export declare const usePaginatedEventPairs: (formattedEvents: RpcRequestResponsePairsById, numberOfVisiblePairs: number, onClearEvents?: () => void) => {
3
+ export declare const usePaginatedEventPairs: (formattedEvents: RpcRequestResponsePairsById, numberOfVisiblePairs: number, onClearEvents?: () => void, scrollableDiv?: HTMLDivElement | null) => {
4
4
  allEventEntries: [string, import("../../model/BroadcastRpc.ts").RpcRequestResponsePairs][];
5
5
  visibleEvents: [string, import("../../model/BroadcastRpc.ts").RpcRequestResponsePairs][];
6
6
  effectiveCurrentPage: number;
@@ -1 +1 @@
1
- {"version":3,"file":"usePaginatedEventPairs.d.ts","sourceRoot":"","sources":["../../../../src/components/broadcast/usePaginatedEventPairs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAKxC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAEvE,eAAO,MAAM,sBAAsB,GACjC,iBAAiB,2BAA2B,EAC5C,sBAAsB,MAAM,EAC5B,gBAAgB,MAAM,IAAI;;;;;;;;+BAuCoB,WAAW,CAAC,OAAO,CAAC,QAAQ,MAAM;CAcjF,CAAA"}
1
+ {"version":3,"file":"usePaginatedEventPairs.d.ts","sourceRoot":"","sources":["../../../../src/components/broadcast/usePaginatedEventPairs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAKxC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAEvE,eAAO,MAAM,sBAAsB,GACjC,iBAAiB,2BAA2B,EAC5C,sBAAsB,MAAM,EAC5B,gBAAgB,MAAM,IAAI,EAC1B,gBAAgB,cAAc,GAAG,IAAI;;;;;;;;+BA0CS,WAAW,CAAC,OAAO,CAAC,QAAQ,MAAM;CAcjF,CAAA"}
@@ -3,7 +3,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
3
3
 
4
4
  // src/components/broadcast/Drawer.tsx
5
5
  import { Box, Button, Drawer, Pagination, Stack as Stack3, Typography as Typography3 } from "@mui/material";
6
- import React5 from "react";
6
+ import React5, { useState as useState7 } from "react";
7
7
 
8
8
  // src/hooks/provider/useActiveNetworkCurrentBlock.ts
9
9
  import { useCurrentBlock, useViewerFromWallet as useViewerFromWallet2 } from "@xyo-network/react-chain-provider";
@@ -305,28 +305,21 @@ import React4, { memo, useState as useState5 } from "react";
305
305
 
306
306
  // src/components/broadcast/details/SummaryStack.tsx
307
307
  import { ArrowRight, CheckCircle, Warning } from "@mui/icons-material";
308
- import { Avatar, Icon, IconButton as IconButton2, Stack, Typography, useTheme } from "@mui/material";
308
+ import { Avatar, Icon, IconButton as IconButton2, Stack, Tooltip, Typography, useTheme } from "@mui/material";
309
309
  import { Identicon } from "@xylabs/react-identicon";
310
- import { isDefined as isDefined4, isHash } from "@xylabs/sdk-js";
310
+ import { usePromise as usePromise2 } from "@xylabs/react-promise";
311
+ import { isDefined as isDefined4 } from "@xylabs/sdk-js";
312
+ import { ObjectHasher } from "@xyo-network/hash";
311
313
  import React3 from "react";
312
- var inferParamsType = /* @__PURE__ */ __name((params) => {
313
- if (!params || !Array.isArray(params)) return {
314
- type: "unknown"
315
- };
316
- const firstParam = params[0];
317
- if (isHash(firstParam)) {
318
- return {
319
- type: "hash",
320
- value: firstParam
321
- };
322
- }
323
- return {
324
- type: "unknown"
325
- };
326
- }, "inferParamsType");
327
314
  var BroadcastedRpcCallDetailsSummaryStack = /* @__PURE__ */ __name(({ expanded, setExpanded, method, timestamp, hasResult, params, ...props }) => {
328
315
  const theme = useTheme();
329
- const { type, value } = inferParamsType(params);
316
+ const [hash, hashError] = usePromise2(async () => {
317
+ if (isDefined4(params)) {
318
+ return await ObjectHasher.hash(params);
319
+ }
320
+ }, [
321
+ params
322
+ ]);
330
323
  return /* @__PURE__ */ React3.createElement(Stack, {
331
324
  direction: "row",
332
325
  gap: 2,
@@ -350,16 +343,18 @@ var BroadcastedRpcCallDetailsSummaryStack = /* @__PURE__ */ __name(({ expanded,
350
343
  component: "span",
351
344
  variant: "body2",
352
345
  fontFamily: "monospace"
353
- }, method), type === "hash" ? /* @__PURE__ */ React3.createElement(Avatar, {
346
+ }, method), /* @__PURE__ */ React3.createElement(Tooltip, {
347
+ title: isDefined4(hashError) ? `Error generating hash of params: ${hashError.message}` : isDefined4(params) ? `Params : ${JSON.stringify(params, null, 2)}` : "Generating params hash..."
348
+ }, /* @__PURE__ */ React3.createElement(Avatar, {
354
349
  sx: {
355
350
  backgroundColor: theme.vars?.palette.text.primary,
356
351
  width: 20,
357
352
  height: 20
358
353
  }
359
354
  }, /* @__PURE__ */ React3.createElement(Identicon, {
360
- value,
355
+ value: hash,
361
356
  size: 14
362
- })) : null, /* @__PURE__ */ React3.createElement(Typography, {
357
+ }))), /* @__PURE__ */ React3.createElement(Typography, {
363
358
  component: "span",
364
359
  variant: "caption",
365
360
  color: "text.secondary",
@@ -401,6 +396,7 @@ var BroadcastedRpcCallDetailsCard = /* @__PURE__ */ memo(({ rpcRequestResponsePa
401
396
  timestamp: request.timestamp
402
397
  }), /* @__PURE__ */ React4.createElement(Collapse, {
403
398
  in: expanded,
399
+ mountOnEnter: true,
404
400
  unmountOnExit: true
405
401
  }, /* @__PURE__ */ React4.createElement(Stack2, {
406
402
  direction: "column",
@@ -436,8 +432,9 @@ var BroadcastedRpcCallDetailsCard = /* @__PURE__ */ memo(({ rpcRequestResponsePa
436
432
  });
437
433
 
438
434
  // src/components/broadcast/usePaginatedEventPairs.ts
435
+ import { isDefinedNotNull } from "@xylabs/sdk-js";
439
436
  import { useCallback as useCallback3, useMemo as useMemo2, useState as useState6 } from "react";
440
- var usePaginatedEventPairs = /* @__PURE__ */ __name((formattedEvents, numberOfVisiblePairs, onClearEvents) => {
437
+ var usePaginatedEventPairs = /* @__PURE__ */ __name((formattedEvents, numberOfVisiblePairs, onClearEvents, scrollableDiv) => {
441
438
  const [currentPage, setCurrentPage] = useState6(0);
442
439
  const allEventEntries = useMemo2(() => {
443
440
  return Object.entries(formattedEvents ?? {}).toSorted(([, a], [, b]) => b.request.timestamp - a.request.timestamp);
@@ -458,13 +455,20 @@ var usePaginatedEventPairs = /* @__PURE__ */ __name((formattedEvents, numberOfVi
458
455
  totalPages
459
456
  ]);
460
457
  const visibleEvents = useMemo2(() => {
458
+ if (isDefinedNotNull(scrollableDiv)) {
459
+ scrollableDiv.scrollTo({
460
+ top: 0,
461
+ behavior: "smooth"
462
+ });
463
+ }
461
464
  const startIndex = effectiveCurrentPage * numberOfVisiblePairs;
462
465
  const endIndex = startIndex + numberOfVisiblePairs;
463
466
  return allEventEntries.slice(startIndex, endIndex);
464
467
  }, [
465
468
  allEventEntries,
466
469
  effectiveCurrentPage,
467
- numberOfVisiblePairs
470
+ numberOfVisiblePairs,
471
+ scrollableDiv
468
472
  ]);
469
473
  const handlePreviousPage = useCallback3(() => {
470
474
  setCurrentPage((prev) => Math.max(0, prev - 1));
@@ -497,7 +501,8 @@ var usePaginatedEventPairs = /* @__PURE__ */ __name((formattedEvents, numberOfVi
497
501
 
498
502
  // src/components/broadcast/Drawer.tsx
499
503
  var BroadcastedRpcCallsDrawer = /* @__PURE__ */ __name(({ anchor = "right", onClearEvents, drawerTitle, events, onClose, numberOfVisibleEvents = 25, ...props }) => {
500
- const { allEventEntries, visibleEvents, totalPages, effectiveCurrentPage, handleClearEvents, handlePageChange } = usePaginatedEventPairs(events, numberOfVisibleEvents, onClearEvents);
504
+ const [scrollableDiv, setScrollableDiv] = useState7(null);
505
+ const { allEventEntries, visibleEvents, totalPages, effectiveCurrentPage, handleClearEvents, handlePageChange } = usePaginatedEventPairs(events, numberOfVisibleEvents, onClearEvents, scrollableDiv);
501
506
  return /* @__PURE__ */ React5.createElement(Drawer, {
502
507
  anchor,
503
508
  onClose,
@@ -536,6 +541,7 @@ var BroadcastedRpcCallsDrawer = /* @__PURE__ */ __name(({ anchor = "right", onCl
536
541
  overflowY: "hidden"
537
542
  }
538
543
  }, /* @__PURE__ */ React5.createElement(Box, {
544
+ ref: /* @__PURE__ */ __name((el) => setScrollableDiv(el), "ref"),
539
545
  sx: {
540
546
  overflowY: "auto",
541
547
  px: 3,
@@ -638,7 +644,7 @@ var NetworkMenuItem = /* @__PURE__ */ __name(({ active, network, onClick, update
638
644
 
639
645
  // src/components/status/Alert.tsx
640
646
  import { Alert, AlertTitle, Button as Button3 } from "@mui/material";
641
- import React10, { useMemo as useMemo3, useState as useState7 } from "react";
647
+ import React10, { useMemo as useMemo3, useState as useState8 } from "react";
642
648
 
643
649
  // src/components/status/Dialog.tsx
644
650
  import { Button as Button2, Dialog, DialogActions, DialogContent, DialogTitle, List, ListItem, Typography as Typography4 } from "@mui/material";
@@ -666,7 +672,7 @@ var NetworkStatusDialog = /* @__PURE__ */ __name(({ updates, ...props }) => {
666
672
 
667
673
  // src/components/status/Alert.tsx
668
674
  var NetworkStatusAlert = /* @__PURE__ */ __name(({ status, ...props }) => {
669
- const [open, setOpen] = useState7(false);
675
+ const [open, setOpen] = useState8(false);
670
676
  const handleClose = /* @__PURE__ */ __name(() => setOpen(false), "handleClose");
671
677
  const severity = useMemo3(() => {
672
678
  if (!status) return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/broadcast/Drawer.tsx","../../src/hooks/provider/useActiveNetworkCurrentBlock.ts","../../src/hooks/provider/useViewerInPage.ts","../../src/context/network/context.ts","../../src/context/network/Provider.tsx","../../src/context/network/settings/defaultChainNetworkSettings.ts","../../src/context/network/settings/useChainNetworkSettings.ts","../../src/context/network/use.ts","../../src/hooks/provider/useActiveNetworkNetwork.ts","../../src/hooks/provider/useActiveNetworkRunner.ts","../../src/hooks/provider/useRpcBroadcastListener.ts","../../src/hooks/provider/useViewerInWallet.ts","../../src/hooks/status/usePollNetworkStatus.ts","../../src/components/broadcast/CloseDrawerIconButton.tsx","../../src/components/broadcast/details/Card.tsx","../../src/components/broadcast/details/SummaryStack.tsx","../../src/components/broadcast/usePaginatedEventPairs.ts","../../src/components/menu/Avatar.tsx","../../src/components/menu/Icon.tsx","../../src/components/menu/MenuItem.tsx","../../src/components/status/Alert.tsx","../../src/components/status/Dialog.tsx","../../src/components/status/NetworkStatus.tsx","../../src/model/BroadcastRpc.ts"],"sourcesContent":["import type { DrawerProps } from '@mui/material'\nimport {\n Box, Button, Drawer, Pagination, Stack, Typography,\n} from '@mui/material'\nimport React from 'react'\n\nimport { useRpcBroadcastListener } from '../../hooks/index.ts'\nimport type { RpcRequestResponsePairsById } from '../../model/index.ts'\nimport { CloseDrawerIconButton } from './CloseDrawerIconButton.tsx'\nimport { BroadcastedRpcCallDetailsCard } from './details/index.ts'\nimport { usePaginatedEventPairs } from './usePaginatedEventPairs.ts'\n\nexport interface BroadcastRpcCallsDrawer extends DrawerProps {\n drawerTitle?: string\n events: RpcRequestResponsePairsById\n numberOfVisibleEvents?: number\n onClearEvents?: () => void\n}\n\nexport const BroadcastedRpcCallsDrawer: React.FC<BroadcastRpcCallsDrawer> = ({\n anchor = 'right',\n onClearEvents,\n drawerTitle,\n events,\n onClose,\n numberOfVisibleEvents = 25,\n ...props\n}) => {\n const {\n allEventEntries,\n visibleEvents,\n totalPages,\n effectiveCurrentPage,\n handleClearEvents,\n handlePageChange,\n } = usePaginatedEventPairs(\n events,\n numberOfVisibleEvents,\n onClearEvents,\n )\n\n return (\n <Drawer anchor={anchor} onClose={onClose} keepMounted={false} {...props}>\n <CloseDrawerIconButton anchor={anchor} onClose={onClose} />\n <Stack gap={2} sx={{ p: 3 }} flexShrink={0}>\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" gap={4}>\n <Typography variant=\"h6\">{drawerTitle ?? 'Broadcasted RPC Calls'}</Typography>\n <Button variant=\"outlined\" size=\"small\" onClick={handleClearEvents}>Clear All</Button>\n </Stack>\n {allEventEntries.length > 0 && (\n <Pagination\n count={totalPages}\n page={effectiveCurrentPage}\n onChange={handlePageChange}\n color=\"primary\"\n />\n )}\n\n </Stack>\n <Stack direction=\"column\" id=\"events-container\" flexGrow={1} sx={{ overflowY: 'hidden' }}>\n <Box\n sx={{\n overflowY: 'auto', px: 3, pb: 3,\n }}\n >\n {visibleEvents.map(([id, broadcastedRpcCall], index) => {\n return <BroadcastedRpcCallDetailsCard key={id} rpcRequestResponsePairs={broadcastedRpcCall} sx={{ mb: index < visibleEvents.length - 1 ? 2 : 0 }} />\n })}\n </Box>\n </Stack>\n </Drawer>\n )\n}\n\nexport const BroadcastedRpcCallsDrawerWithEvents: React.FC<DrawerProps> = (props) => {\n const { clearEvents, events } = useRpcBroadcastListener()\n\n return (\n <BroadcastedRpcCallsDrawer\n events={events}\n onClearEvents={clearEvents}\n {...props}\n />\n )\n}\n","import { useCurrentBlock, useViewerFromWallet } from '@xyo-network/react-chain-provider'\nimport type { XyoViewer } from '@xyo-network/xl1-sdk'\n\nimport { useViewerInPage } from './useViewerInPage.ts'\n\nexport const useActiveNetworkCurrentBlock = (refresh = 1, viewer?: XyoViewer) => {\n const currentBlock = useCurrentBlock(refresh, viewer)\n\n return currentBlock\n}\n\nexport const useActiveNetworkCurrentBlockInPage = (refresh = 1) => {\n const viewer = useViewerInPage()\n const currentBlock = useCurrentBlock(refresh, viewer)\n\n return currentBlock\n}\n\nexport const useActiveNetworkCurrentBlockInWallet = (refresh = 1) => {\n const [viewer] = useViewerFromWallet()\n const currentBlock = useCurrentBlock(refresh, viewer)\n\n return currentBlock\n}\n","import {\n isDefined, isNull, isUndefined,\n} from '@xylabs/sdk-js'\nimport { useHttpRpcViewer, useViewerFromWallet } from '@xyo-network/react-chain-provider'\nimport type { NetworkBootstrap } from '@xyo-network/xl1-sdk'\n\nimport type { ChainNetworkSettings } from '../../context/index.ts'\nimport { useChainNetwork } from '../../context/index.ts'\n\nconst shouldProxy = (networkSettings: ChainNetworkSettings, networkBootstrap: NetworkBootstrap | undefined) => {\n return isDefined(networkBootstrap)\n && isDefined(networkSettings[networkBootstrap.id])\n && networkSettings[networkBootstrap.id].proxy\n}\n\n/**\n * Get the viewer for the active network, first from the wallet or fallback to HTTP RPC\n * @returns - XyoViewer for the active network\n */\nexport const useViewerInPage = (networkOverride?: NetworkBootstrap) => {\n let networkBootstrap: NetworkBootstrap | undefined\n const { activeNetwork, networkSettings } = useChainNetwork()\n networkBootstrap = isDefined(networkOverride) ? networkOverride : activeNetwork\n\n const httpRpcViewer = useHttpRpcViewer(networkBootstrap?.url)\n const [walletRpcViewer] = useViewerFromWallet(networkBootstrap?.id)\n\n // If the wallet viewer is undefined, don't return it yet, useViewerFromWallet is still checking\n if (isUndefined(walletRpcViewer)) return\n\n if (shouldProxy(networkSettings, networkBootstrap)) {\n if (isNull(walletRpcViewer)) {\n console.warn(`Network ${networkBootstrap?.id} is set to proxy but no wallet viewer is available, falling back to HTTP RPC viewer`)\n return httpRpcViewer\n }\n // If the network setting is to proxy and the wallet viewer is available,\n // try to use the wallet viewer\n return walletRpcViewer\n }\n\n return httpRpcViewer\n}\n","import { createContextEx } from '@xylabs/react-shared'\n\nimport type { ChainNetworkState } from './state.ts'\n\nexport const ChainNetworkContext = createContextEx<ChainNetworkState>()\n","import { ErrorRender } from '@xylabs/react-error'\nimport { usePromise } from '@xylabs/react-promise'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { NetworkBootstrap } from '@xyo-network/xl1-sdk'\nimport { MainNetwork } from '@xyo-network/xl1-sdk'\nimport type { PropsWithChildren } from 'react'\nimport React, {\n useCallback, useMemo, useState,\n} from 'react'\n\nimport { ChainNetworkContext } from './context.ts'\nimport type { ChainNetworkSettings } from './settings/index.ts'\nimport { defaultChainNetworkSettings, useChainNetworkSettings } from './settings/index.ts'\nimport type { ChainNetworkState } from './state.ts'\n\nexport interface ChainNetworkProviderProps extends PropsWithChildren {\n getActiveNetwork?: () => Promise<NetworkBootstrap | undefined>\n networkSettings?: ChainNetworkSettings\n networks?: NetworkBootstrap[]\n setActiveNetwork?: (networkId: NetworkBootstrap['id']) => Promise<NetworkBootstrap>\n}\n\nexport const ChainNetworkProvider: React.FC<ChainNetworkProviderProps> = ({\n children, getActiveNetwork, networkSettings: networkSettingsProp = defaultChainNetworkSettings, networks, setActiveNetwork: setActiveNetworkExternal,\n}) => {\n const [activeNetwork, setActiveNetwork] = useState<NetworkBootstrap>()\n const [error, setError] = useState<Error>()\n const { networkSettings, updateNetworkSettings } = useChainNetworkSettings(networkSettingsProp)\n\n // Set the active network upon initialization\n const [resolvedActiveNetwork, activeNetworkError] = usePromise(async () => {\n // ensure networks are loaded\n if (!networks) return\n // get last saved active network\n const activeNetwork = await getActiveNetwork?.()\n // ensure the active network saved is found in the list of networks\n if (activeNetwork && networks?.find(network => network.id === activeNetwork.id)) {\n // Set the active network if it exists\n return activeNetwork\n } else {\n // Set the default network if no active network exists\n const defaultNetwork = networks.find(network => network.id === MainNetwork.id) ?? networks[0]\n await setActiveNetworkExternal?.(defaultNetwork.id)\n\n // Set the active network in the context\n return defaultNetwork\n }\n }, [networks])\n\n const [previousResolvedActiveNetwork, setPreviousResolvedActiveNetwork] = useState(resolvedActiveNetwork)\n if (isDefined(resolvedActiveNetwork) && resolvedActiveNetwork !== previousResolvedActiveNetwork) {\n setActiveNetwork(resolvedActiveNetwork)\n setPreviousResolvedActiveNetwork(resolvedActiveNetwork)\n }\n\n const updateActiveNetwork = useCallback((networkId: NetworkBootstrap['id']) => {\n setError(undefined)\n const network = networks?.find(network => network.id === networkId)\n if (!network) {\n setError(new Error(`Network with id ${networkId} not found`))\n return\n }\n // set internally\n setActiveNetwork(network)\n // set externally\n void setActiveNetworkExternal?.(networkId)\n }, [networks, setActiveNetworkExternal])\n\n const value: ChainNetworkState = useMemo(() => ({\n activeNetwork,\n networks,\n provided: true,\n updateActiveNetwork,\n networkSettings,\n updateNetworkSettings,\n chainNetworkError: error ?? activeNetworkError,\n }), [activeNetwork, activeNetworkError, error, networkSettings, networks, updateActiveNetwork, updateNetworkSettings])\n\n return (\n <ChainNetworkContext value={value}>\n <ErrorRender error={error ?? activeNetworkError} scope=\"ChainNetworkProvider\" />\n {children}\n </ChainNetworkContext>\n )\n}\n","import { LocalNetwork } from '@xyo-network/xl1-sdk'\n\nimport type { ChainNetworkSettings } from './types.ts'\n\nexport const defaultChainNetworkSettings: ChainNetworkSettings = { [LocalNetwork.id]: { proxy: true } }\n","import type { NetworkBootstrap } from '@xyo-network/xl1-sdk'\nimport { useCallback, useState } from 'react'\n\nimport { defaultChainNetworkSettings } from './defaultChainNetworkSettings.ts'\nimport type { ChainNetworkSettings } from './types.ts'\n\nexport const useChainNetworkSettings = (defaults = defaultChainNetworkSettings) => {\n const [networkSettings, setNetworkSettings] = useState<ChainNetworkSettings>(defaults)\n\n const updateNetworkSettings = useCallback((\n networkId: NetworkBootstrap['id'],\n settings: Partial<ChainNetworkSettings>,\n ) => {\n setNetworkSettings(prevSettings => ({\n ...prevSettings,\n [networkId]: {\n ...prevSettings[networkId],\n ...settings,\n },\n }))\n }, [])\n\n return {\n networkSettings,\n updateNetworkSettings,\n }\n}\n","import { useContextEx } from '@xylabs/react-shared'\n\nimport { ChainNetworkContext } from './context.ts'\n\nexport const useChainNetwork = (required = true) => useContextEx(ChainNetworkContext, 'ChainNetwork', required)\n","import { useNetwork } from '@xyo-network/react-chain-provider'\n\nimport { useChainNetwork } from '../../context/index.ts'\n\nexport const useActiveNetworkNetwork = () => {\n const { activeNetwork } = useChainNetwork()\n const network = useNetwork(activeNetwork?.id)\n return network\n}\n","import { useHttpRpcRunner } from '@xyo-network/react-chain-provider'\n\nimport { useChainNetwork } from '../../context/index.ts'\n\nexport const useActiveNetworkRunner = () => {\n const { activeNetwork } = useChainNetwork()\n const runner = useHttpRpcRunner(activeNetwork?.url)\n\n return runner\n}\n","import type { JsonRpcRequest, JsonRpcResponse } from '@metamask/utils'\nimport { isJsonRpcRequest, isJsonRpcResponse } from '@metamask/utils'\nimport { isDefined, isString } from '@xylabs/sdk-js'\nimport { useEffect, useState } from 'react'\n\nimport type {\n BroadcastedRpcCall, RpcRequestResponsePairs, RpcRequestResponsePairsById,\n} from '../../model/index.ts'\n\nconst parseRpcCall = (acc: RpcRequestResponsePairsById, event: BroadcastedRpcCall) => {\n if (isJsonRpcResponse(event.rpcCall)) {\n const castedEvent = event as BroadcastedRpcCall<JsonRpcResponse>\n acc[castedEvent.rpcCall.id as string].result = castedEvent\n } else if (isJsonRpcRequest(event.rpcCall)) {\n const castedEvent = event as BroadcastedRpcCall<JsonRpcRequest>\n acc[castedEvent.rpcCall.id as string].request = castedEvent\n } else {\n console.error('Unknown RPC call type', event)\n }\n acc[event.rpcCall.id as string].source = event.source\n\n return acc\n}\n\nexport const useRpcBroadcastListener = () => {\n const [events, setEvents] = useState<RpcRequestResponsePairsById>({})\n const clearEvents = () => setEvents({})\n\n useEffect(() => {\n const listener = (e: Event) => {\n if ('detail' in e) {\n const { detail } = e ?? {}\n if (isString(detail)) {\n try {\n const parsedDetail = JSON.parse(detail)\n const { data: rpcCall, source } = parsedDetail\n // TODO - make zod type for parsing details\n const broadcastedRpcCall: BroadcastedRpcCall = {\n rpcCall,\n source,\n timestamp: Date.now(),\n }\n setEvents((prev) => {\n const { id } = broadcastedRpcCall.rpcCall\n const newState = { ...prev }\n if (isDefined(newState[id as string])) {\n parseRpcCall(newState, broadcastedRpcCall)\n } else {\n newState[id as string] = {} as RpcRequestResponsePairs\n parseRpcCall(newState, broadcastedRpcCall)\n }\n return newState\n })\n } catch (err) {\n console.error(err)\n }\n }\n }\n }\n globalThis.addEventListener('xyo:broadcast-rpc-request', listener)\n globalThis.addEventListener('xyo:broadcast-rpc-response', listener)\n\n return () => {\n globalThis.removeEventListener('xyo:broadcast-rpc-request', listener)\n globalThis.removeEventListener('xyo:broadcast-rpc-response', listener)\n }\n }, [])\n\n return { events, clearEvents }\n}\n","import { useHttpRpcViewer } from '@xyo-network/react-chain-provider'\n\nimport { useChainNetwork } from '../../context/index.ts'\n\n/**\n * Get the viewer directly from the active network\n * @returns - The viewer for the active network\n */\nexport const useViewerInWallet = () => {\n const { activeNetwork } = useChainNetwork()\n const walletViewer = useHttpRpcViewer(activeNetwork?.url)\n return walletViewer\n}\n","import { delay, isUndefined } from '@xylabs/sdk-js'\nimport type { NetworkStatus } from '@xyo-network/xl1-sdk'\nimport { useEffect, useState } from 'react'\n\nimport { useActiveNetworkNetwork } from '../index.ts'\n\nconst STATUS_CHECK_INTERVAL = 10_000\n\nexport const usePollNetworkStatus = () => {\n const network = useActiveNetworkNetwork()\n const [networkStatus, setNetworkStatus] = useState<NetworkStatus>()\n const [networkStatusError, setNetworkStatusError] = useState<Error>()\n\n // Check network status every 10 seconds\n useEffect(() => {\n let checkNetwork = true\n void (async () => {\n if (isUndefined(network)) return\n while (checkNetwork) {\n try {\n const response = await network.status()\n setNetworkStatus(response)\n setNetworkStatusError(undefined)\n } catch (error) {\n console.error('Error fetching network status:', error)\n setNetworkStatus(undefined)\n setNetworkStatusError(error as Error)\n }\n await delay(STATUS_CHECK_INTERVAL)\n }\n })()\n\n return () => {\n // Cleanup function to stop checking network status at the current statusUrl\n checkNetwork = false\n }\n }, [network])\n\n return [networkStatus, networkStatusError] as const\n}\n","import { Cancel } from '@mui/icons-material'\nimport type { DrawerProps, IconButtonProps } from '@mui/material'\nimport { IconButton } from '@mui/material'\nimport React from 'react'\n\nexport interface CloseDrawerIconButtonProps extends IconButtonProps {\n anchor?: DrawerProps['anchor']\n onClose?: DrawerProps['onClose']\n}\n\nexport const CloseDrawerIconButton: React.FC<CloseDrawerIconButtonProps> = ({ anchor, onClose }) => {\n return (\n <IconButton\n onClick={e => onClose?.(e, 'backdropClick')}\n size=\"small\"\n sx={{\n alignSelf: anchor === 'right' ? 'start' : 'end', top: 8, right: anchor === 'right' ? undefined : 8, left: anchor === 'left' ? undefined : 8,\n }}\n >\n <Cancel fontSize=\"small\" />\n </IconButton>\n )\n}\n","import type { CardProps } from '@mui/material'\nimport {\n Card, Collapse,\n Stack, Typography,\n} from '@mui/material'\nimport { isDefined } from '@xylabs/sdk-js'\nimport { JsonViewerEx } from '@xyo-network/react-payload-raw-info'\nimport React, { memo, useState } from 'react'\n\nimport type { RpcRequestResponsePairs } from '../../../model/index.ts'\nimport { BroadcastedRpcCallDetailsSummaryStack } from './SummaryStack.tsx'\n\nconst JSON_VIEWER_WIDTH = 600\n\nexport interface BroadcastRpcCallDetailsCardProps extends CardProps {\n rpcRequestResponsePairs?: RpcRequestResponsePairs\n}\n\nexport const BroadcastedRpcCallDetailsCard: React.FC<BroadcastRpcCallDetailsCardProps> = memo(({\n rpcRequestResponsePairs, sx, ...props\n}) => {\n const [expanded, setExpanded] = useState(false)\n\n if (!rpcRequestResponsePairs) return null\n\n const {\n request, result, source,\n } = rpcRequestResponsePairs\n\n return (\n <Card\n sx={{\n p: 1, display: 'flex', flexDirection: 'column', width: JSON_VIEWER_WIDTH, ...sx,\n }}\n {...props}\n >\n <BroadcastedRpcCallDetailsSummaryStack\n expanded={expanded}\n params={request.rpcCall.params}\n hasResult={isDefined(result)}\n method={request.rpcCall.method}\n setExpanded={setExpanded}\n timestamp={request.timestamp}\n />\n <Collapse in={expanded} unmountOnExit>\n <Stack direction=\"column\" p={1} gap={2} alignItems=\"stretch\">\n <Typography variant=\"body2\">\n Source:\n <Typography variant=\"caption\" component=\"span\" fontFamily=\"monospace\" sx={{ ml: 1 }}>{source}</Typography>\n </Typography>\n <Typography variant=\"body2\">Request:</Typography>\n <JsonViewerEx\n value={request}\n sx={{ maxHeight: 300, overflow: 'auto' }}\n />\n {isDefined(result)\n ? (\n <>\n <Typography variant=\"body2\">Result:</Typography>\n <JsonViewerEx\n value={result}\n sx={{ maxHeight: 300, overflow: 'auto' }}\n />\n </>\n )\n : null}\n </Stack>\n </Collapse>\n </Card>\n )\n})\n","import type { JsonRpcParams } from '@metamask/utils'\nimport {\n ArrowRight, CheckCircle, Warning,\n} from '@mui/icons-material'\nimport {\n Avatar,\n Icon, IconButton, Stack, type StackProps, Typography,\n useTheme,\n} from '@mui/material'\nimport { Identicon } from '@xylabs/react-identicon'\nimport { isDefined, isHash } from '@xylabs/sdk-js'\nimport React from 'react'\n\ntype InferredParamType = 'hash' | 'unknown'\n\nconst inferParamsType = (params: JsonRpcParams | undefined): { type: InferredParamType; value?: string } => {\n if (!params || !Array.isArray(params)) return { type: 'unknown' }\n\n // Simple heuristic: if the first param is a string that looks like a hash, we infer 'hash'\n const firstParam = params[0]\n if (isHash(firstParam)) {\n return {\n type: 'hash',\n value: firstParam,\n }\n }\n return { type: 'unknown' }\n}\n\nexport interface BroadcastRpcCallDetailsSummaryStackProps extends StackProps {\n expanded?: boolean\n hasResult?: boolean\n method?: string\n params?: JsonRpcParams\n setExpanded?: (expanded: boolean) => void\n timestamp?: number\n}\nexport const BroadcastedRpcCallDetailsSummaryStack: React.FC<BroadcastRpcCallDetailsSummaryStackProps> = ({\n expanded, setExpanded, method, timestamp, hasResult, params, ...props\n}) => {\n const theme = useTheme()\n const { type, value } = inferParamsType(params)\n return (\n <Stack direction=\"row\" gap={2} alignItems=\"center\" justifyContent=\"space-between\" {...props}>\n <Stack direction=\"row\" gap={2} alignItems=\"center\">\n <IconButton\n size=\"small\"\n onClick={() => setExpanded?.(!expanded)}\n >\n <ArrowRight sx={{ transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)', transition: 'transform 0.2s ease-in-out' }} fontSize=\"small\" />\n </IconButton>\n <Typography component=\"span\" variant=\"body2\" fontFamily=\"monospace\">\n {method}\n </Typography>\n {type === 'hash'\n ? (\n <Avatar sx={{\n backgroundColor: theme.vars?.palette.text.primary, width: 20, height: 20,\n }}\n >\n <Identicon value={value} size={14} />\n </Avatar>\n )\n : null}\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\" sx={{ opacity: 0.6 }}>\n {isDefined(timestamp) ? new Date(timestamp).toLocaleString() : ''}\n </Typography>\n </Stack>\n <Icon sx={{ justifySelf: 'end' }}>{hasResult ? <CheckCircle color=\"success\" /> : <Warning color=\"warning\" />}</Icon>\n </Stack>\n )\n}\n","import type { ChangeEvent } from 'react'\nimport {\n useCallback, useMemo, useState,\n} from 'react'\n\nimport type { RpcRequestResponsePairsById } from '../../model/index.ts'\n\nexport const usePaginatedEventPairs = (\n formattedEvents: RpcRequestResponsePairsById,\n numberOfVisiblePairs: number,\n onClearEvents?: () => void,\n) => {\n const [currentPage, setCurrentPage] = useState(0)\n\n const allEventEntries = useMemo(() => {\n return Object.entries(formattedEvents ?? {}).toSorted(([, a], [, b]) => b.request.timestamp - a.request.timestamp)\n }, [formattedEvents])\n\n const totalPages = useMemo(() => {\n return Math.ceil(allEventEntries.length / numberOfVisiblePairs)\n }, [allEventEntries.length, numberOfVisiblePairs])\n\n // Clamp current page to valid range\n const effectiveCurrentPage = useMemo(() => {\n if (totalPages === 0) return 0\n return Math.min(currentPage, totalPages - 1)\n }, [currentPage, totalPages])\n\n const visibleEvents = useMemo(() => {\n const startIndex = effectiveCurrentPage * numberOfVisiblePairs\n const endIndex = startIndex + numberOfVisiblePairs\n return allEventEntries.slice(startIndex, endIndex)\n }, [allEventEntries, effectiveCurrentPage, numberOfVisiblePairs])\n\n const handlePreviousPage = useCallback(() => {\n setCurrentPage(prev => Math.max(0, prev - 1))\n }, [])\n\n const handleNextPage = useCallback(() => {\n setCurrentPage(prev => Math.min(totalPages - 1, prev + 1))\n }, [totalPages])\n\n const handleClearEvents = useCallback(() => {\n setCurrentPage(0)\n onClearEvents?.()\n }, [onClearEvents])\n\n // Compatible with TablePagination's onPageChange signature\n // Accepts 1-indexed page, converts to 0-indexed internally\n const handlePageChange = useCallback((_event: ChangeEvent<unknown>, page: number) => {\n setCurrentPage(page - 1)\n }, [])\n\n return {\n allEventEntries,\n visibleEvents,\n effectiveCurrentPage: effectiveCurrentPage + 1, // Return 1-indexed page\n totalPages,\n handlePreviousPage,\n handleNextPage,\n handleClearEvents,\n handlePageChange,\n }\n}\n","import type { AvatarProps } from '@mui/material'\nimport { Avatar } from '@mui/material'\nimport type { CSSProperties } from 'react'\nimport React from 'react'\n\nimport { useChainNetwork } from '../../context/index.ts'\nimport { NetworkIcon } from './Icon.tsx'\n\nexport interface NetworkAvatarProps extends AvatarProps {\n icon?: string\n iconStyles?: CSSProperties\n name?: string\n}\n\nexport const NetworkAvatar: React.FC<NetworkAvatarProps> = ({\n icon, iconStyles, name, sx, ...props\n}) => {\n return (\n <Avatar\n sx={{ backgroundColor: 'white', ...sx }}\n alt={name}\n {...props}\n >\n <NetworkIcon\n icon={icon}\n style={{ ...iconStyles }}\n />\n </Avatar>\n )\n}\n\nexport const ActiveNetworkAvatar: React.FC<AvatarProps> = (props) => {\n const { activeNetwork } = useChainNetwork()\n\n return (\n <NetworkAvatar\n icon={activeNetwork?.icon}\n name={activeNetwork?.name}\n {...props}\n />\n )\n}\n","import type { DetailedHTMLProps, HtmlHTMLAttributes } from 'react'\nimport React from 'react'\n\nexport interface NetworkIconProps extends DetailedHTMLProps<HtmlHTMLAttributes<HTMLSpanElement>, HTMLSpanElement> {\n icon?: string\n}\n\nexport const NetworkIcon: React.FC<NetworkIconProps> = ({\n icon, style, ...props\n}) => {\n return (\n <span\n // eslint-disable-next-line react-dom/no-dangerously-set-innerhtml\n dangerouslySetInnerHTML={{ __html: icon ?? '' }} // Placeholder for SVG\\\n style={{\n display: 'inline-flex', width: 24, height: 24, ...style,\n }}\n {...props}\n />\n )\n}\n","import type { MenuItemProps } from '@mui/material'\nimport { ListItemText } from '@mui/material'\nimport { ActiveMenuItem } from '@xyo-network/react-chain-shared'\nimport type { NetworkBootstrap, NetworkId } from '@xyo-network/xl1-sdk'\nimport type { MouseEvent as ReactMouseEvent } from 'react'\nimport React from 'react'\n\nimport { NetworkAvatar } from './Avatar.tsx'\n\nexport interface NetworkMenuItemProps extends MenuItemProps {\n active?: boolean\n network?: NetworkBootstrap\n updateActiveNetwork?: (networkId: NetworkId) => void\n}\n\nexport const NetworkMenuItem: React.FC<NetworkMenuItemProps> = ({\n active, network, onClick, updateActiveNetwork, ...props\n}) => {\n const handleClick = (event: ReactMouseEvent<HTMLLIElement, MouseEvent>) => {\n if (network === undefined) throw new Error('Network is undefined')\n updateActiveNetwork?.(network.id)\n onClick?.(event)\n }\n\n return (\n <ActiveMenuItem\n title={network?.name}\n disableRipple\n onClick={handleClick}\n active={active}\n sx={{ py: 1 }}\n {...props}\n >\n <NetworkAvatar icon={network?.icon} name={network?.name} sx={{ width: 30, height: 30 }} />\n <ListItemText>{network?.name}</ListItemText>\n </ActiveMenuItem>\n )\n}\n","import type { AlertProps } from '@mui/material'\nimport {\n Alert, AlertTitle, Button,\n} from '@mui/material'\nimport type { NetworkStatus } from '@xyo-network/xl1-sdk'\nimport React, { useMemo, useState } from 'react'\n\nimport { NetworkStatusDialog } from './Dialog.tsx'\n\nexport interface NetworkStatusAlertProps extends AlertProps {\n status?: NetworkStatus\n}\n\nexport const NetworkStatusAlert: React.FC<NetworkStatusAlertProps> = ({ status, ...props }) => {\n const [open, setOpen] = useState(false)\n const handleClose = () => setOpen(false)\n\n const severity = useMemo(() => {\n if (!status) return\n switch (status.state) {\n case 'online': {\n return 'success'\n }\n case 'offline': {\n return 'error'\n }\n case 'degraded': {\n return 'warning'\n }\n case 'unknown': {\n return 'error'\n }\n }\n }, [status])\n\n return (\n <Alert severity={severity} {...props}>\n <AlertTitle>{status?.description}</AlertTitle>\n {status?.updates && status.updates.length > 0\n ? (\n <>\n <Button color={severity} variant=\"outlined\" size=\"small\" onClick={() => setOpen(true)}>\n Updates\n </Button>\n <NetworkStatusDialog open={open} onClose={handleClose} updates={status.updates} />\n </>\n )\n : null}\n </Alert>\n )\n}\n","import type { DialogProps } from '@mui/material'\nimport {\n Button, Dialog, DialogActions, DialogContent, DialogTitle, List, ListItem, Typography,\n} from '@mui/material'\nimport type { NetworkStatusUpdate } from '@xyo-network/xl1-sdk'\nimport React from 'react'\n\nexport interface NetworkStatusDialogProps extends DialogProps {\n updates: NetworkStatusUpdate[]\n}\n\nexport const NetworkStatusDialog: React.FC<NetworkStatusDialogProps> = ({ updates, ...props }) => {\n return (\n <Dialog {...props}>\n <DialogTitle>Recent Status Updates</DialogTitle>\n <DialogContent>\n <List>\n {updates.map(({\n start, end, update,\n }) => (\n <ListItem\n key={start + update}\n sx={{\n flexDirection: 'column', alignItems: 'start', pl: 0,\n }}\n >\n <Typography>\n {update}\n </Typography>\n <Typography gutterBottom sx={{ opacity: 0.75, fontSize: '.8333rem' }}>\n Start:\n {' '}\n {new Date(start).toLocaleString()}\n {' '}\n <br />\n End:\n {' '}\n {new Date(end).toLocaleString()}\n </Typography>\n </ListItem>\n ))}\n </List>\n </DialogContent>\n <DialogActions>\n <Button onClick={e => props.onClose?.(e, 'backdropClick')} color=\"primary\" variant=\"outlined\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n","import type { AlertProps } from '@mui/material'\nimport type { PropsWithChildren } from 'react'\nimport React from 'react'\n\nimport { usePollNetworkStatus } from '../../hooks/index.ts'\nimport { NetworkStatusAlert } from './Alert.tsx'\n\nconst validNetworkStates = new Set(['online', 'unknown'])\n\nexport interface NetworkStatusProps extends PropsWithChildren<AlertProps> {}\n\nexport const NetworkStatus: React.FC<NetworkStatusProps> = ({ children, ...props }) => {\n const [networkStatus] = usePollNetworkStatus()\n const showStatus = networkStatus && !validNetworkStates.has(networkStatus.state)\n return (\n <>\n {showStatus ? <NetworkStatusAlert status={networkStatus} {...props} /> : null}\n {children}\n </>\n )\n}\n","import type { JsonRpcRequest, JsonRpcResponse } from '@metamask/utils'\n\n// Configuration options for broadcasting RPC calls\nexport type BroadcastRpcConfig = { request: boolean; response: boolean }\n\n// Event Names\nexport const BroadcastRpcRequestEventName = 'xyo:broadcast-rpc-request' as const\nexport const BroadcastRpcResponseEventName = 'xyo:broadcast-rpc-response' as const\nexport type BroadcastRpcEventNames = typeof BroadcastRpcRequestEventName | typeof BroadcastRpcResponseEventName\n\n// default options are to broadcast all events\nexport const defaultBroadcastConfig: BroadcastRpcConfig = { request: true, response: true }\n\nexport interface BroadcastedRpcCall<TRpcCall extends JsonRpcRequest | JsonRpcResponse = JsonRpcRequest | JsonRpcResponse> {\n rpcCall: TRpcCall\n source: string\n timestamp: number\n}\n\nexport type RpcRequestResponsePairs = {\n request: BroadcastedRpcCall<JsonRpcRequest>\n result?: BroadcastedRpcCall<JsonRpcResponse>\n source?: string\n}\n\nexport type RpcRequestResponsePairsById = {\n [id: string]: RpcRequestResponsePairs\n}\n"],"mappings":"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","names":["Box","Button","Drawer","Pagination","Stack","Typography","React","useCurrentBlock","useViewerFromWallet","isDefined","isNull","isUndefined","useHttpRpcViewer","useViewerFromWallet","createContextEx","ChainNetworkContext","ErrorRender","usePromise","isDefined","MainNetwork","React","useCallback","useMemo","useState","LocalNetwork","defaultChainNetworkSettings","id","proxy","useCallback","useState","useChainNetworkSettings","defaults","defaultChainNetworkSettings","networkSettings","setNetworkSettings","useState","updateNetworkSettings","useCallback","networkId","settings","prevSettings","ChainNetworkProvider","children","getActiveNetwork","networkSettings","networkSettingsProp","defaultChainNetworkSettings","networks","setActiveNetwork","setActiveNetworkExternal","activeNetwork","useState","error","setError","updateNetworkSettings","useChainNetworkSettings","resolvedActiveNetwork","activeNetworkError","usePromise","find","network","id","defaultNetwork","MainNetwork","previousResolvedActiveNetwork","setPreviousResolvedActiveNetwork","isDefined","updateActiveNetwork","useCallback","networkId","undefined","Error","value","useMemo","provided","chainNetworkError","ChainNetworkContext","ErrorRender","scope","useContextEx","useChainNetwork","required","useContextEx","ChainNetworkContext","shouldProxy","networkSettings","networkBootstrap","isDefined","id","proxy","useViewerInPage","networkOverride","activeNetwork","useChainNetwork","httpRpcViewer","useHttpRpcViewer","url","walletRpcViewer","useViewerFromWallet","isUndefined","isNull","console","warn","useActiveNetworkCurrentBlock","refresh","viewer","currentBlock","useCurrentBlock","useActiveNetworkCurrentBlockInPage","useViewerInPage","useActiveNetworkCurrentBlockInWallet","useViewerFromWallet","useNetwork","useActiveNetworkNetwork","activeNetwork","useChainNetwork","network","useNetwork","id","useHttpRpcRunner","useActiveNetworkRunner","activeNetwork","useChainNetwork","runner","useHttpRpcRunner","url","isJsonRpcRequest","isJsonRpcResponse","isDefined","isString","useEffect","useState","parseRpcCall","acc","event","isJsonRpcResponse","rpcCall","castedEvent","id","result","isJsonRpcRequest","request","console","error","source","useRpcBroadcastListener","events","setEvents","useState","clearEvents","useEffect","listener","e","detail","isString","parsedDetail","JSON","parse","data","broadcastedRpcCall","timestamp","Date","now","prev","newState","isDefined","err","globalThis","addEventListener","removeEventListener","useHttpRpcViewer","useViewerInWallet","activeNetwork","useChainNetwork","walletViewer","useHttpRpcViewer","url","delay","isUndefined","useEffect","useState","STATUS_CHECK_INTERVAL","usePollNetworkStatus","network","useActiveNetworkNetwork","networkStatus","setNetworkStatus","useState","networkStatusError","setNetworkStatusError","useEffect","checkNetwork","isUndefined","response","status","undefined","error","console","delay","Cancel","IconButton","React","CloseDrawerIconButton","anchor","onClose","React","IconButton","onClick","e","size","sx","alignSelf","top","right","undefined","left","Cancel","fontSize","Card","Collapse","Stack","Typography","isDefined","JsonViewerEx","React","memo","useState","ArrowRight","CheckCircle","Warning","Avatar","Icon","IconButton","Stack","Typography","useTheme","Identicon","isDefined","isHash","React","inferParamsType","params","Array","isArray","type","firstParam","isHash","value","BroadcastedRpcCallDetailsSummaryStack","expanded","setExpanded","method","timestamp","hasResult","props","theme","useTheme","React","Stack","direction","gap","alignItems","justifyContent","IconButton","size","onClick","ArrowRight","sx","transform","transition","fontSize","Typography","component","variant","fontFamily","Avatar","backgroundColor","vars","palette","text","primary","width","height","Identicon","color","opacity","isDefined","Date","toLocaleString","Icon","justifySelf","CheckCircle","Warning","JSON_VIEWER_WIDTH","BroadcastedRpcCallDetailsCard","memo","rpcRequestResponsePairs","sx","props","expanded","setExpanded","useState","request","result","source","React","Card","p","display","flexDirection","width","BroadcastedRpcCallDetailsSummaryStack","params","rpcCall","hasResult","isDefined","method","timestamp","Collapse","in","unmountOnExit","Stack","direction","gap","alignItems","Typography","variant","component","fontFamily","ml","JsonViewerEx","value","maxHeight","overflow","useCallback","useMemo","useState","usePaginatedEventPairs","formattedEvents","numberOfVisiblePairs","onClearEvents","currentPage","setCurrentPage","useState","allEventEntries","useMemo","Object","entries","toSorted","a","b","request","timestamp","totalPages","Math","ceil","length","effectiveCurrentPage","min","visibleEvents","startIndex","endIndex","slice","handlePreviousPage","useCallback","prev","max","handleNextPage","handleClearEvents","handlePageChange","_event","page","BroadcastedRpcCallsDrawer","anchor","onClearEvents","drawerTitle","events","onClose","numberOfVisibleEvents","props","allEventEntries","visibleEvents","totalPages","effectiveCurrentPage","handleClearEvents","handlePageChange","usePaginatedEventPairs","React","Drawer","keepMounted","CloseDrawerIconButton","Stack","gap","sx","p","flexShrink","direction","justifyContent","alignItems","Typography","variant","Button","size","onClick","length","Pagination","count","page","onChange","color","id","flexGrow","overflowY","Box","px","pb","map","broadcastedRpcCall","index","BroadcastedRpcCallDetailsCard","key","rpcRequestResponsePairs","mb","BroadcastedRpcCallsDrawerWithEvents","clearEvents","useRpcBroadcastListener","Avatar","React","React","NetworkIcon","icon","style","props","React","span","dangerouslySetInnerHTML","__html","display","width","height","NetworkAvatar","icon","iconStyles","name","sx","props","React","Avatar","backgroundColor","alt","NetworkIcon","style","ActiveNetworkAvatar","activeNetwork","useChainNetwork","ListItemText","ActiveMenuItem","React","NetworkMenuItem","active","network","onClick","updateActiveNetwork","props","handleClick","event","undefined","Error","id","React","ActiveMenuItem","title","name","disableRipple","sx","py","NetworkAvatar","icon","width","height","ListItemText","Alert","AlertTitle","Button","React","useMemo","useState","Button","Dialog","DialogActions","DialogContent","DialogTitle","List","ListItem","Typography","React","NetworkStatusDialog","updates","props","React","Dialog","DialogTitle","DialogContent","List","map","start","end","update","ListItem","key","sx","flexDirection","alignItems","pl","Typography","gutterBottom","opacity","fontSize","Date","toLocaleString","br","DialogActions","Button","onClick","e","onClose","color","variant","NetworkStatusAlert","status","props","open","setOpen","useState","handleClose","severity","useMemo","state","React","Alert","AlertTitle","description","updates","length","Button","color","variant","size","onClick","NetworkStatusDialog","onClose","React","validNetworkStates","Set","NetworkStatus","children","props","networkStatus","usePollNetworkStatus","showStatus","has","state","React","NetworkStatusAlert","status","BroadcastRpcRequestEventName","BroadcastRpcResponseEventName","defaultBroadcastConfig","request","response"]}
1
+ {"version":3,"sources":["../../src/components/broadcast/Drawer.tsx","../../src/hooks/provider/useActiveNetworkCurrentBlock.ts","../../src/hooks/provider/useViewerInPage.ts","../../src/context/network/context.ts","../../src/context/network/Provider.tsx","../../src/context/network/settings/defaultChainNetworkSettings.ts","../../src/context/network/settings/useChainNetworkSettings.ts","../../src/context/network/use.ts","../../src/hooks/provider/useActiveNetworkNetwork.ts","../../src/hooks/provider/useActiveNetworkRunner.ts","../../src/hooks/provider/useRpcBroadcastListener.ts","../../src/hooks/provider/useViewerInWallet.ts","../../src/hooks/status/usePollNetworkStatus.ts","../../src/components/broadcast/CloseDrawerIconButton.tsx","../../src/components/broadcast/details/Card.tsx","../../src/components/broadcast/details/SummaryStack.tsx","../../src/components/broadcast/usePaginatedEventPairs.ts","../../src/components/menu/Avatar.tsx","../../src/components/menu/Icon.tsx","../../src/components/menu/MenuItem.tsx","../../src/components/status/Alert.tsx","../../src/components/status/Dialog.tsx","../../src/components/status/NetworkStatus.tsx","../../src/model/BroadcastRpc.ts"],"sourcesContent":["import type { DrawerProps } from '@mui/material'\nimport {\n Box, Button, Drawer, Pagination, Stack, Typography,\n} from '@mui/material'\nimport React, { useState } from 'react'\n\nimport { useRpcBroadcastListener } from '../../hooks/index.ts'\nimport type { RpcRequestResponsePairsById } from '../../model/index.ts'\nimport { CloseDrawerIconButton } from './CloseDrawerIconButton.tsx'\nimport { BroadcastedRpcCallDetailsCard } from './details/index.ts'\nimport { usePaginatedEventPairs } from './usePaginatedEventPairs.ts'\n\nexport interface BroadcastRpcCallsDrawer extends DrawerProps {\n drawerTitle?: string\n events: RpcRequestResponsePairsById\n numberOfVisibleEvents?: number\n onClearEvents?: () => void\n}\n\nexport const BroadcastedRpcCallsDrawer: React.FC<BroadcastRpcCallsDrawer> = ({\n anchor = 'right',\n onClearEvents,\n drawerTitle,\n events,\n onClose,\n numberOfVisibleEvents = 25,\n ...props\n}) => {\n const [scrollableDiv, setScrollableDiv] = useState<HTMLDivElement | null>(null)\n const {\n allEventEntries,\n visibleEvents,\n totalPages,\n effectiveCurrentPage,\n handleClearEvents,\n handlePageChange,\n } = usePaginatedEventPairs(\n events,\n numberOfVisibleEvents,\n onClearEvents,\n scrollableDiv,\n )\n\n return (\n <Drawer anchor={anchor} onClose={onClose} keepMounted={false} {...props}>\n <CloseDrawerIconButton anchor={anchor} onClose={onClose} />\n <Stack gap={2} sx={{ p: 3 }} flexShrink={0}>\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" gap={4}>\n <Typography variant=\"h6\">{drawerTitle ?? 'Broadcasted RPC Calls'}</Typography>\n <Button variant=\"outlined\" size=\"small\" onClick={handleClearEvents}>Clear All</Button>\n </Stack>\n {allEventEntries.length > 0 && (\n <Pagination\n count={totalPages}\n page={effectiveCurrentPage}\n onChange={handlePageChange}\n color=\"primary\"\n />\n )}\n\n </Stack>\n <Stack direction=\"column\" id=\"events-container\" flexGrow={1} sx={{ overflowY: 'hidden' }}>\n <Box\n ref={(el: HTMLDivElement) => setScrollableDiv(el)}\n sx={{\n overflowY: 'auto', px: 3, pb: 3,\n }}\n >\n {visibleEvents.map(([id, broadcastedRpcCall], index) => {\n return <BroadcastedRpcCallDetailsCard key={id} rpcRequestResponsePairs={broadcastedRpcCall} sx={{ mb: index < visibleEvents.length - 1 ? 2 : 0 }} />\n })}\n </Box>\n </Stack>\n </Drawer>\n )\n}\n\nexport const BroadcastedRpcCallsDrawerWithEvents: React.FC<DrawerProps> = (props) => {\n const { clearEvents, events } = useRpcBroadcastListener()\n\n return (\n <BroadcastedRpcCallsDrawer\n events={events}\n onClearEvents={clearEvents}\n {...props}\n />\n )\n}\n","import { useCurrentBlock, useViewerFromWallet } from '@xyo-network/react-chain-provider'\nimport type { XyoViewer } from '@xyo-network/xl1-sdk'\n\nimport { useViewerInPage } from './useViewerInPage.ts'\n\nexport const useActiveNetworkCurrentBlock = (refresh = 1, viewer?: XyoViewer) => {\n const currentBlock = useCurrentBlock(refresh, viewer)\n\n return currentBlock\n}\n\nexport const useActiveNetworkCurrentBlockInPage = (refresh = 1) => {\n const viewer = useViewerInPage()\n const currentBlock = useCurrentBlock(refresh, viewer)\n\n return currentBlock\n}\n\nexport const useActiveNetworkCurrentBlockInWallet = (refresh = 1) => {\n const [viewer] = useViewerFromWallet()\n const currentBlock = useCurrentBlock(refresh, viewer)\n\n return currentBlock\n}\n","import {\n isDefined, isNull, isUndefined,\n} from '@xylabs/sdk-js'\nimport { useHttpRpcViewer, useViewerFromWallet } from '@xyo-network/react-chain-provider'\nimport type { NetworkBootstrap } from '@xyo-network/xl1-sdk'\n\nimport type { ChainNetworkSettings } from '../../context/index.ts'\nimport { useChainNetwork } from '../../context/index.ts'\n\nconst shouldProxy = (networkSettings: ChainNetworkSettings, networkBootstrap: NetworkBootstrap | undefined) => {\n return isDefined(networkBootstrap)\n && isDefined(networkSettings[networkBootstrap.id])\n && networkSettings[networkBootstrap.id].proxy\n}\n\n/**\n * Get the viewer for the active network, first from the wallet or fallback to HTTP RPC\n * @returns - XyoViewer for the active network\n */\nexport const useViewerInPage = (networkOverride?: NetworkBootstrap) => {\n let networkBootstrap: NetworkBootstrap | undefined\n const { activeNetwork, networkSettings } = useChainNetwork()\n networkBootstrap = isDefined(networkOverride) ? networkOverride : activeNetwork\n\n const httpRpcViewer = useHttpRpcViewer(networkBootstrap?.url)\n const [walletRpcViewer] = useViewerFromWallet(networkBootstrap?.id)\n\n // If the wallet viewer is undefined, don't return it yet, useViewerFromWallet is still checking\n if (isUndefined(walletRpcViewer)) return\n\n if (shouldProxy(networkSettings, networkBootstrap)) {\n if (isNull(walletRpcViewer)) {\n console.warn(`Network ${networkBootstrap?.id} is set to proxy but no wallet viewer is available, falling back to HTTP RPC viewer`)\n return httpRpcViewer\n }\n // If the network setting is to proxy and the wallet viewer is available,\n // try to use the wallet viewer\n return walletRpcViewer\n }\n\n return httpRpcViewer\n}\n","import { createContextEx } from '@xylabs/react-shared'\n\nimport type { ChainNetworkState } from './state.ts'\n\nexport const ChainNetworkContext = createContextEx<ChainNetworkState>()\n","import { ErrorRender } from '@xylabs/react-error'\nimport { usePromise } from '@xylabs/react-promise'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { NetworkBootstrap } from '@xyo-network/xl1-sdk'\nimport { MainNetwork } from '@xyo-network/xl1-sdk'\nimport type { PropsWithChildren } from 'react'\nimport React, {\n useCallback, useMemo, useState,\n} from 'react'\n\nimport { ChainNetworkContext } from './context.ts'\nimport type { ChainNetworkSettings } from './settings/index.ts'\nimport { defaultChainNetworkSettings, useChainNetworkSettings } from './settings/index.ts'\nimport type { ChainNetworkState } from './state.ts'\n\nexport interface ChainNetworkProviderProps extends PropsWithChildren {\n getActiveNetwork?: () => Promise<NetworkBootstrap | undefined>\n networkSettings?: ChainNetworkSettings\n networks?: NetworkBootstrap[]\n setActiveNetwork?: (networkId: NetworkBootstrap['id']) => Promise<NetworkBootstrap>\n}\n\nexport const ChainNetworkProvider: React.FC<ChainNetworkProviderProps> = ({\n children, getActiveNetwork, networkSettings: networkSettingsProp = defaultChainNetworkSettings, networks, setActiveNetwork: setActiveNetworkExternal,\n}) => {\n const [activeNetwork, setActiveNetwork] = useState<NetworkBootstrap>()\n const [error, setError] = useState<Error>()\n const { networkSettings, updateNetworkSettings } = useChainNetworkSettings(networkSettingsProp)\n\n // Set the active network upon initialization\n const [resolvedActiveNetwork, activeNetworkError] = usePromise(async () => {\n // ensure networks are loaded\n if (!networks) return\n // get last saved active network\n const activeNetwork = await getActiveNetwork?.()\n // ensure the active network saved is found in the list of networks\n if (activeNetwork && networks?.find(network => network.id === activeNetwork.id)) {\n // Set the active network if it exists\n return activeNetwork\n } else {\n // Set the default network if no active network exists\n const defaultNetwork = networks.find(network => network.id === MainNetwork.id) ?? networks[0]\n await setActiveNetworkExternal?.(defaultNetwork.id)\n\n // Set the active network in the context\n return defaultNetwork\n }\n }, [networks])\n\n const [previousResolvedActiveNetwork, setPreviousResolvedActiveNetwork] = useState(resolvedActiveNetwork)\n if (isDefined(resolvedActiveNetwork) && resolvedActiveNetwork !== previousResolvedActiveNetwork) {\n setActiveNetwork(resolvedActiveNetwork)\n setPreviousResolvedActiveNetwork(resolvedActiveNetwork)\n }\n\n const updateActiveNetwork = useCallback((networkId: NetworkBootstrap['id']) => {\n setError(undefined)\n const network = networks?.find(network => network.id === networkId)\n if (!network) {\n setError(new Error(`Network with id ${networkId} not found`))\n return\n }\n // set internally\n setActiveNetwork(network)\n // set externally\n void setActiveNetworkExternal?.(networkId)\n }, [networks, setActiveNetworkExternal])\n\n const value: ChainNetworkState = useMemo(() => ({\n activeNetwork,\n networks,\n provided: true,\n updateActiveNetwork,\n networkSettings,\n updateNetworkSettings,\n chainNetworkError: error ?? activeNetworkError,\n }), [activeNetwork, activeNetworkError, error, networkSettings, networks, updateActiveNetwork, updateNetworkSettings])\n\n return (\n <ChainNetworkContext value={value}>\n <ErrorRender error={error ?? activeNetworkError} scope=\"ChainNetworkProvider\" />\n {children}\n </ChainNetworkContext>\n )\n}\n","import { LocalNetwork } from '@xyo-network/xl1-sdk'\n\nimport type { ChainNetworkSettings } from './types.ts'\n\nexport const defaultChainNetworkSettings: ChainNetworkSettings = { [LocalNetwork.id]: { proxy: true } }\n","import type { NetworkBootstrap } from '@xyo-network/xl1-sdk'\nimport { useCallback, useState } from 'react'\n\nimport { defaultChainNetworkSettings } from './defaultChainNetworkSettings.ts'\nimport type { ChainNetworkSettings } from './types.ts'\n\nexport const useChainNetworkSettings = (defaults = defaultChainNetworkSettings) => {\n const [networkSettings, setNetworkSettings] = useState<ChainNetworkSettings>(defaults)\n\n const updateNetworkSettings = useCallback((\n networkId: NetworkBootstrap['id'],\n settings: Partial<ChainNetworkSettings>,\n ) => {\n setNetworkSettings(prevSettings => ({\n ...prevSettings,\n [networkId]: {\n ...prevSettings[networkId],\n ...settings,\n },\n }))\n }, [])\n\n return {\n networkSettings,\n updateNetworkSettings,\n }\n}\n","import { useContextEx } from '@xylabs/react-shared'\n\nimport { ChainNetworkContext } from './context.ts'\n\nexport const useChainNetwork = (required = true) => useContextEx(ChainNetworkContext, 'ChainNetwork', required)\n","import { useNetwork } from '@xyo-network/react-chain-provider'\n\nimport { useChainNetwork } from '../../context/index.ts'\n\nexport const useActiveNetworkNetwork = () => {\n const { activeNetwork } = useChainNetwork()\n const network = useNetwork(activeNetwork?.id)\n return network\n}\n","import { useHttpRpcRunner } from '@xyo-network/react-chain-provider'\n\nimport { useChainNetwork } from '../../context/index.ts'\n\nexport const useActiveNetworkRunner = () => {\n const { activeNetwork } = useChainNetwork()\n const runner = useHttpRpcRunner(activeNetwork?.url)\n\n return runner\n}\n","import type { JsonRpcRequest, JsonRpcResponse } from '@metamask/utils'\nimport { isJsonRpcRequest, isJsonRpcResponse } from '@metamask/utils'\nimport { isDefined, isString } from '@xylabs/sdk-js'\nimport { useEffect, useState } from 'react'\n\nimport type {\n BroadcastedRpcCall, RpcRequestResponsePairs, RpcRequestResponsePairsById,\n} from '../../model/index.ts'\n\nconst parseRpcCall = (acc: RpcRequestResponsePairsById, event: BroadcastedRpcCall) => {\n if (isJsonRpcResponse(event.rpcCall)) {\n const castedEvent = event as BroadcastedRpcCall<JsonRpcResponse>\n acc[castedEvent.rpcCall.id as string].result = castedEvent\n } else if (isJsonRpcRequest(event.rpcCall)) {\n const castedEvent = event as BroadcastedRpcCall<JsonRpcRequest>\n acc[castedEvent.rpcCall.id as string].request = castedEvent\n } else {\n console.error('Unknown RPC call type', event)\n }\n acc[event.rpcCall.id as string].source = event.source\n\n return acc\n}\n\nexport const useRpcBroadcastListener = () => {\n const [events, setEvents] = useState<RpcRequestResponsePairsById>({})\n const clearEvents = () => setEvents({})\n\n useEffect(() => {\n const listener = (e: Event) => {\n if ('detail' in e) {\n const { detail } = e ?? {}\n if (isString(detail)) {\n try {\n const parsedDetail = JSON.parse(detail)\n const { data: rpcCall, source } = parsedDetail\n // TODO - make zod type for parsing details\n const broadcastedRpcCall: BroadcastedRpcCall = {\n rpcCall,\n source,\n timestamp: Date.now(),\n }\n setEvents((prev) => {\n const { id } = broadcastedRpcCall.rpcCall\n const newState = { ...prev }\n if (isDefined(newState[id as string])) {\n parseRpcCall(newState, broadcastedRpcCall)\n } else {\n newState[id as string] = {} as RpcRequestResponsePairs\n parseRpcCall(newState, broadcastedRpcCall)\n }\n return newState\n })\n } catch (err) {\n console.error(err)\n }\n }\n }\n }\n globalThis.addEventListener('xyo:broadcast-rpc-request', listener)\n globalThis.addEventListener('xyo:broadcast-rpc-response', listener)\n\n return () => {\n globalThis.removeEventListener('xyo:broadcast-rpc-request', listener)\n globalThis.removeEventListener('xyo:broadcast-rpc-response', listener)\n }\n }, [])\n\n return { events, clearEvents }\n}\n","import { useHttpRpcViewer } from '@xyo-network/react-chain-provider'\n\nimport { useChainNetwork } from '../../context/index.ts'\n\n/**\n * Get the viewer directly from the active network\n * @returns - The viewer for the active network\n */\nexport const useViewerInWallet = () => {\n const { activeNetwork } = useChainNetwork()\n const walletViewer = useHttpRpcViewer(activeNetwork?.url)\n return walletViewer\n}\n","import { delay, isUndefined } from '@xylabs/sdk-js'\nimport type { NetworkStatus } from '@xyo-network/xl1-sdk'\nimport { useEffect, useState } from 'react'\n\nimport { useActiveNetworkNetwork } from '../index.ts'\n\nconst STATUS_CHECK_INTERVAL = 10_000\n\nexport const usePollNetworkStatus = () => {\n const network = useActiveNetworkNetwork()\n const [networkStatus, setNetworkStatus] = useState<NetworkStatus>()\n const [networkStatusError, setNetworkStatusError] = useState<Error>()\n\n // Check network status every 10 seconds\n useEffect(() => {\n let checkNetwork = true\n void (async () => {\n if (isUndefined(network)) return\n while (checkNetwork) {\n try {\n const response = await network.status()\n setNetworkStatus(response)\n setNetworkStatusError(undefined)\n } catch (error) {\n console.error('Error fetching network status:', error)\n setNetworkStatus(undefined)\n setNetworkStatusError(error as Error)\n }\n await delay(STATUS_CHECK_INTERVAL)\n }\n })()\n\n return () => {\n // Cleanup function to stop checking network status at the current statusUrl\n checkNetwork = false\n }\n }, [network])\n\n return [networkStatus, networkStatusError] as const\n}\n","import { Cancel } from '@mui/icons-material'\nimport type { DrawerProps, IconButtonProps } from '@mui/material'\nimport { IconButton } from '@mui/material'\nimport React from 'react'\n\nexport interface CloseDrawerIconButtonProps extends IconButtonProps {\n anchor?: DrawerProps['anchor']\n onClose?: DrawerProps['onClose']\n}\n\nexport const CloseDrawerIconButton: React.FC<CloseDrawerIconButtonProps> = ({ anchor, onClose }) => {\n return (\n <IconButton\n onClick={e => onClose?.(e, 'backdropClick')}\n size=\"small\"\n sx={{\n alignSelf: anchor === 'right' ? 'start' : 'end', top: 8, right: anchor === 'right' ? undefined : 8, left: anchor === 'left' ? undefined : 8,\n }}\n >\n <Cancel fontSize=\"small\" />\n </IconButton>\n )\n}\n","import type { CardProps } from '@mui/material'\nimport {\n Card, Collapse,\n Stack, Typography,\n} from '@mui/material'\nimport { isDefined } from '@xylabs/sdk-js'\nimport { JsonViewerEx } from '@xyo-network/react-payload-raw-info'\nimport React, { memo, useState } from 'react'\n\nimport type { RpcRequestResponsePairs } from '../../../model/index.ts'\nimport { BroadcastedRpcCallDetailsSummaryStack } from './SummaryStack.tsx'\n\nconst JSON_VIEWER_WIDTH = 600\n\nexport interface BroadcastRpcCallDetailsCardProps extends CardProps {\n rpcRequestResponsePairs?: RpcRequestResponsePairs\n}\n\nexport const BroadcastedRpcCallDetailsCard: React.FC<BroadcastRpcCallDetailsCardProps> = memo(({\n rpcRequestResponsePairs, sx, ...props\n}) => {\n const [expanded, setExpanded] = useState(false)\n\n if (!rpcRequestResponsePairs) return null\n\n const {\n request, result, source,\n } = rpcRequestResponsePairs\n\n return (\n <Card\n sx={{\n p: 1, display: 'flex', flexDirection: 'column', width: JSON_VIEWER_WIDTH, ...sx,\n }}\n {...props}\n >\n <BroadcastedRpcCallDetailsSummaryStack\n expanded={expanded}\n params={request.rpcCall.params}\n hasResult={isDefined(result)}\n method={request.rpcCall.method}\n setExpanded={setExpanded}\n timestamp={request.timestamp}\n />\n <Collapse in={expanded} mountOnEnter unmountOnExit>\n <Stack direction=\"column\" p={1} gap={2} alignItems=\"stretch\">\n <Typography variant=\"body2\">\n Source:\n <Typography variant=\"caption\" component=\"span\" fontFamily=\"monospace\" sx={{ ml: 1 }}>{source}</Typography>\n </Typography>\n <Typography variant=\"body2\">Request:</Typography>\n <JsonViewerEx\n value={request}\n sx={{ maxHeight: 300, overflow: 'auto' }}\n />\n {isDefined(result)\n ? (\n <>\n <Typography variant=\"body2\">Result:</Typography>\n <JsonViewerEx\n value={result}\n sx={{ maxHeight: 300, overflow: 'auto' }}\n />\n </>\n )\n : null}\n </Stack>\n </Collapse>\n </Card>\n )\n})\n","import type { JsonRpcParams } from '@metamask/utils'\nimport {\n ArrowRight, CheckCircle, Warning,\n} from '@mui/icons-material'\nimport {\n Avatar,\n Icon, IconButton, Stack, type StackProps, Tooltip, Typography,\n useTheme,\n} from '@mui/material'\nimport { Identicon } from '@xylabs/react-identicon'\nimport { usePromise } from '@xylabs/react-promise'\nimport { isDefined } from '@xylabs/sdk-js'\nimport { ObjectHasher } from '@xyo-network/hash'\nimport React from 'react'\n\nexport interface BroadcastRpcCallDetailsSummaryStackProps extends StackProps {\n expanded?: boolean\n hasResult?: boolean\n method?: string\n params?: JsonRpcParams\n setExpanded?: (expanded: boolean) => void\n timestamp?: number\n}\n\nexport const BroadcastedRpcCallDetailsSummaryStack: React.FC<BroadcastRpcCallDetailsSummaryStackProps> = ({\n expanded, setExpanded, method, timestamp, hasResult, params, ...props\n}) => {\n const theme = useTheme()\n const [hash, hashError] = usePromise(async () => {\n if (isDefined(params)) {\n return await ObjectHasher.hash(params)\n }\n }, [params])\n\n return (\n <Stack direction=\"row\" gap={2} alignItems=\"center\" justifyContent=\"space-between\" {...props}>\n <Stack direction=\"row\" gap={2} alignItems=\"center\">\n <IconButton\n size=\"small\"\n onClick={() => setExpanded?.(!expanded)}\n >\n <ArrowRight sx={{ transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)', transition: 'transform 0.2s ease-in-out' }} fontSize=\"small\" />\n </IconButton>\n <Typography component=\"span\" variant=\"body2\" fontFamily=\"monospace\">\n {method}\n </Typography>\n <Tooltip\n title={isDefined(hashError)\n ? `Error generating hash of params: ${hashError.message}`\n : isDefined(params) ? `Params : ${JSON.stringify(params, null, 2)}` : 'Generating params hash...'}\n >\n <Avatar sx={{\n backgroundColor: theme.vars?.palette.text.primary, width: 20, height: 20,\n }}\n >\n <Identicon value={hash} size={14} />\n </Avatar>\n </Tooltip>\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\" sx={{ opacity: 0.6 }}>\n {isDefined(timestamp) ? new Date(timestamp).toLocaleString() : ''}\n </Typography>\n </Stack>\n <Icon sx={{ justifySelf: 'end' }}>{hasResult ? <CheckCircle color=\"success\" /> : <Warning color=\"warning\" />}</Icon>\n </Stack>\n )\n}\n","import { isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { ChangeEvent } from 'react'\nimport {\n useCallback, useMemo, useState,\n} from 'react'\n\nimport type { RpcRequestResponsePairsById } from '../../model/index.ts'\n\nexport const usePaginatedEventPairs = (\n formattedEvents: RpcRequestResponsePairsById,\n numberOfVisiblePairs: number,\n onClearEvents?: () => void,\n scrollableDiv?: HTMLDivElement | null,\n) => {\n const [currentPage, setCurrentPage] = useState(0)\n\n const allEventEntries = useMemo(() => {\n return Object.entries(formattedEvents ?? {}).toSorted(([, a], [, b]) => b.request.timestamp - a.request.timestamp)\n }, [formattedEvents])\n\n const totalPages = useMemo(() => {\n return Math.ceil(allEventEntries.length / numberOfVisiblePairs)\n }, [allEventEntries.length, numberOfVisiblePairs])\n\n // Clamp current page to valid range\n const effectiveCurrentPage = useMemo(() => {\n if (totalPages === 0) return 0\n return Math.min(currentPage, totalPages - 1)\n }, [currentPage, totalPages])\n\n const visibleEvents = useMemo(() => {\n if (isDefinedNotNull(scrollableDiv)) {\n scrollableDiv.scrollTo({ top: 0, behavior: 'smooth' })\n }\n const startIndex = effectiveCurrentPage * numberOfVisiblePairs\n const endIndex = startIndex + numberOfVisiblePairs\n return allEventEntries.slice(startIndex, endIndex)\n }, [allEventEntries, effectiveCurrentPage, numberOfVisiblePairs, scrollableDiv])\n\n const handlePreviousPage = useCallback(() => {\n setCurrentPage(prev => Math.max(0, prev - 1))\n }, [])\n\n const handleNextPage = useCallback(() => {\n setCurrentPage(prev => Math.min(totalPages - 1, prev + 1))\n }, [totalPages])\n\n const handleClearEvents = useCallback(() => {\n setCurrentPage(0)\n onClearEvents?.()\n }, [onClearEvents])\n\n // Compatible with TablePagination's onPageChange signature\n // Accepts 1-indexed page, converts to 0-indexed internally\n const handlePageChange = useCallback((_event: ChangeEvent<unknown>, page: number) => {\n setCurrentPage(page - 1)\n }, [])\n\n return {\n allEventEntries,\n visibleEvents,\n effectiveCurrentPage: effectiveCurrentPage + 1, // Return 1-indexed page\n totalPages,\n handlePreviousPage,\n handleNextPage,\n handleClearEvents,\n handlePageChange,\n }\n}\n","import type { AvatarProps } from '@mui/material'\nimport { Avatar } from '@mui/material'\nimport type { CSSProperties } from 'react'\nimport React from 'react'\n\nimport { useChainNetwork } from '../../context/index.ts'\nimport { NetworkIcon } from './Icon.tsx'\n\nexport interface NetworkAvatarProps extends AvatarProps {\n icon?: string\n iconStyles?: CSSProperties\n name?: string\n}\n\nexport const NetworkAvatar: React.FC<NetworkAvatarProps> = ({\n icon, iconStyles, name, sx, ...props\n}) => {\n return (\n <Avatar\n sx={{ backgroundColor: 'white', ...sx }}\n alt={name}\n {...props}\n >\n <NetworkIcon\n icon={icon}\n style={{ ...iconStyles }}\n />\n </Avatar>\n )\n}\n\nexport const ActiveNetworkAvatar: React.FC<AvatarProps> = (props) => {\n const { activeNetwork } = useChainNetwork()\n\n return (\n <NetworkAvatar\n icon={activeNetwork?.icon}\n name={activeNetwork?.name}\n {...props}\n />\n )\n}\n","import type { DetailedHTMLProps, HtmlHTMLAttributes } from 'react'\nimport React from 'react'\n\nexport interface NetworkIconProps extends DetailedHTMLProps<HtmlHTMLAttributes<HTMLSpanElement>, HTMLSpanElement> {\n icon?: string\n}\n\nexport const NetworkIcon: React.FC<NetworkIconProps> = ({\n icon, style, ...props\n}) => {\n return (\n <span\n // eslint-disable-next-line react-dom/no-dangerously-set-innerhtml\n dangerouslySetInnerHTML={{ __html: icon ?? '' }} // Placeholder for SVG\\\n style={{\n display: 'inline-flex', width: 24, height: 24, ...style,\n }}\n {...props}\n />\n )\n}\n","import type { MenuItemProps } from '@mui/material'\nimport { ListItemText } from '@mui/material'\nimport { ActiveMenuItem } from '@xyo-network/react-chain-shared'\nimport type { NetworkBootstrap, NetworkId } from '@xyo-network/xl1-sdk'\nimport type { MouseEvent as ReactMouseEvent } from 'react'\nimport React from 'react'\n\nimport { NetworkAvatar } from './Avatar.tsx'\n\nexport interface NetworkMenuItemProps extends MenuItemProps {\n active?: boolean\n network?: NetworkBootstrap\n updateActiveNetwork?: (networkId: NetworkId) => void\n}\n\nexport const NetworkMenuItem: React.FC<NetworkMenuItemProps> = ({\n active, network, onClick, updateActiveNetwork, ...props\n}) => {\n const handleClick = (event: ReactMouseEvent<HTMLLIElement, MouseEvent>) => {\n if (network === undefined) throw new Error('Network is undefined')\n updateActiveNetwork?.(network.id)\n onClick?.(event)\n }\n\n return (\n <ActiveMenuItem\n title={network?.name}\n disableRipple\n onClick={handleClick}\n active={active}\n sx={{ py: 1 }}\n {...props}\n >\n <NetworkAvatar icon={network?.icon} name={network?.name} sx={{ width: 30, height: 30 }} />\n <ListItemText>{network?.name}</ListItemText>\n </ActiveMenuItem>\n )\n}\n","import type { AlertProps } from '@mui/material'\nimport {\n Alert, AlertTitle, Button,\n} from '@mui/material'\nimport type { NetworkStatus } from '@xyo-network/xl1-sdk'\nimport React, { useMemo, useState } from 'react'\n\nimport { NetworkStatusDialog } from './Dialog.tsx'\n\nexport interface NetworkStatusAlertProps extends AlertProps {\n status?: NetworkStatus\n}\n\nexport const NetworkStatusAlert: React.FC<NetworkStatusAlertProps> = ({ status, ...props }) => {\n const [open, setOpen] = useState(false)\n const handleClose = () => setOpen(false)\n\n const severity = useMemo(() => {\n if (!status) return\n switch (status.state) {\n case 'online': {\n return 'success'\n }\n case 'offline': {\n return 'error'\n }\n case 'degraded': {\n return 'warning'\n }\n case 'unknown': {\n return 'error'\n }\n }\n }, [status])\n\n return (\n <Alert severity={severity} {...props}>\n <AlertTitle>{status?.description}</AlertTitle>\n {status?.updates && status.updates.length > 0\n ? (\n <>\n <Button color={severity} variant=\"outlined\" size=\"small\" onClick={() => setOpen(true)}>\n Updates\n </Button>\n <NetworkStatusDialog open={open} onClose={handleClose} updates={status.updates} />\n </>\n )\n : null}\n </Alert>\n )\n}\n","import type { DialogProps } from '@mui/material'\nimport {\n Button, Dialog, DialogActions, DialogContent, DialogTitle, List, ListItem, Typography,\n} from '@mui/material'\nimport type { NetworkStatusUpdate } from '@xyo-network/xl1-sdk'\nimport React from 'react'\n\nexport interface NetworkStatusDialogProps extends DialogProps {\n updates: NetworkStatusUpdate[]\n}\n\nexport const NetworkStatusDialog: React.FC<NetworkStatusDialogProps> = ({ updates, ...props }) => {\n return (\n <Dialog {...props}>\n <DialogTitle>Recent Status Updates</DialogTitle>\n <DialogContent>\n <List>\n {updates.map(({\n start, end, update,\n }) => (\n <ListItem\n key={start + update}\n sx={{\n flexDirection: 'column', alignItems: 'start', pl: 0,\n }}\n >\n <Typography>\n {update}\n </Typography>\n <Typography gutterBottom sx={{ opacity: 0.75, fontSize: '.8333rem' }}>\n Start:\n {' '}\n {new Date(start).toLocaleString()}\n {' '}\n <br />\n End:\n {' '}\n {new Date(end).toLocaleString()}\n </Typography>\n </ListItem>\n ))}\n </List>\n </DialogContent>\n <DialogActions>\n <Button onClick={e => props.onClose?.(e, 'backdropClick')} color=\"primary\" variant=\"outlined\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n","import type { AlertProps } from '@mui/material'\nimport type { PropsWithChildren } from 'react'\nimport React from 'react'\n\nimport { usePollNetworkStatus } from '../../hooks/index.ts'\nimport { NetworkStatusAlert } from './Alert.tsx'\n\nconst validNetworkStates = new Set(['online', 'unknown'])\n\nexport interface NetworkStatusProps extends PropsWithChildren<AlertProps> {}\n\nexport const NetworkStatus: React.FC<NetworkStatusProps> = ({ children, ...props }) => {\n const [networkStatus] = usePollNetworkStatus()\n const showStatus = networkStatus && !validNetworkStates.has(networkStatus.state)\n return (\n <>\n {showStatus ? <NetworkStatusAlert status={networkStatus} {...props} /> : null}\n {children}\n </>\n )\n}\n","import type { JsonRpcRequest, JsonRpcResponse } from '@metamask/utils'\n\n// Configuration options for broadcasting RPC calls\nexport type BroadcastRpcConfig = { request: boolean; response: boolean }\n\n// Event Names\nexport const BroadcastRpcRequestEventName = 'xyo:broadcast-rpc-request' as const\nexport const BroadcastRpcResponseEventName = 'xyo:broadcast-rpc-response' as const\nexport type BroadcastRpcEventNames = typeof BroadcastRpcRequestEventName | typeof BroadcastRpcResponseEventName\n\n// default options are to broadcast all events\nexport const defaultBroadcastConfig: BroadcastRpcConfig = { request: true, response: true }\n\nexport interface BroadcastedRpcCall<TRpcCall extends JsonRpcRequest | JsonRpcResponse = JsonRpcRequest | JsonRpcResponse> {\n rpcCall: TRpcCall\n source: string\n timestamp: number\n}\n\nexport type RpcRequestResponsePairs = {\n request: BroadcastedRpcCall<JsonRpcRequest>\n result?: BroadcastedRpcCall<JsonRpcResponse>\n source?: string\n}\n\nexport type RpcRequestResponsePairsById = {\n [id: string]: RpcRequestResponsePairs\n}\n"],"mappings":"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","names":["Box","Button","Drawer","Pagination","Stack","Typography","React","useState","useCurrentBlock","useViewerFromWallet","isDefined","isNull","isUndefined","useHttpRpcViewer","useViewerFromWallet","createContextEx","ChainNetworkContext","ErrorRender","usePromise","isDefined","MainNetwork","React","useCallback","useMemo","useState","LocalNetwork","defaultChainNetworkSettings","id","proxy","useCallback","useState","useChainNetworkSettings","defaults","defaultChainNetworkSettings","networkSettings","setNetworkSettings","useState","updateNetworkSettings","useCallback","networkId","settings","prevSettings","ChainNetworkProvider","children","getActiveNetwork","networkSettings","networkSettingsProp","defaultChainNetworkSettings","networks","setActiveNetwork","setActiveNetworkExternal","activeNetwork","useState","error","setError","updateNetworkSettings","useChainNetworkSettings","resolvedActiveNetwork","activeNetworkError","usePromise","find","network","id","defaultNetwork","MainNetwork","previousResolvedActiveNetwork","setPreviousResolvedActiveNetwork","isDefined","updateActiveNetwork","useCallback","networkId","undefined","Error","value","useMemo","provided","chainNetworkError","ChainNetworkContext","ErrorRender","scope","useContextEx","useChainNetwork","required","useContextEx","ChainNetworkContext","shouldProxy","networkSettings","networkBootstrap","isDefined","id","proxy","useViewerInPage","networkOverride","activeNetwork","useChainNetwork","httpRpcViewer","useHttpRpcViewer","url","walletRpcViewer","useViewerFromWallet","isUndefined","isNull","console","warn","useActiveNetworkCurrentBlock","refresh","viewer","currentBlock","useCurrentBlock","useActiveNetworkCurrentBlockInPage","useViewerInPage","useActiveNetworkCurrentBlockInWallet","useViewerFromWallet","useNetwork","useActiveNetworkNetwork","activeNetwork","useChainNetwork","network","useNetwork","id","useHttpRpcRunner","useActiveNetworkRunner","activeNetwork","useChainNetwork","runner","useHttpRpcRunner","url","isJsonRpcRequest","isJsonRpcResponse","isDefined","isString","useEffect","useState","parseRpcCall","acc","event","isJsonRpcResponse","rpcCall","castedEvent","id","result","isJsonRpcRequest","request","console","error","source","useRpcBroadcastListener","events","setEvents","useState","clearEvents","useEffect","listener","e","detail","isString","parsedDetail","JSON","parse","data","broadcastedRpcCall","timestamp","Date","now","prev","newState","isDefined","err","globalThis","addEventListener","removeEventListener","useHttpRpcViewer","useViewerInWallet","activeNetwork","useChainNetwork","walletViewer","useHttpRpcViewer","url","delay","isUndefined","useEffect","useState","STATUS_CHECK_INTERVAL","usePollNetworkStatus","network","useActiveNetworkNetwork","networkStatus","setNetworkStatus","useState","networkStatusError","setNetworkStatusError","useEffect","checkNetwork","isUndefined","response","status","undefined","error","console","delay","Cancel","IconButton","React","CloseDrawerIconButton","anchor","onClose","React","IconButton","onClick","e","size","sx","alignSelf","top","right","undefined","left","Cancel","fontSize","Card","Collapse","Stack","Typography","isDefined","JsonViewerEx","React","memo","useState","ArrowRight","CheckCircle","Warning","Avatar","Icon","IconButton","Stack","Tooltip","Typography","useTheme","Identicon","usePromise","isDefined","ObjectHasher","React","BroadcastedRpcCallDetailsSummaryStack","expanded","setExpanded","method","timestamp","hasResult","params","props","theme","useTheme","hash","hashError","usePromise","isDefined","ObjectHasher","React","Stack","direction","gap","alignItems","justifyContent","IconButton","size","onClick","ArrowRight","sx","transform","transition","fontSize","Typography","component","variant","fontFamily","Tooltip","title","message","JSON","stringify","Avatar","backgroundColor","vars","palette","text","primary","width","height","Identicon","value","color","opacity","Date","toLocaleString","Icon","justifySelf","CheckCircle","Warning","JSON_VIEWER_WIDTH","BroadcastedRpcCallDetailsCard","memo","rpcRequestResponsePairs","sx","props","expanded","setExpanded","useState","request","result","source","React","Card","p","display","flexDirection","width","BroadcastedRpcCallDetailsSummaryStack","params","rpcCall","hasResult","isDefined","method","timestamp","Collapse","in","mountOnEnter","unmountOnExit","Stack","direction","gap","alignItems","Typography","variant","component","fontFamily","ml","JsonViewerEx","value","maxHeight","overflow","isDefinedNotNull","useCallback","useMemo","useState","usePaginatedEventPairs","formattedEvents","numberOfVisiblePairs","onClearEvents","scrollableDiv","currentPage","setCurrentPage","useState","allEventEntries","useMemo","Object","entries","toSorted","a","b","request","timestamp","totalPages","Math","ceil","length","effectiveCurrentPage","min","visibleEvents","isDefinedNotNull","scrollTo","top","behavior","startIndex","endIndex","slice","handlePreviousPage","useCallback","prev","max","handleNextPage","handleClearEvents","handlePageChange","_event","page","BroadcastedRpcCallsDrawer","anchor","onClearEvents","drawerTitle","events","onClose","numberOfVisibleEvents","props","scrollableDiv","setScrollableDiv","useState","allEventEntries","visibleEvents","totalPages","effectiveCurrentPage","handleClearEvents","handlePageChange","usePaginatedEventPairs","React","Drawer","keepMounted","CloseDrawerIconButton","Stack","gap","sx","p","flexShrink","direction","justifyContent","alignItems","Typography","variant","Button","size","onClick","length","Pagination","count","page","onChange","color","id","flexGrow","overflowY","Box","ref","el","px","pb","map","broadcastedRpcCall","index","BroadcastedRpcCallDetailsCard","key","rpcRequestResponsePairs","mb","BroadcastedRpcCallsDrawerWithEvents","clearEvents","useRpcBroadcastListener","Avatar","React","React","NetworkIcon","icon","style","props","React","span","dangerouslySetInnerHTML","__html","display","width","height","NetworkAvatar","icon","iconStyles","name","sx","props","React","Avatar","backgroundColor","alt","NetworkIcon","style","ActiveNetworkAvatar","activeNetwork","useChainNetwork","ListItemText","ActiveMenuItem","React","NetworkMenuItem","active","network","onClick","updateActiveNetwork","props","handleClick","event","undefined","Error","id","React","ActiveMenuItem","title","name","disableRipple","sx","py","NetworkAvatar","icon","width","height","ListItemText","Alert","AlertTitle","Button","React","useMemo","useState","Button","Dialog","DialogActions","DialogContent","DialogTitle","List","ListItem","Typography","React","NetworkStatusDialog","updates","props","React","Dialog","DialogTitle","DialogContent","List","map","start","end","update","ListItem","key","sx","flexDirection","alignItems","pl","Typography","gutterBottom","opacity","fontSize","Date","toLocaleString","br","DialogActions","Button","onClick","e","onClose","color","variant","NetworkStatusAlert","status","props","open","setOpen","useState","handleClose","severity","useMemo","state","React","Alert","AlertTitle","description","updates","length","Button","color","variant","size","onClick","NetworkStatusDialog","onClose","React","validNetworkStates","Set","NetworkStatus","children","props","networkStatus","usePollNetworkStatus","showStatus","has","state","React","NetworkStatusAlert","status","BroadcastRpcRequestEventName","BroadcastRpcResponseEventName","defaultBroadcastConfig","request","response"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package.json",
3
3
  "name": "@xyo-network/react-chain-network",
4
- "version": "1.19.12",
4
+ "version": "1.19.13",
5
5
  "description": "XYO Layer One React SDK",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -54,8 +54,9 @@
54
54
  "@xylabs/react-promise": "~7.1.15",
55
55
  "@xylabs/react-shared": "~7.1.15",
56
56
  "@xylabs/sdk-js": "~5.0.79",
57
- "@xyo-network/react-chain-provider": "~1.19.12",
58
- "@xyo-network/react-chain-shared": "~1.19.12",
57
+ "@xyo-network/hash": "~5.3.2",
58
+ "@xyo-network/react-chain-provider": "~1.19.13",
59
+ "@xyo-network/react-chain-shared": "~1.19.13",
59
60
  "@xyo-network/react-payload-raw-info": "~7.5.1",
60
61
  "@xyo-network/xl1-sdk": "~1.23.21"
61
62
  },
@@ -71,7 +72,7 @@
71
72
  "@xylabs/tsconfig": "~7.3.2",
72
73
  "@xylabs/tsconfig-dom": "~7.3.2",
73
74
  "@xylabs/tsconfig-react": "~7.3.2",
74
- "@xyo-network/react-chain-model": "~1.19.12",
75
+ "@xyo-network/react-chain-model": "~1.19.13",
75
76
  "eslint": "^9.39.2",
76
77
  "react": "~19.2.4",
77
78
  "react-dom": "~19.2.4",
@@ -2,7 +2,7 @@ import type { DrawerProps } from '@mui/material'
2
2
  import {
3
3
  Box, Button, Drawer, Pagination, Stack, Typography,
4
4
  } from '@mui/material'
5
- import React from 'react'
5
+ import React, { useState } from 'react'
6
6
 
7
7
  import { useRpcBroadcastListener } from '../../hooks/index.ts'
8
8
  import type { RpcRequestResponsePairsById } from '../../model/index.ts'
@@ -26,6 +26,7 @@ export const BroadcastedRpcCallsDrawer: React.FC<BroadcastRpcCallsDrawer> = ({
26
26
  numberOfVisibleEvents = 25,
27
27
  ...props
28
28
  }) => {
29
+ const [scrollableDiv, setScrollableDiv] = useState<HTMLDivElement | null>(null)
29
30
  const {
30
31
  allEventEntries,
31
32
  visibleEvents,
@@ -37,6 +38,7 @@ export const BroadcastedRpcCallsDrawer: React.FC<BroadcastRpcCallsDrawer> = ({
37
38
  events,
38
39
  numberOfVisibleEvents,
39
40
  onClearEvents,
41
+ scrollableDiv,
40
42
  )
41
43
 
42
44
  return (
@@ -59,6 +61,7 @@ export const BroadcastedRpcCallsDrawer: React.FC<BroadcastRpcCallsDrawer> = ({
59
61
  </Stack>
60
62
  <Stack direction="column" id="events-container" flexGrow={1} sx={{ overflowY: 'hidden' }}>
61
63
  <Box
64
+ ref={(el: HTMLDivElement) => setScrollableDiv(el)}
62
65
  sx={{
63
66
  overflowY: 'auto', px: 3, pb: 3,
64
67
  }}
@@ -42,7 +42,7 @@ export const BroadcastedRpcCallDetailsCard: React.FC<BroadcastRpcCallDetailsCard
42
42
  setExpanded={setExpanded}
43
43
  timestamp={request.timestamp}
44
44
  />
45
- <Collapse in={expanded} unmountOnExit>
45
+ <Collapse in={expanded} mountOnEnter unmountOnExit>
46
46
  <Stack direction="column" p={1} gap={2} alignItems="stretch">
47
47
  <Typography variant="body2">
48
48
  Source:
@@ -4,29 +4,15 @@ import {
4
4
  } from '@mui/icons-material'
5
5
  import {
6
6
  Avatar,
7
- Icon, IconButton, Stack, type StackProps, Typography,
7
+ Icon, IconButton, Stack, type StackProps, Tooltip, Typography,
8
8
  useTheme,
9
9
  } from '@mui/material'
10
10
  import { Identicon } from '@xylabs/react-identicon'
11
- import { isDefined, isHash } from '@xylabs/sdk-js'
11
+ import { usePromise } from '@xylabs/react-promise'
12
+ import { isDefined } from '@xylabs/sdk-js'
13
+ import { ObjectHasher } from '@xyo-network/hash'
12
14
  import React from 'react'
13
15
 
14
- type InferredParamType = 'hash' | 'unknown'
15
-
16
- const inferParamsType = (params: JsonRpcParams | undefined): { type: InferredParamType; value?: string } => {
17
- if (!params || !Array.isArray(params)) return { type: 'unknown' }
18
-
19
- // Simple heuristic: if the first param is a string that looks like a hash, we infer 'hash'
20
- const firstParam = params[0]
21
- if (isHash(firstParam)) {
22
- return {
23
- type: 'hash',
24
- value: firstParam,
25
- }
26
- }
27
- return { type: 'unknown' }
28
- }
29
-
30
16
  export interface BroadcastRpcCallDetailsSummaryStackProps extends StackProps {
31
17
  expanded?: boolean
32
18
  hasResult?: boolean
@@ -35,11 +21,17 @@ export interface BroadcastRpcCallDetailsSummaryStackProps extends StackProps {
35
21
  setExpanded?: (expanded: boolean) => void
36
22
  timestamp?: number
37
23
  }
24
+
38
25
  export const BroadcastedRpcCallDetailsSummaryStack: React.FC<BroadcastRpcCallDetailsSummaryStackProps> = ({
39
26
  expanded, setExpanded, method, timestamp, hasResult, params, ...props
40
27
  }) => {
41
28
  const theme = useTheme()
42
- const { type, value } = inferParamsType(params)
29
+ const [hash, hashError] = usePromise(async () => {
30
+ if (isDefined(params)) {
31
+ return await ObjectHasher.hash(params)
32
+ }
33
+ }, [params])
34
+
43
35
  return (
44
36
  <Stack direction="row" gap={2} alignItems="center" justifyContent="space-between" {...props}>
45
37
  <Stack direction="row" gap={2} alignItems="center">
@@ -52,16 +44,18 @@ export const BroadcastedRpcCallDetailsSummaryStack: React.FC<BroadcastRpcCallDet
52
44
  <Typography component="span" variant="body2" fontFamily="monospace">
53
45
  {method}
54
46
  </Typography>
55
- {type === 'hash'
56
- ? (
57
- <Avatar sx={{
58
- backgroundColor: theme.vars?.palette.text.primary, width: 20, height: 20,
59
- }}
60
- >
61
- <Identicon value={value} size={14} />
62
- </Avatar>
63
- )
64
- : null}
47
+ <Tooltip
48
+ title={isDefined(hashError)
49
+ ? `Error generating hash of params: ${hashError.message}`
50
+ : isDefined(params) ? `Params : ${JSON.stringify(params, null, 2)}` : 'Generating params hash...'}
51
+ >
52
+ <Avatar sx={{
53
+ backgroundColor: theme.vars?.palette.text.primary, width: 20, height: 20,
54
+ }}
55
+ >
56
+ <Identicon value={hash} size={14} />
57
+ </Avatar>
58
+ </Tooltip>
65
59
  <Typography component="span" variant="caption" color="text.secondary" sx={{ opacity: 0.6 }}>
66
60
  {isDefined(timestamp) ? new Date(timestamp).toLocaleString() : ''}
67
61
  </Typography>
@@ -1,3 +1,4 @@
1
+ import { isDefinedNotNull } from '@xylabs/sdk-js'
1
2
  import type { ChangeEvent } from 'react'
2
3
  import {
3
4
  useCallback, useMemo, useState,
@@ -9,6 +10,7 @@ export const usePaginatedEventPairs = (
9
10
  formattedEvents: RpcRequestResponsePairsById,
10
11
  numberOfVisiblePairs: number,
11
12
  onClearEvents?: () => void,
13
+ scrollableDiv?: HTMLDivElement | null,
12
14
  ) => {
13
15
  const [currentPage, setCurrentPage] = useState(0)
14
16
 
@@ -27,10 +29,13 @@ export const usePaginatedEventPairs = (
27
29
  }, [currentPage, totalPages])
28
30
 
29
31
  const visibleEvents = useMemo(() => {
32
+ if (isDefinedNotNull(scrollableDiv)) {
33
+ scrollableDiv.scrollTo({ top: 0, behavior: 'smooth' })
34
+ }
30
35
  const startIndex = effectiveCurrentPage * numberOfVisiblePairs
31
36
  const endIndex = startIndex + numberOfVisiblePairs
32
37
  return allEventEntries.slice(startIndex, endIndex)
33
- }, [allEventEntries, effectiveCurrentPage, numberOfVisiblePairs])
38
+ }, [allEventEntries, effectiveCurrentPage, numberOfVisiblePairs, scrollableDiv])
34
39
 
35
40
  const handlePreviousPage = useCallback(() => {
36
41
  setCurrentPage(prev => Math.max(0, prev - 1))