@tuwaio/nova-connect 0.1.0 → 0.1.1

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 (71) hide show
  1. package/README.md +21 -96
  2. package/dist/chunk-6S5OTERL.cjs +2 -0
  3. package/dist/chunk-6S5OTERL.cjs.map +1 -0
  4. package/dist/chunk-CEGEQMI2.cjs +2 -0
  5. package/dist/chunk-CEGEQMI2.cjs.map +1 -0
  6. package/dist/chunk-DYDY3FCT.cjs +2 -0
  7. package/dist/chunk-DYDY3FCT.cjs.map +1 -0
  8. package/dist/{chunk-NJDPFYUJ.js → chunk-FNWARYJY.js} +2 -2
  9. package/dist/{chunk-NJDPFYUJ.js.map → chunk-FNWARYJY.js.map} +1 -1
  10. package/dist/{chunk-KKCRUSJT.js → chunk-J4TY3CJF.js} +2 -2
  11. package/dist/{chunk-KKCRUSJT.js.map → chunk-J4TY3CJF.js.map} +1 -1
  12. package/dist/evm/index.cjs +1 -1
  13. package/dist/evm/index.cjs.map +1 -1
  14. package/dist/evm/index.d.cts +24 -0
  15. package/dist/evm/index.d.ts +24 -0
  16. package/dist/evm/index.js +1 -1
  17. package/dist/evm/index.js.map +1 -1
  18. package/dist/evm-7NHOTSAK.cjs +2 -0
  19. package/dist/evm-7NHOTSAK.cjs.map +1 -0
  20. package/dist/{getChainsListByWalletType-KXWMBNB4.js → getChainsListByWalletType-EO6A7Q5A.js} +2 -2
  21. package/dist/{getChainsListByWalletType-KXWMBNB4.js.map → getChainsListByWalletType-EO6A7Q5A.js.map} +1 -1
  22. package/dist/getChainsListByWalletType-ZU7OPWTP.cjs +2 -0
  23. package/dist/getChainsListByWalletType-ZU7OPWTP.cjs.map +1 -0
  24. package/dist/index.cjs +3 -3
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +6081 -6112
  27. package/dist/index.d.ts +6081 -6112
  28. package/dist/index.js +3 -3
  29. package/dist/index.js.map +1 -1
  30. package/dist/solana/index.cjs +1 -1
  31. package/dist/solana/index.cjs.map +1 -1
  32. package/dist/solana/index.d.cts +33 -0
  33. package/dist/solana/index.d.ts +33 -0
  34. package/dist/solana/index.js +1 -1
  35. package/dist/solana/index.js.map +1 -1
  36. package/dist/{providers/solana-WHT5KTOF.js → solana-GLHHYZDQ.js} +2 -2
  37. package/dist/{solana-2MXIY6UT.js.map → solana-GLHHYZDQ.js.map} +1 -1
  38. package/dist/solana-JUU54KQ3.cjs +2 -0
  39. package/dist/solana-JUU54KQ3.cjs.map +1 -0
  40. package/dist/types-DGsiEwne.d.cts +50 -0
  41. package/dist/types-DGsiEwne.d.ts +50 -0
  42. package/dist/utils-DZB4ZTS4.cjs +2 -0
  43. package/dist/utils-DZB4ZTS4.cjs.map +1 -0
  44. package/dist/utils-H5O25MTI.cjs +2 -0
  45. package/dist/utils-H5O25MTI.cjs.map +1 -0
  46. package/dist/utils-SUIRQJIA.js +2 -0
  47. package/dist/{utils-72MDY3OH.js.map → utils-SUIRQJIA.js.map} +1 -1
  48. package/package.json +6 -18
  49. package/dist/evm-F7OJEDX3.js +0 -2
  50. package/dist/evm-F7OJEDX3.js.map +0 -1
  51. package/dist/hooks/index.cjs +0 -2
  52. package/dist/hooks/index.cjs.map +0 -1
  53. package/dist/hooks/index.js +0 -2
  54. package/dist/hooks/index.js.map +0 -1
  55. package/dist/providers/evm-5323YCLC.js +0 -2
  56. package/dist/providers/evm-5323YCLC.js.map +0 -1
  57. package/dist/providers/index.cjs +0 -6
  58. package/dist/providers/index.cjs.map +0 -1
  59. package/dist/providers/index.d.cts +0 -506
  60. package/dist/providers/index.d.ts +0 -506
  61. package/dist/providers/index.js +0 -6
  62. package/dist/providers/index.js.map +0 -1
  63. package/dist/providers/solana-WHT5KTOF.js.map +0 -1
  64. package/dist/providers/utils-FHHKXQ5Z.js +0 -2
  65. package/dist/providers/utils-FHHKXQ5Z.js.map +0 -1
  66. package/dist/providers/utils-L6CFHW4B.js +0 -2
  67. package/dist/providers/utils-L6CFHW4B.js.map +0 -1
  68. package/dist/solana-2MXIY6UT.js +0 -2
  69. package/dist/solana-EV65GS7Q.js +0 -2
  70. package/dist/solana-EV65GS7Q.js.map +0 -1
  71. package/dist/utils-72MDY3OH.js +0 -2
