@xyo-network/react-chain-network 1.19.7 → 1.19.9

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.
@@ -4,7 +4,7 @@ export declare const ChainNetworkContext: import("react").Context<({
4
4
  networkSettings: import("./index.ts").ChainNetworkSettings;
5
5
  networks?: import("@xyo-network/xl1-network-model").NetworkBootstrap[];
6
6
  updateActiveNetwork?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"]) => void;
7
- updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: Partial<import("./index.ts").ChainNetworkSettings>) => void;
7
+ updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: import("./index.ts").NetworkSetting) => void;
8
8
  } & {
9
9
  provided: true;
10
10
  }) | (import("@xylabs/react-shared").FixedValues<import("@xylabs/react-shared").ProvidedContextExState<{
@@ -13,7 +13,7 @@ export declare const ChainNetworkContext: import("react").Context<({
13
13
  networkSettings: import("./index.ts").ChainNetworkSettings;
14
14
  networks?: import("@xyo-network/xl1-network-model").NetworkBootstrap[];
15
15
  updateActiveNetwork?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"]) => void;
16
- updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: Partial<import("./index.ts").ChainNetworkSettings>) => void;
16
+ updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: import("./index.ts").NetworkSetting) => void;
17
17
  }>, never> & {
18
18
  provided: false;
19
19
  }) | (import("@xylabs/react-shared").FixedValues<import("@xylabs/react-shared").NotProvidedContextExState<{
@@ -22,7 +22,7 @@ export declare const ChainNetworkContext: import("react").Context<({
22
22
  networkSettings: import("./index.ts").ChainNetworkSettings;
23
23
  networks?: import("@xyo-network/xl1-network-model").NetworkBootstrap[];
24
24
  updateActiveNetwork?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"]) => void;
25
- updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: Partial<import("./index.ts").ChainNetworkSettings>) => void;
25
+ updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: import("./index.ts").NetworkSetting) => void;
26
26
  }>, never> & {
27
27
  provided: false;
28
28
  })>;
@@ -1,12 +1,12 @@
1
1
  import type { ContextExState } from '@xylabs/react-shared';
2
2
  import type { NetworkBootstrap } from '@xyo-network/xl1-sdk';
3
- import type { ChainNetworkSettings } from './settings/index.ts';
3
+ import type { ChainNetworkSettings, NetworkSetting } from './settings/index.ts';
4
4
  export type ChainNetworkState = ContextExState<{
5
5
  activeNetwork?: NetworkBootstrap;
6
6
  chainNetworkError?: Error;
7
7
  networkSettings: ChainNetworkSettings;
8
8
  networks?: NetworkBootstrap[];
9
9
  updateActiveNetwork?: (networkId: NetworkBootstrap['id']) => void;
10
- updateNetworkSettings?: (networkId: NetworkBootstrap['id'], settings: Partial<ChainNetworkSettings>) => void;
10
+ updateNetworkSettings?: (networkId: NetworkBootstrap['id'], settings: NetworkSetting) => void;
11
11
  }>;
12
12
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../src/context/network/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE/D,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAC7C,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC,iBAAiB,CAAC,EAAE,KAAK,CAAA;IACzB,eAAe,EAAE,oBAAoB,CAAA;IACrC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC7B,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAA;IACjE,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAA;CAC7G,CAAC,CAAA"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../src/context/network/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAE/E,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAC7C,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC,iBAAiB,CAAC,EAAE,KAAK,CAAA;IACzB,eAAe,EAAE,oBAAoB,CAAA;IACrC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC7B,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAA;IACjE,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAA;CAC9F,CAAC,CAAA"}
@@ -4,7 +4,7 @@ export declare const useChainNetwork: (required?: boolean) => Omit<{
4
4
  networkSettings: import("./index.ts").ChainNetworkSettings;
5
5
  networks?: import("@xyo-network/xl1-network-model").NetworkBootstrap[];
6
6
  updateActiveNetwork?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"]) => void;
7
- updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: Partial<import("./index.ts").ChainNetworkSettings>) => void;
7
+ updateNetworkSettings?: (networkId: import("@xyo-network/xl1-network-model").NetworkBootstrap["id"], settings: import("./index.ts").NetworkSetting) => void;
8
8
  } & {
9
9
  provided: true;
10
10
  }, "provided"> | Omit<import("@xylabs/react-shared").NotProvidedContextExState<import("./state.ts").ChainNetworkState>, "provided">;
