bitcoin-wallet-connector 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +208 -0
  2. package/lib/BitcoinConnectionProvider.d.ts +23 -0
  3. package/lib/BitcoinWalletAdapterConnector-Bq835yj0.mjs +123 -0
  4. package/lib/BitcoinWalletAdapterConnector-Bq835yj0.mjs.map +1 -0
  5. package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js +2 -0
  6. package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js.map +1 -0
  7. package/lib/BitcoinWalletAdapterConnector.d.ts +30 -0
  8. package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs +10 -0
  9. package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs.map +1 -0
  10. package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js +2 -0
  11. package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js.map +1 -0
  12. package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js +2 -0
  13. package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js.map +1 -0
  14. package/lib/LeatherWalletAdapter.impl-RUYx555r.mjs +184 -0
  15. package/lib/LeatherWalletAdapter.impl-RUYx555r.mjs.map +1 -0
  16. package/lib/MagicEdenWalletAdapter.impl-CrA6SGvG.mjs +235 -0
  17. package/lib/MagicEdenWalletAdapter.impl-CrA6SGvG.mjs.map +1 -0
  18. package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js +2 -0
  19. package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js.map +1 -0
  20. package/lib/OkxWalletAdapter.impl-BepoUL1B.mjs +67 -0
  21. package/lib/OkxWalletAdapter.impl-BepoUL1B.mjs.map +1 -0
  22. package/lib/OkxWalletAdapter.impl-C8kesjGu.js +2 -0
  23. package/lib/OkxWalletAdapter.impl-C8kesjGu.js.map +1 -0
  24. package/lib/UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js +2 -0
  25. package/lib/UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js.map +1 -0
  26. package/lib/UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs +137 -0
  27. package/lib/UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs.map +1 -0
  28. package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs +14 -0
  29. package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs.map +1 -0
  30. package/lib/UnisatWalletAdapter.impl-EISvxdpc.js +2 -0
  31. package/lib/UnisatWalletAdapter.impl-EISvxdpc.js.map +1 -0
  32. package/lib/WalletAdapters.types-CnvOqHFH.mjs +32 -0
  33. package/lib/WalletAdapters.types-CnvOqHFH.mjs.map +1 -0
  34. package/lib/WalletAdapters.types-De_x1lzr.js +2 -0
  35. package/lib/WalletAdapters.types-De_x1lzr.js.map +1 -0
  36. package/lib/WalletAdapters.types.d.ts +110 -0
  37. package/lib/XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js +2 -0
  38. package/lib/XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js.map +1 -0
  39. package/lib/XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs +151 -0
  40. package/lib/XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs.map +1 -0
  41. package/lib/XverseWalletAdapter.impl-CZO0RQva.mjs +105 -0
  42. package/lib/XverseWalletAdapter.impl-CZO0RQva.mjs.map +1 -0
  43. package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js +2 -0
  44. package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js.map +1 -0
  45. package/lib/adapters/BitgetWalletAdapter.d.ts +2 -0
  46. package/lib/adapters/BitgetWalletAdapter.impl.d.ts +8 -0
  47. package/lib/adapters/LeatherWalletAdapter.d.ts +2 -0
  48. package/lib/adapters/LeatherWalletAdapter.impl.d.ts +41 -0
  49. package/lib/adapters/MagicEdenWalletAdapter.d.ts +11 -0
  50. package/lib/adapters/MagicEdenWalletAdapter.impl.d.ts +22 -0
  51. package/lib/adapters/MockAddressWalletAdapter.d.ts +33 -0
  52. package/lib/adapters/OkxWalletAdapter.d.ts +2 -0
  53. package/lib/adapters/OkxWalletAdapter.impl.d.ts +51 -0
  54. package/lib/adapters/UnisatWalletAdapter.d.ts +2 -0
  55. package/lib/adapters/UnisatWalletAdapter.impl.d.ts +14 -0
  56. package/lib/adapters/XverseWalletAdapter.d.ts +3 -0
  57. package/lib/adapters/XverseWalletAdapter.impl.d.ts +14 -0
  58. package/lib/adapters/index.d.ts +7 -0
  59. package/lib/adapters.js +2 -0
  60. package/lib/adapters.js.map +1 -0
  61. package/lib/adapters.mjs +11 -0
  62. package/lib/adapters.mjs.map +1 -0
  63. package/lib/bitget-C7oB4Ffq.mjs +5 -0
  64. package/lib/bitget-C7oB4Ffq.mjs.map +1 -0
  65. package/lib/bitget-DXnsxx_y.js +2 -0
  66. package/lib/bitget-DXnsxx_y.js.map +1 -0
  67. package/lib/index-CaV3F1Nm.js +424 -0
  68. package/lib/index-CaV3F1Nm.js.map +1 -0
  69. package/lib/index-CcQUdePc.mjs +12224 -0
  70. package/lib/index-CcQUdePc.mjs.map +1 -0
  71. package/lib/index-D7YwhNAG.mjs +3946 -0
  72. package/lib/index-D7YwhNAG.mjs.map +1 -0
  73. package/lib/index-Zx0KcpYx.js +2 -0
  74. package/lib/index-Zx0KcpYx.js.map +1 -0
  75. package/lib/index.d.ts +3 -0
  76. package/lib/index.js +2 -0
  77. package/lib/index.js.map +1 -0
  78. package/lib/index.mjs +20 -0
  79. package/lib/index.mjs.map +1 -0
  80. package/lib/leather-BoQG_CPn.mjs +5 -0
  81. package/lib/leather-BoQG_CPn.mjs.map +1 -0
  82. package/lib/leather-DJ8nWmM8.js +2 -0
  83. package/lib/leather-DJ8nWmM8.js.map +1 -0
  84. package/lib/magiceden-B36CEQa6.js +2 -0
  85. package/lib/magiceden-B36CEQa6.js.map +1 -0
  86. package/lib/magiceden-Cg7d3agI.mjs +5 -0
  87. package/lib/magiceden-Cg7d3agI.mjs.map +1 -0
  88. package/lib/misc-B5EWO_dn.mjs +10 -0
  89. package/lib/misc-B5EWO_dn.mjs.map +1 -0
  90. package/lib/misc-CigR0RqC.js +2 -0
  91. package/lib/misc-CigR0RqC.js.map +1 -0
  92. package/lib/okx-ChwzM0dK.js +2 -0
  93. package/lib/okx-ChwzM0dK.js.map +1 -0
  94. package/lib/okx-DWbHwazu.mjs +5 -0
  95. package/lib/okx-DWbHwazu.mjs.map +1 -0
  96. package/lib/react.d.ts +2 -0
  97. package/lib/react.js +2 -0
  98. package/lib/react.js.map +1 -0
  99. package/lib/react.mjs +128 -0
  100. package/lib/react.mjs.map +1 -0
  101. package/lib/transaction-CiLOYSE_.mjs +1063 -0
  102. package/lib/transaction-CiLOYSE_.mjs.map +1 -0
  103. package/lib/transaction-CzdnbXSo.js +2 -0
  104. package/lib/transaction-CzdnbXSo.js.map +1 -0
  105. package/lib/unisat-BvZW5h0U.js +2 -0
  106. package/lib/unisat-BvZW5h0U.js.map +1 -0
  107. package/lib/unisat-pLgab4nG.mjs +5 -0
  108. package/lib/unisat-pLgab4nG.mjs.map +1 -0
  109. package/lib/utils/StateChannel.d.ts +14 -0
  110. package/lib/utils/UnisatCompatibleWalletAdapterImpl.d.ts +99 -0
  111. package/lib/utils/XverseCompatibleWalletAdapterImpl.d.ts +80 -0
  112. package/lib/utils/XverseCompatibleWalletAdapterImpl_legacy.d.ts +44 -0
  113. package/lib/utils/bitcoinAddressHelpers.d.ts +14 -0
  114. package/lib/utils/bitcoinNetworkHelpers.d.ts +4 -0
  115. package/lib/utils/createAdapterAvailability.d.ts +15 -0
  116. package/lib/utils/error.d.ts +6 -0
  117. package/lib/utils/misc.d.ts +3 -0
  118. package/lib/xverse-IKOHyGi-.js +2 -0
  119. package/lib/xverse-IKOHyGi-.js.map +1 -0
  120. package/lib/xverse-iHLNanCB.mjs +5 -0
  121. package/lib/xverse-iHLNanCB.mjs.map +1 -0
  122. package/package.json +86 -0
  123. package/src/BitcoinConnectionProvider.stories.tsx +329 -0
  124. package/src/BitcoinConnectionProvider.tsx +234 -0
  125. package/src/BitcoinWalletAdapterConnector.ts +166 -0
  126. package/src/WalletAdapters.types.ts +154 -0
  127. package/src/_/bitget.png +0 -0
  128. package/src/_/leather.svg +4 -0
  129. package/src/_/magiceden.png +0 -0
  130. package/src/_/okx.png +0 -0
  131. package/src/_/unisat.svg +31 -0
  132. package/src/_/xverse.png +0 -0
  133. package/src/adapters/BitgetWalletAdapter.impl.ts +22 -0
  134. package/src/adapters/BitgetWalletAdapter.ts +44 -0
  135. package/src/adapters/LeatherWalletAdapter.impl.ts +324 -0
  136. package/src/adapters/LeatherWalletAdapter.ts +35 -0
  137. package/src/adapters/MagicEdenWalletAdapter.impl.ts +139 -0
  138. package/src/adapters/MagicEdenWalletAdapter.ts +51 -0
  139. package/src/adapters/MockAddressWalletAdapter.ts +199 -0
  140. package/src/adapters/OkxWalletAdapter.impl.ts +168 -0
  141. package/src/adapters/OkxWalletAdapter.ts +37 -0
  142. package/src/adapters/UnisatWalletAdapter.impl.ts +32 -0
  143. package/src/adapters/UnisatWalletAdapter.ts +50 -0
  144. package/src/adapters/XverseWalletAdapter.impl.ts +150 -0
  145. package/src/adapters/XverseWalletAdapter.ts +37 -0
  146. package/src/adapters/index.ts +7 -0
  147. package/src/env.d.ts +9 -0
  148. package/src/index.ts +3 -0
  149. package/src/react.ts +9 -0
  150. package/src/utils/StateChannel.ts +39 -0
  151. package/src/utils/UnisatCompatibleWalletAdapterImpl.ts +342 -0
  152. package/src/utils/XverseCompatibleWalletAdapterImpl.ts +288 -0
  153. package/src/utils/XverseCompatibleWalletAdapterImpl_legacy.ts +278 -0
  154. package/src/utils/bitcoinAddressHelpers.ts +132 -0
  155. package/src/utils/bitcoinNetworkHelpers.ts +17 -0
  156. package/src/utils/createAdapterAvailability.ts +92 -0
  157. package/src/utils/error.ts +13 -0
  158. package/src/utils/misc.ts +10 -0
