@wallet-ui/react 1.0.0 → 1.1.0-canary-20250302003059

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 (33) hide show
  1. package/dist/index.browser.cjs +54 -78
  2. package/dist/index.browser.cjs.map +1 -1
  3. package/dist/index.browser.mjs +42 -69
  4. package/dist/index.browser.mjs.map +1 -1
  5. package/dist/index.native.mjs +42 -69
  6. package/dist/index.native.mjs.map +1 -1
  7. package/dist/index.node.cjs +54 -78
  8. package/dist/index.node.cjs.map +1 -1
  9. package/dist/index.node.mjs +42 -69
  10. package/dist/index.node.mjs.map +1 -1
  11. package/dist/types/index.d.ts +5 -4
  12. package/dist/types/index.d.ts.map +1 -1
  13. package/dist/types/solana-client-context.d.ts +3 -0
  14. package/dist/types/solana-client-context.d.ts.map +1 -0
  15. package/dist/types/solana-client-provider.d.ts +7 -0
  16. package/dist/types/solana-client-provider.d.ts.map +1 -0
  17. package/dist/types/solana-cluster-context.d.ts +17 -0
  18. package/dist/types/solana-cluster-context.d.ts.map +1 -0
  19. package/dist/types/solana-cluster-provider.d.ts +7 -0
  20. package/dist/types/solana-cluster-provider.d.ts.map +1 -0
  21. package/dist/types/solana-provider.d.ts +3 -3
  22. package/dist/types/solana-provider.d.ts.map +1 -1
  23. package/dist/types/solana-wallet-context.d.ts +1 -1
  24. package/dist/types/solana-wallet-context.d.ts.map +1 -1
  25. package/package.json +3 -3
  26. package/dist/types/solana-chain-context.d.ts +0 -20
  27. package/dist/types/solana-chain-context.d.ts.map +0 -1
  28. package/dist/types/solana-chain-provider.d.ts +0 -7
  29. package/dist/types/solana-chain-provider.d.ts.map +0 -1
  30. package/dist/types/solana-rpc-context.d.ts +0 -11
  31. package/dist/types/solana-rpc-context.d.ts.map +0 -1
  32. package/dist/types/solana-rpc-provider.d.ts +0 -7
  33. package/dist/types/solana-rpc-provider.d.ts.map +0 -1
@@ -1,35 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var web3_js = require('@solana/web3.js');
3
+ var core = require('@wallet-ui/core');
4
4
  var React4 = require('react');
5
+ var gill = require('gill');
5
6
  var react = require('@wallet-standard/react');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
9
 
9
10
  var React4__default = /*#__PURE__*/_interopDefault(React4);
10
11
 
