@xyo-network/react-chain-provider 1.6.0 → 1.6.2

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
81
91
  ]);
82
- }, "useViewer");
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
112
+ ]);
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,53 +126,61 @@ var useCurrentBlock = /* @__PURE__ */ __name((refresh = 1) => {
93
126
  viewer,
94
127
  refresh
95
128
  ]);
96
- }, "useCurrentBlock");
129
+ }, "useCurrentBlockBase");
130
+ var useCurrentBlock = useCurrentBlockBase;
97
131
 
98
132
  // src/hooks/useNetwork.ts
99
- import { useChainNetwork as useChainNetwork2 } from "@xyo-network/react-chain-network";
133
+ import { isUndefined as isUndefined4 } from "@xylabs/typeof";
100
134
  import { MemoryXyoNetwork } from "@xyo-network/xl1-rpc";
101
- import { useMemo as useMemo3 } from "react";
102
- var useNetwork = /* @__PURE__ */ __name(() => {
103
- const { activeNetwork } = useChainNetwork2();
104
- return useMemo3(() => {
105
- if (!activeNetwork) return;
106
- return new MemoryXyoNetwork(activeNetwork.id);
135
+ import { useMemo as useMemo4 } from "react";
136
+ var useNetworkBase = /* @__PURE__ */ __name((id) => {
137
+ const network = useMemo4(() => {
138
+ if (isUndefined4(id)) return;
139
+ return new MemoryXyoNetwork(id);
107
140
  }, [
108
- activeNetwork
141
+ id
109
142
  ]);
110
- }, "useNetwork");
143
+ return network;
144
+ }, "useNetworkBase");
145
+ var useNetwork = useNetworkBase;
111
146
 
112
147
  // src/hooks/useRunner.ts
113
- import { useChainNetwork as useChainNetwork3 } from "@xyo-network/react-chain-network";
148
+ import { isUndefined as isUndefined5 } from "@xylabs/typeof";
114
149
  import { AllRpcSchemas as AllRpcSchemas2, HttpRpcTransport as HttpRpcTransport2, JsonRpcXyoRunner } from "@xyo-network/xl1-rpc";
115
- import { useMemo as useMemo4 } from "react";
116
- var useRunner = /* @__PURE__ */ __name((_provider) => {
117
- const { activeNetwork } = useChainNetwork3();
118
- return useMemo4(() => {
119
- if (!activeNetwork) {
150
+ import { useMemo as useMemo5 } from "react";
151
+ var useRunnerBase = /* @__PURE__ */ __name((url) => {
152
+ return useMemo5(() => {
153
+ if (isUndefined5(url)) {
120
154
  return;
121
155
  }
122
- const transport = new HttpRpcTransport2(`${activeNetwork.url}/rpc`, AllRpcSchemas2);
156
+ const transport = new HttpRpcTransport2(`${url}/rpc`, AllRpcSchemas2);
123
157
  return new JsonRpcXyoRunner(transport);
124
158
  }, [
125
- activeNetwork
159
+ url
126
160
  ]);
127
- }, "useRunner");
161
+ }, "useRunnerBase");
162
+ var useRunner = useRunnerBase;
128
163
 
129
164
  // src/hooks/useSigner.ts
130
165
  import { MemoryXyoSigner } from "@xyo-network/xl1-rpc";
131
- import { useMemo as useMemo5 } from "react";
166
+ import { useMemo as useMemo6 } from "react";
132
167
  var useSigner = /* @__PURE__ */ __name((_provider, account) => {
133
- return useMemo5(() => account ? new MemoryXyoSigner(account) : void 0, [
168
+ return useMemo6(() => account ? new MemoryXyoSigner(account) : void 0, [
134
169
  account
135
170
  ]);
136
171
  }, "useSigner");
137
172
  export {
138
173
  useAddressBalance,
139
174
  useCurrentBlock,
175
+ useCurrentBlockBase,
176
+ useHostViewer,
177
+ useHostViewerBase,
140
178
  useNetwork,
179
+ useNetworkBase,
141
180
  useRunner,
181
+ useRunnerBase,
142
182
  useSigner,
143
- useViewer
183
+ useViewer,
184
+ useViewerBase
144
185
  };
145
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/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 { 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","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,5 +1,6 @@
1
1
  export * from './useAddressBalance.ts';
2
2
  export * from './useCurrentBlock.ts';
3
+ export * from './useHostViewer.ts';
3
4
  export * from './useNetwork.ts';
4
5
  export * from './useRunner.ts';
5
6
  export * from './useSigner.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA"}
@@ -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"}
@@ -0,0 +1,13 @@
1
+ import { JsonRpcXyoViewer } from '@xyo-network/xl1-rpc';
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;
13
+ //# sourceMappingURL=useHostViewer.d.ts.map
@@ -0,0 +1 @@
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.0",
4
+ "version": "1.6.2",
5
5
  "description": "XYO Layer One API",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -34,20 +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.31",
37
+ "@xylabs/hex": "^4.12.44",
38
38
  "@xylabs/react-promise": "^6.3.7",
39
- "@xylabs/typeof": "^4.12.31",
40
- "@xyo-network/account-model": "^4.0.1",
41
- "@xyo-network/chain-wrappers": "^1.6.0",
42
- "@xyo-network/react-chain-network": "^1.6.0",
43
- "@xyo-network/xl1-protocol": "^1.6.0",
44
- "@xyo-network/xl1-rpc": "^1.6.0",
39
+ "@xylabs/typeof": "^4.12.44",
40
+ "@xyo-network/account-model": "^4.0.2",
41
+ "@xyo-network/chain-wrappers": "^1.6.2",
42
+ "@xyo-network/xl1-protocol": "^1.6.1",
43
+ "@xyo-network/xl1-rpc": "^1.6.2",
45
44
  "react": "^19.1.0"
46
45
  },
47
46
  "devDependencies": {
47
+ "@emotion/react": "^11.14.0",
48
+ "@emotion/styled": "^11.14.1",
49
+ "@mui/material": "^7.2.0",
50
+ "@storybook/react-vite": "^9.0.16",
48
51
  "@types/react": "^19.1.8",
49
- "@xylabs/ts-scripts-yarn3": "^6.5.12",
50
- "@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.2",
55
+ "@xyo-network/react-chain-model": "^1.6.2",
51
56
  "knip": "^5.61.3",
52
57
  "typescript": "^5.8.3"
53
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,5 +1,6 @@
1
1
  export * from './useAddressBalance.ts'
2
2
  export * from './useCurrentBlock.ts'
3
+ export * from './useHostViewer.ts'
3
4
  export * from './useNetwork.ts'
4
5
  export * from './useRunner.ts'
5
6
  export * from './useSigner.ts'
@@ -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
@@ -0,0 +1,67 @@
1
+ import {
2
+ Alert, Button, Stack,
3
+ } from '@mui/material'
4
+ import type { 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 { useHostViewerBase } from './useHostViewer.ts'
11
+
12
+ const wallet = globalThis.xyo?.walletExtensionId?.()
13
+ const inIframe = globalThis.self !== window.top
14
+
15
+ const UseHostViewerStoryTemplate: React.FC = () => {
16
+ const defaultDestination = SequenceNetwork.id
17
+ const viewer = useHostViewerBase(defaultDestination)
18
+ const [error, setError] = useState<Error | null>(null)
19
+ const [result, setResult] = useState<HydratedBlock | null | undefined>()
20
+
21
+ const handleClick = async () => {
22
+ if (isDefined(viewer)) {
23
+ try {
24
+ const block = await viewer.currentBlock()
25
+ setError(null)
26
+ setResult(block)
27
+ } catch (err) {
28
+ setError(err as Error)
29
+ setResult(undefined)
30
+ }
31
+ }
32
+ }
33
+
34
+ return (
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
+ )}
46
+ <Button variant="contained" onClick={() => void handleClick()} disabled={!isDefined(viewer)}>
47
+ Get Current Block
48
+ </Button>
49
+ <pre>
50
+ {JSON.stringify(result, null, 2)}
51
+ </pre>
52
+ {error && <Alert severity="error">{error.message}</Alert>}
53
+ </Stack>
54
+ )
55
+ }
56
+
57
+ export default {
58
+ title: 'provider/useHostViewer',
59
+ component: UseHostViewerStoryTemplate,
60
+ }
61
+
62
+ export const Template: StoryFn<typeof UseHostViewerStoryTemplate> = args => <UseHostViewerStoryTemplate {...args} />
63
+
64
+ const Default = Template.bind({})
65
+ Default.args = {}
66
+
67
+ export { Default }
@@ -0,0 +1,38 @@
1
+ import {
2
+ isDefined, isTruthy, isUndefined,
3
+ } from '@xylabs/typeof'
4
+ import {
5
+ JsonRpcXyoViewer,
6
+ PostMessageRpcTransport,
7
+ } from '@xyo-network/xl1-rpc'
8
+ import { useMemo } from 'react'
9
+
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
+
26
+ const rpcProvider = useMemo(() => {
27
+ if (isUndefined(networkConnection)) return
28
+ const transport = new PostMessageRpcTransport(networkConnection)
29
+ return new JsonRpcXyoViewer(transport)
30
+ }, [networkConnection])
31
+
32
+ return rpcProvider
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