package/lib/react.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { BitcoinConnectionProvider, useBitcoinConnectionContext, } from './BitcoinConnectionProvider';
2
+ export type { WalletSession, BitcoinConnectionContextValue, } from './BitcoinConnectionProvider';
package/lib/react.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("react/jsx-runtime"),t=require("react"),I=require("./BitcoinWalletAdapterConnector-DMef0iHV.js"),W=t.createContext(null);function B(e,s,c){const[l,a]=t.useState(s);return t.useEffect(()=>{const d=e(a);return()=>d.unsubscribe()},c),l}const S=e=>{const[s,c]=t.useState(!1),[l,a]=t.useState(null),d=g(e.onWalletConnected??f),h=g(e.onWalletAddressesChanged??f),v=g(e.onWalletDisconnected??f),n=t.useMemo(()=>new I.BitcoinWalletAdapterConnector(e.adapterFactories),[e.adapterFactories]);t.useEffect(()=>()=>{n.dispose()},[n]);const A=B(o=>n.subscribeAvailableAdapters(o),()=>n.getAvailableAdapters(),[n]),C=B(o=>n.subscribeConnectedInfo(o),()=>n.getConnectedInfo(),[n]),P=t.useMemo(()=>({walletSession:l,isConnectionInitializing:s,connect:n.connect.bind(n),disconnect:n.disconnect.bind(n),adapterFactories:e.adapterFactories,availableAdapters:A}),[l,s,n,e.adapterFactories,A]);return t.useEffect(()=>{const o=new AbortController,b=n.subscribeConnectedInfo(i=>{if(i==null){try{v()}catch(r){console.error("[BitcoinConnectionProvider] onWalletDisconnected error",r)}a(null),c(!1);return}c(!0),i.adapter.getAddresses().then(r=>{if(o.signal.aborted)return;const u={adapterId:i.adapterId,adapter:i.adapter,addresses:r};try{d(u)}catch(w){console.error("[BitcoinConnectionProvider] onWalletConnected error",w)}a(u),c(!1)}).catch(r=>{o.signal.aborted||(c(!1),console.error("[BitcoinConnectionProvider] connect error",r))})});return()=>{o.abort(),b.unsubscribe()}},[n,v,d]),t.useEffect(()=>{if(C==null)return;const o=new AbortController,b=C.adapter.onAddressesChanged(({addresses:i})=>{o.signal.aborted||a(r=>{if(r==null)return console.warn("[BitcoinConnectionProvider] onWalletAddressesChanged event received while disconnected, skipping..."),r;try{h(i)}catch(u){console.error("[BitcoinConnectionProvider] onWalletAddressesChanged error",u)}return{...r,addresses:i}})});return()=>{o.abort(),b.unsubscribe()}},[C,h]),x.jsx(W.Provider,{value:P,children:e.children})};function p(){const e=t.useContext(W);if(!e)throw new Error("useBitcoinConnectionContext must be used within BitcoinConnectionProvider");return e}const f=()=>{},g=e=>{const s=t.useRef(e);return s.current=e,t.useCallback((...c)=>s.current(...c),[])};exports.BitcoinConnectionProvider=S;exports.useBitcoinConnectionContext=p;
2
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sources":["../src/BitcoinConnectionProvider.tsx"],"sourcesContent":["import {\n createContext,\n FC,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { BitcoinWalletAdapterConnector } from \"./BitcoinWalletAdapterConnector\"\nimport {\n WalletAdapter,\n WalletAdapterAddress,\n WalletAdapterStatic,\n} from \"./WalletAdapters.types\"\n\nexport interface WalletSession {\n adapterId: string\n adapter: WalletAdapter\n addresses: WalletAdapterAddress[]\n}\n\nexport interface BitcoinConnectionContextValue {\n // Core connection state\n walletSession: null | WalletSession\n isConnectionInitializing: boolean\n connect: (adapterId: string, adapter: WalletAdapter) => Promise<void>\n disconnect: () => Promise<void>\n\n // Wallet management (for UI)\n adapterFactories: WalletAdapterStatic<WalletAdapter>[]\n availableAdapters: (readonly [adapterId: string, adapter: WalletAdapter])[]\n}\n\nconst BitcoinConnectionContext =\n createContext<null | BitcoinConnectionContextValue>(null)\n\nfunction useConnectorState<T>(\n subscribe: (listener: (value: T) => void) => { unsubscribe: () => void },\n getSnapshot: () => T,\n deps: ReadonlyArray<unknown>,\n): T {\n const [value, setValue] = useState(getSnapshot)\n\n useEffect(() => {\n const subscription = subscribe(setValue)\n return () => subscription.unsubscribe()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n\n return value\n}\n\nexport const BitcoinConnectionProvider: FC<{\n children: ReactNode\n adapterFactories: WalletAdapterStatic<WalletAdapter>[]\n onWalletConnected?: (session: WalletSession) => void\n onWalletAddressesChanged?: (addresses: WalletAdapterAddress[]) => void\n onWalletDisconnected?: () => void\n}> = props => {\n const [isConnectionInitializing, setIsConnectionInitializing] =\n useState(false)\n const [walletSession, setWalletSession] = useState<null | WalletSession>(null)\n\n const onWalletConnected = usePersistFn(props.onWalletConnected ?? noop)\n const onWalletAddressesChanged = usePersistFn(\n props.onWalletAddressesChanged ?? noop,\n )\n const onWalletDisconnected = usePersistFn(props.onWalletDisconnected ?? noop)\n\n const connector = useMemo(\n () => new BitcoinWalletAdapterConnector(props.adapterFactories),\n [props.adapterFactories],\n )\n\n useEffect(\n () => () => {\n connector.dispose()\n },\n [connector],\n )\n\n const availableAdapters = useConnectorState(\n listener => connector.subscribeAvailableAdapters(listener),\n () => connector.getAvailableAdapters(),\n [connector],\n )\n\n const connectInfo = useConnectorState(\n listener => connector.subscribeConnectedInfo(listener),\n () => connector.getConnectedInfo(),\n [connector],\n )\n\n const ctxValue = useMemo(\n (): BitcoinConnectionContextValue => ({\n walletSession,\n isConnectionInitializing,\n connect: connector.connect.bind(connector),\n disconnect: connector.disconnect.bind(connector),\n\n adapterFactories: props.adapterFactories,\n availableAdapters,\n }),\n [\n walletSession,\n isConnectionInitializing,\n connector,\n props.adapterFactories,\n availableAdapters,\n ],\n )\n\n useEffect(() => {\n const abortController = new AbortController()\n\n const sub = connector.subscribeConnectedInfo(info => {\n if (info == null) {\n try {\n onWalletDisconnected()\n } catch (e) {\n console.error(\n \"[BitcoinConnectionProvider] onWalletDisconnected error\",\n e,\n )\n }\n\n setWalletSession(null)\n setIsConnectionInitializing(false)\n return\n }\n\n setIsConnectionInitializing(true)\n info.adapter\n .getAddresses()\n .then(addresses => {\n if (abortController.signal.aborted) return\n\n const walletSession: WalletSession = {\n adapterId: info.adapterId,\n adapter: info.adapter,\n addresses,\n }\n\n try {\n onWalletConnected(walletSession)\n } catch (e) {\n console.error(\n \"[BitcoinConnectionProvider] onWalletConnected error\",\n e,\n )\n }\n\n setWalletSession(walletSession)\n setIsConnectionInitializing(false)\n })\n .catch(err => {\n if (abortController.signal.aborted) return\n setIsConnectionInitializing(false)\n console.error(\"[BitcoinConnectionProvider] connect error\", err)\n })\n })\n\n return () => {\n abortController.abort()\n sub.unsubscribe()\n }\n }, [connector, onWalletDisconnected, onWalletConnected])\n\n // Listen to address changes from wallet\n useEffect(() => {\n if (connectInfo == null) return\n\n const abortController = new AbortController()\n\n const sub = connectInfo.adapter.onAddressesChanged(({ addresses }) => {\n if (abortController.signal.aborted) return\n\n setWalletSession(prev => {\n if (prev == null) {\n console.warn(\n \"[BitcoinConnectionProvider] onWalletAddressesChanged event received while disconnected, skipping...\",\n )\n return prev\n }\n\n try {\n onWalletAddressesChanged(addresses)\n } catch (e) {\n console.error(\n \"[BitcoinConnectionProvider] onWalletAddressesChanged error\",\n e,\n )\n }\n\n return { ...prev, addresses }\n })\n })\n return () => {\n abortController.abort()\n sub.unsubscribe()\n }\n }, [connectInfo, onWalletAddressesChanged])\n\n return (\n <BitcoinConnectionContext.Provider value={ctxValue}>\n {props.children}\n </BitcoinConnectionContext.Provider>\n )\n}\n\nexport function useBitcoinConnectionContext(): BitcoinConnectionContextValue {\n const ctx = useContext(BitcoinConnectionContext)\n if (!ctx) {\n throw new Error(\n \"useBitcoinConnectionContext must be used within BitcoinConnectionProvider\",\n )\n }\n\n return ctx\n}\n\nconst noop = (): void => {}\n\nconst usePersistFn = <T extends (...args: any[]) => any>(\n fn: T,\n): ((...args: Parameters<T>) => ReturnType<T>) => {\n const fnRef = useRef(fn)\n fnRef.current = fn\n\n return useCallback((...args) => fnRef.current(...args), [])\n}\n"],"names":["BitcoinConnectionContext","createContext","useConnectorState","subscribe","getSnapshot","deps","value","setValue","useState","useEffect","subscription","BitcoinConnectionProvider","props","isConnectionInitializing","setIsConnectionInitializing","walletSession","setWalletSession","onWalletConnected","usePersistFn","noop","onWalletAddressesChanged","onWalletDisconnected","connector","useMemo","BitcoinWalletAdapterConnector","availableAdapters","listener","connectInfo","ctxValue","abortController","sub","info","e","addresses","err","prev","useBitcoinConnectionContext","ctx","useContext","fn","fnRef","useRef","useCallback","args"],"mappings":"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"}
package/lib/react.mjs ADDED
@@ -0,0 +1,128 @@
1
+ import { jsx as m } from "react/jsx-runtime";
2
+ import { createContext as p, useState as g, useMemo as W, useEffect as u, useContext as F, useRef as S, useCallback as y } from "react";
3
+ import { B as D } from "./BitcoinWalletAdapterConnector-Bq835yj0.mjs";
4
+ const x = p(null);
5
+ function w(e, c, r) {
6
+ const [a, i] = g(c);
7
+ return u(() => {
8
+ const l = e(i);
9
+ return () => l.unsubscribe();
10
+ }, r), a;
11
+ }
12
+ const R = (e) => {
13
+ const [c, r] = g(!1), [a, i] = g(null), l = h(e.onWalletConnected ?? f), A = h(
14
+ e.onWalletAddressesChanged ?? f
15
+ ), v = h(e.onWalletDisconnected ?? f), n = W(
16
+ () => new D(e.adapterFactories),
17
+ [e.adapterFactories]
18
+ );
19
+ u(
20
+ () => () => {
21
+ n.dispose();
22
+ },
23
+ [n]
24
+ );
25
+ const B = w(
26
+ (t) => n.subscribeAvailableAdapters(t),
27
+ () => n.getAvailableAdapters(),
28
+ [n]
29
+ ), C = w(
30
+ (t) => n.subscribeConnectedInfo(t),
31
+ () => n.getConnectedInfo(),
32
+ [n]
33
+ ), I = W(
34
+ () => ({
35
+ walletSession: a,
36
+ isConnectionInitializing: c,
37
+ connect: n.connect.bind(n),
38
+ disconnect: n.disconnect.bind(n),
39
+ adapterFactories: e.adapterFactories,
40
+ availableAdapters: B
41
+ }),
42
+ [
43
+ a,
44
+ c,
45
+ n,
46
+ e.adapterFactories,
47
+ B
48
+ ]
49
+ );
50
+ return u(() => {
51
+ const t = new AbortController(), b = n.subscribeConnectedInfo((s) => {
52
+ if (s == null) {
53
+ try {
54
+ v();
55
+ } catch (o) {
56
+ console.error(
57
+ "[BitcoinConnectionProvider] onWalletDisconnected error",
58
+ o
59
+ );
60
+ }
61
+ i(null), r(!1);
62
+ return;
63
+ }
64
+ r(!0), s.adapter.getAddresses().then((o) => {
65
+ if (t.signal.aborted) return;
66
+ const d = {
67
+ adapterId: s.adapterId,
68
+ adapter: s.adapter,
69
+ addresses: o
70
+ };
71
+ try {
72
+ l(d);
73
+ } catch (P) {
74
+ console.error(
75
+ "[BitcoinConnectionProvider] onWalletConnected error",
76
+ P
77
+ );
78
+ }
79
+ i(d), r(!1);
80
+ }).catch((o) => {
81
+ t.signal.aborted || (r(!1), console.error("[BitcoinConnectionProvider] connect error", o));
82
+ });
83
+ });
84
+ return () => {
85
+ t.abort(), b.unsubscribe();
86
+ };
87
+ }, [n, v, l]), u(() => {
88
+ if (C == null) return;
89
+ const t = new AbortController(), b = C.adapter.onAddressesChanged(({ addresses: s }) => {
90
+ t.signal.aborted || i((o) => {
91
+ if (o == null)
92
+ return console.warn(
93
+ "[BitcoinConnectionProvider] onWalletAddressesChanged event received while disconnected, skipping..."
94
+ ), o;
95
+ try {
96
+ A(s);
97
+ } catch (d) {
98
+ console.error(
99
+ "[BitcoinConnectionProvider] onWalletAddressesChanged error",
100
+ d
101
+ );
102
+ }
103
+ return { ...o, addresses: s };
104
+ });
105
+ });
106
+ return () => {
107
+ t.abort(), b.unsubscribe();
108
+ };
109
+ }, [C, A]), /* @__PURE__ */ m(x.Provider, { value: I, children: e.children });
110
+ };
111
+ function V() {
112
+ const e = F(x);
113
+ if (!e)
114
+ throw new Error(
115
+ "useBitcoinConnectionContext must be used within BitcoinConnectionProvider"
116
+ );
117
+ return e;
118
+ }
119
+ const f = () => {
120
+ }, h = (e) => {
121
+ const c = S(e);
122
+ return c.current = e, y((...r) => c.current(...r), []);
123
+ };
124
+ export {
125
+ R as BitcoinConnectionProvider,
126
+ V as useBitcoinConnectionContext
127
+ };
128
+ //# sourceMappingURL=react.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.mjs","sources":["../src/BitcoinConnectionProvider.tsx"],"sourcesContent":["import {\n createContext,\n FC,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { BitcoinWalletAdapterConnector } from \"./BitcoinWalletAdapterConnector\"\nimport {\n WalletAdapter,\n WalletAdapterAddress,\n WalletAdapterStatic,\n} from \"./WalletAdapters.types\"\n\nexport interface WalletSession {\n adapterId: string\n adapter: WalletAdapter\n addresses: WalletAdapterAddress[]\n}\n\nexport interface BitcoinConnectionContextValue {\n // Core connection state\n walletSession: null | WalletSession\n isConnectionInitializing: boolean\n connect: (adapterId: string, adapter: WalletAdapter) => Promise<void>\n disconnect: () => Promise<void>\n\n // Wallet management (for UI)\n adapterFactories: WalletAdapterStatic<WalletAdapter>[]\n availableAdapters: (readonly [adapterId: string, adapter: WalletAdapter])[]\n}\n\nconst BitcoinConnectionContext =\n createContext<null | BitcoinConnectionContextValue>(null)\n\nfunction useConnectorState<T>(\n subscribe: (listener: (value: T) => void) => { unsubscribe: () => void },\n getSnapshot: () => T,\n deps: ReadonlyArray<unknown>,\n): T {\n const [value, setValue] = useState(getSnapshot)\n\n useEffect(() => {\n const subscription = subscribe(setValue)\n return () => subscription.unsubscribe()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n\n return value\n}\n\nexport const BitcoinConnectionProvider: FC<{\n children: ReactNode\n adapterFactories: WalletAdapterStatic<WalletAdapter>[]\n onWalletConnected?: (session: WalletSession) => void\n onWalletAddressesChanged?: (addresses: WalletAdapterAddress[]) => void\n onWalletDisconnected?: () => void\n}> = props => {\n const [isConnectionInitializing, setIsConnectionInitializing] =\n useState(false)\n const [walletSession, setWalletSession] = useState<null | WalletSession>(null)\n\n const onWalletConnected = usePersistFn(props.onWalletConnected ?? noop)\n const onWalletAddressesChanged = usePersistFn(\n props.onWalletAddressesChanged ?? noop,\n )\n const onWalletDisconnected = usePersistFn(props.onWalletDisconnected ?? noop)\n\n const connector = useMemo(\n () => new BitcoinWalletAdapterConnector(props.adapterFactories),\n [props.adapterFactories],\n )\n\n useEffect(\n () => () => {\n connector.dispose()\n },\n [connector],\n )\n\n const availableAdapters = useConnectorState(\n listener => connector.subscribeAvailableAdapters(listener),\n () => connector.getAvailableAdapters(),\n [connector],\n )\n\n const connectInfo = useConnectorState(\n listener => connector.subscribeConnectedInfo(listener),\n () => connector.getConnectedInfo(),\n [connector],\n )\n\n const ctxValue = useMemo(\n (): BitcoinConnectionContextValue => ({\n walletSession,\n isConnectionInitializing,\n connect: connector.connect.bind(connector),\n disconnect: connector.disconnect.bind(connector),\n\n adapterFactories: props.adapterFactories,\n availableAdapters,\n }),\n [\n walletSession,\n isConnectionInitializing,\n connector,\n props.adapterFactories,\n availableAdapters,\n ],\n )\n\n useEffect(() => {\n const abortController = new AbortController()\n\n const sub = connector.subscribeConnectedInfo(info => {\n if (info == null) {\n try {\n onWalletDisconnected()\n } catch (e) {\n console.error(\n \"[BitcoinConnectionProvider] onWalletDisconnected error\",\n e,\n )\n }\n\n setWalletSession(null)\n setIsConnectionInitializing(false)\n return\n }\n\n setIsConnectionInitializing(true)\n info.adapter\n .getAddresses()\n .then(addresses => {\n if (abortController.signal.aborted) return\n\n const walletSession: WalletSession = {\n adapterId: info.adapterId,\n adapter: info.adapter,\n addresses,\n }\n\n try {\n onWalletConnected(walletSession)\n } catch (e) {\n console.error(\n \"[BitcoinConnectionProvider] onWalletConnected error\",\n e,\n )\n }\n\n setWalletSession(walletSession)\n setIsConnectionInitializing(false)\n })\n .catch(err => {\n if (abortController.signal.aborted) return\n setIsConnectionInitializing(false)\n console.error(\"[BitcoinConnectionProvider] connect error\", err)\n })\n })\n\n return () => {\n abortController.abort()\n sub.unsubscribe()\n }\n }, [connector, onWalletDisconnected, onWalletConnected])\n\n // Listen to address changes from wallet\n useEffect(() => {\n if (connectInfo == null) return\n\n const abortController = new AbortController()\n\n const sub = connectInfo.adapter.onAddressesChanged(({ addresses }) => {\n if (abortController.signal.aborted) return\n\n setWalletSession(prev => {\n if (prev == null) {\n console.warn(\n \"[BitcoinConnectionProvider] onWalletAddressesChanged event received while disconnected, skipping...\",\n )\n return prev\n }\n\n try {\n onWalletAddressesChanged(addresses)\n } catch (e) {\n console.error(\n \"[BitcoinConnectionProvider] onWalletAddressesChanged error\",\n e,\n )\n }\n\n return { ...prev, addresses }\n })\n })\n return () => {\n abortController.abort()\n sub.unsubscribe()\n }\n }, [connectInfo, onWalletAddressesChanged])\n\n return (\n <BitcoinConnectionContext.Provider value={ctxValue}>\n {props.children}\n </BitcoinConnectionContext.Provider>\n )\n}\n\nexport function useBitcoinConnectionContext(): BitcoinConnectionContextValue {\n const ctx = useContext(BitcoinConnectionContext)\n if (!ctx) {\n throw new Error(\n \"useBitcoinConnectionContext must be used within BitcoinConnectionProvider\",\n )\n }\n\n return ctx\n}\n\nconst noop = (): void => {}\n\nconst usePersistFn = <T extends (...args: any[]) => any>(\n fn: T,\n): ((...args: Parameters<T>) => ReturnType<T>) => {\n const fnRef = useRef(fn)\n fnRef.current = fn\n\n return useCallback((...args) => fnRef.current(...args), [])\n}\n"],"names":["BitcoinConnectionContext","createContext","useConnectorState","subscribe","getSnapshot","deps","value","setValue","useState","useEffect","subscription","BitcoinConnectionProvider","props","isConnectionInitializing","setIsConnectionInitializing","walletSession","setWalletSession","onWalletConnected","usePersistFn","noop","onWalletAddressesChanged","onWalletDisconnected","connector","useMemo","BitcoinWalletAdapterConnector","availableAdapters","listener","connectInfo","ctxValue","abortController","sub","info","e","addresses","err","prev","useBitcoinConnectionContext","ctx","useContext","fn","fnRef","useRef","useCallback","args"],"mappings":"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"}