@@ -1 +1 @@
1
- {"version":3,"file":"UseViewerInPage.stories.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/UseViewerInPage.stories.tsx"],"names":[],"mappings":"AAcA,OAAO,KAGN,MAAM,OAAO,CAAA;;;;;AAgHd,wBAGC;AAID,QAAA,MAAM,OAAO,iGAAoB,CAAA;AAGjC,QAAA,MAAM,KAAK,iGAAoB,CAAA;AAI/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"UseViewerInPage.stories.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/UseViewerInPage.stories.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAIN,MAAM,OAAO,CAAA;;;;;AAgHd,wBAGC;AAID,QAAA,MAAM,OAAO,iGAAoB,CAAA;AAEjC,QAAA,MAAM,KAAK,iGAAoB,CAAA;AAI/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA"}
@@ -3,5 +3,5 @@ import type { NetworkBootstrap } from '@xyo-network/xl1-sdk';
3
3
  * Get the viewer for the active network, first from the wallet or fallback to HTTP RPC
4
4
  * @returns - XyoViewer for the active network
5
5
  */
6
- export declare const useViewerInPage: (networkOverride?: NetworkBootstrap) => import("@xyo-network/xl1-sdk").XyoViewer | null | undefined;
6
+ export declare const useViewerInPage: (networkOverride?: NetworkBootstrap) => import("@xyo-network/xl1-sdk").XyoViewer | undefined;
7
7
  //# sourceMappingURL=useViewerInPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useViewerInPage.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/useViewerInPage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAW5D;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,kBAAkB,gBAAgB,gEAkBjE,CAAA"}
1
+ {"version":3,"file":"useViewerInPage.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/useViewerInPage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAW5D;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,kBAAkB,gBAAgB,yDAsBjE,CAAA"}
@@ -433,7 +433,7 @@ import React11 from "react";
433
433
  import { useCurrentBlock, useViewerFromWallet as useViewerFromWallet2 } from "@xyo-network/react-chain-provider";
434
434
 
435
435
  // src/hooks/provider/useViewerInPage.ts
436
- import { isDefined as isDefined5, isUndefined } from "@xylabs/sdk-js";
436
+ import { isDefined as isDefined5, isNull, isUndefined } from "@xylabs/sdk-js";
437
437
  import { useHttpRpcViewer, useViewerFromWallet } from "@xyo-network/react-chain-provider";