@@ -1,2 +1,2 @@
1
- 'use strict';var orbitSolana=require('@tuwaio/orbit-solana');function i(r){let n=r.split(":");if(n.length<2)return null;let t=n[1];return t in orbitSolana.defaultRpcUrlsByMoniker?t:null}function s(r,n){let t={};for(let o of r){if(typeof o!="string")continue;let l=i(o);if(!l)continue;let a=n?.[l]??orbitSolana.defaultRpcUrlsByMoniker[l];a&&(t[l]=a);}return t}function p(r,n){if(n&&n.length>0){let t=s(n,r);return Object.keys(t)}return Object.keys(r||orbitSolana.defaultRpcUrlsByMoniker)}function f(r){return r.length>0&&r.every(n=>typeof n=="string")}function C(){return Object.keys(orbitSolana.defaultRpcUrlsByMoniker)}function S(r){return r in orbitSolana.defaultRpcUrlsByMoniker}exports.getAvailableSolanaClusters=C;exports.getSolanaClusters=p;exports.isSolanaChainList=f;exports.isValidSolanaCluster=S;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var chunkDYDY3FCT_cjs=require('../chunk-DYDY3FCT.cjs'),solana=require('@tuwaio/satellite-react/solana');Object.defineProperty(exports,"getAvailableSolanaClusters",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.c}});Object.defineProperty(exports,"getSolanaClusters",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.a}});Object.defineProperty(exports,"isSolanaChainList",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.b}});Object.defineProperty(exports,"isValidSolanaCluster",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.d}});Object.keys(solana).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return solana[k]}})});//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/solana/utils.ts"],"names":["extractSolanaCluster","chainId","parts","cluster","defaultRpcUrlsByMoniker","buildSolanaRpcUrls","chains","solanaRPCUrls","availableRpcUrls","rpcUrl","getSolanaClusters","isSolanaChainList","chain","getAvailableSolanaClusters","isValidSolanaCluster"],"mappings":"6DAQA,SAASA,CAAAA,CAAqBC,CAAAA,CAA8C,CAC1E,IAAMC,CAAAA,CAAQD,CAAAA,CAAQ,KAAA,CAAM,GAAG,EAC/B,GAAIC,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAG,OAAO,IAAA,CAE7B,IAAMC,CAAAA,CAAUD,CAAAA,CAAM,CAAC,CAAA,CAEvB,OAAOC,CAAAA,IAAWC,mCAAAA,CAA0BD,CAAAA,CAAU,IACxD,CAKA,SAASE,CAAAA,CACPC,CAAAA,CACAC,CAAAA,CAC0B,CAC1B,IAAMC,CAAAA,CAA6C,EAAC,CAEpD,IAAA,IAAWP,CAAAA,IAAWK,CAAAA,CAAQ,CAC5B,GAAI,OAAOL,CAAAA,EAAY,SAAU,SAEjC,IAAME,CAAAA,CAAUH,CAAAA,CAAqBC,CAAO,CAAA,CAC5C,GAAI,CAACE,EAAS,SAGd,IAAMM,CAAAA,CAASF,CAAAA,GAAgBJ,CAAO,CAAA,EAAKC,mCAAAA,CAAwBD,CAAO,EAEtEM,CAAAA,GACFD,CAAAA,CAAiBL,CAAO,CAAA,CAAIM,CAAAA,EAEhC,CAEA,OAAOD,CACT,CAKO,SAASE,CAAAA,CACdH,CAAAA,CACAD,CAAAA,CACU,CACV,GAAIA,CAAAA,EAAUA,EAAO,MAAA,CAAS,CAAA,CAAG,CAE/B,IAAME,CAAAA,CAAmBH,CAAAA,CAAmBC,CAAAA,CAAQC,CAAa,EACjE,OAAO,MAAA,CAAO,IAAA,CAAKC,CAAgB,CACrC,CAGA,OAAO,MAAA,CAAO,KAAKD,CAAAA,EAAiBH,mCAAuB,CAC7D,CAKO,SAASO,CAAAA,CAAkBL,CAAAA,CAAiD,CACjF,OAAOA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOM,CAAAA,EAAU,OAAOA,GAAU,QAAQ,CAC/E,CAKO,SAASC,CAAAA,EAAqD,CACnE,OAAO,MAAA,CAAO,KAAKT,mCAAuB,CAC5C,CAKO,SAASU,CAAAA,CAAqBX,CAAAA,CAAkD,CACrF,OAAOA,KAAWC,mCACpB","file":"index.cjs","sourcesContent":["import { defaultRpcUrlsByMoniker, SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport type { SolanaClusterMoniker } from 'gill';\n\nimport { ChainIdentifierArray } from '../types';\n\n/**\n * Extracts Solana cluster from chain identifier\n */\nfunction extractSolanaCluster(chainId: string): SolanaClusterMoniker | null {\n const parts = chainId.split(':');\n if (parts.length < 2) return null;\n\n const cluster = parts[1] as SolanaClusterMoniker;\n // Validate that it's a known cluster\n return cluster in defaultRpcUrlsByMoniker ? cluster : null;\n}\n\n/**\n * Builds available Solana RPC URLs from chain identifiers\n */\nfunction buildSolanaRpcUrls(\n chains: ChainIdentifierArray,\n solanaRPCUrls?: SolanaRPCUrls['rpcUrls'],\n): SolanaRPCUrls['rpcUrls'] {\n const availableRpcUrls: SolanaRPCUrls['rpcUrls'] = {};\n\n for (const chainId of chains) {\n if (typeof chainId !== 'string') continue;\n\n const cluster = extractSolanaCluster(chainId);\n if (!cluster) continue;\n\n // Get RPC URL with fallback to default\n const rpcUrl = solanaRPCUrls?.[cluster] ?? defaultRpcUrlsByMoniker[cluster];\n\n if (rpcUrl) {\n availableRpcUrls[cluster] = rpcUrl;\n }\n }\n\n return availableRpcUrls;\n}\n\n/**\n * Get Solana clusters from configuration\n */\nexport function getSolanaClusters(\n solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>,\n chains?: ChainIdentifierArray,\n): string[] {\n if (chains && chains.length > 0) {\n // For Solana, build RPC URLs and return cluster names\n const availableRpcUrls = buildSolanaRpcUrls(chains, solanaRPCUrls);\n return Object.keys(availableRpcUrls);\n }\n\n // Return configured clusters or defaults\n return Object.keys(solanaRPCUrls || defaultRpcUrlsByMoniker);\n}\n\n/**\n * Type guard to check if a chain list contains Solana cluster names\n */\nexport function isSolanaChainList(chains: (string | number)[]): chains is string[] {\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n}\n\n/**\n * Gets available Solana clusters from the default configuration\n */\nexport function getAvailableSolanaClusters(): SolanaClusterMoniker[] {\n return Object.keys(defaultRpcUrlsByMoniker) as SolanaClusterMoniker[];\n}\n\n/**\n * Validates if a string is a valid Solana cluster moniker\n */\nexport function isValidSolanaCluster(cluster: string): cluster is SolanaClusterMoniker {\n return cluster in defaultRpcUrlsByMoniker;\n}\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs","sourcesContent":[]}
@@ -0,0 +1,33 @@
1
+ import { SolanaClusterMoniker } from 'gill';
2
+ export { SolanaClusterMoniker } from 'gill';
3
+ import { C as ChainIdentifierArray } from '../types-DGsiEwne.cjs';
4
+ export * from '@tuwaio/satellite-react/solana';
5
+
6
+ /**
7
+ * Get Solana clusters from configuration
8
+ */
9
+ declare function getSolanaClusters(solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>, chains?: ChainIdentifierArray): string[];
10
+ /**
11
+ * Type guard to check if a chain list contains Solana cluster names
12
+ */
13
+ declare function isSolanaChainList(chains: (string | number)[]): chains is string[];
14
+ /**
15
+ * Gets available Solana clusters from the default configuration
16
+ */
17
+ declare function getAvailableSolanaClusters(): SolanaClusterMoniker[];
18
+ /**
19
+ * Validates if a string is a valid Solana cluster moniker
20
+ */
21
+ declare function isValidSolanaCluster(cluster: string): cluster is SolanaClusterMoniker;
22
+
23
+ declare module '@tuwaio/nova-connect' {
24
+ interface AllChainConfigs {
25
+ /**
26
+ * Solana RPC URLs configuration - enhanced from default any type
27
+ * @override Replaces default `any` with specific SolanaClusterMoniker typing when gill is available
28
+ */
29
+ solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>;
30
+ }
31
+ }
32
+
33
+ export { getAvailableSolanaClusters, getSolanaClusters, isSolanaChainList, isValidSolanaCluster };
@@ -0,0 +1,33 @@
1
+ import { SolanaClusterMoniker } from 'gill';
2
+ export { SolanaClusterMoniker } from 'gill';
3
+ import { C as ChainIdentifierArray } from '../types-DGsiEwne.js';
4
+ export * from '@tuwaio/satellite-react/solana';
5
+
6
+ /**
7
+ * Get Solana clusters from configuration
8
+ */
9
+ declare function getSolanaClusters(solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>, chains?: ChainIdentifierArray): string[];
10
+ /**
11
+ * Type guard to check if a chain list contains Solana cluster names
12
+ */
13
+ declare function isSolanaChainList(chains: (string | number)[]): chains is string[];
14
+ /**
15
+ * Gets available Solana clusters from the default configuration
16
+ */
17
+ declare function getAvailableSolanaClusters(): SolanaClusterMoniker[];
18
+ /**
19
+ * Validates if a string is a valid Solana cluster moniker
20
+ */
21
+ declare function isValidSolanaCluster(cluster: string): cluster is SolanaClusterMoniker;
22
+
23
+ declare module '@tuwaio/nova-connect' {
24
+ interface AllChainConfigs {
25
+ /**
26
+ * Solana RPC URLs configuration - enhanced from default any type
27
+ * @override Replaces default `any` with specific SolanaClusterMoniker typing when gill is available
28
+ */
29
+ solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>;
30
+ }
31
+ }
32
+
33
+ export { getAvailableSolanaClusters, getSolanaClusters, isSolanaChainList, isValidSolanaCluster };
@@ -1,2 +1,2 @@
1
- import {defaultRpcUrlsByMoniker}from'@tuwaio/orbit-solana';function i(r){let n=r.split(":");if(n.length<2)return null;let t=n[1];return t in defaultRpcUrlsByMoniker?t:null}function s(r,n){let t={};for(let o of r){if(typeof o!="string")continue;let l=i(o);if(!l)continue;let a=n?.[l]??defaultRpcUrlsByMoniker[l];a&&(t[l]=a);}return t}function p(r,n){if(n&&n.length>0){let t=s(n,r);return Object.keys(t)}return Object.keys(r||defaultRpcUrlsByMoniker)}function f(r){return r.length>0&&r.every(n=>typeof n=="string")}function C(){return Object.keys(defaultRpcUrlsByMoniker)}function S(r){return r in defaultRpcUrlsByMoniker}export{C as getAvailableSolanaClusters,p as getSolanaClusters,f as isSolanaChainList,S as isValidSolanaCluster};//# sourceMappingURL=index.js.map
1
+ export{c as getAvailableSolanaClusters,a as getSolanaClusters,b as isSolanaChainList,d as isValidSolanaCluster}from'../chunk-J4TY3CJF.js';export*from'@tuwaio/satellite-react/solana';//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/solana/utils.ts"],"names":["extractSolanaCluster","chainId","parts","cluster","defaultRpcUrlsByMoniker","buildSolanaRpcUrls","chains","solanaRPCUrls","availableRpcUrls","rpcUrl","getSolanaClusters","isSolanaChainList","chain","getAvailableSolanaClusters","isValidSolanaCluster"],"mappings":"2DAQA,SAASA,CAAAA,CAAqBC,CAAAA,CAA8C,CAC1E,IAAMC,CAAAA,CAAQD,CAAAA,CAAQ,KAAA,CAAM,GAAG,EAC/B,GAAIC,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAG,OAAO,IAAA,CAE7B,IAAMC,CAAAA,CAAUD,CAAAA,CAAM,CAAC,CAAA,CAEvB,OAAOC,CAAAA,IAAWC,uBAAAA,CAA0BD,CAAAA,CAAU,IACxD,CAKA,SAASE,CAAAA,CACPC,CAAAA,CACAC,CAAAA,CAC0B,CAC1B,IAAMC,CAAAA,CAA6C,EAAC,CAEpD,IAAA,IAAWP,CAAAA,IAAWK,CAAAA,CAAQ,CAC5B,GAAI,OAAOL,CAAAA,EAAY,SAAU,SAEjC,IAAME,CAAAA,CAAUH,CAAAA,CAAqBC,CAAO,CAAA,CAC5C,GAAI,CAACE,EAAS,SAGd,IAAMM,CAAAA,CAASF,CAAAA,GAAgBJ,CAAO,CAAA,EAAKC,uBAAAA,CAAwBD,CAAO,EAEtEM,CAAAA,GACFD,CAAAA,CAAiBL,CAAO,CAAA,CAAIM,CAAAA,EAEhC,CAEA,OAAOD,CACT,CAKO,SAASE,CAAAA,CACdH,CAAAA,CACAD,CAAAA,CACU,CACV,GAAIA,CAAAA,EAAUA,EAAO,MAAA,CAAS,CAAA,CAAG,CAE/B,IAAME,CAAAA,CAAmBH,CAAAA,CAAmBC,CAAAA,CAAQC,CAAa,EACjE,OAAO,MAAA,CAAO,IAAA,CAAKC,CAAgB,CACrC,CAGA,OAAO,MAAA,CAAO,KAAKD,CAAAA,EAAiBH,uBAAuB,CAC7D,CAKO,SAASO,CAAAA,CAAkBL,CAAAA,CAAiD,CACjF,OAAOA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOM,CAAAA,EAAU,OAAOA,GAAU,QAAQ,CAC/E,CAKO,SAASC,CAAAA,EAAqD,CACnE,OAAO,MAAA,CAAO,KAAKT,uBAAuB,CAC5C,CAKO,SAASU,CAAAA,CAAqBX,CAAAA,CAAkD,CACrF,OAAOA,KAAWC,uBACpB","file":"index.js","sourcesContent":["import { defaultRpcUrlsByMoniker, SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport type { SolanaClusterMoniker } from 'gill';\n\nimport { ChainIdentifierArray } from '../types';\n\n/**\n * Extracts Solana cluster from chain identifier\n */\nfunction extractSolanaCluster(chainId: string): SolanaClusterMoniker | null {\n const parts = chainId.split(':');\n if (parts.length < 2) return null;\n\n const cluster = parts[1] as SolanaClusterMoniker;\n // Validate that it's a known cluster\n return cluster in defaultRpcUrlsByMoniker ? cluster : null;\n}\n\n/**\n * Builds available Solana RPC URLs from chain identifiers\n */\nfunction buildSolanaRpcUrls(\n chains: ChainIdentifierArray,\n solanaRPCUrls?: SolanaRPCUrls['rpcUrls'],\n): SolanaRPCUrls['rpcUrls'] {\n const availableRpcUrls: SolanaRPCUrls['rpcUrls'] = {};\n\n for (const chainId of chains) {\n if (typeof chainId !== 'string') continue;\n\n const cluster = extractSolanaCluster(chainId);\n if (!cluster) continue;\n\n // Get RPC URL with fallback to default\n const rpcUrl = solanaRPCUrls?.[cluster] ?? defaultRpcUrlsByMoniker[cluster];\n\n if (rpcUrl) {\n availableRpcUrls[cluster] = rpcUrl;\n }\n }\n\n return availableRpcUrls;\n}\n\n/**\n * Get Solana clusters from configuration\n */\nexport function getSolanaClusters(\n solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>,\n chains?: ChainIdentifierArray,\n): string[] {\n if (chains && chains.length > 0) {\n // For Solana, build RPC URLs and return cluster names\n const availableRpcUrls = buildSolanaRpcUrls(chains, solanaRPCUrls);\n return Object.keys(availableRpcUrls);\n }\n\n // Return configured clusters or defaults\n return Object.keys(solanaRPCUrls || defaultRpcUrlsByMoniker);\n}\n\n/**\n * Type guard to check if a chain list contains Solana cluster names\n */\nexport function isSolanaChainList(chains: (string | number)[]): chains is string[] {\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n}\n\n/**\n * Gets available Solana clusters from the default configuration\n */\nexport function getAvailableSolanaClusters(): SolanaClusterMoniker[] {\n return Object.keys(defaultRpcUrlsByMoniker) as SolanaClusterMoniker[];\n}\n\n/**\n * Validates if a string is a valid Solana cluster moniker\n */\nexport function isValidSolanaCluster(cluster: string): cluster is SolanaClusterMoniker {\n return cluster in defaultRpcUrlsByMoniker;\n}\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
@@ -1,2 +1,2 @@
1
- async function n(){try{return await import('./utils-FHHKXQ5Z.js')}catch(a){return console.warn("Solana utilities not available:",a),null}}async function r(){let a=await n();return {getChains(t,e){return a?.getSolanaClusters?a.getSolanaClusters(t,e):t&&typeof t=="object"?Object.keys(t):[]},isChainList(t){return a?.isSolanaChainList?a.isSolanaChainList(t):t.length>0&&t.every(e=>typeof e=="string")},getAvailableClusters(){return a?.getAvailableSolanaClusters?a.getAvailableSolanaClusters():[]},isValidCluster(t){return a?.isValidSolanaCluster?a.isValidSolanaCluster(t):false}}}async function l(){try{return await import('./utils-FHHKXQ5Z.js'),!0}catch{return false}}export{r as createSolanaAdapter,l as isSolanaAdapterAvailable};//# sourceMappingURL=solana-WHT5KTOF.js.map
2
- //# sourceMappingURL=solana-WHT5KTOF.js.map
1
+ async function n(){try{return await import('./utils-SUIRQJIA.js')}catch(a){return console.warn("Solana utilities not available:",a),null}}async function r(){let a=await n();return {getChains(t,e){return a?.getSolanaClusters?a.getSolanaClusters(t,e):t&&typeof t=="object"?Object.keys(t):[]},isChainList(t){return a?.isSolanaChainList?a.isSolanaChainList(t):t.length>0&&t.every(e=>typeof e=="string")},getAvailableClusters(){return a?.getAvailableSolanaClusters?a.getAvailableSolanaClusters():[]},isValidCluster(t){return a?.isValidSolanaCluster?a.isValidSolanaCluster(t):false}}}async function l(){try{return await import('./utils-SUIRQJIA.js'),!0}catch{return false}}export{r as createSolanaAdapter,l as isSolanaAdapterAvailable};//# sourceMappingURL=solana-GLHHYZDQ.js.map
2
+ //# sourceMappingURL=solana-GLHHYZDQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/adapters/solana.ts"],"names":["getSolanaUtils","error","createSolanaAdapter","solanaUtils","solanaRPCUrls","chains","chain","cluster","isSolanaAdapterAvailable"],"mappings":"AAiCA,eAAeA,CAAAA,EAAoD,CACjE,GAAI,CAGF,OADoB,MAAM,OAAO,qBAAoB,CAEvD,CAAA,MAASC,CAAAA,CAAO,CACd,eAAQ,IAAA,CAAK,iCAAA,CAAmCA,CAAK,CAAA,CAC9C,IACT,CACF,CAiCA,eAAsBC,CAAAA,EAA6C,CACjE,IAAMC,CAAAA,CAAc,MAAMH,CAAAA,GAE1B,OAAO,CAQL,SAAA,CAAUI,CAAAA,CAAoBC,CAAAA,CAAmC,CAE/D,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBC,CAAAA,CAAeC,CAAM,EAIxDD,CAAAA,EAAiB,OAAOA,CAAAA,EAAkB,QAAA,CACrC,MAAA,CAAO,IAAA,CAAKA,CAAa,CAAA,CAE3B,EACT,CAAA,CASA,WAAA,CAAYC,CAAAA,CAAsC,CAChD,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBE,CAAM,CAAA,CAItCA,EAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOC,CAAAA,EAAU,OAAOA,GAAU,QAAQ,CAC/E,CAAA,CAcA,oBAAA,EAAiC,CAC/B,OAAIH,CAAAA,EAAa,0BAAA,CACRA,CAAAA,CAAY,0BAAA,EAA2B,CAEzC,EACT,CAAA,CAkBA,eAAeI,CAAAA,CAA0B,CACvC,OAAIJ,CAAAA,EAAa,oBAAA,CACRA,CAAAA,CAAY,oBAAA,CAAqBI,CAAO,CAAA,CAE1C,KACT,CACF,CACF,CAuBA,eAAsBC,GAA6C,CACjE,GAAI,CACF,OAAA,MAAM,OAAO,qBAAoB,CAAA,CAC1B,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF","file":"solana-2MXIY6UT.js","sourcesContent":["import type { ChainAdapter } from './types';\n\n/**\n * Solana utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface SolanaUtilsModule {\n getSolanaClusters?: (solanaRPCUrls: any, chains?: any) => string[];\n isSolanaChainList?: (chains: (string | number)[]) => boolean;\n getAvailableSolanaClusters?: () => string[];\n isValidSolanaCluster?: (cluster: string) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of Solana utilities.\n * This function attempts to load Solana-specific utilities without throwing errors\n * if the Solana package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to Solana utilities module or null if not available\n *\n * @example\n * ```typescript\n * const solanaUtils = await getSolanaUtils();\n * if (solanaUtils?.getSolanaClusters) {\n * const clusters = solanaUtils.getSolanaClusters(rpcUrls);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getSolanaUtils(): Promise<SolanaUtilsModule | null> {\n try {\n // Dynamic import of Solana utilities - fails gracefully if package not installed\n const solanaUtils = await import('../../solana/utils');\n return solanaUtils;\n } catch (error) {\n console.warn('Solana utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates a Solana chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides Solana-specific functionality while gracefully handling\n * environments where Solana utilities are not available. It includes Solana-specific\n * methods like cluster management that are unique to the Solana blockchain architecture.\n *\n * @returns Promise resolving to a configured Solana ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createSolanaAdapter();\n *\n * // Get Solana cluster names from RPC configuration\n * const clusters = adapter.getChains({\n * 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * });\n * console.log(clusters); // ['mainnet-beta', 'devnet']\n *\n * // Validate cluster list format\n * const isValid = adapter.isChainList(['mainnet-beta', 'devnet']);\n * console.log(isValid); // true (string identifiers are valid for Solana)\n *\n * // Get available clusters\n * const availableClusters = adapter.getAvailableClusters?.();\n * console.log(availableClusters); // All configured cluster names\n * ```\n *\n * @since 1.0.0\n */\nexport async function createSolanaAdapter(): Promise<ChainAdapter> {\n const solanaUtils = await getSolanaUtils();\n\n return {\n /**\n * Extracts cluster names from Solana RPC URL configuration.\n *\n * @param solanaRPCUrls Object mapping cluster names to RPC URLs\n * @param chains Optional array of specific chains to filter\n * @returns Array of cluster names (strings)\n */\n getChains(solanaRPCUrls: any, chains?: any): (string | number)[] {\n // Use imported Solana utilities if available\n if (solanaUtils?.getSolanaClusters) {\n return solanaUtils.getSolanaClusters(solanaRPCUrls, chains);\n }\n\n // Fallback implementation for basic cluster extraction\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n return Object.keys(solanaRPCUrls);\n }\n return [];\n },\n\n /**\n * Validates whether the provided chains list conforms to Solana cluster format.\n * Solana clusters are typically identified by string names like 'mainnet-beta', 'devnet'.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for Solana\n */\n isChainList(chains: (string | number)[]): boolean {\n if (solanaUtils?.isSolanaChainList) {\n return solanaUtils.isSolanaChainList(chains);\n }\n\n // Fallback validation: Solana clusters should be strings\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n },\n\n /**\n * Gets all available Solana clusters from the current configuration.\n * This is a Solana-specific method that returns cluster names that can be used.\n *\n * @returns Array of available cluster names\n *\n * @example\n * ```typescript\n * const clusters = adapter.getAvailableClusters?.();\n * // Might return: ['mainnet-beta', 'devnet', 'testnet']\n * ```\n */\n getAvailableClusters(): string[] {\n if (solanaUtils?.getAvailableSolanaClusters) {\n return solanaUtils.getAvailableSolanaClusters();\n }\n return [];\n },\n\n /**\n * Validates whether a cluster name is valid for Solana.\n * Checks against known Solana cluster monikers and custom configurations.\n *\n * @param cluster Cluster name to validate\n * @returns True if the cluster name is valid\n *\n * @example\n * ```typescript\n * const isValid = adapter.isValidCluster?.('mainnet-beta');\n * console.log(isValid); // true\n *\n * const isInvalid = adapter.isValidCluster?.('invalid-cluster');\n * console.log(isInvalid); // false\n * ```\n */\n isValidCluster(cluster: string): boolean {\n if (solanaUtils?.isValidSolanaCluster) {\n return solanaUtils.isValidSolanaCluster(cluster);\n }\n return false;\n },\n };\n}\n\n/**\n * Checks if the Solana adapter can be created in the current environment.\n * This function verifies that the required Solana utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if Solana adapter is available\n *\n * @example\n * ```typescript\n * const hasSolana = await isSolanaAdapterAvailable();\n * if (hasSolana) {\n * const adapter = await createSolanaAdapter();\n * // Use Solana functionality\n * const clusters = adapter.getAvailableClusters?.();\n * } else {\n * console.log('Solana support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isSolanaAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../solana/utils');\n return true;\n } catch {\n return false;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/adapters/solana.ts"],"names":["getSolanaUtils","error","createSolanaAdapter","solanaUtils","solanaRPCUrls","chains","chain","cluster","isSolanaAdapterAvailable"],"mappings":"AAiCA,eAAeA,CAAAA,EAAoD,CACjE,GAAI,CAGF,OADoB,MAAM,OAAO,qBAAoB,CAEvD,CAAA,MAASC,CAAAA,CAAO,CACd,eAAQ,IAAA,CAAK,iCAAA,CAAmCA,CAAK,CAAA,CAC9C,IACT,CACF,CAiCA,eAAsBC,CAAAA,EAA6C,CACjE,IAAMC,CAAAA,CAAc,MAAMH,CAAAA,GAE1B,OAAO,CAQL,SAAA,CAAUI,CAAAA,CAAoBC,CAAAA,CAAmC,CAE/D,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBC,CAAAA,CAAeC,CAAM,EAIxDD,CAAAA,EAAiB,OAAOA,CAAAA,EAAkB,QAAA,CACrC,MAAA,CAAO,IAAA,CAAKA,CAAa,CAAA,CAE3B,EACT,CAAA,CASA,WAAA,CAAYC,CAAAA,CAAsC,CAChD,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBE,CAAM,CAAA,CAItCA,EAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOC,CAAAA,EAAU,OAAOA,GAAU,QAAQ,CAC/E,CAAA,CAcA,oBAAA,EAAiC,CAC/B,OAAIH,CAAAA,EAAa,0BAAA,CACRA,CAAAA,CAAY,0BAAA,EAA2B,CAEzC,EACT,CAAA,CAkBA,eAAeI,CAAAA,CAA0B,CACvC,OAAIJ,CAAAA,EAAa,oBAAA,CACRA,CAAAA,CAAY,oBAAA,CAAqBI,CAAO,CAAA,CAE1C,KACT,CACF,CACF,CAuBA,eAAsBC,GAA6C,CACjE,GAAI,CACF,OAAA,MAAM,OAAO,qBAAoB,CAAA,CAC1B,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF","file":"solana-GLHHYZDQ.js","sourcesContent":["import type { ChainAdapter } from './types';\n\n/**\n * Solana utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface SolanaUtilsModule {\n getSolanaClusters?: (solanaRPCUrls: any, chains?: any) => string[];\n isSolanaChainList?: (chains: (string | number)[]) => boolean;\n getAvailableSolanaClusters?: () => string[];\n isValidSolanaCluster?: (cluster: string) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of Solana utilities.\n * This function attempts to load Solana-specific utilities without throwing errors\n * if the Solana package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to Solana utilities module or null if not available\n *\n * @example\n * ```typescript\n * const solanaUtils = await getSolanaUtils();\n * if (solanaUtils?.getSolanaClusters) {\n * const clusters = solanaUtils.getSolanaClusters(rpcUrls);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getSolanaUtils(): Promise<SolanaUtilsModule | null> {\n try {\n // Dynamic import of Solana utilities - fails gracefully if package not installed\n const solanaUtils = await import('../../solana/utils');\n return solanaUtils;\n } catch (error) {\n console.warn('Solana utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates a Solana chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides Solana-specific functionality while gracefully handling\n * environments where Solana utilities are not available. It includes Solana-specific\n * methods like cluster management that are unique to the Solana blockchain architecture.\n *\n * @returns Promise resolving to a configured Solana ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createSolanaAdapter();\n *\n * // Get Solana cluster names from RPC configuration\n * const clusters = adapter.getChains({\n * 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * });\n * console.log(clusters); // ['mainnet-beta', 'devnet']\n *\n * // Validate cluster list format\n * const isValid = adapter.isChainList(['mainnet-beta', 'devnet']);\n * console.log(isValid); // true (string identifiers are valid for Solana)\n *\n * // Get available clusters\n * const availableClusters = adapter.getAvailableClusters?.();\n * console.log(availableClusters); // All configured cluster names\n * ```\n *\n * @since 1.0.0\n */\nexport async function createSolanaAdapter(): Promise<ChainAdapter> {\n const solanaUtils = await getSolanaUtils();\n\n return {\n /**\n * Extracts cluster names from Solana RPC URL configuration.\n *\n * @param solanaRPCUrls Object mapping cluster names to RPC URLs\n * @param chains Optional array of specific chains to filter\n * @returns Array of cluster names (strings)\n */\n getChains(solanaRPCUrls: any, chains?: any): (string | number)[] {\n // Use imported Solana utilities if available\n if (solanaUtils?.getSolanaClusters) {\n return solanaUtils.getSolanaClusters(solanaRPCUrls, chains);\n }\n\n // Fallback implementation for basic cluster extraction\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n return Object.keys(solanaRPCUrls);\n }\n return [];\n },\n\n /**\n * Validates whether the provided chains list conforms to Solana cluster format.\n * Solana clusters are typically identified by string names like 'mainnet-beta', 'devnet'.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for Solana\n */\n isChainList(chains: (string | number)[]): boolean {\n if (solanaUtils?.isSolanaChainList) {\n return solanaUtils.isSolanaChainList(chains);\n }\n\n // Fallback validation: Solana clusters should be strings\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n },\n\n /**\n * Gets all available Solana clusters from the current configuration.\n * This is a Solana-specific method that returns cluster names that can be used.\n *\n * @returns Array of available cluster names\n *\n * @example\n * ```typescript\n * const clusters = adapter.getAvailableClusters?.();\n * // Might return: ['mainnet-beta', 'devnet', 'testnet']\n * ```\n */\n getAvailableClusters(): string[] {\n if (solanaUtils?.getAvailableSolanaClusters) {\n return solanaUtils.getAvailableSolanaClusters();\n }\n return [];\n },\n\n /**\n * Validates whether a cluster name is valid for Solana.\n * Checks against known Solana cluster monikers and custom configurations.\n *\n * @param cluster Cluster name to validate\n * @returns True if the cluster name is valid\n *\n * @example\n * ```typescript\n * const isValid = adapter.isValidCluster?.('mainnet-beta');\n * console.log(isValid); // true\n *\n * const isInvalid = adapter.isValidCluster?.('invalid-cluster');\n * console.log(isInvalid); // false\n * ```\n */\n isValidCluster(cluster: string): boolean {\n if (solanaUtils?.isValidSolanaCluster) {\n return solanaUtils.isValidSolanaCluster(cluster);\n }\n return false;\n },\n };\n}\n\n/**\n * Checks if the Solana adapter can be created in the current environment.\n * This function verifies that the required Solana utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if Solana adapter is available\n *\n * @example\n * ```typescript\n * const hasSolana = await isSolanaAdapterAvailable();\n * if (hasSolana) {\n * const adapter = await createSolanaAdapter();\n * // Use Solana functionality\n * const clusters = adapter.getAvailableClusters?.();\n * } else {\n * console.log('Solana support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isSolanaAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../solana/utils');\n return true;\n } catch {\n return false;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';async function n(){try{return await import('./utils-H5O25MTI.cjs')}catch(a){return console.warn("Solana utilities not available:",a),null}}async function r(){let a=await n();return {getChains(t,e){return a?.getSolanaClusters?a.getSolanaClusters(t,e):t&&typeof t=="object"?Object.keys(t):[]},isChainList(t){return a?.isSolanaChainList?a.isSolanaChainList(t):t.length>0&&t.every(e=>typeof e=="string")},getAvailableClusters(){return a?.getAvailableSolanaClusters?a.getAvailableSolanaClusters():[]},isValidCluster(t){return a?.isValidSolanaCluster?a.isValidSolanaCluster(t):false}}}async function l(){try{return await import('./utils-H5O25MTI.cjs'),!0}catch{return false}}exports.createSolanaAdapter=r;exports.isSolanaAdapterAvailable=l;//# sourceMappingURL=solana-JUU54KQ3.cjs.map
2
+ //# sourceMappingURL=solana-JUU54KQ3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/adapters/solana.ts"],"names":["getSolanaUtils","error","createSolanaAdapter","solanaUtils","solanaRPCUrls","chains","chain","cluster","isSolanaAdapterAvailable"],"mappings":"aAiCA,eAAeA,CAAAA,EAAoD,CACjE,GAAI,CAGF,OADoB,MAAM,OAAO,sBAAoB,CAEvD,CAAA,MAASC,CAAAA,CAAO,CACd,eAAQ,IAAA,CAAK,iCAAA,CAAmCA,CAAK,CAAA,CAC9C,IACT,CACF,CAiCA,eAAsBC,CAAAA,EAA6C,CACjE,IAAMC,CAAAA,CAAc,MAAMH,CAAAA,GAE1B,OAAO,CAQL,SAAA,CAAUI,CAAAA,CAAoBC,CAAAA,CAAmC,CAE/D,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBC,CAAAA,CAAeC,CAAM,EAIxDD,CAAAA,EAAiB,OAAOA,CAAAA,EAAkB,QAAA,CACrC,MAAA,CAAO,IAAA,CAAKA,CAAa,CAAA,CAE3B,EACT,CAAA,CASA,WAAA,CAAYC,CAAAA,CAAsC,CAChD,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBE,CAAM,CAAA,CAItCA,EAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOC,CAAAA,EAAU,OAAOA,GAAU,QAAQ,CAC/E,CAAA,CAcA,oBAAA,EAAiC,CAC/B,OAAIH,CAAAA,EAAa,0BAAA,CACRA,CAAAA,CAAY,0BAAA,EAA2B,CAEzC,EACT,CAAA,CAkBA,eAAeI,CAAAA,CAA0B,CACvC,OAAIJ,CAAAA,EAAa,oBAAA,CACRA,CAAAA,CAAY,oBAAA,CAAqBI,CAAO,CAAA,CAE1C,KACT,CACF,CACF,CAuBA,eAAsBC,GAA6C,CACjE,GAAI,CACF,OAAA,MAAM,OAAO,sBAAoB,CAAA,CAC1B,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF","file":"solana-JUU54KQ3.cjs","sourcesContent":["import type { ChainAdapter } from './types';\n\n/**\n * Solana utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface SolanaUtilsModule {\n getSolanaClusters?: (solanaRPCUrls: any, chains?: any) => string[];\n isSolanaChainList?: (chains: (string | number)[]) => boolean;\n getAvailableSolanaClusters?: () => string[];\n isValidSolanaCluster?: (cluster: string) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of Solana utilities.\n * This function attempts to load Solana-specific utilities without throwing errors\n * if the Solana package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to Solana utilities module or null if not available\n *\n * @example\n * ```typescript\n * const solanaUtils = await getSolanaUtils();\n * if (solanaUtils?.getSolanaClusters) {\n * const clusters = solanaUtils.getSolanaClusters(rpcUrls);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getSolanaUtils(): Promise<SolanaUtilsModule | null> {\n try {\n // Dynamic import of Solana utilities - fails gracefully if package not installed\n const solanaUtils = await import('../../solana/utils');\n return solanaUtils;\n } catch (error) {\n console.warn('Solana utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates a Solana chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides Solana-specific functionality while gracefully handling\n * environments where Solana utilities are not available. It includes Solana-specific\n * methods like cluster management that are unique to the Solana blockchain architecture.\n *\n * @returns Promise resolving to a configured Solana ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createSolanaAdapter();\n *\n * // Get Solana cluster names from RPC configuration\n * const clusters = adapter.getChains({\n * 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * });\n * console.log(clusters); // ['mainnet-beta', 'devnet']\n *\n * // Validate cluster list format\n * const isValid = adapter.isChainList(['mainnet-beta', 'devnet']);\n * console.log(isValid); // true (string identifiers are valid for Solana)\n *\n * // Get available clusters\n * const availableClusters = adapter.getAvailableClusters?.();\n * console.log(availableClusters); // All configured cluster names\n * ```\n *\n * @since 1.0.0\n */\nexport async function createSolanaAdapter(): Promise<ChainAdapter> {\n const solanaUtils = await getSolanaUtils();\n\n return {\n /**\n * Extracts cluster names from Solana RPC URL configuration.\n *\n * @param solanaRPCUrls Object mapping cluster names to RPC URLs\n * @param chains Optional array of specific chains to filter\n * @returns Array of cluster names (strings)\n */\n getChains(solanaRPCUrls: any, chains?: any): (string | number)[] {\n // Use imported Solana utilities if available\n if (solanaUtils?.getSolanaClusters) {\n return solanaUtils.getSolanaClusters(solanaRPCUrls, chains);\n }\n\n // Fallback implementation for basic cluster extraction\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n return Object.keys(solanaRPCUrls);\n }\n return [];\n },\n\n /**\n * Validates whether the provided chains list conforms to Solana cluster format.\n * Solana clusters are typically identified by string names like 'mainnet-beta', 'devnet'.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for Solana\n */\n isChainList(chains: (string | number)[]): boolean {\n if (solanaUtils?.isSolanaChainList) {\n return solanaUtils.isSolanaChainList(chains);\n }\n\n // Fallback validation: Solana clusters should be strings\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n },\n\n /**\n * Gets all available Solana clusters from the current configuration.\n * This is a Solana-specific method that returns cluster names that can be used.\n *\n * @returns Array of available cluster names\n *\n * @example\n * ```typescript\n * const clusters = adapter.getAvailableClusters?.();\n * // Might return: ['mainnet-beta', 'devnet', 'testnet']\n * ```\n */\n getAvailableClusters(): string[] {\n if (solanaUtils?.getAvailableSolanaClusters) {\n return solanaUtils.getAvailableSolanaClusters();\n }\n return [];\n },\n\n /**\n * Validates whether a cluster name is valid for Solana.\n * Checks against known Solana cluster monikers and custom configurations.\n *\n * @param cluster Cluster name to validate\n * @returns True if the cluster name is valid\n *\n * @example\n * ```typescript\n * const isValid = adapter.isValidCluster?.('mainnet-beta');\n * console.log(isValid); // true\n *\n * const isInvalid = adapter.isValidCluster?.('invalid-cluster');\n * console.log(isInvalid); // false\n * ```\n */\n isValidCluster(cluster: string): boolean {\n if (solanaUtils?.isValidSolanaCluster) {\n return solanaUtils.isValidSolanaCluster(cluster);\n }\n return false;\n },\n };\n}\n\n/**\n * Checks if the Solana adapter can be created in the current environment.\n * This function verifies that the required Solana utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if Solana adapter is available\n *\n * @example\n * ```typescript\n * const hasSolana = await isSolanaAdapterAvailable();\n * if (hasSolana) {\n * const adapter = await createSolanaAdapter();\n * // Use Solana functionality\n * const clusters = adapter.getAvailableClusters?.();\n * } else {\n * console.log('Solana support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isSolanaAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../solana/utils');\n return true;\n } catch {\n return false;\n }\n}\n"]}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @description
3
+ * This interface provides default fallback types for chain configurations.
4
+ * Chain-specific packages will use module augmentation to override these
5
+ * with more specific types while maintaining backward compatibility.
6
+ *
7
+ * Default values are `any` to ensure the system works without specific
8
+ * chain packages, but gets enhanced type safety when they are installed.
9
+ */
10
+ interface AllChainConfigs {
11
+ /**
12
+ * App chains configuration - defaults to any, gets enhanced by chain-specific packages
13
+ * @default any - Will be typed as `readonly [Chain, ...Chain[]]` when viem is available
14
+ */
15
+ appChains?: any;
16
+ /**
17
+ * Solana RPC URLs configuration - defaults to any, gets enhanced by Solana packages
18
+ * @default any - Will be typed as `Partial<Record<SolanaClusterMoniker, string>>` when gill is available
19
+ */
20
+ solanaRPCUrls?: any;
21
+ }
22
+ /**
23
+ * Union type for all supported chain configurations.
24
+ * Gets automatically extended when packages augment AllChainConfigs.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Without specific packages - uses any types
29
+ * const config: InitialChains = {
30
+ * appChains: [], // any
31
+ * solanaRPCUrls: {} // any
32
+ * }
33
+ *
34
+ * // With viem package installed - gets proper Chain[] typing
35
+ * // With gill package installed - gets proper SolanaClusterMoniker typing
36
+ * ```
37
+ */
38
+ type InitialChains = AllChainConfigs;
39
+ /**
40
+ * Array of chain identifiers (replaces IdentifierArray from @wallet-standard/base)
41
+ * Can contain strings, numbers, or other primitive types
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const chainIds: ChainIdentifierArray = ['ethereum', 1, 'solana:mainnet-beta'];
46
+ * ```
47
+ */
48
+ type ChainIdentifierArray = readonly (string | number)[];
49
+
50
+ export type { AllChainConfigs as A, ChainIdentifierArray as C, InitialChains as I };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @description
3
+ * This interface provides default fallback types for chain configurations.
4
+ * Chain-specific packages will use module augmentation to override these
5
+ * with more specific types while maintaining backward compatibility.
6
+ *
7
+ * Default values are `any` to ensure the system works without specific
8
+ * chain packages, but gets enhanced type safety when they are installed.
9
+ */
10
+ interface AllChainConfigs {
11
+ /**
12
+ * App chains configuration - defaults to any, gets enhanced by chain-specific packages
13
+ * @default any - Will be typed as `readonly [Chain, ...Chain[]]` when viem is available
14
+ */
15
+ appChains?: any;
16
+ /**
17
+ * Solana RPC URLs configuration - defaults to any, gets enhanced by Solana packages
18
+ * @default any - Will be typed as `Partial<Record<SolanaClusterMoniker, string>>` when gill is available
19
+ */
20
+ solanaRPCUrls?: any;
21
+ }
22
+ /**
23
+ * Union type for all supported chain configurations.
24
+ * Gets automatically extended when packages augment AllChainConfigs.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Without specific packages - uses any types
29
+ * const config: InitialChains = {
30
+ * appChains: [], // any
31
+ * solanaRPCUrls: {} // any
32
+ * }
33
+ *
34
+ * // With viem package installed - gets proper Chain[] typing
35
+ * // With gill package installed - gets proper SolanaClusterMoniker typing
36
+ * ```
37
+ */
38
+ type InitialChains = AllChainConfigs;
39
+ /**
40
+ * Array of chain identifiers (replaces IdentifierArray from @wallet-standard/base)
41
+ * Can contain strings, numbers, or other primitive types
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const chainIds: ChainIdentifierArray = ['ethereum', 1, 'solana:mainnet-beta'];
46
+ * ```
47
+ */
48
+ type ChainIdentifierArray = readonly (string | number)[];
49
+
50
+ export type { AllChainConfigs as A, ChainIdentifierArray as C, InitialChains as I };
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkCEGEQMI2_cjs=require('./chunk-CEGEQMI2.cjs');Object.defineProperty(exports,"getEvmChains",{enumerable:true,get:function(){return chunkCEGEQMI2_cjs.a}});Object.defineProperty(exports,"isEvmChainList",{enumerable:true,get:function(){return chunkCEGEQMI2_cjs.b}});//# sourceMappingURL=utils-DZB4ZTS4.cjs.map
2
+ //# sourceMappingURL=utils-DZB4ZTS4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils-DZB4ZTS4.cjs"}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkDYDY3FCT_cjs=require('./chunk-DYDY3FCT.cjs');Object.defineProperty(exports,"getAvailableSolanaClusters",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.c}});Object.defineProperty(exports,"getSolanaClusters",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.a}});Object.defineProperty(exports,"isSolanaChainList",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.b}});Object.defineProperty(exports,"isValidSolanaCluster",{enumerable:true,get:function(){return chunkDYDY3FCT_cjs.d}});//# sourceMappingURL=utils-H5O25MTI.cjs.map
2
+ //# sourceMappingURL=utils-H5O25MTI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils-H5O25MTI.cjs"}
@@ -0,0 +1,2 @@
1
+ export{c as getAvailableSolanaClusters,a as getSolanaClusters,b as isSolanaChainList,d as isValidSolanaCluster}from'./chunk-J4TY3CJF.js';//# sourceMappingURL=utils-SUIRQJIA.js.map
2
+ //# sourceMappingURL=utils-SUIRQJIA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"utils-72MDY3OH.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils-SUIRQJIA.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuwaio/nova-connect",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",
@@ -15,16 +15,6 @@
15
15
  "import": "./dist/index.cjs",
