@xyo-network/react-chain-provider 1.6.1 → 1.6.3

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.
@@ -65,25 +65,58 @@ var useAddressBalance = /* @__PURE__ */ __name((address, viewer, networkId, refr
65
65
  import { usePromise as usePromise2 } from "@xylabs/react-promise";
66
66
 
67
67
  // src/hooks/useViewer.ts
68
- import { useChainNetwork } from "@xyo-network/react-chain-network";
69
- import { AllRpcSchemas, HttpRpcTransport, JsonRpcXyoViewer } from "@xyo-network/xl1-rpc";
68
+ import { isDefined as isDefined2, isUndefined as isUndefined3 } from "@xylabs/typeof";
69
+ import { AllRpcSchemas, HttpRpcTransport, JsonRpcXyoViewer as JsonRpcXyoViewer2 } from "@xyo-network/xl1-rpc";
70
+ import { useMemo as useMemo3 } from "react";
71
+
72
+ // src/hooks/useHostViewer.ts
73
+ import { isDefined, isTruthy, isUndefined as isUndefined2 } from "@xylabs/typeof";
74
+ import { JsonRpcXyoViewer, PostMessageRpcTransport } from "@xyo-network/xl1-rpc";
70
75
  import { useMemo as useMemo2 } from "react";
71
- var useViewer = /* @__PURE__ */ __name((_provider) => {
72
- const { activeNetwork } = useChainNetwork();
73
- return useMemo2(() => {
74
- if (!activeNetwork) {
75
- return;
76
+ var walletConnections = globalThis.xyo?.connections;
77
+ var useHostViewerBase = /* @__PURE__ */ __name((networkId) => {
78
+ const networkConnection = useMemo2(() => {
79
+ if (isTruthy(networkId) && isDefined(walletConnections) && isDefined(walletConnections[networkId])) {
80
+ return networkId;
76
81
  }
77
- const transport = new HttpRpcTransport(`${activeNetwork.url}/rpc`, AllRpcSchemas);
82
+ }, [
83
+ networkId
84
+ ]);
85
+ const rpcProvider = useMemo2(() => {
86
+ if (isUndefined2(networkConnection)) return;
87
+ const transport = new PostMessageRpcTransport(networkConnection);
78
88
  return new JsonRpcXyoViewer(transport);
79
89
  }, [
80
- activeNetwork
90
+ networkConnection
91
+ ]);
92
+ return rpcProvider;
93
+ }, "useHostViewerBase");
94
+ var useHostViewer = useHostViewerBase;
95
+
96
+ // src/hooks/useViewer.ts
97
+ var useViewerBase = /* @__PURE__ */ __name((id, url) => {
98
+ const hostViewer = useHostViewerBase(id);
99
+ const resolvedViewer = useMemo3(() => {
100
+ if (isUndefined3(url)) {
101
+ return;
102
+ }
103
+ if (isDefined2(hostViewer)) {
104
+ console.debug("Using host viewer:", hostViewer);
105
+ return hostViewer;
106
+ }
107
+ const transport = new HttpRpcTransport(`${url}/rpc`, AllRpcSchemas);
108
+ return new JsonRpcXyoViewer2(transport);
109
+ }, [
110
+ url,
111
+ hostViewer
81
112
  ]);
82
- }, "useViewer");
113
+ return resolvedViewer;
114
+ }, "useViewerBase");
115
+ var useViewer = useViewerBase;
83
116
 
84
117
  // src/hooks/useCurrentBlock.ts
85
- var useCurrentBlock = /* @__PURE__ */ __name((refresh = 1) => {
86
- const viewer = useViewer();
118
+ var useCurrentBlockBase = /* @__PURE__ */ __name((refresh = 1, id, url) => {
119
+ const viewer = useViewerBase(id, url);
87
120
  return usePromise2(async () => {
88
121
  if (viewer && refresh > 0) {
89
122
  const block = await viewer.currentBlock();
@@ -93,49 +126,40 @@ var useCurrentBlock = /* @__PURE__ */ __name((refresh = 1) => {
93
126
  viewer,
94
127
  refresh
95
128
  ]);
96
- }, "useCurrentBlock");
97
-
98
- // src/hooks/useHostViewer.ts
99
- import { JsonRpcXyoViewer as JsonRpcXyoViewer2, PostMessageRpcTransport } from "@xyo-network/xl1-rpc";
100
- import { useMemo as useMemo3 } from "react";
101
- var useHostViewer = /* @__PURE__ */ __name((_provider) => {
102
- const rpcProvider = useMemo3(() => {
103
- const transport = new PostMessageRpcTransport();
104
- return new JsonRpcXyoViewer2(transport);
105
- }, []);
106
- return rpcProvider;
107
- }, "useHostViewer");
129
+ }, "useCurrentBlockBase");
130
+ var useCurrentBlock = useCurrentBlockBase;
108
131
 
109
132
  // src/hooks/useNetwork.ts
110
- import { useChainNetwork as useChainNetwork2 } from "@xyo-network/react-chain-network";
133
+ import { isUndefined as isUndefined4 } from "@xylabs/typeof";
111
134
  import { MemoryXyoNetwork } from "@xyo-network/xl1-rpc";
112
135
  import { useMemo as useMemo4 } from "react";
113
- var useNetwork = /* @__PURE__ */ __name(() => {
114
- const { activeNetwork } = useChainNetwork2();
115
- return useMemo4(() => {
116
- if (!activeNetwork) return;
117
- return new MemoryXyoNetwork(activeNetwork.id);
136
+ var useNetworkBase = /* @__PURE__ */ __name((id) => {
137
+ const network = useMemo4(() => {
138
+ if (isUndefined4(id)) return;
139
+ return new MemoryXyoNetwork(id);
118
140
  }, [
119
- activeNetwork
141
+ id
120
142
  ]);
121
- }, "useNetwork");
143
+ return network;
144
+ }, "useNetworkBase");
145
+ var useNetwork = useNetworkBase;
122
146
 
123
147
  // src/hooks/useRunner.ts
124
- import { useChainNetwork as useChainNetwork3 } from "@xyo-network/react-chain-network";
148
+ import { isUndefined as isUndefined5 } from "@xylabs/typeof";
125
149
  import { AllRpcSchemas as AllRpcSchemas2, HttpRpcTransport as HttpRpcTransport2, JsonRpcXyoRunner } from "@xyo-network/xl1-rpc";
126
150
  import { useMemo as useMemo5 } from "react";
127
- var useRunner = /* @__PURE__ */ __name((_provider) => {
128
- const { activeNetwork } = useChainNetwork3();
151
+ var useRunnerBase = /* @__PURE__ */ __name((url) => {
129
152
  return useMemo5(() => {
130
- if (!activeNetwork) {
153
+ if (isUndefined5(url)) {
131
154
  return;
132
155
  }
133
- const transport = new HttpRpcTransport2(`${activeNetwork.url}/rpc`, AllRpcSchemas2);
156
+ const transport = new HttpRpcTransport2(`${url}/rpc`, AllRpcSchemas2);
134
157
  return new JsonRpcXyoRunner(transport);
135
158
  }, [
136
- activeNetwork
159
+ url
137
160
  ]);
138
- }, "useRunner");
161
+ }, "useRunnerBase");
162
+ var useRunner = useRunnerBase;
139
163
 
140
164
  // src/hooks/useSigner.ts
141
165
  import { MemoryXyoSigner } from "@xyo-network/xl1-rpc";
@@ -148,10 +172,15 @@ var useSigner = /* @__PURE__ */ __name((_provider, account) => {
148
172
  export {
149
173
  useAddressBalance,
150
174
  useCurrentBlock,
175
+ useCurrentBlockBase,
151
176
  useHostViewer,
177
+ useHostViewerBase,
152
178
  useNetwork,
179
+ useNetworkBase,
153
180
  useRunner,
181
+ useRunnerBase,
154
182
  useSigner,
155
- useViewer
183
+ useViewer,
184
+ useViewerBase
156
185
  };
157
186
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useAddressBalance.ts","../../src/hooks/useCurrentBlock.ts","../../src/hooks/useViewer.ts","../../src/hooks/useHostViewer.ts","../../src/hooks/useNetwork.ts","../../src/hooks/useRunner.ts","../../src/hooks/useSigner.ts"],"sourcesContent":["import type { Address } from '@xylabs/hex'\nimport { usePromise } from '@xylabs/react-promise'\nimport { isUndefined, isUndefinedOrNull } from '@xylabs/typeof'\nimport { ShiftedBigInt } from '@xyo-network/chain-wrappers'\nimport type {\n AttoXL1, NetworkId, XyoViewer,\n} from '@xyo-network/xl1-protocol'\nimport { useMemo, useState } from 'react'\n\nexport const useAddressBalance = (\n // address to get balance for\n address?: Address,\n // viewer to use for fetching balance\n viewer?: XyoViewer,\n // network ID to trigger a balance refresh\n networkId?: NetworkId,\n // refresh balance trigger\n refresh?: number,\n) => {\n const [balancesResult, setBalancesResult] = useState<AttoXL1 | null>()\n const [loading, setLoading] = useState(false)\n\n const [, balancesError] = usePromise(async () => {\n if (isUndefined(viewer) || isUndefined(address)) return\n setLoading(true)\n setBalancesResult(undefined)\n const balance = await viewer.accountBalance(address)\n setBalancesResult(balance as AttoXL1)\n setLoading(false)\n }, [address, viewer, networkId, refresh])\n\n useMemo(() => {\n if (balancesError) {\n setLoading(false)\n }\n }, [balancesError])\n\n const shiftedBigInt = useMemo(() => {\n if (typeof balancesResult !== 'bigint') return\n return new ShiftedBigInt(balancesResult, {\n places: 18, maxDecimal: 18, maxCharacters: 9, minDecimals: 1, locale: navigator.language,\n })\n }, [balancesResult])\n\n const balanceIntlFriendly = useMemo(() => {\n return shiftedBigInt?.toFullString()\n }, [shiftedBigInt])\n\n const shortBalanceIntlFriendly = useMemo(() => {\n return isUndefinedOrNull(balancesResult)\n ? undefined\n : (balancesResult < 1_000_000_000_000n && balancesResult > 0n) ? '<0.00001' : shiftedBigInt?.toShortString()\n }, [shiftedBigInt])\n\n return {\n address,\n balanceForAddress: balancesResult,\n balanceIntlFriendly,\n shortBalanceIntlFriendly,\n error: balancesError,\n loading,\n }\n}\n","import { usePromise } from '@xylabs/react-promise'\n\nimport { useViewer } from './useViewer.ts'\n\nexport const useCurrentBlock = (refresh = 1) => {\n const viewer = useViewer()\n return usePromise(async () => {\n if (viewer && refresh > 0) {\n const block = await viewer.currentBlock()\n return block\n }\n }, [viewer, refresh])\n}\n","import { useChainNetwork } from '@xyo-network/react-chain-network'\nimport type { XyoProvider } from '@xyo-network/xl1-protocol'\nimport {\n AllRpcSchemas, HttpRpcTransport, JsonRpcXyoViewer,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useViewer = (_provider?: XyoProvider) => {\n const { activeNetwork } = useChainNetwork()\n\n return useMemo(() => {\n if (!activeNetwork) {\n return\n }\n const transport = new HttpRpcTransport(`${activeNetwork.url}/rpc`, AllRpcSchemas)\n return new JsonRpcXyoViewer(transport)\n }, [activeNetwork])\n}\n","import type { XyoProvider } from '@xyo-network/xl1-protocol'\nimport {\n JsonRpcXyoViewer,\n PostMessageRpcTransport,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useHostViewer = (_provider?: XyoProvider) => {\n const rpcProvider = useMemo(() => {\n const transport = new PostMessageRpcTransport()\n return new JsonRpcXyoViewer(transport)\n }, [])\n\n return rpcProvider\n}\n","import { useChainNetwork } from '@xyo-network/react-chain-network'\nimport { MemoryXyoNetwork } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useNetwork = () => {\n const { activeNetwork } = useChainNetwork()\n\n return useMemo(() => {\n if (!activeNetwork) return\n return new MemoryXyoNetwork(activeNetwork.id)\n }, [activeNetwork])\n}\n","import { useChainNetwork } from '@xyo-network/react-chain-network'\nimport type { XyoProvider } from '@xyo-network/xl1-protocol'\nimport {\n AllRpcSchemas, HttpRpcTransport, JsonRpcXyoRunner,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useRunner = (_provider?: XyoProvider) => {\n const { activeNetwork } = useChainNetwork()\n\n return useMemo(() => {\n if (!activeNetwork) {\n return\n }\n const transport = new HttpRpcTransport(`${activeNetwork.url}/rpc`, AllRpcSchemas)\n return new JsonRpcXyoRunner(transport)\n }, [activeNetwork])\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { XyoProvider, XyoSigner } from '@xyo-network/xl1-protocol'\nimport { MemoryXyoSigner } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useSigner = (_provider?: XyoProvider, account?: AccountInstance) => {\n return useMemo<XyoSigner | undefined>(() => account ? new MemoryXyoSigner(account) : undefined, [account])\n}\n"],"mappings":"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","names":["usePromise","isUndefined","isUndefinedOrNull","ShiftedBigInt","useMemo","useState","useAddressBalance","address","viewer","networkId","refresh","balancesResult","setBalancesResult","useState","loading","setLoading","balancesError","usePromise","isUndefined","undefined","balance","accountBalance","useMemo","shiftedBigInt","ShiftedBigInt","places","maxDecimal","maxCharacters","minDecimals","locale","navigator","language","balanceIntlFriendly","toFullString","shortBalanceIntlFriendly","isUndefinedOrNull","toShortString","balanceForAddress","error","usePromise","useChainNetwork","AllRpcSchemas","HttpRpcTransport","JsonRpcXyoViewer","useMemo","useViewer","_provider","activeNetwork","useChainNetwork","useMemo","transport","HttpRpcTransport","url","AllRpcSchemas","JsonRpcXyoViewer","useCurrentBlock","refresh","viewer","useViewer","usePromise","block","currentBlock","JsonRpcXyoViewer","PostMessageRpcTransport","useMemo","useHostViewer","_provider","rpcProvider","useMemo","transport","PostMessageRpcTransport","JsonRpcXyoViewer","useChainNetwork","MemoryXyoNetwork","useMemo","useNetwork","activeNetwork","useChainNetwork","useMemo","MemoryXyoNetwork","id","useChainNetwork","AllRpcSchemas","HttpRpcTransport","JsonRpcXyoRunner","useMemo","useRunner","_provider","activeNetwork","useChainNetwork","useMemo","transport","HttpRpcTransport","url","AllRpcSchemas","JsonRpcXyoRunner","MemoryXyoSigner","useMemo","useSigner","_provider","account","useMemo","MemoryXyoSigner","undefined"]}
1
+ {"version":3,"sources":["../../src/hooks/useAddressBalance.ts","../../src/hooks/useCurrentBlock.ts","../../src/hooks/useViewer.ts","../../src/hooks/useHostViewer.ts","../../src/hooks/useNetwork.ts","../../src/hooks/useRunner.ts","../../src/hooks/useSigner.ts"],"sourcesContent":["import type { Address } from '@xylabs/hex'\nimport { usePromise } from '@xylabs/react-promise'\nimport { isUndefined, isUndefinedOrNull } from '@xylabs/typeof'\nimport { ShiftedBigInt } from '@xyo-network/chain-wrappers'\nimport type {\n AttoXL1, NetworkId, XyoViewer,\n} from '@xyo-network/xl1-protocol'\nimport { useMemo, useState } from 'react'\n\nexport const useAddressBalance = (\n // address to get balance for\n address?: Address,\n // viewer to use for fetching balance\n viewer?: XyoViewer,\n // network ID to trigger a balance refresh\n networkId?: NetworkId,\n // refresh balance trigger\n refresh?: number,\n) => {\n const [balancesResult, setBalancesResult] = useState<AttoXL1 | null>()\n const [loading, setLoading] = useState(false)\n\n const [, balancesError] = usePromise(async () => {\n if (isUndefined(viewer) || isUndefined(address)) return\n setLoading(true)\n setBalancesResult(undefined)\n const balance = await viewer.accountBalance(address)\n setBalancesResult(balance as AttoXL1)\n setLoading(false)\n }, [address, viewer, networkId, refresh])\n\n useMemo(() => {\n if (balancesError) {\n setLoading(false)\n }\n }, [balancesError])\n\n const shiftedBigInt = useMemo(() => {\n if (typeof balancesResult !== 'bigint') return\n return new ShiftedBigInt(balancesResult, {\n places: 18, maxDecimal: 18, maxCharacters: 9, minDecimals: 1, locale: navigator.language,\n })\n }, [balancesResult])\n\n const balanceIntlFriendly = useMemo(() => {\n return shiftedBigInt?.toFullString()\n }, [shiftedBigInt])\n\n const shortBalanceIntlFriendly = useMemo(() => {\n return isUndefinedOrNull(balancesResult)\n ? undefined\n : (balancesResult < 1_000_000_000_000n && balancesResult > 0n) ? '<0.00001' : shiftedBigInt?.toShortString()\n }, [shiftedBigInt])\n\n return {\n address,\n balanceForAddress: balancesResult,\n balanceIntlFriendly,\n shortBalanceIntlFriendly,\n error: balancesError,\n loading,\n }\n}\n","import { usePromise } from '@xylabs/react-promise'\n\nimport { useViewerBase } from './useViewer.ts'\n\nexport const useCurrentBlockBase = (refresh = 1, id?: string, url?: string) => {\n const viewer = useViewerBase(id, url)\n return usePromise(async () => {\n if (viewer && refresh > 0) {\n const block = await viewer.currentBlock()\n return block\n }\n }, [viewer, refresh])\n}\n\n/** @deprecated - use useCurrentBlockBase instead but note this hook no longer relies on useChainNetwork */\nexport const useCurrentBlock = useCurrentBlockBase\n","import { isDefined, isUndefined } from '@xylabs/typeof'\nimport {\n AllRpcSchemas, HttpRpcTransport, JsonRpcXyoViewer,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nimport { useHostViewerBase } from './useHostViewer.ts'\n\nexport const useViewerBase = (id?: string, url?: string) => {\n const hostViewer = useHostViewerBase(id)\n\n const resolvedViewer = useMemo(() => {\n if (isUndefined(url)) {\n return\n }\n if (isDefined(hostViewer)) {\n console.debug('Using host viewer:', hostViewer)\n return hostViewer\n }\n const transport = new HttpRpcTransport(`${url}/rpc`, AllRpcSchemas)\n return new JsonRpcXyoViewer(transport)\n }, [url, hostViewer])\n\n return resolvedViewer\n}\n\n/** @deprecated - use useViewerBase instead but note this hook no longer relies on useChainNetwork */\nexport const useViewer = useViewerBase\n","import {\n isDefined, isTruthy, isUndefined,\n} from '@xylabs/typeof'\nimport {\n JsonRpcXyoViewer,\n PostMessageRpcTransport,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\n// Get known wallet connections from the global Xyo object\nconst walletConnections = globalThis.xyo?.connections\n\n/**\n * Creates a JsonRpcXyoViewer instance based on the provided networkId.\n * @param networkId - a network id like 'sequence', 'local', etc.\n * @returns An instance of JsonRpcXyoViewer if the networkId is found in walletConnections,\n * otherwise undefined.\n */\nexport const useHostViewerBase = (networkId?: string) => {\n const networkConnection = useMemo(() => {\n if (isTruthy(networkId) && isDefined(walletConnections) && isDefined(walletConnections[networkId])) {\n return networkId\n }\n }, [networkId])\n\n const rpcProvider = useMemo(() => {\n if (isUndefined(networkConnection)) return\n const transport = new PostMessageRpcTransport(networkConnection)\n return new JsonRpcXyoViewer(transport)\n }, [networkConnection])\n\n return rpcProvider\n}\n\n/**\n * @deprecated - use useHostViewerBase instead but note this hook no longer relies on useChainNetwork\n */\nexport const useHostViewer = useHostViewerBase\n","import { isUndefined } from '@xylabs/typeof'\nimport type { DefaultNetworkIds } from '@xyo-network/xl1-protocol'\nimport { MemoryXyoNetwork } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useNetworkBase = (id?: DefaultNetworkIds) => {\n const network = useMemo(() => {\n if (isUndefined(id)) return\n return new MemoryXyoNetwork(id)\n }, [id])\n\n return network\n}\n\n/**\n * @deprecated - use useNetworkBase instead but note this hook no longer relies on useChainNetwork\n */\nexport const useNetwork = useNetworkBase\n","import { isUndefined } from '@xylabs/typeof'\nimport {\n AllRpcSchemas, HttpRpcTransport, JsonRpcXyoRunner,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useRunnerBase = (url?: string) => {\n return useMemo(() => {\n if (isUndefined(url)) {\n return\n }\n const transport = new HttpRpcTransport(`${url}/rpc`, AllRpcSchemas)\n return new JsonRpcXyoRunner(transport)\n }, [url])\n}\n\n/** @deprecated - use useRunnerBase instead but note this hook no longer relies on useChainNetwork */\nexport const useRunner = useRunnerBase\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { XyoProvider, XyoSigner } from '@xyo-network/xl1-protocol'\nimport { MemoryXyoSigner } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useSigner = (_provider?: XyoProvider, account?: AccountInstance) => {\n return useMemo<XyoSigner | undefined>(() => account ? new MemoryXyoSigner(account) : undefined, [account])\n}\n"],"mappings":"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","names":["usePromise","isUndefined","isUndefinedOrNull","ShiftedBigInt","useMemo","useState","useAddressBalance","address","viewer","networkId","refresh","balancesResult","setBalancesResult","useState","loading","setLoading","balancesError","usePromise","isUndefined","undefined","balance","accountBalance","useMemo","shiftedBigInt","ShiftedBigInt","places","maxDecimal","maxCharacters","minDecimals","locale","navigator","language","balanceIntlFriendly","toFullString","shortBalanceIntlFriendly","isUndefinedOrNull","toShortString","balanceForAddress","error","usePromise","isDefined","isUndefined","AllRpcSchemas","HttpRpcTransport","JsonRpcXyoViewer","useMemo","isDefined","isTruthy","isUndefined","JsonRpcXyoViewer","PostMessageRpcTransport","useMemo","walletConnections","globalThis","xyo","connections","useHostViewerBase","networkId","networkConnection","useMemo","isTruthy","isDefined","rpcProvider","isUndefined","transport","PostMessageRpcTransport","JsonRpcXyoViewer","useHostViewer","useViewerBase","id","url","hostViewer","useHostViewerBase","resolvedViewer","useMemo","isUndefined","isDefined","console","debug","transport","HttpRpcTransport","AllRpcSchemas","JsonRpcXyoViewer","useViewer","useCurrentBlockBase","refresh","id","url","viewer","useViewerBase","usePromise","block","currentBlock","useCurrentBlock","isUndefined","MemoryXyoNetwork","useMemo","useNetworkBase","id","network","useMemo","isUndefined","MemoryXyoNetwork","useNetwork","isUndefined","AllRpcSchemas","HttpRpcTransport","JsonRpcXyoRunner","useMemo","useRunnerBase","url","useMemo","isUndefined","transport","HttpRpcTransport","AllRpcSchemas","JsonRpcXyoRunner","useRunner","MemoryXyoSigner","useMemo","useSigner","_provider","account","useMemo","MemoryXyoSigner","undefined"]}
@@ -1,2 +1,4 @@
1
- export declare const useCurrentBlock: (refresh?: number) => [import("@xyo-network/xl1-protocol").HydratedBlock | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
1
+ export declare const useCurrentBlockBase: (refresh?: number, id?: string, url?: string) => [import("@xyo-network/xl1-protocol").HydratedBlock | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
2
+ /** @deprecated - use useCurrentBlockBase instead but note this hook no longer relies on useChainNetwork */
3
+ export declare const useCurrentBlock: (refresh?: number, id?: string, url?: string) => [import("@xyo-network/xl1-protocol").HydratedBlock | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
2
4
  //# sourceMappingURL=useCurrentBlock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCurrentBlock.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCurrentBlock.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,eAAe,GAAI,gBAAW,oJAQ1C,CAAA"}
1
+ {"version":3,"file":"useCurrentBlock.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCurrentBlock.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB,GAAI,gBAAW,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,oJAQzE,CAAA;AAED,2GAA2G;AAC3G,eAAO,MAAM,eAAe,0BAX0B,MAAM,QAAQ,MAAM,oJAWxB,CAAA"}
@@ -1,4 +1,13 @@
1
- import type { XyoProvider } from '@xyo-network/xl1-protocol';
2
1
  import { JsonRpcXyoViewer } from '@xyo-network/xl1-rpc';
3
- export declare const useHostViewer: (_provider?: XyoProvider) => JsonRpcXyoViewer;
2
+ /**
3
+ * Creates a JsonRpcXyoViewer instance based on the provided networkId.
4
+ * @param networkId - a network id like 'sequence', 'local', etc.
5
+ * @returns An instance of JsonRpcXyoViewer if the networkId is found in walletConnections,
6
+ * otherwise undefined.
7
+ */
8
+ export declare const useHostViewerBase: (networkId?: string) => JsonRpcXyoViewer | undefined;
9
+ /**
10
+ * @deprecated - use useHostViewerBase instead but note this hook no longer relies on useChainNetwork
11
+ */
12
+ export declare const useHostViewer: (networkId?: string) => JsonRpcXyoViewer | undefined;
4
13
  //# sourceMappingURL=useHostViewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useHostViewer.d.ts","sourceRoot":"","sources":["../../../src/hooks/useHostViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EACL,gBAAgB,EAEjB,MAAM,sBAAsB,CAAA;AAG7B,eAAO,MAAM,aAAa,GAAI,YAAY,WAAW,qBAOpD,CAAA"}
1
+ {"version":3,"file":"useHostViewer.d.ts","sourceRoot":"","sources":["../../../src/hooks/useHostViewer.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAEjB,MAAM,sBAAsB,CAAA;AAM7B;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,iCAcnD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,eAnBoB,MAAM,iCAmBN,CAAA"}
@@ -1,3 +1,8 @@
1
+ import type { DefaultNetworkIds } from '@xyo-network/xl1-protocol';
1
2
  import { MemoryXyoNetwork } from '@xyo-network/xl1-rpc';
2
- export declare const useNetwork: () => MemoryXyoNetwork | undefined;
3
+ export declare const useNetworkBase: (id?: DefaultNetworkIds) => MemoryXyoNetwork | undefined;
4
+ /**
5
+ * @deprecated - use useNetworkBase instead but note this hook no longer relies on useChainNetwork
6
+ */
7
+ export declare const useNetwork: (id?: DefaultNetworkIds) => MemoryXyoNetwork | undefined;
3
8
  //# sourceMappingURL=useNetwork.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useNetwork.d.ts","sourceRoot":"","sources":["../../../src/hooks/useNetwork.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAGvD,eAAO,MAAM,UAAU,oCAOtB,CAAA"}
1
+ {"version":3,"file":"useNetwork.d.ts","sourceRoot":"","sources":["../../../src/hooks/useNetwork.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAGvD,eAAO,MAAM,cAAc,GAAI,KAAK,iBAAiB,iCAOpD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,QAZa,iBAAiB,iCAYb,CAAA"}
@@ -1,4 +1,5 @@
1
- import type { XyoProvider } from '@xyo-network/xl1-protocol';
2
1
  import { JsonRpcXyoRunner } from '@xyo-network/xl1-rpc';
3
- export declare const useRunner: (_provider?: XyoProvider) => JsonRpcXyoRunner | undefined;
2
+ export declare const useRunnerBase: (url?: string) => JsonRpcXyoRunner | undefined;
3
+ /** @deprecated - use useRunnerBase instead but note this hook no longer relies on useChainNetwork */
4
+ export declare const useRunner: (url?: string) => JsonRpcXyoRunner | undefined;
4
5
  //# sourceMappingURL=useRunner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRunner.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRunner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAC4B,gBAAgB,EAClD,MAAM,sBAAsB,CAAA;AAG7B,eAAO,MAAM,SAAS,GAAI,YAAY,WAAW,iCAUhD,CAAA"}
1
+ {"version":3,"file":"useRunner.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRunner.ts"],"names":[],"mappings":"AACA,OAAO,EAC4B,gBAAgB,EAClD,MAAM,sBAAsB,CAAA;AAG7B,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,iCAQzC,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,SAAS,SAXc,MAAM,iCAWJ,CAAA"}
@@ -1,4 +1,5 @@
1
- import type { XyoProvider } from '@xyo-network/xl1-protocol';
2
1
  import { JsonRpcXyoViewer } from '@xyo-network/xl1-rpc';
3
- export declare const useViewer: (_provider?: XyoProvider) => JsonRpcXyoViewer | undefined;
2
+ export declare const useViewerBase: (id?: string, url?: string) => JsonRpcXyoViewer | undefined;
3
+ /** @deprecated - use useViewerBase instead but note this hook no longer relies on useChainNetwork */
4
+ export declare const useViewer: (id?: string, url?: string) => JsonRpcXyoViewer | undefined;
4
5
  //# sourceMappingURL=useViewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useViewer.d.ts","sourceRoot":"","sources":["../../../src/hooks/useViewer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAC4B,gBAAgB,EAClD,MAAM,sBAAsB,CAAA;AAG7B,eAAO,MAAM,SAAS,GAAI,YAAY,WAAW,iCAUhD,CAAA"}
1
+ {"version":3,"file":"useViewer.d.ts","sourceRoot":"","sources":["../../../src/hooks/useViewer.ts"],"names":[],"mappings":"AACA,OAAO,EAC4B,gBAAgB,EAClD,MAAM,sBAAsB,CAAA;AAK7B,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,MAAM,MAAM,iCAgBtD,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,SAAS,QAnBa,MAAM,QAAQ,MAAM,iCAmBjB,CAAA"}
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-provider",
4
- "version": "1.6.1",
4
+ "version": "1.6.3",
5
5
  "description": "XYO Layer One API",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -34,23 +34,25 @@
34
34
  "module": "dist/browser/index.mjs",
35
35
  "types": "dist/types/index.d.ts",
36
36
  "dependencies": {
37
- "@xylabs/hex": "^4.12.40",
37
+ "@xylabs/hex": "^4.12.44",
38
38
  "@xylabs/react-promise": "^6.3.7",
39
- "@xylabs/typeof": "^4.12.40",
39
+ "@xylabs/typeof": "^4.12.44",
40
40
  "@xyo-network/account-model": "^4.0.2",
41
- "@xyo-network/chain-wrappers": "^1.6.1",
42
- "@xyo-network/react-chain-network": "^1.6.1",
43
- "@xyo-network/xl1-protocol": "^1.6.0",
44
- "@xyo-network/xl1-rpc": "^1.6.1",
41
+ "@xyo-network/chain-wrappers": "^1.6.3",
42
+ "@xyo-network/xl1-protocol": "^1.6.1",
43
+ "@xyo-network/xl1-rpc": "^1.6.3",
45
44
  "react": "^19.1.0"
46
45
  },
47
46
  "devDependencies": {
48
47
  "@emotion/react": "^11.14.0",
49
48
  "@emotion/styled": "^11.14.1",
50
49
  "@mui/material": "^7.2.0",
50
+ "@storybook/react-vite": "^9.0.16",
51
51
  "@types/react": "^19.1.8",
52
- "@xylabs/ts-scripts-yarn3": "^6.5.12",
53
- "@xylabs/tsconfig-react": "^6.5.12",
52
+ "@xylabs/ts-scripts-yarn3": "^6.5.18",
53
+ "@xylabs/tsconfig-react": "^6.5.18",
54
+ "@xyo-network/chain-network-model": "^1.6.3",
55
+ "@xyo-network/react-chain-model": "^1.6.3",
54
56
  "knip": "^5.61.3",
55
57
  "typescript": "^5.8.3"
56
58
  },
@@ -0,0 +1,10 @@
1
+ import type { XyoGlobal } from '@xyo-network/react-chain-model'
2
+
3
+ export declare global {
4
+ interface Window {
5
+ xyo: XyoGlobal
6
+ }
7
+
8
+ var xyo: XyoGlobal
9
+ var xyoWalletExtensionId: string
10
+ }
@@ -1,9 +1,9 @@
1
1
  import { usePromise } from '@xylabs/react-promise'
2
2
 
3
- import { useViewer } from './useViewer.ts'
3
+ import { useViewerBase } from './useViewer.ts'
4
4
 
5
- export const useCurrentBlock = (refresh = 1) => {
6
- const viewer = useViewer()
5
+ export const useCurrentBlockBase = (refresh = 1, id?: string, url?: string) => {
6
+ const viewer = useViewerBase(id, url)
7
7
  return usePromise(async () => {
8
8
  if (viewer && refresh > 0) {
9
9
  const block = await viewer.currentBlock()
@@ -11,3 +11,6 @@ export const useCurrentBlock = (refresh = 1) => {
11
11
  }
12
12
  }, [viewer, refresh])
13
13
  }
14
+
15
+ /** @deprecated - use useCurrentBlockBase instead but note this hook no longer relies on useChainNetwork */
16
+ export const useCurrentBlock = useCurrentBlockBase
@@ -2,14 +2,19 @@ import {
2
2
  Alert, Button, Stack,
3
3
  } from '@mui/material'
4
4
  import type { StoryFn } from '@storybook/react-vite'
5
- import { isDefined } from '@xylabs/typeof'
5
+ import { isDefined, isUndefined } from '@xylabs/typeof'
6
+ import { SequenceNetwork } from '@xyo-network/chain-network-model'
6
7
  import type { HydratedBlock } from '@xyo-network/xl1-protocol'
7
8
  import React, { useState } from 'react'
8
9
 
9
- import { useHostViewer } from './useHostViewer.ts'
10
+ import { useHostViewerBase } from './useHostViewer.ts'
11
+
12
+ const wallet = globalThis.xyo?.walletExtensionId?.()
13
+ const inIframe = globalThis.self !== window.top
10
14
 
11
15
  const UseHostViewerStoryTemplate: React.FC = () => {
12
- const viewer = useHostViewer()
16
+ const defaultDestination = SequenceNetwork.id
17
+ const viewer = useHostViewerBase(defaultDestination)
13
18
  const [error, setError] = useState<Error | null>(null)
14
19
  const [result, setResult] = useState<HydratedBlock | null | undefined>()
15
20
 
@@ -28,6 +33,16 @@ const UseHostViewerStoryTemplate: React.FC = () => {
28
33
 
29
34
  return (
30
35
  <Stack gap={2} alignItems="center">
36
+ {inIframe && (
37
+ <Alert severity="warning">
38
+ This story is running in an iframe. Please run it in a standalone browser window to test the wallet extension.
39
+ </Alert>
40
+ )}
41
+ {isUndefined(wallet) && (
42
+ <Alert severity="warning">
43
+ No wallet extension found. Please install the Xyo Wallet Chrome Extension.
44
+ </Alert>
45
+ )}
31
46
  <Button variant="contained" onClick={() => void handleClick()} disabled={!isDefined(viewer)}>
32
47
  Get Current Block
33
48
  </Button>
@@ -1,15 +1,38 @@
1
- import type { XyoProvider } from '@xyo-network/xl1-protocol'
1
+ import {
2
+ isDefined, isTruthy, isUndefined,
3
+ } from '@xylabs/typeof'
2
4
  import {
3
5
  JsonRpcXyoViewer,
4
6
  PostMessageRpcTransport,
5
7
  } from '@xyo-network/xl1-rpc'
6
8
  import { useMemo } from 'react'
7
9
 
8
- export const useHostViewer = (_provider?: XyoProvider) => {
10
+ // Get known wallet connections from the global Xyo object
11
+ const walletConnections = globalThis.xyo?.connections
12
+
13
+ /**
14
+ * Creates a JsonRpcXyoViewer instance based on the provided networkId.
15
+ * @param networkId - a network id like 'sequence', 'local', etc.
16
+ * @returns An instance of JsonRpcXyoViewer if the networkId is found in walletConnections,
17
+ * otherwise undefined.
18
+ */
19
+ export const useHostViewerBase = (networkId?: string) => {
20
+ const networkConnection = useMemo(() => {
21
+ if (isTruthy(networkId) && isDefined(walletConnections) && isDefined(walletConnections[networkId])) {
22
+ return networkId
23
+ }
24
+ }, [networkId])
25
+
9
26
  const rpcProvider = useMemo(() => {
10
- const transport = new PostMessageRpcTransport()
27
+ if (isUndefined(networkConnection)) return
28
+ const transport = new PostMessageRpcTransport(networkConnection)
11
29
  return new JsonRpcXyoViewer(transport)
12
- }, [])
30
+ }, [networkConnection])
13
31
 
14
32
  return rpcProvider
15
33
  }
34
+
35
+ /**
36
+ * @deprecated - use useHostViewerBase instead but note this hook no longer relies on useChainNetwork
37
+ */
38
+ export const useHostViewer = useHostViewerBase
@@ -1,12 +1,18 @@
1
- import { useChainNetwork } from '@xyo-network/react-chain-network'
1
+ import { isUndefined } from '@xylabs/typeof'
2
+ import type { DefaultNetworkIds } from '@xyo-network/xl1-protocol'
2
3
  import { MemoryXyoNetwork } from '@xyo-network/xl1-rpc'
3
4
  import { useMemo } from 'react'
4
5
 
5
- export const useNetwork = () => {
6
- const { activeNetwork } = useChainNetwork()
6
+ export const useNetworkBase = (id?: DefaultNetworkIds) => {
7
+ const network = useMemo(() => {
8
+ if (isUndefined(id)) return
9
+ return new MemoryXyoNetwork(id)
10
+ }, [id])
7
11
 
8
- return useMemo(() => {
9
- if (!activeNetwork) return
10
- return new MemoryXyoNetwork(activeNetwork.id)
11
- }, [activeNetwork])
12
+ return network
12
13
  }
14
+
15
+ /**
16
+ * @deprecated - use useNetworkBase instead but note this hook no longer relies on useChainNetwork
17
+ */
18
+ export const useNetwork = useNetworkBase
@@ -1,18 +1,18 @@
1
- import { useChainNetwork } from '@xyo-network/react-chain-network'
2
- import type { XyoProvider } from '@xyo-network/xl1-protocol'
1
+ import { isUndefined } from '@xylabs/typeof'
3
2
  import {
4
3
  AllRpcSchemas, HttpRpcTransport, JsonRpcXyoRunner,
5
4
  } from '@xyo-network/xl1-rpc'
6
5
  import { useMemo } from 'react'
7
6
 
8
- export const useRunner = (_provider?: XyoProvider) => {
9
- const { activeNetwork } = useChainNetwork()
10
-
7
+ export const useRunnerBase = (url?: string) => {
11
8
  return useMemo(() => {
12
- if (!activeNetwork) {
9
+ if (isUndefined(url)) {
13
10
  return
14
11
  }
15
- const transport = new HttpRpcTransport(`${activeNetwork.url}/rpc`, AllRpcSchemas)
12
+ const transport = new HttpRpcTransport(`${url}/rpc`, AllRpcSchemas)
16
13
  return new JsonRpcXyoRunner(transport)
17
- }, [activeNetwork])
14
+ }, [url])
18
15
  }
16
+
17
+ /** @deprecated - use useRunnerBase instead but note this hook no longer relies on useChainNetwork */
18
+ export const useRunner = useRunnerBase
@@ -0,0 +1,64 @@
1
+ import {
2
+ Alert, Button, Stack,
3
+ } from '@mui/material'
4
+ import type { Meta, StoryFn } from '@storybook/react-vite'
5
+ import { isDefined, isUndefined } from '@xylabs/typeof'
6
+ import { SequenceNetwork } from '@xyo-network/chain-network-model'
7
+ import type { HydratedBlock } from '@xyo-network/xl1-protocol'
8
+ import React, { useState } from 'react'
9
+
10
+ import { useViewerBase } from './useViewer.ts'
11
+
12
+ const wallet = globalThis.xyo?.walletExtensionId?.()
13
+ const inIframe = globalThis.self !== window.top
14
+
15
+ const UseViewerStoryTemplate: React.FC = () => {
16
+ const viewer = useViewerBase(SequenceNetwork.id, SequenceNetwork.url)
17
+ const [error, setError] = useState<Error | null>(null)
18
+ const [result, setResult] = useState<HydratedBlock | null | undefined>()
19
+
20
+ const handleClick = async () => {
21
+ if (isDefined(viewer)) {
22
+ try {
23
+ const block = await viewer.currentBlock()
24
+ setError(null)
25
+ setResult(block)
26
+ } catch (err) {
27
+ setError(err as Error)
28
+ setResult(undefined)
29
+ }
30
+ }
31
+ }
32
+
33
+ return (
34
+ <Stack gap={2} alignItems="center">
35
+ {inIframe && (
36
+ <Alert severity="warning">
37
+ This story is running in an iframe. Please run it in a standalone browser window to test the wallet extension.
38
+ </Alert>
39
+ )}
40
+ <Alert severity="info">
41
+ {isUndefined(wallet) ? 'No wallet extension found. Falling back to the default viewer.' : 'Wallet extension found. Using it for viewer.'}
42
+ </Alert>
43
+ <Button variant="contained" onClick={() => void handleClick()} disabled={!isDefined(viewer)}>
44
+ Get Current Block
45
+ </Button>
46
+ <pre>
47
+ {JSON.stringify(result, null, 2)}
48
+ </pre>
49
+ {error && <Alert severity="error">{error.message}</Alert>}
50
+ </Stack>
51
+ )
52
+ }
53
+
54
+ export default {
55
+ title: 'provider/useViewer',
56
+ component: UseViewerStoryTemplate,
57
+ } as Meta
58
+
59
+ export const Template: StoryFn<typeof UseViewerStoryTemplate> = args => <UseViewerStoryTemplate {...args} />
60
+
61
+ const Default = Template.bind({})
62
+ Default.args = {}
63
+
64
+ export { Default }
@@ -1,18 +1,28 @@
1
- import { useChainNetwork } from '@xyo-network/react-chain-network'
2
- import type { XyoProvider } from '@xyo-network/xl1-protocol'
1
+ import { isDefined, isUndefined } from '@xylabs/typeof'
3
2
  import {
4
3
  AllRpcSchemas, HttpRpcTransport, JsonRpcXyoViewer,
5
4
  } from '@xyo-network/xl1-rpc'
6
5
  import { useMemo } from 'react'
7
6
 
8
- export const useViewer = (_provider?: XyoProvider) => {
9
- const { activeNetwork } = useChainNetwork()
7
+ import { useHostViewerBase } from './useHostViewer.ts'
10
8
 
11
- return useMemo(() => {
12
- if (!activeNetwork) {
9
+ export const useViewerBase = (id?: string, url?: string) => {
10
+ const hostViewer = useHostViewerBase(id)
11
+
12
+ const resolvedViewer = useMemo(() => {
13
+ if (isUndefined(url)) {
13
14
  return
14
15
  }
15
- const transport = new HttpRpcTransport(`${activeNetwork.url}/rpc`, AllRpcSchemas)
16
+ if (isDefined(hostViewer)) {
17
+ console.debug('Using host viewer:', hostViewer)
18
+ return hostViewer
19
+ }
20
+ const transport = new HttpRpcTransport(`${url}/rpc`, AllRpcSchemas)
16
21
  return new JsonRpcXyoViewer(transport)
17
- }, [activeNetwork])
22
+ }, [url, hostViewer])
23
+
24
+ return resolvedViewer
18
25
  }
26
+
27
+ /** @deprecated - use useViewerBase instead but note this hook no longer relies on useChainNetwork */
28
+ export const useViewer = useViewerBase