438
438
  var shouldProxy = /* @__PURE__ */ __name((networkSettings, networkBootstrap) => {
439
439
  return isDefined5(networkBootstrap) && isDefined5(networkSettings[networkBootstrap.id]) && networkSettings[networkBootstrap.id].proxy;
@@ -445,7 +445,11 @@ var useViewerInPage = /* @__PURE__ */ __name((networkOverride) => {
445
445
  const httpRpcViewer = useHttpRpcViewer(networkBootstrap?.url);
446
446
  const [walletRpcViewer] = useViewerFromWallet(networkBootstrap?.id);
447
447
  if (isUndefined(walletRpcViewer)) return;
448
- if (shouldProxy(networkSettings, networkBootstrap) && isDefined5(walletRpcViewer)) {
448
+ if (shouldProxy(networkSettings, networkBootstrap)) {
449
+ if (isNull(walletRpcViewer)) {
450
+ console.warn(`Network ${networkBootstrap?.id} is set to proxy but no wallet viewer is available, falling back to HTTP RPC viewer`);
451
+ return httpRpcViewer;
452
+ }
449
453
  return walletRpcViewer;
450
454
  }
451
455
  return httpRpcViewer;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/broadcast/Drawer.tsx","../../src/components/broadcast/CloseDrawerIconButton.tsx","../../src/components/broadcast/details/Card.tsx","../../src/components/broadcast/details/SummaryStack.tsx","../../src/components/broadcast/helpers/formatEvents.ts","../../src/components/menu/Avatar.tsx","../../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/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/hooks/provider/useActiveNetworkCurrentBlock.ts","../../src/hooks/provider/useViewerInPage.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/model/BroadcastRpc.ts"],"sourcesContent":["import type { DrawerProps } from '@mui/material'\nimport {\n Drawer, Stack, Typography,\n} from '@mui/material'\nimport React, { useMemo } from 'react'\n\nimport type { BroadcastedRpcCall } from '../../model/index.ts'\nimport { CloseDrawerIconButton } from './CloseDrawerIconButton.tsx'\nimport { BroadcastedRpcCallDetails } from './details/index.ts'\nimport { formatEvents } from './helpers/index.ts'\n\nexport interface BroadcastRpcCallsDrawer extends DrawerProps {\n drawerTitle?: string\n events: BroadcastedRpcCall[]\n}\n\nexport const BroadcastedRpcCallsDrawer: React.FC<BroadcastRpcCallsDrawer> = ({\n anchor = 'right', drawerTitle, events, onClose, ...props\n}) => {\n const formattedEvents = useMemo(() => formatEvents(events), [events])\n\n return (\n <Drawer anchor={anchor} onClose={onClose} {...props}>\n <CloseDrawerIconButton anchor={anchor} onClose={onClose} />\n <Stack gap={2} sx={{ p: 3 }}>\n <Typography variant=\"h6\">{drawerTitle ?? 'Broadcasted RPC Calls'}</Typography>\n {Object.entries(formattedEvents ?? {}).map(([id, broadcastedRpcCall]) => {\n return <BroadcastedRpcCallDetails key={id} rpcRequestResponsePairs={broadcastedRpcCall} />\n })}\n </Stack>\n </Drawer>\n )\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 {\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, { useState } from 'react'\n\nimport type { RpcRequestResponsePairs } from '../../../model/index.ts'\nimport { BroadcastedRpcCallDetailsSummaryStack } from './SummaryStack.tsx'\n\nexport interface BroadcastRpcCallDetailsProps {\n rpcRequestResponsePairs?: RpcRequestResponsePairs\n}\n\nexport const BroadcastedRpcCallDetails: React.FC<BroadcastRpcCallDetailsProps> = ({ rpcRequestResponsePairs }) => {\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 sx={{ p: 1 }}>\n <BroadcastedRpcCallDetailsSummaryStack\n expanded={expanded}\n hasResult={isDefined(result)}\n method={request.rpcCall.method}\n setExpanded={setExpanded}\n timestamp={request.timestamp}\n />\n <Collapse in={expanded}>\n <Stack direction=\"column\" p={1} gap={2} width={600}>\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 value={request} sx={{ maxHeight: 300, overflow: 'auto' }} />\n {isDefined(result)\n ? (\n <>\n <Typography variant=\"body2\">Result:</Typography>\n <JsonViewerEx value={result} sx={{ maxHeight: 300, overflow: 'auto' }} />\n </>\n )\n : null}\n </Stack>\n </Collapse>\n </Card>\n )\n}\n","import {\n ArrowRight, CheckCircle, Warning,\n} from '@mui/icons-material'\nimport {\n Icon, IconButton, Stack, type StackProps, Typography,\n} from '@mui/material'\nimport { isDefined } from '@xylabs/sdk-js'\nimport React from 'react'\n\nexport interface BroadcastRpcCallDetailsSummaryStackProps extends StackProps {\n expanded?: boolean\n hasResult?: boolean\n method?: string\n setExpanded?: (expanded: boolean) => void\n timestamp?: number\n}\nexport const BroadcastedRpcCallDetailsSummaryStack: React.FC<BroadcastRpcCallDetailsSummaryStackProps> = ({\n expanded, setExpanded, method, timestamp, hasResult, ...props\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 size=\"small\" onClick={() => setExpanded?.(!expanded)}><ArrowRight fontSize=\"small\" /></IconButton>\n <Typography component=\"span\" variant=\"body2\" fontFamily=\"monospace\">\n {method}\n </Typography>\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 { JsonRpcRequest, JsonRpcResponse } from '@metamask/utils'\nimport { isJsonRpcRequest, isJsonRpcResponse } from '@metamask/utils'\nimport { isArray, isDefined } from '@xylabs/sdk-js'\n\nimport type { BroadcastedRpcCall, RpcRequestResponsePairs } from '../../../model/index.ts'\n\ntype RpcRequestResponsePairsById = {\n [id: string]: RpcRequestResponsePairs\n}\n\nexport const formatEvents = (events: BroadcastedRpcCall[]): RpcRequestResponsePairsById => {\n if (!isArray(events) || events.length === 0) return {} as RpcRequestResponsePairsById\n\n const 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\n let acc: RpcRequestResponsePairsById = {}\n for (const event of events) {\n const { id } = event.rpcCall\n if (isDefined(acc[id as string])) {\n acc = parseRpcCall(acc, event)\n } else {\n acc[id as string] = {} as RpcRequestResponsePairs\n acc = parseRpcCall(acc, event)\n }\n }\n return acc\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 { 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 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 { 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 { isDefined, isUndefined } 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) && isDefined(walletRpcViewer)) {\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 { 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 { isString } from '@xylabs/sdk-js'\nimport { useEffect, useState } from 'react'\n\nimport type { BroadcastedRpcCall } from '../../model/index.ts'\n\nexport const useRpcBroadcastListener = () => {\n const [events, setEvents] = useState<BroadcastedRpcCall[]>([])\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: e.timeStamp,\n }\n setEvents(prev => [broadcastedRpcCall, ...prev])\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 }\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 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"],"mappings":"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","names":["Drawer","Stack","Typography","React","useMemo","Cancel","IconButton","React","CloseDrawerIconButton","anchor","onClose","IconButton","onClick","e","size","sx","alignSelf","top","right","undefined","left","Cancel","fontSize","Card","Collapse","Stack","Typography","isDefined","JsonViewerEx","React","useState","ArrowRight","CheckCircle","Warning","Icon","IconButton","Stack","Typography","isDefined","React","BroadcastedRpcCallDetailsSummaryStack","expanded","setExpanded","method","timestamp","hasResult","props","React","Stack","direction","gap","alignItems","justifyContent","IconButton","size","onClick","ArrowRight","fontSize","Typography","component","variant","fontFamily","color","sx","opacity","isDefined","Date","toLocaleString","Icon","justifySelf","CheckCircle","Warning","BroadcastedRpcCallDetails","rpcRequestResponsePairs","expanded","setExpanded","useState","request","result","source","React","Card","sx","p","BroadcastedRpcCallDetailsSummaryStack","hasResult","isDefined","method","rpcCall","timestamp","Collapse","in","Stack","direction","gap","width","Typography","variant","component","fontFamily","ml","JsonViewerEx","value","maxHeight","overflow","isJsonRpcRequest","isJsonRpcResponse","isArray","isDefined","formatEvents","events","isArray","length","parseRpcCall","acc","event","isJsonRpcResponse","rpcCall","castedEvent","id","result","isJsonRpcRequest","request","console","error","source","isDefined","BroadcastedRpcCallsDrawer","anchor","drawerTitle","events","onClose","props","formattedEvents","useMemo","formatEvents","React","Drawer","CloseDrawerIconButton","Stack","gap","sx","p","Typography","variant","Object","entries","map","id","broadcastedRpcCall","BroadcastedRpcCallDetails","key","rpcRequestResponsePairs","Avatar","React","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","React","ChainNetworkContext","ErrorRender","scope","useContextEx","useChainNetwork","required","useContextEx","ChainNetworkContext","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","useCurrentBlock","useViewerFromWallet","isDefined","isUndefined","useHttpRpcViewer","useViewerFromWallet","shouldProxy","networkSettings","networkBootstrap","isDefined","id","proxy","useViewerInPage","networkOverride","activeNetwork","useChainNetwork","httpRpcViewer","useHttpRpcViewer","url","walletRpcViewer","useViewerFromWallet","isUndefined","useActiveNetworkCurrentBlock","refresh","viewer","currentBlock","useCurrentBlock","useActiveNetworkCurrentBlockInPage","useViewerInPage","useActiveNetworkCurrentBlockInWallet","useViewerFromWallet","useNetwork","useActiveNetworkNetwork","activeNetwork","useChainNetwork","network","useNetwork","id","useHttpRpcRunner","useActiveNetworkRunner","activeNetwork","useChainNetwork","runner","useHttpRpcRunner","url","isString","useEffect","useState","useRpcBroadcastListener","events","setEvents","useState","useEffect","listener","e","detail","isString","parsedDetail","JSON","parse","data","rpcCall","source","broadcastedRpcCall","timestamp","timeStamp","prev","err","console","error","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","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/components/broadcast/CloseDrawerIconButton.tsx","../../src/components/broadcast/details/Card.tsx","../../src/components/broadcast/details/SummaryStack.tsx","../../src/components/broadcast/helpers/formatEvents.ts","../../src/components/menu/Avatar.tsx","../../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/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/hooks/provider/useActiveNetworkCurrentBlock.ts","../../src/hooks/provider/useViewerInPage.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/model/BroadcastRpc.ts"],"sourcesContent":["import type { DrawerProps } from '@mui/material'\nimport {\n Drawer, Stack, Typography,\n} from '@mui/material'\nimport React, { useMemo } from 'react'\n\nimport type { BroadcastedRpcCall } from '../../model/index.ts'\nimport { CloseDrawerIconButton } from './CloseDrawerIconButton.tsx'\nimport { BroadcastedRpcCallDetails } from './details/index.ts'\nimport { formatEvents } from './helpers/index.ts'\n\nexport interface BroadcastRpcCallsDrawer extends DrawerProps {\n drawerTitle?: string\n events: BroadcastedRpcCall[]\n}\n\nexport const BroadcastedRpcCallsDrawer: React.FC<BroadcastRpcCallsDrawer> = ({\n anchor = 'right', drawerTitle, events, onClose, ...props\n}) => {\n const formattedEvents = useMemo(() => formatEvents(events), [events])\n\n return (\n <Drawer anchor={anchor} onClose={onClose} {...props}>\n <CloseDrawerIconButton anchor={anchor} onClose={onClose} />\n <Stack gap={2} sx={{ p: 3 }}>\n <Typography variant=\"h6\">{drawerTitle ?? 'Broadcasted RPC Calls'}</Typography>\n {Object.entries(formattedEvents ?? {}).map(([id, broadcastedRpcCall]) => {\n return <BroadcastedRpcCallDetails key={id} rpcRequestResponsePairs={broadcastedRpcCall} />\n })}\n </Stack>\n </Drawer>\n )\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 {\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, { useState } from 'react'\n\nimport type { RpcRequestResponsePairs } from '../../../model/index.ts'\nimport { BroadcastedRpcCallDetailsSummaryStack } from './SummaryStack.tsx'\n\nexport interface BroadcastRpcCallDetailsProps {\n rpcRequestResponsePairs?: RpcRequestResponsePairs\n}\n\nexport const BroadcastedRpcCallDetails: React.FC<BroadcastRpcCallDetailsProps> = ({ rpcRequestResponsePairs }) => {\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 sx={{ p: 1 }}>\n <BroadcastedRpcCallDetailsSummaryStack\n expanded={expanded}\n hasResult={isDefined(result)}\n method={request.rpcCall.method}\n setExpanded={setExpanded}\n timestamp={request.timestamp}\n />\n <Collapse in={expanded}>\n <Stack direction=\"column\" p={1} gap={2} width={600}>\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 value={request} sx={{ maxHeight: 300, overflow: 'auto' }} />\n {isDefined(result)\n ? (\n <>\n <Typography variant=\"body2\">Result:</Typography>\n <JsonViewerEx value={result} sx={{ maxHeight: 300, overflow: 'auto' }} />\n </>\n )\n : null}\n </Stack>\n </Collapse>\n </Card>\n )\n}\n","import {\n ArrowRight, CheckCircle, Warning,\n} from '@mui/icons-material'\nimport {\n Icon, IconButton, Stack, type StackProps, Typography,\n} from '@mui/material'\nimport { isDefined } from '@xylabs/sdk-js'\nimport React from 'react'\n\nexport interface BroadcastRpcCallDetailsSummaryStackProps extends StackProps {\n expanded?: boolean\n hasResult?: boolean\n method?: string\n setExpanded?: (expanded: boolean) => void\n timestamp?: number\n}\nexport const BroadcastedRpcCallDetailsSummaryStack: React.FC<BroadcastRpcCallDetailsSummaryStackProps> = ({\n expanded, setExpanded, method, timestamp, hasResult, ...props\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 size=\"small\" onClick={() => setExpanded?.(!expanded)}><ArrowRight fontSize=\"small\" /></IconButton>\n <Typography component=\"span\" variant=\"body2\" fontFamily=\"monospace\">\n {method}\n </Typography>\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 { JsonRpcRequest, JsonRpcResponse } from '@metamask/utils'\nimport { isJsonRpcRequest, isJsonRpcResponse } from '@metamask/utils'\nimport { isArray, isDefined } from '@xylabs/sdk-js'\n\nimport type { BroadcastedRpcCall, RpcRequestResponsePairs } from '../../../model/index.ts'\n\ntype RpcRequestResponsePairsById = {\n [id: string]: RpcRequestResponsePairs\n}\n\nexport const formatEvents = (events: BroadcastedRpcCall[]): RpcRequestResponsePairsById => {\n if (!isArray(events) || events.length === 0) return {} as RpcRequestResponsePairsById\n\n const 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\n let acc: RpcRequestResponsePairsById = {}\n for (const event of events) {\n const { id } = event.rpcCall\n if (isDefined(acc[id as string])) {\n acc = parseRpcCall(acc, event)\n } else {\n acc[id as string] = {} as RpcRequestResponsePairs\n acc = parseRpcCall(acc, event)\n }\n }\n return acc\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 { 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 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 { 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 { 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 { isString } from '@xylabs/sdk-js'\nimport { useEffect, useState } from 'react'\n\nimport type { BroadcastedRpcCall } from '../../model/index.ts'\n\nexport const useRpcBroadcastListener = () => {\n const [events, setEvents] = useState<BroadcastedRpcCall[]>([])\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: e.timeStamp,\n }\n setEvents(prev => [broadcastedRpcCall, ...prev])\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 }\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 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"],"mappings":"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","names":["Drawer","Stack","Typography","React","useMemo","Cancel","IconButton","React","CloseDrawerIconButton","anchor","onClose","IconButton","onClick","e","size","sx","alignSelf","top","right","undefined","left","Cancel","fontSize","Card","Collapse","Stack","Typography","isDefined","JsonViewerEx","React","useState","ArrowRight","CheckCircle","Warning","Icon","IconButton","Stack","Typography","isDefined","React","BroadcastedRpcCallDetailsSummaryStack","expanded","setExpanded","method","timestamp","hasResult","props","React","Stack","direction","gap","alignItems","justifyContent","IconButton","size","onClick","ArrowRight","fontSize","Typography","component","variant","fontFamily","color","sx","opacity","isDefined","Date","toLocaleString","Icon","justifySelf","CheckCircle","Warning","BroadcastedRpcCallDetails","rpcRequestResponsePairs","expanded","setExpanded","useState","request","result","source","React","Card","sx","p","BroadcastedRpcCallDetailsSummaryStack","hasResult","isDefined","method","rpcCall","timestamp","Collapse","in","Stack","direction","gap","width","Typography","variant","component","fontFamily","ml","JsonViewerEx","value","maxHeight","overflow","isJsonRpcRequest","isJsonRpcResponse","isArray","isDefined","formatEvents","events","isArray","length","parseRpcCall","acc","event","isJsonRpcResponse","rpcCall","castedEvent","id","result","isJsonRpcRequest","request","console","error","source","isDefined","BroadcastedRpcCallsDrawer","anchor","drawerTitle","events","onClose","props","formattedEvents","useMemo","formatEvents","React","Drawer","CloseDrawerIconButton","Stack","gap","sx","p","Typography","variant","Object","entries","map","id","broadcastedRpcCall","BroadcastedRpcCallDetails","key","rpcRequestResponsePairs","Avatar","React","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","React","ChainNetworkContext","ErrorRender","scope","useContextEx","useChainNetwork","required","useContextEx","ChainNetworkContext","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","useCurrentBlock","useViewerFromWallet","isDefined","isNull","isUndefined","useHttpRpcViewer","useViewerFromWallet","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","isString","useEffect","useState","useRpcBroadcastListener","events","setEvents","useState","useEffect","listener","e","detail","isString","parsedDetail","JSON","parse","data","rpcCall","source","broadcastedRpcCall","timestamp","timeStamp","prev","err","console","error","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","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.7",
4
+ "version": "1.19.9",
5
5
  "description": "XYO Layer One React SDK",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -52,25 +52,25 @@
52
52
  "@xylabs/react-error": "~7.1.15",
53
53
  "@xylabs/react-promise": "~7.1.15",
54
54
  "@xylabs/react-shared": "~7.1.15",
55
- "@xylabs/sdk-js": "~5.0.65",
56
- "@xyo-network/react-chain-provider": "~1.19.7",
57
- "@xyo-network/react-chain-shared": "~1.19.7",
55
+ "@xylabs/sdk-js": "~5.0.79",
56
+ "@xyo-network/react-chain-provider": "~1.19.9",
57
+ "@xyo-network/react-chain-shared": "~1.19.9",
58
58
  "@xyo-network/react-payload-raw-info": "~7.5.0",
59
- "@xyo-network/xl1-sdk": "~1.22.30"
59
+ "@xyo-network/xl1-sdk": "~1.23.14"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@emotion/react": "~11.14.0",
63
63
  "@emotion/styled": "~11.14.1",
64
64
  "@mui/icons-material": "~7.3.7",
65
65
  "@mui/material": "~7.3.7",
66
- "@storybook/react-vite": "~10.2.7",
66
+ "@storybook/react-vite": "~10.2.8",
67
67
  "@types/react": "~19.2.13",
68
68
  "@xylabs/react-button": "~7.1.15",
69
69
  "@xylabs/ts-scripts-yarn3": "~7.3.2",
70
70
  "@xylabs/tsconfig": "~7.3.2",
71
71
  "@xylabs/tsconfig-dom": "~7.3.2",
72
72
  "@xylabs/tsconfig-react": "~7.3.2",
73
- "@xyo-network/react-chain-model": "~1.19.7",
73
+ "@xyo-network/react-chain-model": "~1.19.9",
74
74
  "eslint": "^9.39.2",
75
75
  "react": "~19.2.4",
76
76
  "react-dom": "~19.2.4",
@@ -1,7 +1,7 @@
1
1
  import type { ContextExState } from '@xylabs/react-shared'
2
2
  import type { NetworkBootstrap } from '@xyo-network/xl1-sdk'
3
3
 
4
- import type { ChainNetworkSettings } from './settings/index.ts'
4
+ import type { ChainNetworkSettings, NetworkSetting } from './settings/index.ts'
5
5
 
6
6
  export type ChainNetworkState = ContextExState<{
7
7
  activeNetwork?: NetworkBootstrap
@@ -9,5 +9,5 @@ export type ChainNetworkState = ContextExState<{
9
9
  networkSettings: ChainNetworkSettings
10
10
  networks?: NetworkBootstrap[]
11
11
  updateActiveNetwork?: (networkId: NetworkBootstrap['id']) => void
12
- updateNetworkSettings?: (networkId: NetworkBootstrap['id'], settings: Partial<ChainNetworkSettings>) => void
12
+ updateNetworkSettings?: (networkId: NetworkBootstrap['id'], settings: NetworkSetting) => void
13
13
  }>
@@ -3,9 +3,11 @@ import {
3
3
  } from '@mui/material'
4
4
  import type { Decorator, StoryFn } from '@storybook/react-vite'
5
5
  import { ButtonEx } from '@xylabs/react-button'
6
+ import { ErrorRender } from '@xylabs/react-error'
6
7
  import {
7
8
  isDefined, isDefinedNotNull,
8
9
  isUndefined,
10
+ isUndefinedOrNull,
9
11
  } from '@xylabs/sdk-js'
10
12
  import { isXyoGlobal } from '@xyo-network/react-chain-model'
11
13
  import type { HydratedBlock, NetworkId } from '@xyo-network/xl1-sdk'
@@ -14,6 +16,7 @@ import {
14
16
  } from '@xyo-network/xl1-sdk'
15
17
  import React, {
16
18
  useCallback,
19
+ useEffect,
17
20
  useState,
18
21
  } from 'react'
19
22
 
@@ -84,7 +87,7 @@ const UseViewerInPageStoryTemplate: React.FC = () => {
84
87
  }
85
88
  }, [viewer])
86
89
 
87
- if (isDefined(viewer) && isUndefined(result) && !loading) {
90
+ if (isDefined(viewer) && isUndefined(result) && isUndefinedOrNull(error) && !loading) {
88
91
  void handleClick()
89
92
  }
90
93
 
@@ -122,7 +125,7 @@ const UseViewerInPageStoryTemplate: React.FC = () => {
122
125
  <pre>
123
126
  {JSON.stringify(result, null, 2)}
124
127
  </pre>
125
- {error ? <Alert severity="error">{error.message}</Alert> : null}
128
+ <ErrorRender error={error} />
126
129
  </Stack>
127
130
  )
128
131
  }
@@ -135,7 +138,6 @@ export default {
135
138
  const Template: StoryFn<typeof UseViewerInPageStoryTemplate> = args => <UseViewerInPageStoryTemplate {...args} />
136
139
 
137
140
  const Default = Template.bind({})
138
- Default.decorators = [UseViewerInPageStoryDecorator]
139
141
  Default.args = {}
140
142
  const Proxy = Template.bind({})
141
143
  Proxy.decorators = [UseViewerInPageStoryProxyDecorator]
@@ -1,4 +1,6 @@
1
- import { isDefined, isUndefined } from '@xylabs/sdk-js'
1
+ import {
2
+ isDefined, isNull, isUndefined,
3
+ } from '@xylabs/sdk-js'
2
4
  import { useHttpRpcViewer, useViewerFromWallet } from '@xyo-network/react-chain-provider'
3
5
  import type { NetworkBootstrap } from '@xyo-network/xl1-sdk'
4
6
 
@@ -26,7 +28,11 @@ export const useViewerInPage = (networkOverride?: NetworkBootstrap) => {
26
28
  // If the wallet viewer is undefined, don't return it yet, useViewerFromWallet is still checking
27
29
  if (isUndefined(walletRpcViewer)) return
28
30
 
29
- if (shouldProxy(networkSettings, networkBootstrap) && isDefined(walletRpcViewer)) {
31
+ if (shouldProxy(networkSettings, networkBootstrap)) {
32
+ if (isNull(walletRpcViewer)) {
33
+ console.warn(`Network ${networkBootstrap?.id} is set to proxy but no wallet viewer is available, falling back to HTTP RPC viewer`)
34
+ return httpRpcViewer
35
+ }
30
36
  // If the network setting is to proxy and the wallet viewer is available,
31
37
  // try to use the wallet viewer
32
38
  return walletRpcViewer