16
16
  "default": "./dist/index.js"
17
17
  },
18
- "./hooks": {
19
- "types": "./dist/hooks/index.d.ts",
20
- "import": "./dist/hooks/index.cjs",
21
- "default": "./dist/hooks/index.js"
22
- },
23
- "./providers": {
24
- "types": "./dist/providers/index.d.ts",
25
- "import": "./dist/providers/index.cjs",
26
- "default": "./dist/providers/index.js"
27
- },
28
18
  "./evm": {
29
19
  "types": "./dist/evm/index.d.ts",
30
20
  "import": "./dist/evm/index.cjs",
@@ -74,6 +64,9 @@
74
64
  "url": "https://github.com/Argeare5"
75
65
  }
76
66
  ],
67
+ "dependencies": {
68
+ "@tuwaio/satellite-react": "^0.1.1"
69
+ },
77
70
  "peerDependencies": {
78
71
  "@bgd-labs/react-web3-icons": ">=1.5",
79
72
  "@heroicons/react": "2.x.x",
@@ -84,7 +77,6 @@
84
77
  "@tuwaio/orbit-solana": ">=0.1",
85
78
  "@tuwaio/satellite-core": ">=0.1",
86
79
  "@tuwaio/satellite-evm": ">=0.1",
87
- "@tuwaio/satellite-react": ">=0.1",
88
80
  "@tuwaio/satellite-solana": ">=0.1",
89
81
  "@tuwaio/pulsar-core": ">=0.2",
90
82
  "@tuwaio/nova-core": ">=0",
@@ -122,9 +114,6 @@
122
114
  "@tuwaio/satellite-core": {
123
115
  "optional": false
124
116
  },
125
- "@tuwaio/satellite-react": {
126
- "optional": false
127
- },
128
117
  "@tuwaio/pulsar-core": {
129
118
  "optional": false
130
119
  },
@@ -196,7 +185,6 @@
196
185
  "@tuwaio/orbit-solana": "^0.1.0",
197
186
  "@tuwaio/satellite-core": "^0.1.0",
198
187
  "@tuwaio/satellite-evm": "^0.1.0",
199
- "@tuwaio/satellite-react": "^0.1.0",
200
188
  "@tuwaio/satellite-solana": "^0.1.0",
201
189
  "@tuwaio/pulsar-core": "^0.2.0",
202
190
  "@wallet-standard/react": "^1.0.1",
@@ -224,8 +212,8 @@
224
212
  "tw-animate-css": "^1.4.0",
225
213
  "typescript": "^5.9.3",
226
214
  "tsup": "^8.5.0",
227
- "@tuwaio/nova-transactions": "^0.1.0",
228
- "@tuwaio/nova-core": "^0.1.0"
215
+ "@tuwaio/nova-core": "^0.1.0",
216
+ "@tuwaio/nova-transactions": "^0.1.0"
229
217
  },