11
- // src/solana-chain-context.tsx
12
- var CHAIN_CONFIG_DEVNET = Object.freeze({
13
- id: "solana:devnet",
14
- label: "Devnet",
15
- rpcSubscriptionsUrl: web3_js.devnet("wss://api.devnet.solana.com"),
16
- rpcUrl: web3_js.devnet("https://api.devnet.solana.com")
17
- });
18
- var CHAIN_CONFIG_LOCAL = Object.freeze({
19
- id: "solana:local",
20
- label: "Local",
21
- rpcSubscriptionsUrl: "ws://localhost:8900",
22
- rpcUrl: "http://localhost:8899"
23
- });
24
- var CHAIN_CONFIG_TESTNET = Object.freeze({
25
- id: "solana:testnet",
26
- label: "Testnet",
27
- rpcSubscriptionsUrl: web3_js.testnet("wss://api.testnet.solana.com"),
28
- rpcUrl: web3_js.testnet("https://api.testnet.solana.com")
29
- });
30
- var SolanaChainContext = React4.createContext({});
31
- function useSolanaChain() {
32
- return React4.useContext(SolanaChainContext);
12
+ // src/index.ts
13
+ var SolanaClusterContext = React4.createContext({});
14
+ function useSolanaCluster() {
15
+ return React4.useContext(SolanaClusterContext);
33
16
  }
34
17
  function useLocalStorage(key, initialValue) {
35
18
  const [storedValue, setStoredValue] = React4.useState(() => {
@@ -68,65 +51,51 @@ function useLocalStorage(key, initialValue) {
68
51
  return [storedValue, setValue];
69
52
  }
70
53
 
71
- // src/solana-chain-provider.tsx
72
- var STORAGE_KEY = "placeholder:selected-chain";
73
- function SolanaChainProvider({ chains, children }) {
74
- const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
75
- if (!chains.length) {
76
- throw new Error("No chains provided");
54
+ // src/solana-cluster-provider.tsx
55
+ var STORAGE_KEY = "placeholder:selected-cluster";
56
+ function SolanaClusterProvider({ clusters, children }) {
57
+ const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
58
+ if (!clusters.length) {
59
+ throw new Error("No clusters provided");
77
60
  }
78
- const chain = React4.useMemo(() => {
79
- for (const chain2 of chains) {
80
- if (chain2.id === chainId) {
81
- return chain2;
61
+ const cluster = React4.useMemo(() => {
62
+ for (const cluster2 of clusters) {
63
+ if (cluster2.id === clusterId) {
64
+ return cluster2;
82
65
  }
83
66
  }
84
- return chains[0];
85
- }, [chainId, chains]);
67
+ return clusters[0];
68
+ }, [clusterId, clusters]);
86
69
  return /* @__PURE__ */ React4__default.default.createElement(
87
- SolanaChainContext.Provider,
70
+ SolanaClusterContext.Provider,
88
71
  {
89
72
  value: React4.useMemo(
90
73
  () => ({
91
- chain,
92
- chains,
93
- setChain(chain2) {
94
- localStorage.setItem(STORAGE_KEY, chain2);
95
- setChainId(chain2);
74
+ cluster,
75
+ clusters,
76
+ setCluster(cluster2) {
77
+ localStorage.setItem(STORAGE_KEY, cluster2);
78
+ setClusterId(cluster2);
96
79
  }
97
80
  }),
98
- [chain, chains]
81
+ [cluster, clusters]
99
82
  )
100
83
  },
101
84
  children
102
85
  );
103
86
  }
104
- var SolanaRpcContext = React4.createContext({
105
- rpc: web3_js.createSolanaRpc(web3_js.devnet("https://api.devnet.solana.com")),
106
- rpcSubscriptions: web3_js.createSolanaRpcSubscriptions(web3_js.devnet("wss://api.devnet.solana.com"))
107
- });
108
- function useSolanaRpc() {
109
- return React4.useContext(SolanaRpcContext);
87
+ var SolanaClientContext = React4.createContext({});
88
+ function useSolanaClient() {
89
+ return React4.useContext(SolanaClientContext);
110
90
  }
111
91
 
112
- // src/solana-rpc-provider.tsx
113
- function SolanaRpcProvider({ children }) {
114
- const { chain } = useSolanaChain();
115
- return /* @__PURE__ */ React4__default.default.createElement(
116
- SolanaRpcContext.Provider,
117
- {
118
- value: React4.useMemo(
119
- () => ({
120
- rpc: web3_js.createSolanaRpc(chain.rpcUrl),
121
- rpcSubscriptions: web3_js.createSolanaRpcSubscriptions(
122
- chain.rpcSubscriptionsUrl ? chain.rpcSubscriptionsUrl : chain.rpcUrl.replace("https", "wss").replace("8899", "8900")
123
- )
124
- }),
125
- [chain]
126
- )
127
- },
128
- children
129
- );
92
+ // src/solana-client-provider.tsx
93
+ function SolanaClientProvider({
94
+ children,
95
+ urlOrMoniker
96
+ }) {
97
+ const value = React4.useMemo(() => gill.createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
98
+ return /* @__PURE__ */ React4__default.default.createElement(SolanaClientContext.Provider, { value }, children);
130
99
  }
131
100
  var SolanaWalletContext = React4.createContext([
132
101
  void 0,
@@ -141,7 +110,7 @@ function useSolanaWalletAddress() {
141
110
  if (!wallet?.address) {
142
111
  return null;
143
112
  }
144
- return web3_js.address(wallet.address);
113
+ return gill.address(wallet.address);
145
114
  }
146
115
 
147
116
  // src/solana-wallet-provider.tsx
@@ -216,23 +185,30 @@ function SolanaWalletProvider({ children }) {
216
185
  }
217
186
 
218
187
  // src/solana-provider.tsx
219
- function SolanaProvider({ chains, children }) {
220
- return /* @__PURE__ */ React4__default.default.createElement(SolanaChainProvider, { chains }, /* @__PURE__ */ React4__default.default.createElement(SolanaRpcProvider, null, /* @__PURE__ */ React4__default.default.createElement(SolanaWalletProvider, null, children)));
188
+ function SolanaProvider({ clusters, children }) {
189
+ return /* @__PURE__ */ React4__default.default.createElement(SolanaClusterProvider, { clusters }, /* @__PURE__ */ React4__default.default.createElement(SolanaClientProviderLoader, null, /* @__PURE__ */ React4__default.default.createElement(SolanaWalletProvider, null, children)));
190
+ }
191
+ function SolanaClientProviderLoader({ children }) {
192
+ const { cluster } = useSolanaCluster();
193
+ return /* @__PURE__ */ React4__default.default.createElement(SolanaClientProvider, { urlOrMoniker: cluster.urlOrMoniker }, children);
221
194
  }
222
195
 
223
- exports.CHAIN_CONFIG_DEVNET = CHAIN_CONFIG_DEVNET;
224
- exports.CHAIN_CONFIG_LOCAL = CHAIN_CONFIG_LOCAL;
225
- exports.CHAIN_CONFIG_TESTNET = CHAIN_CONFIG_TESTNET;
226
- exports.SolanaChainContext = SolanaChainContext;
227
- exports.SolanaChainProvider = SolanaChainProvider;
196
+ exports.SolanaClientContext = SolanaClientContext;
197
+ exports.SolanaClientProvider = SolanaClientProvider;
198
+ exports.SolanaClusterContext = SolanaClusterContext;
199
+ exports.SolanaClusterProvider = SolanaClusterProvider;
228
200
  exports.SolanaProvider = SolanaProvider;
229
- exports.SolanaRpcContext = SolanaRpcContext;
230
- exports.SolanaRpcProvider = SolanaRpcProvider;
231
201
  exports.SolanaWalletContext = SolanaWalletContext;
232
202
  exports.SolanaWalletProvider = SolanaWalletProvider;
233
- exports.useSolanaChain = useSolanaChain;
234
- exports.useSolanaRpc = useSolanaRpc;
203
+ exports.useSolanaClient = useSolanaClient;
204
+ exports.useSolanaCluster = useSolanaCluster;
235
205
  exports.useSolanaWallet = useSolanaWallet;
236
206
  exports.useSolanaWalletAddress = useSolanaWalletAddress;
207
+ Object.keys(core).forEach(function (k) {
208
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
209
+ enumerable: true,
210
+ get: function () { return core[k]; }
211
+ });
212
+ });
237
213
  //# sourceMappingURL=index.browser.cjs.map
238
214
  //# sourceMappingURL=index.browser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/solana-chain-context.tsx","../src/use-local-storage.ts","../src/solana-chain-provider.tsx","../src/solana-rpc-context.tsx","../src/solana-rpc-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["devnet","testnet","createContext","useContext","useState","useCallback","useMemo","chain","React","createSolanaRpc","createSolanaRpcSubscriptions","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet"],"mappings":";;;;;;;;;;;AAUa,IAAA,mBAAA,GAAmC,OAAO,MAAO,CAAA;AAAA,EAC1D,EAAI,EAAA,eAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,mBAAA,EAAqBA,eAAO,6BAA6B,CAAA;AAAA,EACzD,MAAA,EAAQA,eAAO,+BAA+B,CAAA;AAClD,CAAC,EAAA;AACY,IAAA,kBAAA,GAAkC,OAAO,MAAO,CAAA;AAAA,EACzD,EAAI,EAAA,cAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,mBAAqB,EAAA,qBAAA;AAAA,EACrB,MAAQ,EAAA,uBAAA;AACZ,CAAC,EAAA;AACY,IAAA,oBAAA,GAAoC,OAAO,MAAO,CAAA;AAAA,EAC3D,EAAI,EAAA,gBAAA;AAAA,EACJ,KAAO,EAAA,SAAA;AAAA,EACP,mBAAA,EAAqBC,gBAAQ,8BAA8B,CAAA;AAAA,EAC3D,MAAA,EAAQA,gBAAQ,gCAAgC,CAAA;AACpD,CAAC,EAAA;AAEY,IAAA,kBAAA,GAAqBC,oBAAuC,CAAA,EAA6B,EAAA;AAE/F,SAAS,cAAiB,GAAA;AAC7B,EAAA,OAAOC,kBAAW,kBAAkB,CAAA,CAAA;AACxC,CAAA;AC/BO,SAAS,eAAA,CAAmB,KAAa,YAAiB,EAAA;AAE7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,gBAAY,MAAM;AACpD,IAAI,IAAA;AAEA,MAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAC/B,QAAO,OAAA,YAAA,CAAA;AAAA,OACX;AAEA,MAAA,MAAM,IAAO,GAAA,MAAA,CAAO,YAAa,CAAA,OAAA,CAAQ,GAAG,CAAA,CAAA;AAE5C,MAAA,IAAI,IAAI,QAAS,CAAA,QAAQ,KAAK,GAAI,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AAEnD,QAAO,OAAA,YAAA,CAAA;AAAA,OACX;AACA,MAAA,OAAO,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,IAAI,CAAI,GAAA,YAAA,CAAA;AAAA,aAC5B,KAAO,EAAA;AACZ,MAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,gCAAA,EAAmC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA,CAAA;AAC9D,MAAO,OAAA,YAAA,CAAA;AAAA,KACX;AAAA,GACH,CAAA,CAAA;AAGD,EAAA,MAAM,QAAW,GAAAC,kBAAA;AAAA,IACb,CAAC,KAA+B,KAAA;AAC5B,MAAI,IAAA;AAEA,QAAA,MAAM,YAAe,GAAA,KAAA,YAAiB,QAAW,GAAA,KAAA,CAAM,WAAW,CAAI,GAAA,KAAA,CAAA;AAGtE,QAAA,cAAA,CAAe,YAAY,CAAA,CAAA;AAG3B,QAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAC/B,UAAI,IAAA,YAAA,KAAiB,KAAa,CAAA,IAAA,YAAA,KAAiB,IAAM,EAAA;AACrD,YAAO,MAAA,CAAA,YAAA,CAAa,WAAW,GAAG,CAAA,CAAA;AAAA,WAC/B,MAAA;AACH,YAAA,MAAA,CAAO,aAAa,OAAQ,CAAA,GAAA,EAAK,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA,CAAA;AAAA,WACjE;AAAA,SACJ;AAAA,eACK,KAAO,EAAA;AACZ,QAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,gCAAA,EAAmC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA,CAAA;AAAA,OAClE;AAAA,KACJ;AAAA,IACA,CAAC,KAAK,WAAW,CAAA;AAAA,GACrB,CAAA;AAEA,EAAO,OAAA,CAAC,aAAa,QAAQ,CAAA,CAAA;AACjC,CAAA;;;AC5CA,IAAM,WAAc,GAAA,4BAAA,CAAA;AAEb,SAAS,mBAAoB,CAAA,EAAE,MAAQ,EAAA,QAAA,EAA4D,EAAA;AACtG,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,eAAA,CAAgB,aAAa,eAAe,CAAA,CAAA;AAE1E,EAAI,IAAA,CAAC,OAAO,MAAQ,EAAA;AAChB,IAAM,MAAA,IAAI,MAAM,oBAAoB,CAAA,CAAA;AAAA,GACxC;AAEA,EAAM,MAAA,KAAA,GAAQC,eAAqB,MAAM;AACrC,IAAA,KAAA,MAAWC,UAAS,MAAQ,EAAA;AACxB,MAAIA,IAAAA,MAAAA,CAAM,OAAO,OAAS,EAAA;AACtB,QAAOA,OAAAA,MAAAA,CAAAA;AAAA,OACX;AAAA,KACJ;AACA,IAAA,OAAO,OAAO,CAAC,CAAA,CAAA;AAAA,GAChB,EAAA,CAAC,OAAS,EAAA,MAAM,CAAC,CAAA,CAAA;AAEpB,EACI,uBAAAC,uBAAA,CAAA,aAAA;AAAA,IAAC,kBAAmB,CAAA,QAAA;AAAA,IAAnB;AAAA,MACG,KAAO,EAAAF,cAAA;AAAA,QACH,OAAO;AAAA,UACH,KAAA;AAAA,UACA,MAAA;AAAA,UACA,SAASC,MAAO,EAAA;AACZ,YAAa,YAAA,CAAA,OAAA,CAAQ,aAAaA,MAAK,CAAA,CAAA;AACvC,YAAA,UAAA,CAAWA,MAAK,CAAA,CAAA;AAAA,WACpB;AAAA,SACJ,CAAA;AAAA,QACA,CAAC,OAAO,MAAM,CAAA;AAAA,OAClB;AAAA,KAAA;AAAA,IAEC,QAAA;AAAA,GACL,CAAA;AAER,CAAA;ACnCO,IAAM,mBAAmBL,oBAG7B,CAAA;AAAA,EACC,GAAK,EAAAO,uBAAA,CAAgBT,cAAO,CAAA,+BAA+B,CAAC,CAAA;AAAA,EAC5D,gBAAkB,EAAAU,oCAAA,CAA6BV,cAAO,CAAA,6BAA6B,CAAC,CAAA;AACxF,CAAC,EAAA;AAEM,SAAS,YAAe,GAAA;AAC3B,EAAA,OAAOG,kBAAW,gBAAgB,CAAA,CAAA;AACtC,CAAA;;;ACNO,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAmB,EAAA;AACnD,EAAM,MAAA,EAAE,KAAM,EAAA,GAAI,cAAe,EAAA,CAAA;AAEjC,EAAA,uBACIK,uBAAA,CAAA,aAAA;AAAA,IAAC,gBAAiB,CAAA,QAAA;AAAA,IAAjB;AAAA,MACG,KAAOF,EAAAA,cAAAA;AAAA,QACH,OAAO;AAAA,UACH,GAAA,EAAKG,uBAAgB,CAAA,KAAA,CAAM,MAAM,CAAA;AAAA,UACjC,gBAAkBC,EAAAA,oCAAAA;AAAA,YACd,KAAM,CAAA,mBAAA,GACA,KAAM,CAAA,mBAAA,GACN,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,EAAS,KAAK,CAAA,CAAE,OAAQ,CAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,WACrE;AAAA,SACJ,CAAA;AAAA,QACA,CAAC,KAAK,CAAA;AAAA,OACV;AAAA,KAAA;AAAA,IAEC,QAAA;AAAA,GACL,CAAA;AAER,CAAA;ACxBO,IAAM,sBAAsBR,oBAKjC,CAAA;AAAA,EACE,KAAA,CAAA;AAAA,EACA,SAAS,wBAA2B,GAAA;AAAA,GAEpC;AACJ,CAAC,EAAA;AAEM,SAAS,eAAkB,GAAA;AAC9B,EAAA,OAAOC,kBAAW,mBAAmB,CAAA,CAAA;AACzC,CAAA;AAEO,SAAS,sBAAyB,GAAA;AACrC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAI,eAAgB,EAAA,CAAA;AACjC,EAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AAClB,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AACA,EAAO,OAAAQ,eAAA,CAAQ,OAAO,OAAO,CAAA,CAAA;AACjC,CAAA;;;AChBA,IAAMC,YAAc,GAAA,yCAAA,CAAA;AAEpB,IAAI,gBAAmB,GAAA,KAAA,CAAA;AAEvB,SAAS,qBAAA,CAAsB,SAA8B,yBAA0C,EAAA;AACnG,EAAA,IAAI,gBAAkB,EAAA;AAGlB,IAAA,OAAA;AAAA,GACJ;AACA,EAAA,IAAI,CAAC,yBAAA,IAA6B,OAAO,yBAAA,KAA8B,QAAU,EAAA;AAC7E,IAAA,OAAA;AAAA,GACJ;AACA,EAAA,MAAM,CAAC,eAAiB,EAAA,mBAAmB,CAAI,GAAA,yBAAA,CAA0B,MAAM,GAAG,CAAA,CAAA;AAClF,EAAI,IAAA,CAAC,eAAmB,IAAA,CAAC,mBAAqB,EAAA;AAC1C,IAAA,OAAA;AAAA,GACJ;AACA,EAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC1B,IAAI,IAAA,MAAA,CAAO,SAAS,eAAiB,EAAA;AACjC,MAAW,KAAA,MAAA,OAAA,IAAW,OAAO,QAAU,EAAA;AACnC,QAAI,IAAA,OAAA,CAAQ,YAAY,mBAAqB,EAAA;AACzC,UAAO,OAAA,OAAA,CAAA;AAAA,SACX;AAAA,OACJ;AAAA,KACJ;AAAA,GACJ;AACJ,CAAA;AAOO,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAqC,EAAA;AACxE,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,eAAA,CAA+BA,cAAa,IAAI,CAAA,CAAA;AAClF,EAAA,MAAM,UAAUC,gBAAW,EAAA,CAAA;AAC3B,EAAM,MAAA,CAAC,qBAAuB,EAAA,gCAAgC,CAAIT,GAAAA,eAAAA;AAAA,IAAqC,MACnG,qBAAsB,CAAA,OAAA,EAAS,SAAS,CAAA;AAAA,GAC5C,CAAA;AACA,EAAA,MAAMU,4BAAiF,CAAkB,cAAA,KAAA;AACrG,IAAA,gCAAA,CAAiC,CAA6B,yBAAA,KAAA;AAC1D,MAAmB,gBAAA,GAAA,IAAA,CAAA;AACnB,MAAA,MAAM,oBACF,OAAO,cAAA,KAAmB,UAAa,GAAA,cAAA,CAAe,yBAAyB,CAAI,GAAA,cAAA,CAAA;AACvF,MAAA,MAAM,UAAa,GAAA,iBAAA,GAAoBC,kCAA6B,CAAA,iBAAiB,CAAI,GAAA,KAAA,CAAA,CAAA;AACzF,MAAA,IAAI,UAAY,EAAA;AACZ,QAAA,YAAA,CAAa,UAAU,CAAA,CAAA;AAAA,OACpB,MAAA;AACH,QAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAAA,OACrB;AACA,MAAO,OAAA,iBAAA,CAAA;AAAA,KACV,CAAA,CAAA;AAAA,GACL,CAAA;AACA,EAAAC,gBAAA,CAAU,MAAM;AACZ,IAAM,MAAA,kBAAA,GAAqB,qBAAsB,CAAA,OAAA,EAAS,SAAS,CAAA,CAAA;AACnE,IAAA,IAAI,kBAAoB,EAAA;AACpB,MAAA,gCAAA,CAAiC,kBAAkB,CAAA,CAAA;AAAA,KACvD;AAAA,GACJ,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AACZ,EAAM,MAAA,aAAA,GAAgBV,eAAQ,MAAM;AAChC,IAAA,IAAI,qBAAuB,EAAA;AACvB,MAAA,KAAA,MAAW,YAAY,OAAS,EAAA;AAC5B,QAAW,KAAA,MAAA,eAAA,IAAmB,SAAS,QAAU,EAAA;AAC7C,UAAI,IAAAW,6BAAA,CAAwB,qBAAuB,EAAA,eAAe,CAAG,EAAA;AACjE,YAAO,OAAA,eAAA,CAAA;AAAA,WACX;AAAA,SACJ;AACA,QAAA,IAAIC,uCAAiC,qBAAuB,EAAA,QAAQ,KAAK,QAAS,CAAA,QAAA,CAAS,CAAC,CAAG,EAAA;AAG3F,UAAO,OAAA,QAAA,CAAS,SAAS,CAAC,CAAA,CAAA;AAAA,SAC9B;AAAA,OACJ;AAAA,KACJ;AAAA,GACD,EAAA,CAAC,qBAAuB,EAAA,OAAO,CAAC,CAAA,CAAA;AACnC,EAAAF,gBAAA,CAAU,MAAM;AAGZ,IAAI,IAAA,qBAAA,IAAyB,CAAC,aAAe,EAAA;AACzC,MAAA,gCAAA,CAAiC,KAAS,CAAA,CAAA,CAAA;AAAA,KAC9C;AAAA,GACD,EAAA,CAAC,qBAAuB,EAAA,aAAa,CAAC,CAAA,CAAA;AACzC,EAAA,uBACIR,uBAAA,CAAA,aAAA,CAAC,mBAAoB,CAAA,QAAA,EAApB,EAA6B,KAAOF,EAAAA,cAAAA,CAAQ,MAAM,CAAC,eAAeQ,yBAAwB,CAAA,EAAG,CAAC,aAAa,CAAC,KACxG,QACL,CAAA,CAAA;AAER,CAAA;;;AC5FO,SAAS,cAAe,CAAA,EAAE,MAAQ,EAAA,QAAA,EAA4D,EAAA;AACjG,EAAA,uBACIN,uBAAAA,CAAA,aAAC,CAAA,mBAAA,EAAA,EAAoB,0BACjBA,uBAAAA,CAAA,aAAC,CAAA,iBAAA,EAAA,IAAA,kBACGA,uBAAA,CAAA,aAAA,CAAC,oBAAsB,EAAA,IAAA,EAAA,QAAS,CACpC,CACJ,CAAA,CAAA;AAER","file":"index.browser.cjs","sourcesContent":["import { devnet, testnet } from '@solana/web3.js';\nimport { SolanaChain } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaChainContextProps = Readonly<{\n chain: SolanaChain;\n chains: SolanaChain[];\n setChain?(chain: `solana:${string}`): void;\n}>;\n\nexport const CHAIN_CONFIG_DEVNET: SolanaChain = Object.freeze({\n id: 'solana:devnet',\n label: 'Devnet',\n rpcSubscriptionsUrl: devnet('wss://api.devnet.solana.com'),\n rpcUrl: devnet('https://api.devnet.solana.com'),\n});\nexport const CHAIN_CONFIG_LOCAL: SolanaChain = Object.freeze({\n id: 'solana:local',\n label: 'Local',\n rpcSubscriptionsUrl: 'ws://localhost:8900',\n rpcUrl: 'http://localhost:8899',\n});\nexport const CHAIN_CONFIG_TESTNET: SolanaChain = Object.freeze({\n id: 'solana:testnet',\n label: 'Testnet',\n rpcSubscriptionsUrl: testnet('wss://api.testnet.solana.com'),\n rpcUrl: testnet('https://api.testnet.solana.com'),\n});\n\nexport const SolanaChainContext = createContext<SolanaChainContextProps>({} as SolanaChainContextProps);\n\nexport function useSolanaChain() {\n return useContext(SolanaChainContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaChainContext } from './solana-chain-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-chain';\n\nexport function SolanaChainProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!chains.length) {\n throw new Error('No chains provided');\n }\n\n const chain = useMemo<SolanaChain>(() => {\n for (const chain of chains) {\n if (chain.id === chainId) {\n return chain;\n }\n }\n return chains[0];\n }, [chainId, chains]);\n\n return (\n <SolanaChainContext.Provider\n value={useMemo(\n () => ({\n chain,\n chains,\n setChain(chain) {\n localStorage.setItem(STORAGE_KEY, chain);\n setChainId(chain);\n },\n }),\n [chain, chains],\n )}\n >\n {children}\n </SolanaChainContext.Provider>\n );\n}\n","import type { Rpc, RpcSubscriptions, SolanaRpcApiDevnet, SolanaRpcSubscriptionsApi } from '@solana/web3.js';\nimport { createSolanaRpc, createSolanaRpcSubscriptions, devnet } from '@solana/web3.js';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaRpc = Rpc<SolanaRpcApiDevnet>;\n\nexport const SolanaRpcContext = createContext<{\n rpc: SolanaRpc; // Limit the API to only those methods found on Mainnet (ie. not `requestAirdrop`)\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n}>({\n rpc: createSolanaRpc(devnet('https://api.devnet.solana.com')),\n rpcSubscriptions: createSolanaRpcSubscriptions(devnet('wss://api.devnet.solana.com')),\n});\n\nexport function useSolanaRpc() {\n return useContext(SolanaRpcContext);\n}\n","import { createSolanaRpc, createSolanaRpcSubscriptions } from '@solana/web3.js';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { useSolanaChain } from './solana-chain-context';\nimport { SolanaRpc, SolanaRpcContext } from './solana-rpc-context';\n\ntype Props = Readonly<{\n children: ReactNode;\n}>;\n\nexport function SolanaRpcProvider({ children }: Props) {\n const { chain } = useSolanaChain();\n\n return (\n <SolanaRpcContext.Provider\n value={useMemo(\n () => ({\n rpc: createSolanaRpc(chain.rpcUrl) as SolanaRpc,\n rpcSubscriptions: createSolanaRpcSubscriptions(\n chain.rpcSubscriptionsUrl\n ? chain.rpcSubscriptionsUrl\n : chain.rpcUrl.replace('https', 'wss').replace('8899', '8900'),\n ),\n }),\n [chain],\n )}\n >\n {children}\n </SolanaRpcContext.Provider>\n );\n}\n","import { address } from '@solana/web3.js';\nimport type { UiWalletAccount } from '@wallet-standard/react';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaChainProvider } from './solana-chain-provider';\nimport { SolanaRpcProvider } from './solana-rpc-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n return (\n <SolanaChainProvider chains={chains}>\n <SolanaRpcProvider>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaRpcProvider>\n </SolanaChainProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["createContext","useContext","useState","useCallback","useMemo","cluster","React","createSolanaClient","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}
@@ -1,29 +1,12 @@
1
- import { devnet, testnet, createSolanaRpc, createSolanaRpcSubscriptions, address } from '@solana/web3.js';
1
+ export * from '@wallet-ui/core';
2
2
  import React4, { createContext, useContext, useMemo, useState, useEffect, useCallback } from 'react';
3
+ import { createSolanaClient, address } from 'gill';
3
4
  import { useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, getUiWalletAccountStorageKey } from '@wallet-standard/react';
4
5
 
5
- // src/solana-chain-context.tsx
6
- var CHAIN_CONFIG_DEVNET = Object.freeze({
7
- id: "solana:devnet",
8
- label: "Devnet",
9
- rpcSubscriptionsUrl: devnet("wss://api.devnet.solana.com"),
10
- rpcUrl: devnet("https://api.devnet.solana.com")
11
- });
12
- var CHAIN_CONFIG_LOCAL = Object.freeze({
13
- id: "solana:local",
14
- label: "Local",
15
- rpcSubscriptionsUrl: "ws://localhost:8900",
16
- rpcUrl: "http://localhost:8899"
17
- });
18
- var CHAIN_CONFIG_TESTNET = Object.freeze({
19
- id: "solana:testnet",
20
- label: "Testnet",
21
- rpcSubscriptionsUrl: testnet("wss://api.testnet.solana.com"),
22
- rpcUrl: testnet("https://api.testnet.solana.com")
23
- });
24
- var SolanaChainContext = createContext({});
25
- function useSolanaChain() {
26
- return useContext(SolanaChainContext);
6
+ // src/index.ts
7
+ var SolanaClusterContext = createContext({});
8
+ function useSolanaCluster() {
9
+ return useContext(SolanaClusterContext);
27
10
  }
28
11
  function useLocalStorage(key, initialValue) {
29
12
  const [storedValue, setStoredValue] = useState(() => {
@@ -62,65 +45,51 @@ function useLocalStorage(key, initialValue) {
62
45
  return [storedValue, setValue];
63
46
  }
64
47
 
65
- // src/solana-chain-provider.tsx
66
- var STORAGE_KEY = "placeholder:selected-chain";
67
- function SolanaChainProvider({ chains, children }) {
68
- const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
69
- if (!chains.length) {
70
- throw new Error("No chains provided");
48
+ // src/solana-cluster-provider.tsx
49
+ var STORAGE_KEY = "placeholder:selected-cluster";
50
+ function SolanaClusterProvider({ clusters, children }) {
51
+ const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
52
+ if (!clusters.length) {
53
+ throw new Error("No clusters provided");
71
54
  }
72
- const chain = useMemo(() => {
73
- for (const chain2 of chains) {
74
- if (chain2.id === chainId) {
75
- return chain2;
55
+ const cluster = useMemo(() => {
56
+ for (const cluster2 of clusters) {
57
+ if (cluster2.id === clusterId) {
58
+ return cluster2;
76
59
  }
77
60
  }
78
- return chains[0];
79
- }, [chainId, chains]);
61
+ return clusters[0];
62
+ }, [clusterId, clusters]);
80
63
  return /* @__PURE__ */ React4.createElement(
81
- SolanaChainContext.Provider,
64
+ SolanaClusterContext.Provider,
82
65
  {
83
66
  value: useMemo(
84
67
  () => ({
85
- chain,
86
- chains,
87
- setChain(chain2) {
88
- localStorage.setItem(STORAGE_KEY, chain2);
89
- setChainId(chain2);
68
+ cluster,
69
+ clusters,
70
+ setCluster(cluster2) {
71
+ localStorage.setItem(STORAGE_KEY, cluster2);
72
+ setClusterId(cluster2);
90
73
  }
91
74
  }),
92
- [chain, chains]
75
+ [cluster, clusters]
93
76
  )
94
77
  },
95
78
  children
96
79
  );
97
80
  }
98
- var SolanaRpcContext = createContext({
99
- rpc: createSolanaRpc(devnet("https://api.devnet.solana.com")),
100
- rpcSubscriptions: createSolanaRpcSubscriptions(devnet("wss://api.devnet.solana.com"))
101
- });
102
- function useSolanaRpc() {
103
- return useContext(SolanaRpcContext);
81
+ var SolanaClientContext = createContext({});
82
+ function useSolanaClient() {
83
+ return useContext(SolanaClientContext);
104
84
  }
105
85
 
106
- // src/solana-rpc-provider.tsx
107
- function SolanaRpcProvider({ children }) {
108
- const { chain } = useSolanaChain();
109
- return /* @__PURE__ */ React4.createElement(
110
- SolanaRpcContext.Provider,
111
- {
112
- value: useMemo(
113
- () => ({
114
- rpc: createSolanaRpc(chain.rpcUrl),
115
- rpcSubscriptions: createSolanaRpcSubscriptions(
116
- chain.rpcSubscriptionsUrl ? chain.rpcSubscriptionsUrl : chain.rpcUrl.replace("https", "wss").replace("8899", "8900")
117
- )
118
- }),
119
- [chain]
120
- )
121
- },
122
- children
123
- );
86
+ // src/solana-client-provider.tsx
87
+ function SolanaClientProvider({
88
+ children,
89
+ urlOrMoniker
90
+ }) {
91
+ const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
92
+ return /* @__PURE__ */ React4.createElement(SolanaClientContext.Provider, { value }, children);
124
93
  }
125
94
  var SolanaWalletContext = createContext([
126
95
  void 0,
@@ -210,10 +179,14 @@ function SolanaWalletProvider({ children }) {
210
179
  }
211
180
 
212
181
  // src/solana-provider.tsx
213
- function SolanaProvider({ chains, children }) {
214
- return /* @__PURE__ */ React4.createElement(SolanaChainProvider, { chains }, /* @__PURE__ */ React4.createElement(SolanaRpcProvider, null, /* @__PURE__ */ React4.createElement(SolanaWalletProvider, null, children)));
182
+ function SolanaProvider({ clusters, children }) {
183
+ return /* @__PURE__ */ React4.createElement(SolanaClusterProvider, { clusters }, /* @__PURE__ */ React4.createElement(SolanaClientProviderLoader, null, /* @__PURE__ */ React4.createElement(SolanaWalletProvider, null, children)));
184
+ }
185
+ function SolanaClientProviderLoader({ children }) {
186
+ const { cluster } = useSolanaCluster();
187
+ return /* @__PURE__ */ React4.createElement(SolanaClientProvider, { urlOrMoniker: cluster.urlOrMoniker }, children);
215
188
  }
216
189
 
217
- export { CHAIN_CONFIG_DEVNET, CHAIN_CONFIG_LOCAL, CHAIN_CONFIG_TESTNET, SolanaChainContext, SolanaChainProvider, SolanaProvider, SolanaRpcContext, SolanaRpcProvider, SolanaWalletContext, SolanaWalletProvider, useSolanaChain, useSolanaRpc, useSolanaWallet, useSolanaWalletAddress };
190
+ export { SolanaClientContext, SolanaClientProvider, SolanaClusterContext, SolanaClusterProvider, SolanaProvider, SolanaWalletContext, SolanaWalletProvider, useSolanaClient, useSolanaCluster, useSolanaWallet, useSolanaWalletAddress };
218
191
  //# sourceMappingURL=index.browser.mjs.map
219
192
  //# sourceMappingURL=index.browser.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/solana-chain-context.tsx","../src/use-local-storage.ts","../src/solana-chain-provider.tsx","../src/solana-rpc-context.tsx","../src/solana-rpc-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["chain","React","createContext","devnet","useContext","useMemo","createSolanaRpc","createSolanaRpcSubscriptions","STORAGE_KEY","useState","setSelectedWalletAccount"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import { devnet, testnet } from '@solana/web3.js';\nimport { SolanaChain } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaChainContextProps = Readonly<{\n chain: SolanaChain;\n chains: SolanaChain[];\n setChain?(chain: `solana:${string}`): void;\n}>;\n\nexport const CHAIN_CONFIG_DEVNET: SolanaChain = Object.freeze({\n id: 'solana:devnet',\n label: 'Devnet',\n rpcSubscriptionsUrl: devnet('wss://api.devnet.solana.com'),\n rpcUrl: devnet('https://api.devnet.solana.com'),\n});\nexport const CHAIN_CONFIG_LOCAL: SolanaChain = Object.freeze({\n id: 'solana:local',\n label: 'Local',\n rpcSubscriptionsUrl: 'ws://localhost:8900',\n rpcUrl: 'http://localhost:8899',\n});\nexport const CHAIN_CONFIG_TESTNET: SolanaChain = Object.freeze({\n id: 'solana:testnet',\n label: 'Testnet',\n rpcSubscriptionsUrl: testnet('wss://api.testnet.solana.com'),\n rpcUrl: testnet('https://api.testnet.solana.com'),\n});\n\nexport const SolanaChainContext = createContext<SolanaChainContextProps>({} as SolanaChainContextProps);\n\nexport function useSolanaChain() {\n return useContext(SolanaChainContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaChainContext } from './solana-chain-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-chain';\n\nexport function SolanaChainProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!chains.length) {\n throw new Error('No chains provided');\n }\n\n const chain = useMemo<SolanaChain>(() => {\n for (const chain of chains) {\n if (chain.id === chainId) {\n return chain;\n }\n }\n return chains[0];\n }, [chainId, chains]);\n\n return (\n <SolanaChainContext.Provider\n value={useMemo(\n () => ({\n chain,\n chains,\n setChain(chain) {\n localStorage.setItem(STORAGE_KEY, chain);\n setChainId(chain);\n },\n }),\n [chain, chains],\n )}\n >\n {children}\n </SolanaChainContext.Provider>\n );\n}\n","import type { Rpc, RpcSubscriptions, SolanaRpcApiDevnet, SolanaRpcSubscriptionsApi } from '@solana/web3.js';\nimport { createSolanaRpc, createSolanaRpcSubscriptions, devnet } from '@solana/web3.js';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaRpc = Rpc<SolanaRpcApiDevnet>;\n\nexport const SolanaRpcContext = createContext<{\n rpc: SolanaRpc; // Limit the API to only those methods found on Mainnet (ie. not `requestAirdrop`)\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n}>({\n rpc: createSolanaRpc(devnet('https://api.devnet.solana.com')),\n rpcSubscriptions: createSolanaRpcSubscriptions(devnet('wss://api.devnet.solana.com')),\n});\n\nexport function useSolanaRpc() {\n return useContext(SolanaRpcContext);\n}\n","import { createSolanaRpc, createSolanaRpcSubscriptions } from '@solana/web3.js';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { useSolanaChain } from './solana-chain-context';\nimport { SolanaRpc, SolanaRpcContext } from './solana-rpc-context';\n\ntype Props = Readonly<{\n children: ReactNode;\n}>;\n\nexport function SolanaRpcProvider({ children }: Props) {\n const { chain } = useSolanaChain();\n\n return (\n <SolanaRpcContext.Provider\n value={useMemo(\n () => ({\n rpc: createSolanaRpc(chain.rpcUrl) as SolanaRpc,\n rpcSubscriptions: createSolanaRpcSubscriptions(\n chain.rpcSubscriptionsUrl\n ? chain.rpcSubscriptionsUrl\n : chain.rpcUrl.replace('https', 'wss').replace('8899', '8900'),\n ),\n }),\n [chain],\n )}\n >\n {children}\n </SolanaRpcContext.Provider>\n );\n}\n","import { address } from '@solana/web3.js';\nimport type { UiWalletAccount } from '@wallet-standard/react';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaChainProvider } from './solana-chain-provider';\nimport { SolanaRpcProvider } from './solana-rpc-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n return (\n <SolanaChainProvider chains={chains}>\n <SolanaRpcProvider>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaRpcProvider>\n </SolanaChainProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["cluster","React","createContext","useContext","useMemo","STORAGE_KEY","useState","setSelectedWalletAccount"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}