230
218
  "scripts": {
231
219
  "start": "tsup src/index.ts --watch",
@@ -1,2 +0,0 @@
1
- export{a as getEvmChains,b as isEvmChainList}from'./chunk-RR5G7U5F.js';//# sourceMappingURL=evm-F7OJEDX3.js.map
2
- //# sourceMappingURL=evm-F7OJEDX3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"evm-F7OJEDX3.js"}
@@ -1,2 +0,0 @@
1
- 'use strict';var novaCore=require('@tuwaio/nova-core'),orbitCore=require('@tuwaio/orbit-core'),react=require('react');function z(m){let{abbreviateSymbols:e=12,maxNameLength:n=30,autoRetry:y=false,retryDelay:B=3e3,store:v}=m,c=v.getState().getAdapter,l=react.useMemo(()=>m.activeWallet?.address,[m.activeWallet?.address]),t=react.useMemo(()=>m.activeWallet?.walletType,[m.activeWallet?.walletType]),a=react.useMemo(()=>t?c(orbitCore.getAdapterFromWalletType(t??`${orbitCore.OrbitAdapter.EVM}:not-connected`)):null,[c,t]),[r,o]=react.useState(null),[T,p]=react.useState(null),[C,i]=react.useState(false),[b,u]=react.useState(null),d=react.useRef(null),R=react.useRef(null),x=react.useMemo(()=>{if(!a)return {hasNameResolver:false,hasAvatarResolver:false};let f="getName"in a&&typeof a.getName=="function",s="getAvatar"in a&&typeof a.getAvatar=="function";return {hasNameResolver:f,hasAvatarResolver:s}},[a]),g=react.useCallback(()=>{d.current&&(d.current.abort(),d.current=null),R.current!==null&&(clearTimeout(R.current),R.current=null);},[]),N=react.useCallback(async()=>{if(g(),!l||!a||!x.hasNameResolver){o(null),p(null),i(false),u(null);return}d.current=new AbortController;let{signal:f}=d.current;i(true),u(null),o(null),p(null);try{if(f.aborted)return;let s=await a.getName?.(l);if(f.aborted)return;if(s&&(o(s),x.hasAvatarResolver))try{let h=await a.getAvatar?.(s);f.aborted||p(h??null);}catch(h){console.warn("Failed to fetch avatar:",h),f.aborted||p(null);}}catch(s){if(f.aborted)return;let h=s instanceof Error?s.message:"Failed to fetch name service data";console.error("Failed to fetch name service data:",s),u(h),o(null),p(null),y&&(R.current=setTimeout(()=>{N();},B));}finally{f.aborted||i(false);}},[l,a,x,y,B,g]),$=react.useCallback(()=>{u(null),N();},[N]);react.useEffect(()=>(N(),g),[N,g]),react.useEffect(()=>g,[g]);let M=react.useMemo(()=>r?r.length>n?novaCore.textCenterEllipsis(r,e,e):r:l?novaCore.textCenterEllipsis(l,e,e):void 0,[r,l,n,e]);return {ensName:r,ensAvatar:T,isLoading:C,ensNameAbbreviated:M,error:b,retry:$}}function W({store:m,activeWallet:e}){let[n,y]=react.useState({}),[B,v]=react.useState(false),c=react.useRef(null),l=m.getState().getAdapter,t=react.useMemo(()=>e?.chainId&&e?.address?`${e.address}-${e.chainId}`:null,[e?.chainId,e?.address]),a=react.useMemo(()=>e?.walletType?l(orbitCore.getAdapterFromWalletType(e.walletType)):null,[l,e?.walletType]),r=react.useMemo(()=>a&&"getBalance"in a&&typeof a.getBalance=="function",[a]),o=react.useCallback(async(C=false)=>{if(!e?.address||!a||!e?.chainId||!t||!r){v(false);return}let i=`${t}-${Date.now()}`;if(c.current=i,!C&&n[t]){v(false);return}v(true);try{let b=await a.getBalance(e.address,e.chainId);c.current===i&&y(u=>({...u,[t]:b}));}catch(b){console.error(`Failed to fetch native balance for ${t}:`,b),C&&c.current===i&&y(u=>{let d={...u};return delete d[t],d});}finally{c.current===i&&v(false);}},[e?.address,a,e?.chainId,t,r,n]),T=react.useCallback(()=>{o(true);},[o]);return react.useEffect(()=>{t&&r&&!n[t]?o(false):(!t||!r)&&v(false);},[t,r,n,o]),react.useEffect(()=>()=>{c.current=null;},[]),{balance:react.useMemo(()=>t&&n[t]||null,[t,n]),isLoading:B,refetch:T}}exports.useGetWalletNameAndAvatar=z;exports.useWalletNativeBalance=W;//# sourceMappingURL=index.cjs.map
2
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/hooks/useGetWalletNameAndAvatar.ts","../../src/hooks/useWalletNativeBalance.ts"],"names":["useGetWalletNameAndAvatar","options","abbreviateSymbols","maxNameLength","autoRetry","retryDelay","store","getAdapter","walletAddress","useMemo","walletType","foundAdapter","getAdapterFromWalletType","OrbitAdapter","ensName","setEnsName","useState","ensAvatar","setEnsAvatar","isLoading","setIsLoading","error","setError","abortControllerRef","useRef","retryTimeoutRef","adapterCapabilities","hasNameResolver","hasAvatarResolver","cleanup","useCallback","fetchNameData","signal","name","avatar","avatarError","errorMessage","retry","useEffect","ensNameAbbreviated","textCenterEllipsis","useWalletNativeBalance","activeWallet","balanceCache","setBalanceCache","fetchOperationRef","cacheKey","hasBalanceResolver","fetchBalance","forceRefresh","operationId","balanceResult","prevCache","newCache","refetch"],"mappings":"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","file":"index.cjs","sourcesContent":["import { textCenterEllipsis } from '@tuwaio/nova-core';\nimport { getAdapterFromWalletType, OrbitAdapter } from '@tuwaio/orbit-core';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { NovaConnectProviderProps, NovaConnectProviderType } from './useNovaConnect';\n\nexport interface WalletNameAndAvatarData {\n /** The resolved name from the Name Service (e.g., ENS, like \"alice.eth\"), or null if not found. */\n ensName: string | null;\n /** The URL of the avatar associated with the name, or null if not found. */\n ensAvatar: string | null;\n /** True while the name service data is being fetched. */\n isLoading: boolean;\n /** A truncated version of the name for display, or the abbreviated address if no name. */\n ensNameAbbreviated: string | undefined;\n /** Error message if the name resolution failed. */\n error: string | null;\n /** Function to retry the name resolution manually. */\n retry: () => void;\n}\n\ninterface UseGetWalletNameAndAvatarOptions\n extends Pick<NovaConnectProviderProps, 'store'>,\n Pick<NovaConnectProviderType, 'activeWallet'> {\n /** Number of characters to show on each side when abbreviating (default: 12) */\n abbreviateSymbols?: number;\n /** Maximum length before abbreviation is applied (default: 30) */\n maxNameLength?: number;\n /** Whether to automatically retry on failure (default: false) */\n autoRetry?: boolean;\n /** Retry delay in milliseconds (default: 3000) */\n retryDelay?: number;\n}\n\n/**\n * A custom hook to fetch the Name Service (e.g., ENS) name and avatar\n * for the currently active wallet.\n *\n * This hook automatically detects the active wallet and its corresponding\n * adapter via the `useSatelliteConnectStore` and attempts to resolve the\n * wallet address to a human-readable name and avatar.\n *\n * @param options Configuration options for the hook\n * @returns An object containing the resolved name, avatar, loading state, and utility functions\n *\n * @example\n * ```typescript\n * import { useGetWalletNameAndAvatar } from './useGetWalletNameAndAvatar';\n *\n * function DisplayWalletInfo() {\n * const { ensName, ensAvatar, isLoading, ensNameAbbreviated, error, retry } = useGetWalletNameAndAvatar({\n * abbreviateSymbols: 8,\n * maxNameLength: 25\n * });\n *\n * if (isLoading) {\n * return <div>Resolving name...</div>;\n * }\n *\n * if (error) {\n * return <div>Error: {error} <button onClick={retry}>Retry</button></div>;\n * }\n *\n * return (\n * <div className=\"wallet-info\">\n * {ensAvatar && <img src={ensAvatar} alt=\"Wallet Avatar\" />}\n * <p title={ensName || ''}>{ensNameAbbreviated || 'No Name Found'}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useGetWalletNameAndAvatar(options: UseGetWalletNameAndAvatarOptions): WalletNameAndAvatarData {\n const { abbreviateSymbols = 12, maxNameLength = 30, autoRetry = false, retryDelay = 3000, store } = options;\n\n // Store state selectors - memoized for performance\n const getAdapter = store.getState().getAdapter;\n\n // Memoize wallet address and adapter for dependency tracking\n const walletAddress = useMemo(() => options.activeWallet?.address, [options.activeWallet?.address]);\n const walletType = useMemo(() => options.activeWallet?.walletType, [options.activeWallet?.walletType]);\n\n const foundAdapter = useMemo(() => {\n if (!walletType) return null;\n return getAdapter(getAdapterFromWalletType(walletType ?? `${OrbitAdapter.EVM}:not-connected`));\n }, [getAdapter, walletType]);\n\n // State variables\n const [ensName, setEnsName] = useState<string | null>(null);\n const [ensAvatar, setEnsAvatar] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Refs for cleanup and retry functionality\n const abortControllerRef = useRef<AbortController | null>(null);\n const retryTimeoutRef = useRef<number | null>(null);\n\n // Memoize adapter capabilities\n const adapterCapabilities = useMemo(() => {\n if (!foundAdapter) {\n return { hasNameResolver: false, hasAvatarResolver: false };\n }\n\n const hasNameResolver = 'getName' in foundAdapter && typeof foundAdapter.getName === 'function';\n const hasAvatarResolver = 'getAvatar' in foundAdapter && typeof foundAdapter.getAvatar === 'function';\n\n return { hasNameResolver, hasAvatarResolver };\n }, [foundAdapter]);\n\n // Cleanup function\n const cleanup = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (retryTimeoutRef.current !== null) {\n clearTimeout(retryTimeoutRef.current);\n retryTimeoutRef.current = null;\n }\n }, []);\n\n // Main fetch function\n const fetchNameData = useCallback(async () => {\n cleanup();\n\n // Exit conditions\n if (!walletAddress || !foundAdapter || !adapterCapabilities.hasNameResolver) {\n setEnsName(null);\n setEnsAvatar(null);\n setIsLoading(false);\n setError(null);\n return;\n }\n\n // Create new abort controller for this request\n abortControllerRef.current = new AbortController();\n const { signal } = abortControllerRef.current;\n\n // Start loading\n setIsLoading(true);\n setError(null);\n setEnsName(null);\n setEnsAvatar(null);\n\n try {\n // Check if request was aborted\n if (signal.aborted) return;\n\n // Attempt to resolve the name\n const name = await foundAdapter.getName?.(walletAddress);\n\n if (signal.aborted) return;\n\n if (name) {\n setEnsName(name);\n\n // If avatar resolution is supported, fetch the avatar\n if (adapterCapabilities.hasAvatarResolver) {\n try {\n const avatar = await foundAdapter.getAvatar?.(name);\n if (!signal.aborted) {\n // Handle undefined case by converting to null\n setEnsAvatar(avatar ?? null);\n }\n } catch (avatarError) {\n // Avatar fetch failed, but name succeeded - not critical\n console.warn('Failed to fetch avatar:', avatarError);\n if (!signal.aborted) {\n setEnsAvatar(null);\n }\n }\n }\n }\n } catch (error) {\n if (signal.aborted) return;\n\n const errorMessage = error instanceof Error ? error.message : 'Failed to fetch name service data';\n console.error('Failed to fetch name service data:', error);\n\n setError(errorMessage);\n setEnsName(null);\n setEnsAvatar(null);\n\n // Auto retry if enabled\n if (autoRetry) {\n retryTimeoutRef.current = setTimeout(() => {\n fetchNameData();\n }, retryDelay) as unknown as number;\n }\n } finally {\n if (!signal.aborted) {\n setIsLoading(false);\n }\n }\n }, [walletAddress, foundAdapter, adapterCapabilities, autoRetry, retryDelay, cleanup]);\n\n // Manual retry function\n const retry = useCallback(() => {\n setError(null);\n fetchNameData();\n }, [fetchNameData]);\n\n // Effect to fetch data when dependencies change\n useEffect(() => {\n fetchNameData();\n return cleanup;\n }, [fetchNameData, cleanup]);\n\n // Cleanup on unmount\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n // Memoized abbreviated name computation\n const ensNameAbbreviated = useMemo(() => {\n if (ensName) {\n return ensName.length > maxNameLength\n ? textCenterEllipsis(ensName, abbreviateSymbols, abbreviateSymbols)\n : ensName;\n }\n\n return walletAddress ? textCenterEllipsis(walletAddress, abbreviateSymbols, abbreviateSymbols) : undefined;\n }, [ensName, walletAddress, maxNameLength, abbreviateSymbols]);\n\n return {\n ensName,\n ensAvatar,\n isLoading,\n ensNameAbbreviated,\n error,\n retry,\n };\n}\n","import { getAdapterFromWalletType } from '@tuwaio/orbit-core';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { NovaConnectProviderProps, NovaConnectProviderType } from './useNovaConnect';\n\n/**\n * @interface NativeBalanceResult\n * Represents the native token balance returned by the adapter.\n * The value is already formatted for human readability.\n * @property {string} value The native token balance formatted to standard decimals (e.g., \"1.5\").\n * @property {string} symbol The symbol of the native token (e.g., \"ETH\").\n */\nexport interface NativeBalanceResult {\n value: string;\n symbol: string;\n}\n\n// Type for the balance state within the hook (the fetched data or null).\ntype NativeBalanceState = NativeBalanceResult | null;\n\n// Type for the local cache: \"walletAddress-chainId\" -> { value, symbol }.\ntype BalanceCache = Record<string, NativeBalanceResult>;\n\n/**\n * @interface NativeBalanceData\n * The object returned by the useWalletNativeBalance hook.\n * @property {NativeBalanceState} balance The native token balance and symbol, or null.\n * @property {boolean} isLoading True while the balance is being fetched for the current wallet/chain combination.\n * @property {() => void} refetch Function to manually trigger a balance refresh.\n */\ninterface NativeBalanceData {\n balance: NativeBalanceState;\n isLoading: boolean;\n refetch: () => void;\n}\n\n/**\n * Custom hook to fetch the native token balance for the currently connected wallet\n * on the active chain. It includes a local cache layer to prevent redundant network calls\n * when switching between components or on re-renders for the same wallet/chain.\n *\n * @returns {NativeBalanceData} An object containing the balance data and loading state.\n *\n * @example\n * ```typescript\n * import { useWalletNativeBalance } from './useWalletNativeBalance';\n *\n * function NativeTokenDisplay() {\n * const { balance, isLoading, refetch } = useWalletNativeBalance();\n *\n * if (isLoading) {\n * return <p>Loading balance...</p>;\n * }\n *\n * // Display the formatted balance and symbol\n * return (\n * <div>\n * <p>Balance: {balance ? `${balance.value} ${balance.symbol}` : '0.00'}</p>\n * <button onClick={refetch}>Refresh</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useWalletNativeBalance({\n store,\n activeWallet,\n}: Pick<NovaConnectProviderProps, 'store'> & Pick<NovaConnectProviderType, 'activeWallet'>): NativeBalanceData {\n // --- 1. STATE & CACHE SETUP ---\n\n // Local cache storage. Keys combine wallet address and chain ID.\n const [balanceCache, setBalanceCache] = useState<BalanceCache>({});\n\n // Local loading state, managed alongside the cache check.\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n // Track the current fetch operation to prevent race conditions\n const fetchOperationRef = useRef<string | null>(null);\n\n // Store state selectors - memoized for performance\n const getAdapter = store.getState().getAdapter;\n\n // --- 2. COMPUTED INPUTS ---\n\n // Create the unique key for cache lookups: \"address-chainId\".\n const cacheKey = useMemo(() => {\n return activeWallet?.chainId && activeWallet?.address ? `${activeWallet.address}-${activeWallet.chainId}` : null;\n }, [activeWallet?.chainId, activeWallet?.address]);\n\n // Find the actual adapter object from the adapter map.\n const foundAdapter = useMemo(() => {\n if (!activeWallet?.walletType) return null;\n return getAdapter(getAdapterFromWalletType(activeWallet.walletType));\n }, [getAdapter, activeWallet?.walletType]);\n\n // Check if the adapter has balance functionality\n const hasBalanceResolver = useMemo(() => {\n return foundAdapter && 'getBalance' in foundAdapter && typeof foundAdapter.getBalance === 'function';\n }, [foundAdapter]);\n\n // --- 3. BALANCE FETCHING LOGIC ---\n\n const fetchBalance = useCallback(\n async (forceRefresh = false) => {\n // Exit early if essential data is missing (not connected).\n if (!activeWallet?.address || !foundAdapter || !activeWallet?.chainId || !cacheKey || !hasBalanceResolver) {\n setIsLoading(false);\n return;\n }\n\n // Set the current operation ID to prevent race conditions\n const operationId = `${cacheKey}-${Date.now()}`;\n fetchOperationRef.current = operationId;\n\n // Check cache unless forcing a refresh\n if (!forceRefresh) {\n const cachedBalance = balanceCache[cacheKey];\n if (cachedBalance) {\n setIsLoading(false);\n return;\n }\n }\n\n setIsLoading(true);\n\n try {\n // Call the adapter's getBalance method\n const balanceResult: NativeBalanceResult = await foundAdapter.getBalance(\n activeWallet.address,\n activeWallet.chainId,\n );\n\n // Only update if this operation is still the latest one\n if (fetchOperationRef.current === operationId) {\n setBalanceCache((prevCache) => ({\n ...prevCache,\n [cacheKey]: balanceResult,\n }));\n }\n } catch (error) {\n console.error(`Failed to fetch native balance for ${cacheKey}:`, error);\n\n // Optionally clear cache entry on error (if you want to retry on next call)\n if (forceRefresh && fetchOperationRef.current === operationId) {\n setBalanceCache((prevCache) => {\n const newCache = { ...prevCache };\n delete newCache[cacheKey];\n return newCache;\n });\n }\n } finally {\n // Only update loading state if this operation is still current\n if (fetchOperationRef.current === operationId) {\n setIsLoading(false);\n }\n }\n },\n [activeWallet?.address, foundAdapter, activeWallet?.chainId, cacheKey, hasBalanceResolver, balanceCache],\n );\n\n // Memoized refetch function that forces a refresh\n const refetch = useCallback(() => {\n fetchBalance(true);\n }, [fetchBalance]);\n\n // --- 4. EFFECT FOR INITIAL FETCH ---\n\n useEffect(() => {\n // Only fetch if we have all required data and no cached result\n if (cacheKey && hasBalanceResolver && !balanceCache[cacheKey]) {\n fetchBalance(false);\n } else if (!cacheKey || !hasBalanceResolver) {\n // Reset loading state if we can't fetch\n setIsLoading(false);\n }\n }, [cacheKey, hasBalanceResolver, balanceCache, fetchBalance]);\n\n // --- 5. CLEANUP EFFECT ---\n\n useEffect(() => {\n return () => {\n // Cancel any ongoing operations when component unmounts\n fetchOperationRef.current = null;\n };\n }, []);\n\n // --- 6. RETURNED DATA ---\n\n // The definitive balance is always derived from the cache based on the current key.\n const balance: NativeBalanceState = useMemo(() => {\n return cacheKey ? balanceCache[cacheKey] || null : null;\n }, [cacheKey, balanceCache]);\n\n // Return the fetched balance data and the loading status.\n return {\n balance, // { value: \"1.5\", symbol: \"ETH\" } or null\n isLoading,\n refetch,\n };\n}\n"]}
@@ -1,2 +0,0 @@
1
- import {textCenterEllipsis}from'@tuwaio/nova-core';import {getAdapterFromWalletType,OrbitAdapter}from'@tuwaio/orbit-core';import {useMemo,useState,useRef,useCallback,useEffect}from'react';function z(m){let{abbreviateSymbols:e=12,maxNameLength:n=30,autoRetry:y=false,retryDelay:B=3e3,store:v}=m,c=v.getState().getAdapter,l=useMemo(()=>m.activeWallet?.address,[m.activeWallet?.address]),t=useMemo(()=>m.activeWallet?.walletType,[m.activeWallet?.walletType]),a=useMemo(()=>t?c(getAdapterFromWalletType(t??`${OrbitAdapter.EVM}:not-connected`)):null,[c,t]),[r,o]=useState(null),[T,p]=useState(null),[C,i]=useState(false),[b,u]=useState(null),d=useRef(null),R=useRef(null),x=useMemo(()=>{if(!a)return {hasNameResolver:false,hasAvatarResolver:false};let f="getName"in a&&typeof a.getName=="function",s="getAvatar"in a&&typeof a.getAvatar=="function";return {hasNameResolver:f,hasAvatarResolver:s}},[a]),g=useCallback(()=>{d.current&&(d.current.abort(),d.current=null),R.current!==null&&(clearTimeout(R.current),R.current=null);},[]),N=useCallback(async()=>{if(g(),!l||!a||!x.hasNameResolver){o(null),p(null),i(false),u(null);return}d.current=new AbortController;let{signal:f}=d.current;i(true),u(null),o(null),p(null);try{if(f.aborted)return;let s=await a.getName?.(l);if(f.aborted)return;if(s&&(o(s),x.hasAvatarResolver))try{let h=await a.getAvatar?.(s);f.aborted||p(h??null);}catch(h){console.warn("Failed to fetch avatar:",h),f.aborted||p(null);}}catch(s){if(f.aborted)return;let h=s instanceof Error?s.message:"Failed to fetch name service data";console.error("Failed to fetch name service data:",s),u(h),o(null),p(null),y&&(R.current=setTimeout(()=>{N();},B));}finally{f.aborted||i(false);}},[l,a,x,y,B,g]),$=useCallback(()=>{u(null),N();},[N]);useEffect(()=>(N(),g),[N,g]),useEffect(()=>g,[g]);let M=useMemo(()=>r?r.length>n?textCenterEllipsis(r,e,e):r:l?textCenterEllipsis(l,e,e):void 0,[r,l,n,e]);return {ensName:r,ensAvatar:T,isLoading:C,ensNameAbbreviated:M,error:b,retry:$}}function W({store:m,activeWallet:e}){let[n,y]=useState({}),[B,v]=useState(false),c=useRef(null),l=m.getState().getAdapter,t=useMemo(()=>e?.chainId&&e?.address?`${e.address}-${e.chainId}`:null,[e?.chainId,e?.address]),a=useMemo(()=>e?.walletType?l(getAdapterFromWalletType(e.walletType)):null,[l,e?.walletType]),r=useMemo(()=>a&&"getBalance"in a&&typeof a.getBalance=="function",[a]),o=useCallback(async(C=false)=>{if(!e?.address||!a||!e?.chainId||!t||!r){v(false);return}let i=`${t}-${Date.now()}`;if(c.current=i,!C&&n[t]){v(false);return}v(true);try{let b=await a.getBalance(e.address,e.chainId);c.current===i&&y(u=>({...u,[t]:b}));}catch(b){console.error(`Failed to fetch native balance for ${t}:`,b),C&&c.current===i&&y(u=>{let d={...u};return delete d[t],d});}finally{c.current===i&&v(false);}},[e?.address,a,e?.chainId,t,r,n]),T=useCallback(()=>{o(true);},[o]);return useEffect(()=>{t&&r&&!n[t]?o(false):(!t||!r)&&v(false);},[t,r,n,o]),useEffect(()=>()=>{c.current=null;},[]),{balance:useMemo(()=>t&&n[t]||null,[t,n]),isLoading:B,refetch:T}}export{z as useGetWalletNameAndAvatar,W as useWalletNativeBalance};//# sourceMappingURL=index.js.map
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/hooks/useGetWalletNameAndAvatar.ts","../../src/hooks/useWalletNativeBalance.ts"],"names":["useGetWalletNameAndAvatar","options","abbreviateSymbols","maxNameLength","autoRetry","retryDelay","store","getAdapter","walletAddress","useMemo","walletType","foundAdapter","getAdapterFromWalletType","OrbitAdapter","ensName","setEnsName","useState","ensAvatar","setEnsAvatar","isLoading","setIsLoading","error","setError","abortControllerRef","useRef","retryTimeoutRef","adapterCapabilities","hasNameResolver","hasAvatarResolver","cleanup","useCallback","fetchNameData","signal","name","avatar","avatarError","errorMessage","retry","useEffect","ensNameAbbreviated","textCenterEllipsis","useWalletNativeBalance","activeWallet","balanceCache","setBalanceCache","fetchOperationRef","cacheKey","hasBalanceResolver","fetchBalance","forceRefresh","operationId","balanceResult","prevCache","newCache","refetch"],"mappings":"4LAwEO,SAASA,CAAAA,CAA0BC,EAAoE,CAC5G,GAAM,CAAE,iBAAA,CAAAC,CAAAA,CAAoB,GAAI,aAAA,CAAAC,CAAAA,CAAgB,GAAI,SAAA,CAAAC,CAAAA,CAAY,MAAO,UAAA,CAAAC,CAAAA,CAAa,IAAM,KAAA,CAAAC,CAAM,EAAIL,CAAAA,CAG9FM,CAAAA,CAAaD,CAAAA,CAAM,QAAA,GAAW,UAAA,CAG9BE,CAAAA,CAAgBC,QAAQ,IAAMR,CAAAA,CAAQ,cAAc,OAAA,CAAS,CAACA,EAAQ,YAAA,EAAc,OAAO,CAAC,CAAA,CAC5FS,CAAAA,CAAaD,QAAQ,IAAMR,CAAAA,CAAQ,cAAc,UAAA,CAAY,CAACA,CAAAA,CAAQ,YAAA,EAAc,UAAU,CAAC,CAAA,CAE/FU,EAAeF,OAAAA,CAAQ,IACtBC,EACEH,CAAAA,CAAWK,wBAAAA,CAAyBF,GAAc,CAAA,EAAGG,YAAAA,CAAa,GAAG,CAAA,cAAA,CAAgB,CAAC,EADrE,IAAA,CAEvB,CAACN,EAAYG,CAAU,CAAC,CAAA,CAGrB,CAACI,EAASC,CAAU,CAAA,CAAIC,SAAwB,IAAI,CAAA,CACpD,CAACC,CAAAA,CAAWC,CAAY,EAAIF,QAAAA,CAAwB,IAAI,EACxD,CAACG,CAAAA,CAAWC,CAAY,CAAA,CAAIJ,QAAAA,CAAS,KAAK,CAAA,CAC1C,CAACK,CAAAA,CAAOC,CAAQ,EAAIN,QAAAA,CAAwB,IAAI,EAGhDO,CAAAA,CAAqBC,MAAAA,CAA+B,IAAI,CAAA,CACxDC,CAAAA,CAAkBD,OAAsB,IAAI,CAAA,CAG5CE,EAAsBjB,OAAAA,CAAQ,IAAM,CACxC,GAAI,CAACE,EACH,OAAO,CAAE,eAAA,CAAiB,KAAA,CAAO,kBAAmB,KAAM,CAAA,CAG5D,IAAMgB,CAAAA,CAAkB,SAAA,GAAahB,GAAgB,OAAOA,CAAAA,CAAa,SAAY,UAAA,CAC/EiB,CAAAA,CAAoB,cAAejB,CAAAA,EAAgB,OAAOA,EAAa,SAAA,EAAc,UAAA,CAE3F,OAAO,CAAE,eAAA,CAAAgB,CAAAA,CAAiB,iBAAA,CAAAC,CAAkB,CAC9C,CAAA,CAAG,CAACjB,CAAY,CAAC,EAGXkB,CAAAA,CAAUC,WAAAA,CAAY,IAAM,CAC5BP,CAAAA,CAAmB,UACrBA,CAAAA,CAAmB,OAAA,CAAQ,OAAM,CACjCA,CAAAA,CAAmB,QAAU,IAAA,CAAA,CAE3BE,CAAAA,CAAgB,OAAA,GAAY,IAAA,GAC9B,aAAaA,CAAAA,CAAgB,OAAO,EACpCA,CAAAA,CAAgB,OAAA,CAAU,MAE9B,CAAA,CAAG,EAAE,CAAA,CAGCM,CAAAA,CAAgBD,YAAY,SAAY,CAI5C,GAHAD,CAAAA,EAAQ,CAGJ,CAACrB,CAAAA,EAAiB,CAACG,CAAAA,EAAgB,CAACe,EAAoB,eAAA,CAAiB,CAC3EX,EAAW,IAAI,CAAA,CACfG,EAAa,IAAI,CAAA,CACjBE,EAAa,KAAK,CAAA,CAClBE,EAAS,IAAI,CAAA,CACb,MACF,CAGAC,CAAAA,CAAmB,QAAU,IAAI,eAAA,CACjC,GAAM,CAAE,OAAAS,CAAO,CAAA,CAAIT,EAAmB,OAAA,CAGtCH,CAAAA,CAAa,IAAI,CAAA,CACjBE,CAAAA,CAAS,IAAI,CAAA,CACbP,CAAAA,CAAW,IAAI,CAAA,CACfG,CAAAA,CAAa,IAAI,CAAA,CAEjB,GAAI,CAEF,GAAIc,CAAAA,CAAO,OAAA,CAAS,OAGpB,IAAMC,CAAAA,CAAO,MAAMtB,EAAa,OAAA,GAAUH,CAAa,EAEvD,GAAIwB,CAAAA,CAAO,QAAS,OAEpB,GAAIC,IACFlB,CAAAA,CAAWkB,CAAI,EAGXP,CAAAA,CAAoB,iBAAA,CAAA,CACtB,GAAI,CACF,IAAMQ,CAAAA,CAAS,MAAMvB,EAAa,SAAA,GAAYsB,CAAI,EAC7CD,CAAAA,CAAO,OAAA,EAEVd,EAAagB,CAAAA,EAAU,IAAI,EAE/B,CAAA,MAASC,CAAAA,CAAa,CAEpB,OAAA,CAAQ,IAAA,CAAK,0BAA2BA,CAAW,CAAA,CAC9CH,EAAO,OAAA,EACVd,CAAAA,CAAa,IAAI,EAErB,CAGN,CAAA,MAASG,CAAAA,CAAO,CACd,GAAIW,CAAAA,CAAO,QAAS,OAEpB,IAAMI,EAAef,CAAAA,YAAiB,KAAA,CAAQA,EAAM,OAAA,CAAU,mCAAA,CAC9D,QAAQ,KAAA,CAAM,oCAAA,CAAsCA,CAAK,CAAA,CAEzDC,CAAAA,CAASc,CAAY,CAAA,CACrBrB,EAAW,IAAI,CAAA,CACfG,EAAa,IAAI,CAAA,CAGbd,IACFqB,CAAAA,CAAgB,OAAA,CAAU,WAAW,IAAM,CACzCM,IACF,CAAA,CAAG1B,CAAU,CAAA,EAEjB,CAAA,OAAE,CACK2B,CAAAA,CAAO,OAAA,EACVZ,EAAa,KAAK,EAEtB,CACF,CAAA,CAAG,CAACZ,EAAeG,CAAAA,CAAce,CAAAA,CAAqBtB,EAAWC,CAAAA,CAAYwB,CAAO,CAAC,CAAA,CAG/EQ,CAAAA,CAAQP,YAAY,IAAM,CAC9BR,EAAS,IAAI,CAAA,CACbS,IACF,CAAA,CAAG,CAACA,CAAa,CAAC,CAAA,CAGlBO,SAAAA,CAAU,KACRP,CAAAA,EAAc,CACPF,GACN,CAACE,CAAAA,CAAeF,CAAO,CAAC,CAAA,CAG3BS,UAAU,IACDT,CAAAA,CACN,CAACA,CAAO,CAAC,EAGZ,IAAMU,CAAAA,CAAqB9B,OAAAA,CAAQ,IAC7BK,EACKA,CAAAA,CAAQ,MAAA,CAASX,EACpBqC,kBAAAA,CAAmB1B,CAAAA,CAASZ,EAAmBA,CAAiB,CAAA,CAChEY,EAGCN,CAAAA,CAAgBgC,kBAAAA,CAAmBhC,EAAeN,CAAAA,CAAmBA,CAAiB,EAAI,MAAA,CAChG,CAACY,EAASN,CAAAA,CAAeL,CAAAA,CAAeD,CAAiB,CAAC,EAE7D,OAAO,CACL,QAAAY,CAAAA,CACA,SAAA,CAAAG,EACA,SAAA,CAAAE,CAAAA,CACA,mBAAAoB,CAAAA,CACA,KAAA,CAAAlB,EACA,KAAA,CAAAgB,CACF,CACF,CCxKO,SAASI,CAAAA,CAAuB,CACrC,KAAA,CAAAnC,CAAAA,CACA,aAAAoC,CACF,CAAA,CAA+G,CAI7G,GAAM,CAACC,CAAAA,CAAcC,CAAe,EAAI5B,QAAAA,CAAuB,EAAE,CAAA,CAG3D,CAACG,EAAWC,CAAY,CAAA,CAAIJ,SAAkB,KAAK,CAAA,CAGnD6B,EAAoBrB,MAAAA,CAAsB,IAAI,EAG9CjB,CAAAA,CAAaD,CAAAA,CAAM,UAAS,CAAE,UAAA,CAK9BwC,CAAAA,CAAWrC,OAAAA,CAAQ,IAChBiC,CAAAA,EAAc,OAAA,EAAWA,GAAc,OAAA,CAAU,CAAA,EAAGA,EAAa,OAAO,CAAA,CAAA,EAAIA,EAAa,OAAO,CAAA,CAAA,CAAK,KAC3G,CAACA,CAAAA,EAAc,QAASA,CAAAA,EAAc,OAAO,CAAC,CAAA,CAG3C/B,CAAAA,CAAeF,OAAAA,CAAQ,IACtBiC,GAAc,UAAA,CACZnC,CAAAA,CAAWK,yBAAyB8B,CAAAA,CAAa,UAAU,CAAC,CAAA,CAD7B,IAAA,CAErC,CAACnC,CAAAA,CAAYmC,CAAAA,EAAc,UAAU,CAAC,CAAA,CAGnCK,EAAqBtC,OAAAA,CAAQ,IAC1BE,GAAgB,YAAA,GAAgBA,CAAAA,EAAgB,OAAOA,CAAAA,CAAa,YAAe,UAAA,CACzF,CAACA,CAAY,CAAC,CAAA,CAIXqC,EAAelB,WAAAA,CACnB,MAAOmB,EAAe,KAAA,GAAU,CAE9B,GAAI,CAACP,CAAAA,EAAc,SAAW,CAAC/B,CAAAA,EAAgB,CAAC+B,CAAAA,EAAc,OAAA,EAAW,CAACI,CAAAA,EAAY,CAACC,CAAAA,CAAoB,CACzG3B,EAAa,KAAK,CAAA,CAClB,MACF,CAGA,IAAM8B,EAAc,CAAA,EAAGJ,CAAQ,IAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,CAI7C,GAHAD,EAAkB,OAAA,CAAUK,CAAAA,CAGxB,CAACD,CAAAA,EACmBN,EAAaG,CAAQ,CAAA,CACxB,CACjB1B,CAAAA,CAAa,KAAK,EAClB,MACF,CAGFA,EAAa,IAAI,CAAA,CAEjB,GAAI,CAEF,IAAM+B,EAAqC,MAAMxC,CAAAA,CAAa,WAC5D+B,CAAAA,CAAa,OAAA,CACbA,CAAAA,CAAa,OACf,EAGIG,CAAAA,CAAkB,OAAA,GAAYK,GAChCN,CAAAA,CAAiBQ,CAAAA,GAAe,CAC9B,GAAGA,CAAAA,CACH,CAACN,CAAQ,EAAGK,CACd,CAAA,CAAE,EAEN,OAAS9B,CAAAA,CAAO,CACd,QAAQ,KAAA,CAAM,CAAA,mCAAA,EAAsCyB,CAAQ,CAAA,CAAA,CAAA,CAAKzB,CAAK,CAAA,CAGlE4B,CAAAA,EAAgBJ,EAAkB,OAAA,GAAYK,CAAAA,EAChDN,EAAiBQ,CAAAA,EAAc,CAC7B,IAAMC,CAAAA,CAAW,CAAE,GAAGD,CAAU,CAAA,CAChC,cAAOC,CAAAA,CAASP,CAAQ,EACjBO,CACT,CAAC,EAEL,CAAA,OAAE,CAEIR,CAAAA,CAAkB,OAAA,GAAYK,GAChC9B,CAAAA,CAAa,KAAK,EAEtB,CACF,CAAA,CACA,CAACsB,CAAAA,EAAc,OAAA,CAAS/B,EAAc+B,CAAAA,EAAc,OAAA,CAASI,EAAUC,CAAAA,CAAoBJ,CAAY,CACzG,CAAA,CAGMW,CAAAA,CAAUxB,WAAAA,CAAY,IAAM,CAChCkB,CAAAA,CAAa,IAAI,EACnB,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAIjB,OAAAV,SAAAA,CAAU,IAAM,CAEVQ,CAAAA,EAAYC,CAAAA,EAAsB,CAACJ,CAAAA,CAAaG,CAAQ,EAC1DE,CAAAA,CAAa,KAAK,CAAA,CAAA,CACT,CAACF,GAAY,CAACC,CAAAA,GAEvB3B,EAAa,KAAK,EAEtB,EAAG,CAAC0B,CAAAA,CAAUC,EAAoBJ,CAAAA,CAAcK,CAAY,CAAC,CAAA,CAI7DV,SAAAA,CAAU,IACD,IAAM,CAEXO,EAAkB,OAAA,CAAU,KAC9B,EACC,EAAE,EAUE,CACL,OAAA,CANkCpC,QAAQ,IACnCqC,CAAAA,EAAWH,EAAaG,CAAQ,CAAA,EAAK,KAC3C,CAACA,CAAAA,CAAUH,CAAY,CAAC,CAAA,CAKzB,UAAAxB,CAAAA,CACA,OAAA,CAAAmC,CACF,CACF","file":"index.js","sourcesContent":["import { textCenterEllipsis } from '@tuwaio/nova-core';\nimport { getAdapterFromWalletType, OrbitAdapter } from '@tuwaio/orbit-core';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { NovaConnectProviderProps, NovaConnectProviderType } from './useNovaConnect';\n\nexport interface WalletNameAndAvatarData {\n /** The resolved name from the Name Service (e.g., ENS, like \"alice.eth\"), or null if not found. */\n ensName: string | null;\n /** The URL of the avatar associated with the name, or null if not found. */\n ensAvatar: string | null;\n /** True while the name service data is being fetched. */\n isLoading: boolean;\n /** A truncated version of the name for display, or the abbreviated address if no name. */\n ensNameAbbreviated: string | undefined;\n /** Error message if the name resolution failed. */\n error: string | null;\n /** Function to retry the name resolution manually. */\n retry: () => void;\n}\n\ninterface UseGetWalletNameAndAvatarOptions\n extends Pick<NovaConnectProviderProps, 'store'>,\n Pick<NovaConnectProviderType, 'activeWallet'> {\n /** Number of characters to show on each side when abbreviating (default: 12) */\n abbreviateSymbols?: number;\n /** Maximum length before abbreviation is applied (default: 30) */\n maxNameLength?: number;\n /** Whether to automatically retry on failure (default: false) */\n autoRetry?: boolean;\n /** Retry delay in milliseconds (default: 3000) */\n retryDelay?: number;\n}\n\n/**\n * A custom hook to fetch the Name Service (e.g., ENS) name and avatar\n * for the currently active wallet.\n *\n * This hook automatically detects the active wallet and its corresponding\n * adapter via the `useSatelliteConnectStore` and attempts to resolve the\n * wallet address to a human-readable name and avatar.\n *\n * @param options Configuration options for the hook\n * @returns An object containing the resolved name, avatar, loading state, and utility functions\n *\n * @example\n * ```typescript\n * import { useGetWalletNameAndAvatar } from './useGetWalletNameAndAvatar';\n *\n * function DisplayWalletInfo() {\n * const { ensName, ensAvatar, isLoading, ensNameAbbreviated, error, retry } = useGetWalletNameAndAvatar({\n * abbreviateSymbols: 8,\n * maxNameLength: 25\n * });\n *\n * if (isLoading) {\n * return <div>Resolving name...</div>;\n * }\n *\n * if (error) {\n * return <div>Error: {error} <button onClick={retry}>Retry</button></div>;\n * }\n *\n * return (\n * <div className=\"wallet-info\">\n * {ensAvatar && <img src={ensAvatar} alt=\"Wallet Avatar\" />}\n * <p title={ensName || ''}>{ensNameAbbreviated || 'No Name Found'}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useGetWalletNameAndAvatar(options: UseGetWalletNameAndAvatarOptions): WalletNameAndAvatarData {\n const { abbreviateSymbols = 12, maxNameLength = 30, autoRetry = false, retryDelay = 3000, store } = options;\n\n // Store state selectors - memoized for performance\n const getAdapter = store.getState().getAdapter;\n\n // Memoize wallet address and adapter for dependency tracking\n const walletAddress = useMemo(() => options.activeWallet?.address, [options.activeWallet?.address]);\n const walletType = useMemo(() => options.activeWallet?.walletType, [options.activeWallet?.walletType]);\n\n const foundAdapter = useMemo(() => {\n if (!walletType) return null;\n return getAdapter(getAdapterFromWalletType(walletType ?? `${OrbitAdapter.EVM}:not-connected`));\n }, [getAdapter, walletType]);\n\n // State variables\n const [ensName, setEnsName] = useState<string | null>(null);\n const [ensAvatar, setEnsAvatar] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Refs for cleanup and retry functionality\n const abortControllerRef = useRef<AbortController | null>(null);\n const retryTimeoutRef = useRef<number | null>(null);\n\n // Memoize adapter capabilities\n const adapterCapabilities = useMemo(() => {\n if (!foundAdapter) {\n return { hasNameResolver: false, hasAvatarResolver: false };\n }\n\n const hasNameResolver = 'getName' in foundAdapter && typeof foundAdapter.getName === 'function';\n const hasAvatarResolver = 'getAvatar' in foundAdapter && typeof foundAdapter.getAvatar === 'function';\n\n return { hasNameResolver, hasAvatarResolver };\n }, [foundAdapter]);\n\n // Cleanup function\n const cleanup = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (retryTimeoutRef.current !== null) {\n clearTimeout(retryTimeoutRef.current);\n retryTimeoutRef.current = null;\n }\n }, []);\n\n // Main fetch function\n const fetchNameData = useCallback(async () => {\n cleanup();\n\n // Exit conditions\n if (!walletAddress || !foundAdapter || !adapterCapabilities.hasNameResolver) {\n setEnsName(null);\n setEnsAvatar(null);\n setIsLoading(false);\n setError(null);\n return;\n }\n\n // Create new abort controller for this request\n abortControllerRef.current = new AbortController();\n const { signal } = abortControllerRef.current;\n\n // Start loading\n setIsLoading(true);\n setError(null);\n setEnsName(null);\n setEnsAvatar(null);\n\n try {\n // Check if request was aborted\n if (signal.aborted) return;\n\n // Attempt to resolve the name\n const name = await foundAdapter.getName?.(walletAddress);\n\n if (signal.aborted) return;\n\n if (name) {\n setEnsName(name);\n\n // If avatar resolution is supported, fetch the avatar\n if (adapterCapabilities.hasAvatarResolver) {\n try {\n const avatar = await foundAdapter.getAvatar?.(name);\n if (!signal.aborted) {\n // Handle undefined case by converting to null\n setEnsAvatar(avatar ?? null);\n }\n } catch (avatarError) {\n // Avatar fetch failed, but name succeeded - not critical\n console.warn('Failed to fetch avatar:', avatarError);\n if (!signal.aborted) {\n setEnsAvatar(null);\n }\n }\n }\n }\n } catch (error) {\n if (signal.aborted) return;\n\n const errorMessage = error instanceof Error ? error.message : 'Failed to fetch name service data';\n console.error('Failed to fetch name service data:', error);\n\n setError(errorMessage);\n setEnsName(null);\n setEnsAvatar(null);\n\n // Auto retry if enabled\n if (autoRetry) {\n retryTimeoutRef.current = setTimeout(() => {\n fetchNameData();\n }, retryDelay) as unknown as number;\n }\n } finally {\n if (!signal.aborted) {\n setIsLoading(false);\n }\n }\n }, [walletAddress, foundAdapter, adapterCapabilities, autoRetry, retryDelay, cleanup]);\n\n // Manual retry function\n const retry = useCallback(() => {\n setError(null);\n fetchNameData();\n }, [fetchNameData]);\n\n // Effect to fetch data when dependencies change\n useEffect(() => {\n fetchNameData();\n return cleanup;\n }, [fetchNameData, cleanup]);\n\n // Cleanup on unmount\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n // Memoized abbreviated name computation\n const ensNameAbbreviated = useMemo(() => {\n if (ensName) {\n return ensName.length > maxNameLength\n ? textCenterEllipsis(ensName, abbreviateSymbols, abbreviateSymbols)\n : ensName;\n }\n\n return walletAddress ? textCenterEllipsis(walletAddress, abbreviateSymbols, abbreviateSymbols) : undefined;\n }, [ensName, walletAddress, maxNameLength, abbreviateSymbols]);\n\n return {\n ensName,\n ensAvatar,\n isLoading,\n ensNameAbbreviated,\n error,\n retry,\n };\n}\n","import { getAdapterFromWalletType } from '@tuwaio/orbit-core';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { NovaConnectProviderProps, NovaConnectProviderType } from './useNovaConnect';\n\n/**\n * @interface NativeBalanceResult\n * Represents the native token balance returned by the adapter.\n * The value is already formatted for human readability.\n * @property {string} value The native token balance formatted to standard decimals (e.g., \"1.5\").\n * @property {string} symbol The symbol of the native token (e.g., \"ETH\").\n */\nexport interface NativeBalanceResult {\n value: string;\n symbol: string;\n}\n\n// Type for the balance state within the hook (the fetched data or null).\ntype NativeBalanceState = NativeBalanceResult | null;\n\n// Type for the local cache: \"walletAddress-chainId\" -> { value, symbol }.\ntype BalanceCache = Record<string, NativeBalanceResult>;\n\n/**\n * @interface NativeBalanceData\n * The object returned by the useWalletNativeBalance hook.\n * @property {NativeBalanceState} balance The native token balance and symbol, or null.\n * @property {boolean} isLoading True while the balance is being fetched for the current wallet/chain combination.\n * @property {() => void} refetch Function to manually trigger a balance refresh.\n */\ninterface NativeBalanceData {\n balance: NativeBalanceState;\n isLoading: boolean;\n refetch: () => void;\n}\n\n/**\n * Custom hook to fetch the native token balance for the currently connected wallet\n * on the active chain. It includes a local cache layer to prevent redundant network calls\n * when switching between components or on re-renders for the same wallet/chain.\n *\n * @returns {NativeBalanceData} An object containing the balance data and loading state.\n *\n * @example\n * ```typescript\n * import { useWalletNativeBalance } from './useWalletNativeBalance';\n *\n * function NativeTokenDisplay() {\n * const { balance, isLoading, refetch } = useWalletNativeBalance();\n *\n * if (isLoading) {\n * return <p>Loading balance...</p>;\n * }\n *\n * // Display the formatted balance and symbol\n * return (\n * <div>\n * <p>Balance: {balance ? `${balance.value} ${balance.symbol}` : '0.00'}</p>\n * <button onClick={refetch}>Refresh</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useWalletNativeBalance({\n store,\n activeWallet,\n}: Pick<NovaConnectProviderProps, 'store'> & Pick<NovaConnectProviderType, 'activeWallet'>): NativeBalanceData {\n // --- 1. STATE & CACHE SETUP ---\n\n // Local cache storage. Keys combine wallet address and chain ID.\n const [balanceCache, setBalanceCache] = useState<BalanceCache>({});\n\n // Local loading state, managed alongside the cache check.\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n // Track the current fetch operation to prevent race conditions\n const fetchOperationRef = useRef<string | null>(null);\n\n // Store state selectors - memoized for performance\n const getAdapter = store.getState().getAdapter;\n\n // --- 2. COMPUTED INPUTS ---\n\n // Create the unique key for cache lookups: \"address-chainId\".\n const cacheKey = useMemo(() => {\n return activeWallet?.chainId && activeWallet?.address ? `${activeWallet.address}-${activeWallet.chainId}` : null;\n }, [activeWallet?.chainId, activeWallet?.address]);\n\n // Find the actual adapter object from the adapter map.\n const foundAdapter = useMemo(() => {\n if (!activeWallet?.walletType) return null;\n return getAdapter(getAdapterFromWalletType(activeWallet.walletType));\n }, [getAdapter, activeWallet?.walletType]);\n\n // Check if the adapter has balance functionality\n const hasBalanceResolver = useMemo(() => {\n return foundAdapter && 'getBalance' in foundAdapter && typeof foundAdapter.getBalance === 'function';\n }, [foundAdapter]);\n\n // --- 3. BALANCE FETCHING LOGIC ---\n\n const fetchBalance = useCallback(\n async (forceRefresh = false) => {\n // Exit early if essential data is missing (not connected).\n if (!activeWallet?.address || !foundAdapter || !activeWallet?.chainId || !cacheKey || !hasBalanceResolver) {\n setIsLoading(false);\n return;\n }\n\n // Set the current operation ID to prevent race conditions\n const operationId = `${cacheKey}-${Date.now()}`;\n fetchOperationRef.current = operationId;\n\n // Check cache unless forcing a refresh\n if (!forceRefresh) {\n const cachedBalance = balanceCache[cacheKey];\n if (cachedBalance) {\n setIsLoading(false);\n return;\n }\n }\n\n setIsLoading(true);\n\n try {\n // Call the adapter's getBalance method\n const balanceResult: NativeBalanceResult = await foundAdapter.getBalance(\n activeWallet.address,\n activeWallet.chainId,\n );\n\n // Only update if this operation is still the latest one\n if (fetchOperationRef.current === operationId) {\n setBalanceCache((prevCache) => ({\n ...prevCache,\n [cacheKey]: balanceResult,\n }));\n }\n } catch (error) {\n console.error(`Failed to fetch native balance for ${cacheKey}:`, error);\n\n // Optionally clear cache entry on error (if you want to retry on next call)\n if (forceRefresh && fetchOperationRef.current === operationId) {\n setBalanceCache((prevCache) => {\n const newCache = { ...prevCache };\n delete newCache[cacheKey];\n return newCache;\n });\n }\n } finally {\n // Only update loading state if this operation is still current\n if (fetchOperationRef.current === operationId) {\n setIsLoading(false);\n }\n }\n },\n [activeWallet?.address, foundAdapter, activeWallet?.chainId, cacheKey, hasBalanceResolver, balanceCache],\n );\n\n // Memoized refetch function that forces a refresh\n const refetch = useCallback(() => {\n fetchBalance(true);\n }, [fetchBalance]);\n\n // --- 4. EFFECT FOR INITIAL FETCH ---\n\n useEffect(() => {\n // Only fetch if we have all required data and no cached result\n if (cacheKey && hasBalanceResolver && !balanceCache[cacheKey]) {\n fetchBalance(false);\n } else if (!cacheKey || !hasBalanceResolver) {\n // Reset loading state if we can't fetch\n setIsLoading(false);\n }\n }, [cacheKey, hasBalanceResolver, balanceCache, fetchBalance]);\n\n // --- 5. CLEANUP EFFECT ---\n\n useEffect(() => {\n return () => {\n // Cancel any ongoing operations when component unmounts\n fetchOperationRef.current = null;\n };\n }, []);\n\n // --- 6. RETURNED DATA ---\n\n // The definitive balance is always derived from the cache based on the current key.\n const balance: NativeBalanceState = useMemo(() => {\n return cacheKey ? balanceCache[cacheKey] || null : null;\n }, [cacheKey, balanceCache]);\n\n // Return the fetched balance data and the loading status.\n return {\n balance, // { value: \"1.5\", symbol: \"ETH\" } or null\n isLoading,\n refetch,\n };\n}\n"]}
@@ -1,2 +0,0 @@
1
- async function n(){try{return await import('./utils-L6CFHW4B.js')}catch(r){return console.warn("EVM utilities not available:",r),null}}async function i(){let r=await n();return {getChains(e){return r?.getEvmChains?r.getEvmChains(e):!Array.isArray(e)||e.length===0?[]:e.map(t=>typeof t=="object"&&t?.id!==void 0?t.id:typeof t=="number"||typeof t=="string"?t:null).filter(t=>t!==null&&(typeof t=="string"||typeof t=="number"))},isChainList(e){return r?.isEvmChainList?r.isEvmChainList(e):e.length>0&&e.every(t=>typeof t=="number")}}}async function s(){try{return await import('./utils-L6CFHW4B.js'),!0}catch{return false}}export{i as createEvmAdapter,s as isEvmAdapterAvailable};//# sourceMappingURL=evm-5323YCLC.js.map
2
- //# sourceMappingURL=evm-5323YCLC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/adapters/evm.ts"],"names":["getEvmUtils","error","createEvmAdapter","evmUtils","appChains","chain","id","chains","isEvmAdapterAvailable"],"mappings":"AA+BA,eAAeA,CAAAA,EAA8C,CAC3D,GAAI,CAGF,OADiB,MAAM,OAAO,qBAAiB,CAEjD,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAK,8BAAA,CAAgCA,CAAK,CAAA,CAC3C,IACT,CACF,CA6BA,eAAsBC,CAAAA,EAA0C,CAC9D,IAAMC,CAAAA,CAAW,MAAMH,CAAAA,EAAY,CAEnC,OAAO,CAOL,SAAA,CAAUI,CAAAA,CAAqC,CAE7C,OAAID,CAAAA,EAAU,YAAA,CACLA,CAAAA,CAAS,YAAA,CAAaC,CAAS,CAAA,CAIpC,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAS,CAAA,EAAKA,CAAAA,CAAU,MAAA,GAAW,CAAA,CAC7C,EAAC,CAGHA,CAAAA,CACJ,GAAA,CAAKC,CAAAA,EAEA,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,EAAO,EAAA,GAAO,MAAA,CACtCA,EAAM,EAAA,CAGX,OAAOA,CAAAA,EAAU,QAAA,EAAY,OAAOA,CAAAA,EAAU,QAAA,CACzCA,CAAAA,CAEF,IACR,CAAA,CACA,MAAA,CAAQC,CAAAA,EAAmCA,CAAAA,GAAO,IAAA,GAAS,OAAOA,CAAAA,EAAO,QAAA,EAAY,OAAOA,CAAAA,EAAO,QAAA,CAAS,CACjH,CAAA,CASA,WAAA,CAAYC,CAAAA,CAAsC,CAChD,OAAIJ,CAAAA,EAAU,cAAA,CACLA,CAAAA,CAAS,cAAA,CAAeI,CAAM,CAAA,CAIhCA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOF,CAAAA,EAAU,OAAOA,CAAAA,EAAU,QAAQ,CAC/E,CACF,CACF,CAsBA,eAAsBG,CAAAA,EAA0C,CAC9D,GAAI,CACF,OAAA,MAAM,OAAO,qBAAiB,CAAA,CACvB,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF","file":"evm-5323YCLC.js","sourcesContent":["import type { ChainAdapter } from './types';\n\n/**\n * EVM utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface EvmUtilsModule {\n getEvmChains?: (appChains: any) => (string | number)[];\n isEvmChainList?: (chains: (string | number)[]) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of EVM utilities.\n * This function attempts to load EVM-specific utilities without throwing errors\n * if the EVM package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to EVM utilities module or null if not available\n *\n * @example\n * ```typescript\n * const evmUtils = await getEvmUtils();\n * if (evmUtils?.getEvmChains) {\n * const chains = evmUtils.getEvmChains(appChains);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getEvmUtils(): Promise<EvmUtilsModule | null> {\n try {\n // Dynamic import of EVM utilities - fails gracefully if package not installed\n const evmUtils = await import('../../evm/utils');\n return evmUtils;\n } catch (error) {\n console.warn('EVM utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates an EVM chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides EVM-specific functionality while gracefully handling\n * environments where EVM utilities are not available. It uses intelligent\n * fallbacks to ensure basic functionality even without the full EVM package.\n *\n * @returns Promise resolving to a configured EVM ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createEvmAdapter();\n *\n * // Get EVM chain IDs from app configuration\n * const chainIds = adapter.getChains([\n * { id: 1, name: 'Ethereum' },\n * { id: 137, name: 'Polygon' }\n * ]);\n * console.log(chainIds); // [1, 137]\n *\n * // Validate chain list format\n * const isValid = adapter.isChainList([1, 137, 56]);\n * console.log(isValid); // true (numeric IDs are valid for EVM)\n * ```\n *\n * @since 1.0.0\n */\nexport async function createEvmAdapter(): Promise<ChainAdapter> {\n const evmUtils = await getEvmUtils();\n\n return {\n /**\n * Extracts chain IDs from EVM app chain configuration.\n *\n * @param appChains Array of chain configurations or chain identifiers\n * @returns Array of chain IDs (numbers or strings)\n */\n getChains(appChains: any): (string | number)[] {\n // Use imported EVM utilities if available\n if (evmUtils?.getEvmChains) {\n return evmUtils.getEvmChains(appChains);\n }\n\n // Fallback implementation for basic chain extraction\n if (!Array.isArray(appChains) || appChains.length === 0) {\n return [];\n }\n\n return appChains\n .map((chain: any) => {\n // Handle chain objects with id property\n if (typeof chain === 'object' && chain?.id !== undefined) {\n return chain.id;\n }\n // Handle direct chain identifiers\n if (typeof chain === 'number' || typeof chain === 'string') {\n return chain;\n }\n return null;\n })\n .filter((id: any): id is string | number => id !== null && (typeof id === 'string' || typeof id === 'number'));\n },\n\n /**\n * Validates whether the provided chains list conforms to EVM chain format.\n * EVM chains are typically identified by numeric IDs.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for EVM\n */\n isChainList(chains: (string | number)[]): boolean {\n if (evmUtils?.isEvmChainList) {\n return evmUtils.isEvmChainList(chains);\n }\n\n // Fallback validation: EVM chains should be numbers\n return chains.length > 0 && chains.every((chain) => typeof chain === 'number');\n },\n };\n}\n\n/**\n * Checks if the EVM adapter can be created in the current environment.\n * This function verifies that the required EVM utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if EVM adapter is available\n *\n * @example\n * ```typescript\n * const hasEvm = await isEvmAdapterAvailable();\n * if (hasEvm) {\n * const adapter = await createEvmAdapter();\n * // Use EVM functionality\n * } else {\n * console.log('EVM support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isEvmAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../evm/utils');\n return true;\n } catch {\n return false;\n }\n}\n"]}