@tuwaio/orbit-core 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -108,6 +108,24 @@ type BaseAdapter = {
108
108
  * @example "evm:metamask" | "solana:phantom"
109
109
  */
110
110
  type ConnectorType = `${OrbitAdapter}:${string}`;
111
+ /**
112
+ * Array of chain identifiers (replaces IdentifierArray from @wallet-standard/base)
113
+ * Can contain strings, numbers, or other primitive types
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * const chainIds: ChainIdentifierArray = ['ethereum', 1, 'solana:mainnet-beta'];
118
+ * ```
119
+ */
120
+ type ChainIdentifierArray = readonly (string | number)[];
121
+
122
+ /**
123
+ * Universal address validation function that supports multiple blockchain formats
124
+ * @param value - Address string to validate
125
+ * @param type - Optional blockchain type to validate against ('evm' | 'solana' | 'auto')
126
+ * @returns boolean indicating if the address is valid
127
+ */
128
+ declare function isAddress(value: string, type?: 'evm' | 'solana' | 'auto'): boolean;
111
129
 
112
130
  /**
113
131
  * @name delay
@@ -211,6 +229,28 @@ declare function getAdapterFromConnectorType(connectorType: ConnectorType): Orbi
211
229
  */
212
230
  declare function getConnectorTypeFromName(adapter: OrbitAdapter, name: string): string;
213
231
 
232
+ declare const getNetworkData: (adapter: OrbitAdapter) => {
233
+ chain: {
234
+ chainId: number;
235
+ name: string;
236
+ };
237
+ links: {
238
+ aboutNetwork: string;
239
+ choseWallet: string;
240
+ about: string;
241
+ };
242
+ } | {
243
+ chain: {
244
+ chainId: string;
245
+ name: string;
246
+ };
247
+ links: {
248
+ aboutNetwork: string;
249
+ choseWallet: string;
250
+ about: string;
251
+ };
252
+ } | undefined;
253
+
214
254
  /**
215
255
  * Internal function for safely retrieving and parsing data from localStorage.
216
256
  *
@@ -607,4 +647,4 @@ declare function isSolanaChain(chainId: number | string): boolean;
607
647
  */
608
648
  declare function setChainId(chainId: number | string): string | number;
609
649
 
610
- export { type BaseAdapter, type ConnectorType, OrbitAdapter, type OrbitGenericAdapter, type RecentlyConnectedConnectorData, type RecentlyConnectedConnectorsList, delay, filterUniqueByKey, formatConnectorChainId, formatConnectorName, getAdapterFromConnectorType, getConnectorTypeFromName, getParsedStorageItem, impersonatedHelpers, isSafeApp, isSolanaChain, lastConnectedConnectorHelpers, recentlyConnectedConnectorsListHelpers, selectAdapterByKey, setChainId, waitFor };
650
+ export { type BaseAdapter, type ChainIdentifierArray, type ConnectorType, OrbitAdapter, type OrbitGenericAdapter, type RecentlyConnectedConnectorData, type RecentlyConnectedConnectorsList, delay, filterUniqueByKey, formatConnectorChainId, formatConnectorName, getAdapterFromConnectorType, getConnectorTypeFromName, getNetworkData, getParsedStorageItem, impersonatedHelpers, isAddress, isSafeApp, isSolanaChain, lastConnectedConnectorHelpers, recentlyConnectedConnectorsListHelpers, selectAdapterByKey, setChainId, waitFor };
package/dist/index.d.ts CHANGED
@@ -108,6 +108,24 @@ type BaseAdapter = {
108
108
  * @example "evm:metamask" | "solana:phantom"
109
109
  */
110
110
  type ConnectorType = `${OrbitAdapter}:${string}`;
111
+ /**
112
+ * Array of chain identifiers (replaces IdentifierArray from @wallet-standard/base)
113
+ * Can contain strings, numbers, or other primitive types
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * const chainIds: ChainIdentifierArray = ['ethereum', 1, 'solana:mainnet-beta'];
118
+ * ```
119
+ */
120
+ type ChainIdentifierArray = readonly (string | number)[];
121
+
122
+ /**
123
+ * Universal address validation function that supports multiple blockchain formats
124
+ * @param value - Address string to validate
125
+ * @param type - Optional blockchain type to validate against ('evm' | 'solana' | 'auto')
126
+ * @returns boolean indicating if the address is valid
127
+ */
128
+ declare function isAddress(value: string, type?: 'evm' | 'solana' | 'auto'): boolean;
111
129
 
112
130
  /**
113
131
  * @name delay
@@ -211,6 +229,28 @@ declare function getAdapterFromConnectorType(connectorType: ConnectorType): Orbi
211
229
  */
212
230
  declare function getConnectorTypeFromName(adapter: OrbitAdapter, name: string): string;
213
231
 
232
+ declare const getNetworkData: (adapter: OrbitAdapter) => {
233
+ chain: {
234
+ chainId: number;
235
+ name: string;
236
+ };
237
+ links: {
238
+ aboutNetwork: string;
239
+ choseWallet: string;
240
+ about: string;
241
+ };
242
+ } | {
243
+ chain: {
244
+ chainId: string;
245
+ name: string;
246
+ };
247
+ links: {
248
+ aboutNetwork: string;
249
+ choseWallet: string;
250
+ about: string;
251
+ };
252
+ } | undefined;
253
+
214
254
  /**
215
255
  * Internal function for safely retrieving and parsing data from localStorage.
216
256
  *
@@ -607,4 +647,4 @@ declare function isSolanaChain(chainId: number | string): boolean;
607
647
  */
608
648
  declare function setChainId(chainId: number | string): string | number;
609
649
 
610
- export { type BaseAdapter, type ConnectorType, OrbitAdapter, type OrbitGenericAdapter, type RecentlyConnectedConnectorData, type RecentlyConnectedConnectorsList, delay, filterUniqueByKey, formatConnectorChainId, formatConnectorName, getAdapterFromConnectorType, getConnectorTypeFromName, getParsedStorageItem, impersonatedHelpers, isSafeApp, isSolanaChain, lastConnectedConnectorHelpers, recentlyConnectedConnectorsListHelpers, selectAdapterByKey, setChainId, waitFor };
650
+ export { type BaseAdapter, type ChainIdentifierArray, type ConnectorType, OrbitAdapter, type OrbitGenericAdapter, type RecentlyConnectedConnectorData, type RecentlyConnectedConnectorsList, delay, filterUniqueByKey, formatConnectorChainId, formatConnectorName, getAdapterFromConnectorType, getConnectorTypeFromName, getNetworkData, getParsedStorageItem, impersonatedHelpers, isAddress, isSafeApp, isSolanaChain, lastConnectedConnectorHelpers, recentlyConnectedConnectorsListHelpers, selectAdapterByKey, setChainId, waitFor };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var c=(r=>(r.EVM="evm",r.SOLANA="solana",r.Starknet="starknet",r))(c||{});var p=(e,t)=>new Promise(n=>{let r=()=>{setTimeout(()=>n(e),t);};typeof window<"u"?r():setTimeout(r,0);});function m(e,t){let n=new Set;return e.filter(r=>{let s=r[t];return n.has(s)?false:(n.add(s),true)})}function y(e,t){return typeof e=="string"?`${t}:${e}`:e}var a=new Map([["Impersonated Connector","impersonatedwallet"],["Safe","safewallet"],["Trust","trustwallet"],["Trust Wallet","trustwallet"],["Brave \u041A\u043E\u0448\u0435\u043B\u0435\u043A","bravewallet"],["Brave Wallet","bravewallet"],["Base Account","coinbasewallet"]]),g=e=>a.get(e)??e.replace(/\s+/g,"").toLowerCase();function S(e){return e?.split(":")[0]??"evm"}function x(e,t){return `${e}:${t.replace(/\s+/g,"").toLowerCase()}`}function i(e){if(typeof window>"u")return;let t=window.localStorage.getItem(e);if(t)try{return JSON.parse(t)}catch(n){console.error(`Error parsing ${e} from localStorage:`,n);return}}var E={impersonatedAddress:typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress")??"":"",setImpersonated:e=>typeof window<"u"?window.localStorage.setItem("satellite-connect:impersonatedAddress",e):void 0,getImpersonated:()=>typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress"):void 0,removeImpersonated:()=>typeof window<"u"?window.localStorage.removeItem("satellite-connect:impersonatedAddress"):void 0};var v=typeof window<"u"&&window!==window.parent;var d={STORAGE_KEY:"orbit-core:lastConnectedConnector",lastConnectedConnector:i("orbit-core:lastConnectedConnector"),setLastConnectedConnector:({connectorType:e,chainId:t,address:n})=>typeof window<"u"?window.localStorage.setItem(d.STORAGE_KEY,JSON.stringify({connectorType:e,chainId:t,address:n})):void 0,getLastConnectedConnector:()=>i(d.STORAGE_KEY),removeLastConnectedConnector:()=>typeof window<"u"?window.localStorage.removeItem(d.STORAGE_KEY):void 0};var o={STORAGE_KEY:"orbit-core:recentlyConnectedConnectorsListHelpers",recentlyConnectedConnectorsList:i("orbit-core:recentlyConnectedConnectorsListHelpers"),setRecentlyConnectedConnectorsList:e=>typeof window<"u"?window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(e)):void 0,getRecentlyConnectedConnectorsList:()=>i(o.STORAGE_KEY),addConnector:(e,t)=>{if(typeof window>"u")return;let r={...o.getRecentlyConnectedConnectorsList()||{},[e]:t};window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},removeConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t||!(e in t))return;let{[e]:n,...r}=t;window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},hasConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();return t?e in t:false},getConnector:e=>typeof window>"u"?void 0:o.getRecentlyConnectedConnectorsList()?.[e],getConnectorCount:()=>{if(typeof window>"u")return 0;let e=o.getRecentlyConnectedConnectorsList();return e?Object.keys(e).length:0},getConnectorsSortedByTime:()=>{if(typeof window>"u")return [];let e=o.getRecentlyConnectedConnectorsList();return e?Object.entries(e).sort(([,t],[,n])=>n.disconnectedTimestamp-t.disconnectedTimestamp):[]},removeConnectorsOlderThan:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t)return;let n=Object.fromEntries(Object.entries(t).filter(([,r])=>r.disconnectedTimestamp>=e));window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(n));},removeRecentlyConnectedConnectorsList:()=>typeof window<"u"?window.localStorage.removeItem(o.STORAGE_KEY):void 0};var k=({adapterKey:e,adapter:t})=>{if(Array.isArray(t)){if(t.length===0){console.error("Adapter selection failed: The provided adapters array is empty.");return}let n=t.find(r=>r.key===e);return n||(console.warn(`No adapter found for key: "${e}". Falling back to the first available adapter: "${t[0].key}".`),t[0])}return t};async function $(e,t=50,n=200){for(let r=0;r<t;r++){if(e())return;await new Promise(s=>setTimeout(s,n));}throw new Error("Predicate not fulfilled in time")}function f(e){return typeof e=="string"?["devnet","testnet","mainnet-beta","mainnet"].includes(e):false}function B(e){return f(e)?`solana:${e}`:e}exports.OrbitAdapter=c;exports.delay=p;exports.filterUniqueByKey=m;exports.formatConnectorChainId=y;exports.formatConnectorName=g;exports.getAdapterFromConnectorType=S;exports.getConnectorTypeFromName=x;exports.getParsedStorageItem=i;exports.impersonatedHelpers=E;exports.isSafeApp=v;exports.isSolanaChain=f;exports.lastConnectedConnectorHelpers=d;exports.recentlyConnectedConnectorsListHelpers=o;exports.selectAdapterByKey=k;exports.setChainId=B;exports.waitFor=$;//# sourceMappingURL=index.js.map
2
- //# sourceMappingURL=index.js.map
1
+ 'use strict';var d=(r=>(r.EVM="evm",r.SOLANA="solana",r.Starknet="starknet",r))(d||{});function c(e){return /^0x[a-fA-F0-9]{40}$/.test(e.trim())}function l(e){return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(e.trim())}function m(e,t="auto"){if(!e)return false;let n=e.trim();switch(t){case "evm":return c(n);case "solana":return l(n);case "auto":default:return c(n)||l(n)}}var y=(e,t)=>new Promise(n=>{let r=()=>{setTimeout(()=>n(e),t);};typeof window<"u"?r():setTimeout(r,0);});function g(e,t){let n=new Set;return e.filter(r=>{let s=r[t];return n.has(s)?false:(n.add(s),true)})}function b(e,t){return typeof e=="string"?`${t}:${e}`:e}var u=new Map([["Impersonated Connector","impersonatedwallet"],["Safe","safewallet"],["Trust","trustwallet"],["Trust Wallet","trustwallet"],["Brave \u041A\u043E\u0448\u0435\u043B\u0435\u043A","bravewallet"],["Brave Wallet","bravewallet"],["Base Account","coinbasewallet"]]),x=e=>u.get(e)??e.replace(/\s+/g,"").toLowerCase();function R(e){return e?.split(":")[0]??"evm"}function h(e,t){return `${e}:${t.replace(/\s+/g,"").toLowerCase()}`}var N=e=>{switch(e){case "evm":return {chain:{chainId:1,name:"Ethereum"},links:{aboutNetwork:"https://ethereum.org/developers/docs/intro-to-ethereum/",choseWallet:"https://ethereum.org/wallets/find-wallet/",about:"https://ethereum.org/wallets/"}};case "solana":return {chain:{chainId:"solana:mainnet",name:"Solana"},links:{aboutNetwork:"https://solana.com/en/learn/what-is-solana",choseWallet:"https://solana.com/en/solana-wallets",about:"https://solana.com/en/learn/what-is-a-wallet"}}}};function i(e){if(typeof window>"u")return;let t=window.localStorage.getItem(e);if(t)try{return JSON.parse(t)}catch(n){console.error(`Error parsing ${e} from localStorage:`,n);return}}var K={impersonatedAddress:typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress")??"":"",setImpersonated:e=>typeof window<"u"?window.localStorage.setItem("satellite-connect:impersonatedAddress",e):void 0,getImpersonated:()=>typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress"):void 0,removeImpersonated:()=>typeof window<"u"?window.localStorage.removeItem("satellite-connect:impersonatedAddress"):void 0};var _=typeof window<"u"&&window!==window.parent;var a={STORAGE_KEY:"orbit-core:lastConnectedConnector",lastConnectedConnector:i("orbit-core:lastConnectedConnector"),setLastConnectedConnector:({connectorType:e,chainId:t,address:n})=>typeof window<"u"?window.localStorage.setItem(a.STORAGE_KEY,JSON.stringify({connectorType:e,chainId:t,address:n})):void 0,getLastConnectedConnector:()=>i(a.STORAGE_KEY),removeLastConnectedConnector:()=>typeof window<"u"?window.localStorage.removeItem(a.STORAGE_KEY):void 0};var o={STORAGE_KEY:"orbit-core:recentlyConnectedConnectorsListHelpers",recentlyConnectedConnectorsList:i("orbit-core:recentlyConnectedConnectorsListHelpers"),setRecentlyConnectedConnectorsList:e=>typeof window<"u"?window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(e)):void 0,getRecentlyConnectedConnectorsList:()=>i(o.STORAGE_KEY),addConnector:(e,t)=>{if(typeof window>"u")return;let r={...o.getRecentlyConnectedConnectorsList()||{},[e]:t};window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},removeConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t||!(e in t))return;let{[e]:n,...r}=t;window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},hasConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();return t?e in t:false},getConnector:e=>typeof window>"u"?void 0:o.getRecentlyConnectedConnectorsList()?.[e],getConnectorCount:()=>{if(typeof window>"u")return 0;let e=o.getRecentlyConnectedConnectorsList();return e?Object.keys(e).length:0},getConnectorsSortedByTime:()=>{if(typeof window>"u")return [];let e=o.getRecentlyConnectedConnectorsList();return e?Object.entries(e).sort(([,t],[,n])=>n.disconnectedTimestamp-t.disconnectedTimestamp):[]},removeConnectorsOlderThan:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t)return;let n=Object.fromEntries(Object.entries(t).filter(([,r])=>r.disconnectedTimestamp>=e));window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(n));},removeRecentlyConnectedConnectorsList:()=>typeof window<"u"?window.localStorage.removeItem(o.STORAGE_KEY):void 0};var V=({adapterKey:e,adapter:t})=>{if(Array.isArray(t)){if(t.length===0){console.error("Adapter selection failed: The provided adapters array is empty.");return}let n=t.find(r=>r.key===e);return n||(console.warn(`No adapter found for key: "${e}". Falling back to the first available adapter: "${t[0].key}".`),t[0])}return t};async function M(e,t=50,n=200){for(let r=0;r<t;r++){if(e())return;await new Promise(s=>setTimeout(s,n));}throw new Error("Predicate not fulfilled in time")}function f(e){return typeof e=="string"?["devnet","testnet","mainnet-beta","mainnet"].includes(e):false}function j(e){return f(e)?`solana:${e}`:e}
2
+ exports.OrbitAdapter=d;exports.delay=y;exports.filterUniqueByKey=g;exports.formatConnectorChainId=b;exports.formatConnectorName=x;exports.getAdapterFromConnectorType=R;exports.getConnectorTypeFromName=h;exports.getNetworkData=N;exports.getParsedStorageItem=i;exports.impersonatedHelpers=K;exports.isAddress=m;exports.isSafeApp=_;exports.isSolanaChain=f;exports.lastConnectedConnectorHelpers=a;exports.recentlyConnectedConnectorsListHelpers=o;exports.selectAdapterByKey=V;exports.setChainId=j;exports.waitFor=M;
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var c=(r=>(r.EVM="evm",r.SOLANA="solana",r.Starknet="starknet",r))(c||{});var p=(e,t)=>new Promise(n=>{let r=()=>{setTimeout(()=>n(e),t);};typeof window<"u"?r():setTimeout(r,0);});function m(e,t){let n=new Set;return e.filter(r=>{let s=r[t];return n.has(s)?false:(n.add(s),true)})}function y(e,t){return typeof e=="string"?`${t}:${e}`:e}var a=new Map([["Impersonated Connector","impersonatedwallet"],["Safe","safewallet"],["Trust","trustwallet"],["Trust Wallet","trustwallet"],["Brave \u041A\u043E\u0448\u0435\u043B\u0435\u043A","bravewallet"],["Brave Wallet","bravewallet"],["Base Account","coinbasewallet"]]),g=e=>a.get(e)??e.replace(/\s+/g,"").toLowerCase();function S(e){return e?.split(":")[0]??"evm"}function x(e,t){return `${e}:${t.replace(/\s+/g,"").toLowerCase()}`}function i(e){if(typeof window>"u")return;let t=window.localStorage.getItem(e);if(t)try{return JSON.parse(t)}catch(n){console.error(`Error parsing ${e} from localStorage:`,n);return}}var E={impersonatedAddress:typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress")??"":"",setImpersonated:e=>typeof window<"u"?window.localStorage.setItem("satellite-connect:impersonatedAddress",e):void 0,getImpersonated:()=>typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress"):void 0,removeImpersonated:()=>typeof window<"u"?window.localStorage.removeItem("satellite-connect:impersonatedAddress"):void 0};var v=typeof window<"u"&&window!==window.parent;var d={STORAGE_KEY:"orbit-core:lastConnectedConnector",lastConnectedConnector:i("orbit-core:lastConnectedConnector"),setLastConnectedConnector:({connectorType:e,chainId:t,address:n})=>typeof window<"u"?window.localStorage.setItem(d.STORAGE_KEY,JSON.stringify({connectorType:e,chainId:t,address:n})):void 0,getLastConnectedConnector:()=>i(d.STORAGE_KEY),removeLastConnectedConnector:()=>typeof window<"u"?window.localStorage.removeItem(d.STORAGE_KEY):void 0};var o={STORAGE_KEY:"orbit-core:recentlyConnectedConnectorsListHelpers",recentlyConnectedConnectorsList:i("orbit-core:recentlyConnectedConnectorsListHelpers"),setRecentlyConnectedConnectorsList:e=>typeof window<"u"?window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(e)):void 0,getRecentlyConnectedConnectorsList:()=>i(o.STORAGE_KEY),addConnector:(e,t)=>{if(typeof window>"u")return;let r={...o.getRecentlyConnectedConnectorsList()||{},[e]:t};window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},removeConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t||!(e in t))return;let{[e]:n,...r}=t;window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},hasConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();return t?e in t:false},getConnector:e=>typeof window>"u"?void 0:o.getRecentlyConnectedConnectorsList()?.[e],getConnectorCount:()=>{if(typeof window>"u")return 0;let e=o.getRecentlyConnectedConnectorsList();return e?Object.keys(e).length:0},getConnectorsSortedByTime:()=>{if(typeof window>"u")return [];let e=o.getRecentlyConnectedConnectorsList();return e?Object.entries(e).sort(([,t],[,n])=>n.disconnectedTimestamp-t.disconnectedTimestamp):[]},removeConnectorsOlderThan:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t)return;let n=Object.fromEntries(Object.entries(t).filter(([,r])=>r.disconnectedTimestamp>=e));window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(n));},removeRecentlyConnectedConnectorsList:()=>typeof window<"u"?window.localStorage.removeItem(o.STORAGE_KEY):void 0};var k=({adapterKey:e,adapter:t})=>{if(Array.isArray(t)){if(t.length===0){console.error("Adapter selection failed: The provided adapters array is empty.");return}let n=t.find(r=>r.key===e);return n||(console.warn(`No adapter found for key: "${e}". Falling back to the first available adapter: "${t[0].key}".`),t[0])}return t};async function $(e,t=50,n=200){for(let r=0;r<t;r++){if(e())return;await new Promise(s=>setTimeout(s,n));}throw new Error("Predicate not fulfilled in time")}function f(e){return typeof e=="string"?["devnet","testnet","mainnet-beta","mainnet"].includes(e):false}function B(e){return f(e)?`solana:${e}`:e}export{c as OrbitAdapter,p as delay,m as filterUniqueByKey,y as formatConnectorChainId,g as formatConnectorName,S as getAdapterFromConnectorType,x as getConnectorTypeFromName,i as getParsedStorageItem,E as impersonatedHelpers,v as isSafeApp,f as isSolanaChain,d as lastConnectedConnectorHelpers,o as recentlyConnectedConnectorsListHelpers,k as selectAdapterByKey,B as setChainId,$ as waitFor};//# sourceMappingURL=index.mjs.map
2
- //# sourceMappingURL=index.mjs.map
1
+ var d=(r=>(r.EVM="evm",r.SOLANA="solana",r.Starknet="starknet",r))(d||{});function c(e){return /^0x[a-fA-F0-9]{40}$/.test(e.trim())}function l(e){return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(e.trim())}function m(e,t="auto"){if(!e)return false;let n=e.trim();switch(t){case "evm":return c(n);case "solana":return l(n);case "auto":default:return c(n)||l(n)}}var y=(e,t)=>new Promise(n=>{let r=()=>{setTimeout(()=>n(e),t);};typeof window<"u"?r():setTimeout(r,0);});function g(e,t){let n=new Set;return e.filter(r=>{let s=r[t];return n.has(s)?false:(n.add(s),true)})}function b(e,t){return typeof e=="string"?`${t}:${e}`:e}var u=new Map([["Impersonated Connector","impersonatedwallet"],["Safe","safewallet"],["Trust","trustwallet"],["Trust Wallet","trustwallet"],["Brave \u041A\u043E\u0448\u0435\u043B\u0435\u043A","bravewallet"],["Brave Wallet","bravewallet"],["Base Account","coinbasewallet"]]),x=e=>u.get(e)??e.replace(/\s+/g,"").toLowerCase();function R(e){return e?.split(":")[0]??"evm"}function h(e,t){return `${e}:${t.replace(/\s+/g,"").toLowerCase()}`}var N=e=>{switch(e){case "evm":return {chain:{chainId:1,name:"Ethereum"},links:{aboutNetwork:"https://ethereum.org/developers/docs/intro-to-ethereum/",choseWallet:"https://ethereum.org/wallets/find-wallet/",about:"https://ethereum.org/wallets/"}};case "solana":return {chain:{chainId:"solana:mainnet",name:"Solana"},links:{aboutNetwork:"https://solana.com/en/learn/what-is-solana",choseWallet:"https://solana.com/en/solana-wallets",about:"https://solana.com/en/learn/what-is-a-wallet"}}}};function i(e){if(typeof window>"u")return;let t=window.localStorage.getItem(e);if(t)try{return JSON.parse(t)}catch(n){console.error(`Error parsing ${e} from localStorage:`,n);return}}var K={impersonatedAddress:typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress")??"":"",setImpersonated:e=>typeof window<"u"?window.localStorage.setItem("satellite-connect:impersonatedAddress",e):void 0,getImpersonated:()=>typeof window<"u"?window.localStorage.getItem("satellite-connect:impersonatedAddress"):void 0,removeImpersonated:()=>typeof window<"u"?window.localStorage.removeItem("satellite-connect:impersonatedAddress"):void 0};var _=typeof window<"u"&&window!==window.parent;var a={STORAGE_KEY:"orbit-core:lastConnectedConnector",lastConnectedConnector:i("orbit-core:lastConnectedConnector"),setLastConnectedConnector:({connectorType:e,chainId:t,address:n})=>typeof window<"u"?window.localStorage.setItem(a.STORAGE_KEY,JSON.stringify({connectorType:e,chainId:t,address:n})):void 0,getLastConnectedConnector:()=>i(a.STORAGE_KEY),removeLastConnectedConnector:()=>typeof window<"u"?window.localStorage.removeItem(a.STORAGE_KEY):void 0};var o={STORAGE_KEY:"orbit-core:recentlyConnectedConnectorsListHelpers",recentlyConnectedConnectorsList:i("orbit-core:recentlyConnectedConnectorsListHelpers"),setRecentlyConnectedConnectorsList:e=>typeof window<"u"?window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(e)):void 0,getRecentlyConnectedConnectorsList:()=>i(o.STORAGE_KEY),addConnector:(e,t)=>{if(typeof window>"u")return;let r={...o.getRecentlyConnectedConnectorsList()||{},[e]:t};window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},removeConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t||!(e in t))return;let{[e]:n,...r}=t;window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(r));},hasConnector:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();return t?e in t:false},getConnector:e=>typeof window>"u"?void 0:o.getRecentlyConnectedConnectorsList()?.[e],getConnectorCount:()=>{if(typeof window>"u")return 0;let e=o.getRecentlyConnectedConnectorsList();return e?Object.keys(e).length:0},getConnectorsSortedByTime:()=>{if(typeof window>"u")return [];let e=o.getRecentlyConnectedConnectorsList();return e?Object.entries(e).sort(([,t],[,n])=>n.disconnectedTimestamp-t.disconnectedTimestamp):[]},removeConnectorsOlderThan:e=>{if(typeof window>"u")return;let t=o.getRecentlyConnectedConnectorsList();if(!t)return;let n=Object.fromEntries(Object.entries(t).filter(([,r])=>r.disconnectedTimestamp>=e));window.localStorage.setItem(o.STORAGE_KEY,JSON.stringify(n));},removeRecentlyConnectedConnectorsList:()=>typeof window<"u"?window.localStorage.removeItem(o.STORAGE_KEY):void 0};var V=({adapterKey:e,adapter:t})=>{if(Array.isArray(t)){if(t.length===0){console.error("Adapter selection failed: The provided adapters array is empty.");return}let n=t.find(r=>r.key===e);return n||(console.warn(`No adapter found for key: "${e}". Falling back to the first available adapter: "${t[0].key}".`),t[0])}return t};async function M(e,t=50,n=200){for(let r=0;r<t;r++){if(e())return;await new Promise(s=>setTimeout(s,n));}throw new Error("Predicate not fulfilled in time")}function f(e){return typeof e=="string"?["devnet","testnet","mainnet-beta","mainnet"].includes(e):false}function j(e){return f(e)?`solana:${e}`:e}
2
+ export{d as OrbitAdapter,y as delay,g as filterUniqueByKey,b as formatConnectorChainId,x as formatConnectorName,R as getAdapterFromConnectorType,h as getConnectorTypeFromName,N as getNetworkData,i as getParsedStorageItem,K as impersonatedHelpers,m as isAddress,_ as isSafeApp,f as isSolanaChain,a as lastConnectedConnectorHelpers,o as recentlyConnectedConnectorsListHelpers,V as selectAdapterByKey,j as setChainId,M as waitFor};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuwaio/orbit-core",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts","../src/utils/delay.ts","../src/utils/filterUniqueByKey.ts","../src/utils/formatConnectorChainId.ts","../src/utils/formatConnectorName.ts","../src/utils/getAdapterFromConnectorType.ts","../src/utils/getConnectorTypeFromName.ts","../src/utils/getParsedStorageItem.ts","../src/utils/impersonatedHelpers.ts","../src/utils/isSafeApp.ts","../src/utils/lastConnectedConnectorHelpers.ts","../src/utils/recentlyConnectedConnectorsListHelpers.ts","../src/utils/selectAdapterByKey.ts","../src/utils/waitFor.ts","../src/utils/%D1%81hainHelpers.ts"],"names":["OrbitAdapter","delay","value","ms","resolve","runTimeout","filterUniqueByKey","array","key","seenValues","item","keyValue","formatConnectorChainId","chainId","connectedAdapter","CONNECTOR_MAPPINGS","formatConnectorName","connectorName","getAdapterFromConnectorType","connectorType","getConnectorTypeFromName","adapter","name","getParsedStorageItem","error","impersonatedHelpers","address","isSafeApp","lastConnectedConnectorHelpers","recentlyConnectedConnectorsListHelpers","connectors","connectorData","updatedList","currentList","_","remainingConnectors","a","b","beforeTimestamp","filteredList","data","selectAdapterByKey","adapterKey","foundAdapter","waitFor","predicate","maxChecks","checkIntervalMs","i","isSolanaChain","setChainId"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @file\n * Core type definitions for the Orbit blockchain adapter system.\n * This file contains fundamental enums and types that define the supported blockchain architectures\n * and their adapter interfaces.\n */\n\n// =================================================================================================\n// 1. ENUMS AND CORE TRANSACTION TYPES\n// =================================================================================================\n\n/**\n * Defines the supported blockchain adapters in the Orbit system.\n * Each adapter corresponds to a specific blockchain architecture and implements\n * the necessary interfaces for that chain's functionality.\n *\n * @enum {string}\n *\n * @example\n * ```typescript\n * // Using adapter types in configuration\n * const config = {\n * chainType: OrbitAdapter.EVM,\n * // other configuration...\n * };\n *\n * // Checking adapter compatibility\n * if (chainType === OrbitAdapter.SOLANA) {\n * // Solana-specific logic\n * }\n * ```\n */\nexport enum OrbitAdapter {\n /**\n * For Ethereum Virtual Machine (EVM) compatible chains.\n * Supports networks like:\n * - Ethereum Mainnet\n * - Polygon\n * - Binance Smart Chain\n * - Avalanche\n * - Other EVM-compatible L1/L2 chains\n */\n EVM = 'evm',\n\n /**\n * For the Solana blockchain.\n * Supports:\n * - Solana Mainnet\n * - Devnet\n * - Testnet\n */\n SOLANA = 'solana',\n\n /**\n * For the Starknet L2 network.\n * Supports:\n * - Starknet Mainnet\n * - Testnet (Goerli)\n * - Other Starknet deployments\n */\n Starknet = 'starknet',\n}\n\n/**\n * Generic type for creating blockchain adapters with type safety.\n * This type ensures that all adapters implement the required interface\n * and are properly keyed by their blockchain type.\n *\n * @typeParam A - Type that extends the base adapter interface with a key property\n *\n * @property {A | A[]} adapter - Single adapter instance or array of adapters\n *\n * @example\n * ```typescript\n * // Single adapter implementation\n * interface EVMAdapter extends BaseAdapter {\n * key: OrbitAdapter.EVM;\n * // EVM-specific methods...\n * }\n * const evmConfig: OrbitGenericAdapter<EVMAdapter> = {\n * adapter: {\n * key: OrbitAdapter.EVM,\n * // implementation...\n * }\n * };\n *\n * // Multiple adapters\n * const multiChainConfig: OrbitGenericAdapter<EVMAdapter> = {\n * adapter: [\n * { key: OrbitAdapter.EVM, ... },\n * { key: OrbitAdapter.SOLANA, ... }\n * ]\n * };\n * ```\n */\nexport type OrbitGenericAdapter<A extends { key: OrbitAdapter }> = {\n adapter: A | A[];\n};\n\nexport type BaseAdapter = {\n /**\n * Generates blockchain explorer URL\n * @returns Explorer URL or undefined if not available\n */\n getExplorerUrl: (url?: string, chainId?: string | number) => string | undefined;\n\n /** Optional method to resolve ENS-like names */\n getName?: (address: string) => Promise<string | null>;\n\n /** Optional method to get avatar for resolved names */\n getAvatar?: (name: string) => Promise<string | null>;\n\n /** Optional method to resolve names to addresses */\n getAddress?: (name: string) => Promise<string | null>;\n};\n\n/**\n * Type representing a connector identifier in format \"OrbitAdapter:connector\"\n * @example \"evm:metamask\" | \"solana:phantom\"\n */\nexport type ConnectorType = `${OrbitAdapter}:${string}`;\n","/**\n * @name delay\n *\n * Ensures the global 'window' object is available (if running in a browser-like environment),\n * then pauses execution for a specified duration, and finally resolves the Promise with the given value.\n *\n * This utility function is designed to be safe for use in Server-Side Rendering (SSR) environments.\n * It asynchronously waits for the 'window' object to be defined before starting the actual timer,\n * helping to prevent errors during the initial server render while still providing a time delay on the client.\n *\n * @template T - The type of the value being resolved.\n *\n * @param {T} value - The value to resolve the Promise with after the delay.\n * @param {number} ms - The number of milliseconds (delay) to wait before resolving the Promise after 'window' is available.\n *\n * @returns {Promise<T>} A Promise that resolves with the provided `value` after both the 'window' check and the delay (`ms`) are complete.\n *\n * @example\n * ```typescript\n * // Use this in an environment where 'window' might not be immediately available (e.g., Next.js component).\n * async function waitForWindowAndDelay() {\n * console.log(\"Start wait...\");\n * // This will wait for window, and then wait 100ms.\n * const data = await delay(\"Ready to connect\", 100);\n * console.log(data);\n * }\n * waitForWindowAndDelay();\n * ```\n */\nexport const delay = <T>(value: T, ms: number): Promise<T> => {\n return new Promise((resolve) => {\n const runTimeout = () => {\n setTimeout(() => resolve(value), ms);\n };\n\n if (typeof window !== 'undefined') {\n runTimeout();\n } else {\n setTimeout(runTimeout, 0);\n }\n });\n};\n","/**\n * Filters an array of objects to keep only the first occurrence of an object\n * based on a unique value of a specified key.\n *\n * This function is generic and type-safe. It iterates through the array and uses a\n * Set to track already encountered key values, effectively removing duplicates.\n *\n * @template T The type of the objects in the array.\n * @param {T[]} array - The array of objects to be filtered.\n * @param {keyof T} key - The object key (property name) whose values must be unique.\n * @returns {T[]} The filtered array containing only objects with unique key values.\n */\nexport function filterUniqueByKey<T>(array: T[], key: keyof T): T[] {\n // 1. Create a Set to store the unique values of the key encountered so far.\n // Set is a collection of unique values, which is perfect for fast duplicate checks.\n const seenValues = new Set<T[keyof T]>();\n\n // 2. Use the native Array.prototype.filter() method to create a new, filtered array.\n return array.filter((item) => {\n // Access the value of the specified key from the current object.\n const keyValue = item[key];\n\n // 3. Check if this key value has been seen before.\n if (seenValues.has(keyValue)) {\n // If the value is already in the Set, return false.\n // This object is a duplicate and will be excluded from the result.\n return false;\n } else {\n // If the value is encountered for the first time, add it to the Set.\n seenValues.add(keyValue);\n // Return true to include the object in the resulting unique array.\n return true;\n }\n });\n}\n","import { OrbitAdapter } from '../types';\n\nexport function formatConnectorChainId(chainId: string | number, connectedAdapter: OrbitAdapter) {\n if (typeof chainId === 'string') {\n return `${connectedAdapter}:${chainId}`;\n } else {\n return chainId;\n }\n}\n","const CONNECTOR_MAPPINGS = new Map([\n ['Impersonated Connector', 'impersonatedwallet'],\n ['Safe', 'safewallet'],\n ['Trust', 'trustwallet'],\n ['Trust Wallet', 'trustwallet'],\n ['Brave Кошелек', 'bravewallet'],\n ['Brave Wallet', 'bravewallet'],\n ['Base Account', 'coinbasewallet'], // TODO: need fix\n]);\n\nexport const formatConnectorName = (connectorName: string): string => {\n return CONNECTOR_MAPPINGS.get(connectorName) ?? connectorName.replace(/\\s+/g, '').toLowerCase();\n};\n","import { ConnectorType, OrbitAdapter } from '../types';\n\n/**\n * Extracts the adapter type from a connector type string\n *\n * @example\n * ```typescript\n * // Returns OrbitAdapter.EVM\n * getAdapterFromConnectorType('evm:metamask');\n *\n * // Returns OrbitAdapter.SOLANA\n * getAdapterFromConnectorType('solana:phantom');\n *\n * // Returns OrbitAdapter.EVM (default)\n * getAdapterFromConnectorType('unknown');\n * ```\n *\n * @param connectorType - Connector type in format \"orbit-adapter:connector\" (e.g. \"evm:metamask\", \"solana:phantom\")\n * @returns The corresponding {@link OrbitAdapter} type or EVM as default\n *\n * @remarks\n * The function splits the connector type string by \":\" and takes the first part as the adapter type.\n * If the split fails or the first part is empty, it defaults to EVM adapter.\n */\nexport function getAdapterFromConnectorType(connectorType: ConnectorType): OrbitAdapter {\n return (connectorType?.split(':')[0] as OrbitAdapter.EVM) ?? OrbitAdapter.EVM;\n}\n","import { OrbitAdapter } from '../types';\n\n/**\n * Generates a standardized connector type identifier from adapter type and connector name\n *\n * @example\n * ```typescript\n * // Returns \"evm:metamask\"\n * getConnectorTypeFromName(OrbitAdapter.EVM, \"MetaMask\");\n *\n * // Returns \"solana:phantom\"\n * getConnectorTypeFromName(OrbitAdapter.SOLANA, \"Phantom\");\n *\n * // Returns \"evm:coinbasewallet\" (removes spaces)\n * getConnectorTypeFromName(OrbitAdapter.EVM, \"Coinbase Wallet\");\n * ```\n *\n * @param adapter - The blockchain adapter type (e.g. EVM, SOLANA)\n * @param name - The connector name (e.g. \"MetaMask\", \"Phantom\")\n * @returns A formatted connector type string in format \"orbit-adapter:connector\"\n *\n * @remarks\n * The function:\n * 1. Combines adapter type with connector name using \":\" as separator\n * 2. Removes all whitespace from connector name\n * 3. Converts connector name to lowercase\n * This ensures consistent connector type identifiers across the application\n * and normalizes connector names for better UX/consistency.\n */\nexport function getConnectorTypeFromName(adapter: OrbitAdapter, name: string): string {\n return `${adapter}:${name.replace(/\\s+/g, '').toLowerCase()}`;\n}\n","/**\n * Internal function for safely retrieving and parsing data from localStorage.\n *\n * @param key - The key for localStorage\n * @returns The parsed LastConnectedConnector object or undefined if data is not found/invalid\n */\nexport function getParsedStorageItem<ReturnType>(key: string): ReturnType | undefined {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const item = window.localStorage.getItem(key);\n\n // If the item is null (not set) or an empty string, return undefined\n if (!item) {\n return undefined;\n }\n\n try {\n // Safe JSON parsing\n return JSON.parse(item) as ReturnType;\n } catch (error) {\n // In case of a parsing error (e.g., invalid JSON), log the error and return undefined\n console.error(`Error parsing ${key} from localStorage:`, error);\n return undefined;\n }\n}\n","/**\n * Helper utilities for managing impersonated wallet addresses\n *\n * @remarks\n * These utilities are primarily used for development and testing purposes.\n * They provide a way to simulate different wallet addresses without actually connecting a wallet.\n * All data is stored in localStorage with the 'satellite-connect:impersonatedAddress' key.\n * Functions are safe to use in both browser and SSR environments.\n */\nexport const impersonatedHelpers = {\n /**\n * Currently impersonated address from localStorage\n * Returns empty string if not set or in SSR context\n */\n impersonatedAddress:\n typeof window !== 'undefined' ? (window.localStorage.getItem('satellite-connect:impersonatedAddress') ?? '') : '',\n\n /**\n * Stores an impersonated address in localStorage\n *\n * @example\n * ```typescript\n * // Set impersonated address\n * impersonatedHelpers.setImpersonated('0x1234...5678');\n * ```\n *\n * @param address - Ethereum or Solana address to impersonate\n * @returns undefined in SSR context, void in browser\n */\n setImpersonated: (address: string) =>\n typeof window !== 'undefined'\n ? window.localStorage.setItem('satellite-connect:impersonatedAddress', address)\n : undefined,\n\n /**\n * Retrieves the current impersonated address from localStorage\n *\n * @example\n * ```typescript\n * // Get current impersonated address\n * const address = impersonatedHelpers.getImpersonated();\n * if (address) {\n * console.log('Currently impersonating:', address);\n * }\n * ```\n * @returns The impersonated address or undefined if not set or in SSR context\n */\n getImpersonated: () =>\n typeof window !== 'undefined' ? window.localStorage.getItem('satellite-connect:impersonatedAddress') : undefined,\n\n removeImpersonated: () =>\n typeof window !== 'undefined' ? window.localStorage.removeItem('satellite-connect:impersonatedAddress') : undefined,\n};\n","export const isSafeApp = typeof window !== 'undefined' && window !== window.parent;\n","import { ConnectorType } from '../types';\nimport { getParsedStorageItem } from './getParsedStorageItem';\n\ntype LastConnectedConnector = { connectorType: ConnectorType; chainId: number | string; address?: string };\n\n/**\n * Helper utilities for managing the last connected wallet state\n *\n * @remarks\n * All data is stored in localStorage with the 'orbit-core:lastConnectedConnector' key.\n * Functions are safe to use in both browser and SSR environments.\n */\nexport const lastConnectedConnectorHelpers = {\n // Key used for localStorage\n STORAGE_KEY: 'orbit-core:lastConnectedConnector',\n\n /**\n * The value of the last connected wallet, initialized when the module loads.\n * Returns undefined if not set, invalid, or in an SSR context.\n */\n lastConnectedConnector: getParsedStorageItem<LastConnectedConnector>('orbit-core:lastConnectedConnector'),\n\n /**\n * Stores the last connected wallet data in localStorage.\n *\n * @param data - Object containing the wallet type and chain ID.\n * @returns undefined in SSR context, void in browser\n */\n setLastConnectedConnector: ({ connectorType, chainId, address }: LastConnectedConnector) =>\n typeof window !== 'undefined'\n ? window.localStorage.setItem(\n lastConnectedConnectorHelpers.STORAGE_KEY,\n JSON.stringify({ connectorType, chainId, address }),\n )\n : undefined,\n\n /**\n * Retrieves the current last connected wallet data from localStorage.\n *\n * @returns The LastConnectedConnector object or undefined if not set or in SSR context\n */\n getLastConnectedConnector: () =>\n getParsedStorageItem<LastConnectedConnector>(lastConnectedConnectorHelpers.STORAGE_KEY),\n\n /**\n * Removes the last connected wallet data from localStorage.\n *\n * @returns undefined in SSR context, void in browser\n */\n removeLastConnectedConnector: () =>\n typeof window !== 'undefined'\n ? window.localStorage.removeItem(lastConnectedConnectorHelpers.STORAGE_KEY)\n : undefined,\n};\n","import { ConnectorType } from '../types';\nimport { getParsedStorageItem } from './getParsedStorageItem';\n\n/**\n * Data structure for a recently connected connector\n *\n * @interface RecentlyConnectedConnectorData\n * @property {string} address - The wallet address that was connected\n * @property {number} disconnectedTimestamp - Unix timestamp in milliseconds when the connector was disconnected\n * @property {string} [icon] - Optional icon URL or identifier for the connector\n */\nexport type RecentlyConnectedConnectorData = {\n address: string;\n disconnectedTimestamp: number;\n icon?: string;\n};\n\n/**\n * Record mapping connector types to their recently connected data\n *\n * @type RecentlyConnectedConnectorsList\n */\nexport type RecentlyConnectedConnectorsList = Record<ConnectorType, RecentlyConnectedConnectorData>;\n\n/**\n * Helper utilities for managing recently connected connectors list with disconnect timestamps\n *\n * @remarks\n * All data is stored in localStorage with the 'orbit-core:recentlyConnectedConnectorsListHelpers' key.\n * Functions are safe to use in both browser and SSR environments.\n *\n * The storage contains a record where each key is a ConnectorType and value contains\n * address, disconnectedTimestamp (Unix timestamp in milliseconds), and optional icon for that connector.\n * This allows tracking when each connector was last disconnected for cleanup and sorting purposes.\n *\n * @example\n * ```typescript\n * // Set entire list\n * recentlyConnectedConnectorsListHelpers.setRecentlyConnectedConnectorsList({\n * 'evm:metamask': {\n * address: '0x123...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'metamask-icon.png'\n * },\n * 'solana:phantom': {\n * address: 'ABC123...',\n * disconnectedTimestamp: Date.now() - 3600000, // 1 hour ago\n * icon: 'phantom-icon.png'\n * }\n * });\n *\n * // Add single connector\n * recentlyConnectedConnectorsListHelpers.addConnector('evm:walletconnect', {\n * address: '0x456...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'walletconnect-icon.png'\n * });\n *\n * // Remove single connector\n * recentlyConnectedConnectorsListHelpers.removeConnector('evm:metamask');\n * ```\n */\nexport const recentlyConnectedConnectorsListHelpers = {\n /** Key used for localStorage storage */\n STORAGE_KEY: 'orbit-core:recentlyConnectedConnectorsListHelpers',\n\n /**\n * The current recently connected connectors list, initialized when the module loads.\n * Returns undefined if not set, invalid, or in an SSR context.\n *\n * @readonly\n */\n recentlyConnectedConnectorsList: getParsedStorageItem<RecentlyConnectedConnectorsList>(\n 'orbit-core:recentlyConnectedConnectorsListHelpers',\n ),\n\n /**\n * Stores the complete recently connected connectors list in localStorage.\n * This will overwrite the entire existing list.\n *\n * @param connectors - Complete RecentlyConnectedConnectorsList object\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * recentlyConnectedConnectorsListHelpers.setRecentlyConnectedConnectorsList({\n * 'evm:metamask': {\n * address: '0x123...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'metamask.png'\n * },\n * 'solana:phantom': {\n * address: 'ABC123...',\n * disconnectedTimestamp: Date.now() - 1800000 // 30 minutes ago\n * }\n * });\n * ```\n */\n setRecentlyConnectedConnectorsList: (connectors: RecentlyConnectedConnectorsList) =>\n typeof window !== 'undefined'\n ? window.localStorage.setItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY, JSON.stringify(connectors))\n : undefined,\n\n /**\n * Retrieves the current recently connected connectors list from localStorage.\n *\n * @returns The RecentlyConnectedConnectorsList object or undefined if not set or in SSR context\n *\n * @example\n * ```typescript\n * const connectors = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n * if (connectors) {\n * console.log('Available connectors:', Object.keys(connectors));\n * // Sort by most recently disconnected\n * const sorted = Object.entries(connectors)\n * .sort(([,a], [,b]) => b.disconnectedTimestamp - a.disconnectedTimestamp);\n * }\n * ```\n */\n getRecentlyConnectedConnectorsList: () =>\n getParsedStorageItem<RecentlyConnectedConnectorsList>(recentlyConnectedConnectorsListHelpers.STORAGE_KEY),\n\n /**\n * Adds or updates a single connector in the recently connected connectors list.\n * Preserves existing connectors and only adds/updates the specified one.\n *\n * @param connectorType - The connector type to add/update\n * @param connectorData - The connector data (address, disconnectedTimestamp, and optional icon)\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Add new connector with current timestamp\n * recentlyConnectedConnectorsListHelpers.addConnector('evm:metamask', {\n * address: '0x123...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'metamask.png'\n * });\n *\n * // Update existing connector with new disconnect time\n * recentlyConnectedConnectorsListHelpers.addConnector('evm:metamask', {\n * address: '0x456...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'new-metamask.png'\n * });\n * ```\n */\n addConnector: (connectorType: ConnectorType, connectorData: RecentlyConnectedConnectorData) => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList() || {};\n const updatedList = {\n ...currentList,\n [connectorType]: connectorData,\n };\n\n window.localStorage.setItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY, JSON.stringify(updatedList));\n },\n\n /**\n * Removes a single connector from the recently connected connectors list.\n * Preserves all other connectors in the list.\n *\n * @param connectorType - The connector type to remove\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Remove specific connector\n * recentlyConnectedConnectorsListHelpers.removeConnector('evm:metamask');\n * ```\n */\n removeConnector: (connectorType: ConnectorType) => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n if (!currentList || !(connectorType in currentList)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [connectorType]: _, ...remainingConnectors } = currentList;\n window.localStorage.setItem(\n recentlyConnectedConnectorsListHelpers.STORAGE_KEY,\n JSON.stringify(remainingConnectors),\n );\n },\n\n /**\n * Checks if a specific connector exists in the recently connected connectors list.\n *\n * @param connectorType - The connector type to check\n * @returns true if the connector exists, false otherwise, undefined in SSR context\n *\n * @example\n * ```typescript\n * if (recentlyConnectedConnectorsListHelpers.hasConnector('evm:metamask')) {\n * console.log('MetaMask was recently connected');\n * }\n * ```\n */\n hasConnector: (connectorType: ConnectorType): boolean | undefined => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n return currentList ? connectorType in currentList : false;\n },\n\n /**\n * Gets data for a specific connector from the recently connected connectors list.\n *\n * @param connectorType - The connector type to get data for\n * @returns The connector data (including address, disconnectedTimestamp, and optional icon) or undefined if not found or in SSR context\n *\n * @example\n * ```typescript\n * const metamaskData = recentlyConnectedConnectorsListHelpers.getConnector('evm:metamask');\n * if (metamaskData) {\n * console.log('MetaMask address:', metamaskData.address);\n * console.log('Disconnected at:', new Date(metamaskData.disconnectedTimestamp));\n * console.log('MetaMask icon:', metamaskData.icon);\n * }\n * ```\n */\n getConnector: (connectorType: ConnectorType): RecentlyConnectedConnectorData | undefined => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n return currentList?.[connectorType];\n },\n\n /**\n * Gets the count of recently connected connectors.\n *\n * @returns Number of connectors in the list, 0 in SSR context or if list is empty\n *\n * @example\n * ```typescript\n * const count = recentlyConnectedConnectorsListHelpers.getConnectorCount();\n * console.log(`${count} connectors recently connected`);\n * ```\n */\n getConnectorCount: (): number => {\n if (typeof window === 'undefined') {\n return 0;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n return currentList ? Object.keys(currentList).length : 0;\n },\n\n /**\n * Gets recently connected connectors sorted by disconnect time (most recent first).\n * Useful for showing connectors in order of recent usage.\n *\n * @returns Array of [ConnectorType, RecentlyConnectedConnectorData] tuples sorted by disconnectedTimestamp (descending), empty array in SSR context\n *\n * @example\n * ```typescript\n * const sortedConnectors = recentlyConnectedConnectorsListHelpers.getConnectorsSortedByTime();\n * sortedConnectors.forEach(([connectorType, data]) => {\n * console.log(`${connectorType}: disconnected ${new Date(data.disconnectedTimestamp)}`);\n * });\n * ```\n */\n getConnectorsSortedByTime: (): [ConnectorType, RecentlyConnectedConnectorData][] => {\n if (typeof window === 'undefined') {\n return [];\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n if (!currentList) {\n return [];\n }\n\n return Object.entries(currentList).sort(([, a], [, b]) => b.disconnectedTimestamp - a.disconnectedTimestamp) as [\n ConnectorType,\n RecentlyConnectedConnectorData,\n ][];\n },\n\n /**\n * Removes connectors that were disconnected before the specified timestamp.\n * Useful for cleaning up old connector entries.\n *\n * @param beforeTimestamp - Unix timestamp in milliseconds; connectors disconnected before this time will be removed\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Remove connectors disconnected more than 7 days ago\n * const weekAgo = Date.now() - (7 * 24 * 60 * 60 * 1000);\n * recentlyConnectedConnectorsListHelpers.removeConnectorsOlderThan(weekAgo);\n * ```\n */\n removeConnectorsOlderThan: (beforeTimestamp: number) => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n if (!currentList) {\n return;\n }\n\n const filteredList = Object.fromEntries(\n Object.entries(currentList).filter(([, data]) => data.disconnectedTimestamp >= beforeTimestamp),\n ) as RecentlyConnectedConnectorsList;\n\n window.localStorage.setItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY, JSON.stringify(filteredList));\n },\n\n /**\n * Removes all recently connected connectors from localStorage.\n *\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Clear all recently connected connectors\n * recentlyConnectedConnectorsListHelpers.removeRecentlyConnectedConnectorsList();\n * ```\n */\n removeRecentlyConnectedConnectorsList: () =>\n typeof window !== 'undefined'\n ? window.localStorage.removeItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY)\n : undefined,\n};\n","/**\n * @file\n * This module provides adapter selection functionality for the Orbit system.\n * Part of the core infrastructure for managing blockchain adapters.\n */\n\nimport { OrbitAdapter, OrbitGenericAdapter } from '../types';\n\n/**\n * Selects an appropriate adapter based on the provided key from either a single adapter\n * or an array of adapters.\n *\n * @typeParam A - Type extending basic adapter interface with a key property\n *\n * @param options - Selection configuration object\n * @param options.adapterKey - Target adapter key to search for\n * @param options.adapter - Single adapter or array of adapters to search within\n *\n * @returns Selected adapter or undefined if no suitable adapter found\n *\n * @remarks\n * If an array is provided but no matching adapter is found, falls back to the first adapter\n * in the array with a warning message.\n *\n * @example\n * ```typescript\n * // Single adapter usage\n * const singleResult = selectAdapterByKey({\n * adapterKey: OrbitAdapter.SOLANA,\n * adapter: { key: OrbitAdapter.SOLANA, connect: async () => {...} }\n * });\n *\n * // Multiple adapters usage\n * const multiResult = selectAdapterByKey({\n * adapterKey: OrbitAdapter.EVM,\n * adapter: [\n * { key: OrbitAdapter.SOLANA, connect: async () => {...} },\n * { key: OrbitAdapter.EVM, connect: async () => {...} }\n * ]\n * });\n * ```\n *\n * @throws {Error} Logs error if adapter array is empty\n * @throws {Warning} Logs warning if requested adapter key not found in array\n */\nexport const selectAdapterByKey = <A extends { key: OrbitAdapter }>({\n adapterKey,\n adapter,\n}: { adapterKey: OrbitAdapter } & OrbitGenericAdapter<A>): A | undefined => {\n if (Array.isArray(adapter)) {\n if (adapter.length === 0) {\n console.error('Adapter selection failed: The provided adapters array is empty.');\n return undefined;\n }\n\n const foundAdapter = adapter.find((a) => a.key === adapterKey);\n\n if (foundAdapter) {\n return foundAdapter;\n } else {\n console.warn(\n `No adapter found for key: \"${adapterKey}\". Falling back to the first available adapter: \"${adapter[0].key}\".`,\n );\n return adapter[0];\n }\n }\n return adapter;\n};\n","export async function waitFor(\n predicate: () => boolean | undefined,\n maxChecks: number = 50,\n checkIntervalMs: number = 200,\n) {\n for (let i = 0; i < maxChecks; i++) {\n if (predicate()) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, checkIntervalMs));\n }\n throw new Error('Predicate not fulfilled in time');\n}\n","/**\n * Checks whether the given chain ID belongs to a Solana network.\n * Supports common Solana network names: 'devnet', 'testnet', 'mainnet-beta', 'mainnet'.\n *\n * @param {number | string} chainId - The chain ID or chain name.\n * @returns {boolean} - True if the chain ID corresponds to a Solana network, false otherwise.\n */\nexport function isSolanaChain(chainId: number | string): boolean {\n if (typeof chainId === 'string') {\n return ['devnet', 'testnet', 'mainnet-beta', 'mainnet'].includes(chainId);\n }\n return false;\n}\n\n/**\n * Sets the chain ID to a Solana-specific format if the chain is a Solana network.\n *\n * @param {number | string} chainId - The original chain ID or name.\n * @returns {string | number} - The formatted chain ID prefixed with 'solana:' if Solana, otherwise the original.\n */\nexport function setChainId(chainId: number | string): string | number {\n if (isSolanaChain(chainId)) {\n return `solana:${chainId}`;\n } else {\n return chainId;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts","../src/utils/delay.ts","../src/utils/filterUniqueByKey.ts","../src/utils/formatConnectorChainId.ts","../src/utils/formatConnectorName.ts","../src/utils/getAdapterFromConnectorType.ts","../src/utils/getConnectorTypeFromName.ts","../src/utils/getParsedStorageItem.ts","../src/utils/impersonatedHelpers.ts","../src/utils/isSafeApp.ts","../src/utils/lastConnectedConnectorHelpers.ts","../src/utils/recentlyConnectedConnectorsListHelpers.ts","../src/utils/selectAdapterByKey.ts","../src/utils/waitFor.ts","../src/utils/%D1%81hainHelpers.ts"],"names":["OrbitAdapter","delay","value","ms","resolve","runTimeout","filterUniqueByKey","array","key","seenValues","item","keyValue","formatConnectorChainId","chainId","connectedAdapter","CONNECTOR_MAPPINGS","formatConnectorName","connectorName","getAdapterFromConnectorType","connectorType","getConnectorTypeFromName","adapter","name","getParsedStorageItem","error","impersonatedHelpers","address","isSafeApp","lastConnectedConnectorHelpers","recentlyConnectedConnectorsListHelpers","connectors","connectorData","updatedList","currentList","_","remainingConnectors","a","b","beforeTimestamp","filteredList","data","selectAdapterByKey","adapterKey","foundAdapter","waitFor","predicate","maxChecks","checkIntervalMs","i","isSolanaChain","setChainId"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @file\n * Core type definitions for the Orbit blockchain adapter system.\n * This file contains fundamental enums and types that define the supported blockchain architectures\n * and their adapter interfaces.\n */\n\n// =================================================================================================\n// 1. ENUMS AND CORE TRANSACTION TYPES\n// =================================================================================================\n\n/**\n * Defines the supported blockchain adapters in the Orbit system.\n * Each adapter corresponds to a specific blockchain architecture and implements\n * the necessary interfaces for that chain's functionality.\n *\n * @enum {string}\n *\n * @example\n * ```typescript\n * // Using adapter types in configuration\n * const config = {\n * chainType: OrbitAdapter.EVM,\n * // other configuration...\n * };\n *\n * // Checking adapter compatibility\n * if (chainType === OrbitAdapter.SOLANA) {\n * // Solana-specific logic\n * }\n * ```\n */\nexport enum OrbitAdapter {\n /**\n * For Ethereum Virtual Machine (EVM) compatible chains.\n * Supports networks like:\n * - Ethereum Mainnet\n * - Polygon\n * - Binance Smart Chain\n * - Avalanche\n * - Other EVM-compatible L1/L2 chains\n */\n EVM = 'evm',\n\n /**\n * For the Solana blockchain.\n * Supports:\n * - Solana Mainnet\n * - Devnet\n * - Testnet\n */\n SOLANA = 'solana',\n\n /**\n * For the Starknet L2 network.\n * Supports:\n * - Starknet Mainnet\n * - Testnet (Goerli)\n * - Other Starknet deployments\n */\n Starknet = 'starknet',\n}\n\n/**\n * Generic type for creating blockchain adapters with type safety.\n * This type ensures that all adapters implement the required interface\n * and are properly keyed by their blockchain type.\n *\n * @typeParam A - Type that extends the base adapter interface with a key property\n *\n * @property {A | A[]} adapter - Single adapter instance or array of adapters\n *\n * @example\n * ```typescript\n * // Single adapter implementation\n * interface EVMAdapter extends BaseAdapter {\n * key: OrbitAdapter.EVM;\n * // EVM-specific methods...\n * }\n * const evmConfig: OrbitGenericAdapter<EVMAdapter> = {\n * adapter: {\n * key: OrbitAdapter.EVM,\n * // implementation...\n * }\n * };\n *\n * // Multiple adapters\n * const multiChainConfig: OrbitGenericAdapter<EVMAdapter> = {\n * adapter: [\n * { key: OrbitAdapter.EVM, ... },\n * { key: OrbitAdapter.SOLANA, ... }\n * ]\n * };\n * ```\n */\nexport type OrbitGenericAdapter<A extends { key: OrbitAdapter }> = {\n adapter: A | A[];\n};\n\nexport type BaseAdapter = {\n /**\n * Generates blockchain explorer URL\n * @returns Explorer URL or undefined if not available\n */\n getExplorerUrl: (url?: string, chainId?: string | number) => string | undefined;\n\n /** Optional method to resolve ENS-like names */\n getName?: (address: string) => Promise<string | null>;\n\n /** Optional method to get avatar for resolved names */\n getAvatar?: (name: string) => Promise<string | null>;\n\n /** Optional method to resolve names to addresses */\n getAddress?: (name: string) => Promise<string | null>;\n};\n\n/**\n * Type representing a connector identifier in format \"OrbitAdapter:connector\"\n * @example \"evm:metamask\" | \"solana:phantom\"\n */\nexport type ConnectorType = `${OrbitAdapter}:${string}`;\n","/**\n * @name delay\n *\n * Ensures the global 'window' object is available (if running in a browser-like environment),\n * then pauses execution for a specified duration, and finally resolves the Promise with the given value.\n *\n * This utility function is designed to be safe for use in Server-Side Rendering (SSR) environments.\n * It asynchronously waits for the 'window' object to be defined before starting the actual timer,\n * helping to prevent errors during the initial server render while still providing a time delay on the client.\n *\n * @template T - The type of the value being resolved.\n *\n * @param {T} value - The value to resolve the Promise with after the delay.\n * @param {number} ms - The number of milliseconds (delay) to wait before resolving the Promise after 'window' is available.\n *\n * @returns {Promise<T>} A Promise that resolves with the provided `value` after both the 'window' check and the delay (`ms`) are complete.\n *\n * @example\n * ```typescript\n * // Use this in an environment where 'window' might not be immediately available (e.g., Next.js component).\n * async function waitForWindowAndDelay() {\n * console.log(\"Start wait...\");\n * // This will wait for window, and then wait 100ms.\n * const data = await delay(\"Ready to connect\", 100);\n * console.log(data);\n * }\n * waitForWindowAndDelay();\n * ```\n */\nexport const delay = <T>(value: T, ms: number): Promise<T> => {\n return new Promise((resolve) => {\n const runTimeout = () => {\n setTimeout(() => resolve(value), ms);\n };\n\n if (typeof window !== 'undefined') {\n runTimeout();\n } else {\n setTimeout(runTimeout, 0);\n }\n });\n};\n","/**\n * Filters an array of objects to keep only the first occurrence of an object\n * based on a unique value of a specified key.\n *\n * This function is generic and type-safe. It iterates through the array and uses a\n * Set to track already encountered key values, effectively removing duplicates.\n *\n * @template T The type of the objects in the array.\n * @param {T[]} array - The array of objects to be filtered.\n * @param {keyof T} key - The object key (property name) whose values must be unique.\n * @returns {T[]} The filtered array containing only objects with unique key values.\n */\nexport function filterUniqueByKey<T>(array: T[], key: keyof T): T[] {\n // 1. Create a Set to store the unique values of the key encountered so far.\n // Set is a collection of unique values, which is perfect for fast duplicate checks.\n const seenValues = new Set<T[keyof T]>();\n\n // 2. Use the native Array.prototype.filter() method to create a new, filtered array.\n return array.filter((item) => {\n // Access the value of the specified key from the current object.\n const keyValue = item[key];\n\n // 3. Check if this key value has been seen before.\n if (seenValues.has(keyValue)) {\n // If the value is already in the Set, return false.\n // This object is a duplicate and will be excluded from the result.\n return false;\n } else {\n // If the value is encountered for the first time, add it to the Set.\n seenValues.add(keyValue);\n // Return true to include the object in the resulting unique array.\n return true;\n }\n });\n}\n","import { OrbitAdapter } from '../types';\n\nexport function formatConnectorChainId(chainId: string | number, connectedAdapter: OrbitAdapter) {\n if (typeof chainId === 'string') {\n return `${connectedAdapter}:${chainId}`;\n } else {\n return chainId;\n }\n}\n","const CONNECTOR_MAPPINGS = new Map([\n ['Impersonated Connector', 'impersonatedwallet'],\n ['Safe', 'safewallet'],\n ['Trust', 'trustwallet'],\n ['Trust Wallet', 'trustwallet'],\n ['Brave Кошелек', 'bravewallet'],\n ['Brave Wallet', 'bravewallet'],\n ['Base Account', 'coinbasewallet'], // TODO: need fix\n]);\n\nexport const formatConnectorName = (connectorName: string): string => {\n return CONNECTOR_MAPPINGS.get(connectorName) ?? connectorName.replace(/\\s+/g, '').toLowerCase();\n};\n","import { ConnectorType, OrbitAdapter } from '../types';\n\n/**\n * Extracts the adapter type from a connector type string\n *\n * @example\n * ```typescript\n * // Returns OrbitAdapter.EVM\n * getAdapterFromConnectorType('evm:metamask');\n *\n * // Returns OrbitAdapter.SOLANA\n * getAdapterFromConnectorType('solana:phantom');\n *\n * // Returns OrbitAdapter.EVM (default)\n * getAdapterFromConnectorType('unknown');\n * ```\n *\n * @param connectorType - Connector type in format \"orbit-adapter:connector\" (e.g. \"evm:metamask\", \"solana:phantom\")\n * @returns The corresponding {@link OrbitAdapter} type or EVM as default\n *\n * @remarks\n * The function splits the connector type string by \":\" and takes the first part as the adapter type.\n * If the split fails or the first part is empty, it defaults to EVM adapter.\n */\nexport function getAdapterFromConnectorType(connectorType: ConnectorType): OrbitAdapter {\n return (connectorType?.split(':')[0] as OrbitAdapter.EVM) ?? OrbitAdapter.EVM;\n}\n","import { OrbitAdapter } from '../types';\n\n/**\n * Generates a standardized connector type identifier from adapter type and connector name\n *\n * @example\n * ```typescript\n * // Returns \"evm:metamask\"\n * getConnectorTypeFromName(OrbitAdapter.EVM, \"MetaMask\");\n *\n * // Returns \"solana:phantom\"\n * getConnectorTypeFromName(OrbitAdapter.SOLANA, \"Phantom\");\n *\n * // Returns \"evm:coinbasewallet\" (removes spaces)\n * getConnectorTypeFromName(OrbitAdapter.EVM, \"Coinbase Wallet\");\n * ```\n *\n * @param adapter - The blockchain adapter type (e.g. EVM, SOLANA)\n * @param name - The connector name (e.g. \"MetaMask\", \"Phantom\")\n * @returns A formatted connector type string in format \"orbit-adapter:connector\"\n *\n * @remarks\n * The function:\n * 1. Combines adapter type with connector name using \":\" as separator\n * 2. Removes all whitespace from connector name\n * 3. Converts connector name to lowercase\n * This ensures consistent connector type identifiers across the application\n * and normalizes connector names for better UX/consistency.\n */\nexport function getConnectorTypeFromName(adapter: OrbitAdapter, name: string): string {\n return `${adapter}:${name.replace(/\\s+/g, '').toLowerCase()}`;\n}\n","/**\n * Internal function for safely retrieving and parsing data from localStorage.\n *\n * @param key - The key for localStorage\n * @returns The parsed LastConnectedConnector object or undefined if data is not found/invalid\n */\nexport function getParsedStorageItem<ReturnType>(key: string): ReturnType | undefined {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const item = window.localStorage.getItem(key);\n\n // If the item is null (not set) or an empty string, return undefined\n if (!item) {\n return undefined;\n }\n\n try {\n // Safe JSON parsing\n return JSON.parse(item) as ReturnType;\n } catch (error) {\n // In case of a parsing error (e.g., invalid JSON), log the error and return undefined\n console.error(`Error parsing ${key} from localStorage:`, error);\n return undefined;\n }\n}\n","/**\n * Helper utilities for managing impersonated wallet addresses\n *\n * @remarks\n * These utilities are primarily used for development and testing purposes.\n * They provide a way to simulate different wallet addresses without actually connecting a wallet.\n * All data is stored in localStorage with the 'satellite-connect:impersonatedAddress' key.\n * Functions are safe to use in both browser and SSR environments.\n */\nexport const impersonatedHelpers = {\n /**\n * Currently impersonated address from localStorage\n * Returns empty string if not set or in SSR context\n */\n impersonatedAddress:\n typeof window !== 'undefined' ? (window.localStorage.getItem('satellite-connect:impersonatedAddress') ?? '') : '',\n\n /**\n * Stores an impersonated address in localStorage\n *\n * @example\n * ```typescript\n * // Set impersonated address\n * impersonatedHelpers.setImpersonated('0x1234...5678');\n * ```\n *\n * @param address - Ethereum or Solana address to impersonate\n * @returns undefined in SSR context, void in browser\n */\n setImpersonated: (address: string) =>\n typeof window !== 'undefined'\n ? window.localStorage.setItem('satellite-connect:impersonatedAddress', address)\n : undefined,\n\n /**\n * Retrieves the current impersonated address from localStorage\n *\n * @example\n * ```typescript\n * // Get current impersonated address\n * const address = impersonatedHelpers.getImpersonated();\n * if (address) {\n * console.log('Currently impersonating:', address);\n * }\n * ```\n * @returns The impersonated address or undefined if not set or in SSR context\n */\n getImpersonated: () =>\n typeof window !== 'undefined' ? window.localStorage.getItem('satellite-connect:impersonatedAddress') : undefined,\n\n removeImpersonated: () =>\n typeof window !== 'undefined' ? window.localStorage.removeItem('satellite-connect:impersonatedAddress') : undefined,\n};\n","export const isSafeApp = typeof window !== 'undefined' && window !== window.parent;\n","import { ConnectorType } from '../types';\nimport { getParsedStorageItem } from './getParsedStorageItem';\n\ntype LastConnectedConnector = { connectorType: ConnectorType; chainId: number | string; address?: string };\n\n/**\n * Helper utilities for managing the last connected wallet state\n *\n * @remarks\n * All data is stored in localStorage with the 'orbit-core:lastConnectedConnector' key.\n * Functions are safe to use in both browser and SSR environments.\n */\nexport const lastConnectedConnectorHelpers = {\n // Key used for localStorage\n STORAGE_KEY: 'orbit-core:lastConnectedConnector',\n\n /**\n * The value of the last connected wallet, initialized when the module loads.\n * Returns undefined if not set, invalid, or in an SSR context.\n */\n lastConnectedConnector: getParsedStorageItem<LastConnectedConnector>('orbit-core:lastConnectedConnector'),\n\n /**\n * Stores the last connected wallet data in localStorage.\n *\n * @param data - Object containing the wallet type and chain ID.\n * @returns undefined in SSR context, void in browser\n */\n setLastConnectedConnector: ({ connectorType, chainId, address }: LastConnectedConnector) =>\n typeof window !== 'undefined'\n ? window.localStorage.setItem(\n lastConnectedConnectorHelpers.STORAGE_KEY,\n JSON.stringify({ connectorType, chainId, address }),\n )\n : undefined,\n\n /**\n * Retrieves the current last connected wallet data from localStorage.\n *\n * @returns The LastConnectedConnector object or undefined if not set or in SSR context\n */\n getLastConnectedConnector: () =>\n getParsedStorageItem<LastConnectedConnector>(lastConnectedConnectorHelpers.STORAGE_KEY),\n\n /**\n * Removes the last connected wallet data from localStorage.\n *\n * @returns undefined in SSR context, void in browser\n */\n removeLastConnectedConnector: () =>\n typeof window !== 'undefined'\n ? window.localStorage.removeItem(lastConnectedConnectorHelpers.STORAGE_KEY)\n : undefined,\n};\n","import { ConnectorType } from '../types';\nimport { getParsedStorageItem } from './getParsedStorageItem';\n\n/**\n * Data structure for a recently connected connector\n *\n * @interface RecentlyConnectedConnectorData\n * @property {string} address - The wallet address that was connected\n * @property {number} disconnectedTimestamp - Unix timestamp in milliseconds when the connector was disconnected\n * @property {string} [icon] - Optional icon URL or identifier for the connector\n */\nexport type RecentlyConnectedConnectorData = {\n address: string;\n disconnectedTimestamp: number;\n icon?: string;\n};\n\n/**\n * Record mapping connector types to their recently connected data\n *\n * @type RecentlyConnectedConnectorsList\n */\nexport type RecentlyConnectedConnectorsList = Record<ConnectorType, RecentlyConnectedConnectorData>;\n\n/**\n * Helper utilities for managing recently connected connectors list with disconnect timestamps\n *\n * @remarks\n * All data is stored in localStorage with the 'orbit-core:recentlyConnectedConnectorsListHelpers' key.\n * Functions are safe to use in both browser and SSR environments.\n *\n * The storage contains a record where each key is a ConnectorType and value contains\n * address, disconnectedTimestamp (Unix timestamp in milliseconds), and optional icon for that connector.\n * This allows tracking when each connector was last disconnected for cleanup and sorting purposes.\n *\n * @example\n * ```typescript\n * // Set entire list\n * recentlyConnectedConnectorsListHelpers.setRecentlyConnectedConnectorsList({\n * 'evm:metamask': {\n * address: '0x123...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'metamask-icon.png'\n * },\n * 'solana:phantom': {\n * address: 'ABC123...',\n * disconnectedTimestamp: Date.now() - 3600000, // 1 hour ago\n * icon: 'phantom-icon.png'\n * }\n * });\n *\n * // Add single connector\n * recentlyConnectedConnectorsListHelpers.addConnector('evm:walletconnect', {\n * address: '0x456...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'walletconnect-icon.png'\n * });\n *\n * // Remove single connector\n * recentlyConnectedConnectorsListHelpers.removeConnector('evm:metamask');\n * ```\n */\nexport const recentlyConnectedConnectorsListHelpers = {\n /** Key used for localStorage storage */\n STORAGE_KEY: 'orbit-core:recentlyConnectedConnectorsListHelpers',\n\n /**\n * The current recently connected connectors list, initialized when the module loads.\n * Returns undefined if not set, invalid, or in an SSR context.\n *\n * @readonly\n */\n recentlyConnectedConnectorsList: getParsedStorageItem<RecentlyConnectedConnectorsList>(\n 'orbit-core:recentlyConnectedConnectorsListHelpers',\n ),\n\n /**\n * Stores the complete recently connected connectors list in localStorage.\n * This will overwrite the entire existing list.\n *\n * @param connectors - Complete RecentlyConnectedConnectorsList object\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * recentlyConnectedConnectorsListHelpers.setRecentlyConnectedConnectorsList({\n * 'evm:metamask': {\n * address: '0x123...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'metamask.png'\n * },\n * 'solana:phantom': {\n * address: 'ABC123...',\n * disconnectedTimestamp: Date.now() - 1800000 // 30 minutes ago\n * }\n * });\n * ```\n */\n setRecentlyConnectedConnectorsList: (connectors: RecentlyConnectedConnectorsList) =>\n typeof window !== 'undefined'\n ? window.localStorage.setItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY, JSON.stringify(connectors))\n : undefined,\n\n /**\n * Retrieves the current recently connected connectors list from localStorage.\n *\n * @returns The RecentlyConnectedConnectorsList object or undefined if not set or in SSR context\n *\n * @example\n * ```typescript\n * const connectors = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n * if (connectors) {\n * console.log('Available connectors:', Object.keys(connectors));\n * // Sort by most recently disconnected\n * const sorted = Object.entries(connectors)\n * .sort(([,a], [,b]) => b.disconnectedTimestamp - a.disconnectedTimestamp);\n * }\n * ```\n */\n getRecentlyConnectedConnectorsList: () =>\n getParsedStorageItem<RecentlyConnectedConnectorsList>(recentlyConnectedConnectorsListHelpers.STORAGE_KEY),\n\n /**\n * Adds or updates a single connector in the recently connected connectors list.\n * Preserves existing connectors and only adds/updates the specified one.\n *\n * @param connectorType - The connector type to add/update\n * @param connectorData - The connector data (address, disconnectedTimestamp, and optional icon)\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Add new connector with current timestamp\n * recentlyConnectedConnectorsListHelpers.addConnector('evm:metamask', {\n * address: '0x123...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'metamask.png'\n * });\n *\n * // Update existing connector with new disconnect time\n * recentlyConnectedConnectorsListHelpers.addConnector('evm:metamask', {\n * address: '0x456...',\n * disconnectedTimestamp: Date.now(),\n * icon: 'new-metamask.png'\n * });\n * ```\n */\n addConnector: (connectorType: ConnectorType, connectorData: RecentlyConnectedConnectorData) => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList() || {};\n const updatedList = {\n ...currentList,\n [connectorType]: connectorData,\n };\n\n window.localStorage.setItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY, JSON.stringify(updatedList));\n },\n\n /**\n * Removes a single connector from the recently connected connectors list.\n * Preserves all other connectors in the list.\n *\n * @param connectorType - The connector type to remove\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Remove specific connector\n * recentlyConnectedConnectorsListHelpers.removeConnector('evm:metamask');\n * ```\n */\n removeConnector: (connectorType: ConnectorType) => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n if (!currentList || !(connectorType in currentList)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [connectorType]: _, ...remainingConnectors } = currentList;\n window.localStorage.setItem(\n recentlyConnectedConnectorsListHelpers.STORAGE_KEY,\n JSON.stringify(remainingConnectors),\n );\n },\n\n /**\n * Checks if a specific connector exists in the recently connected connectors list.\n *\n * @param connectorType - The connector type to check\n * @returns true if the connector exists, false otherwise, undefined in SSR context\n *\n * @example\n * ```typescript\n * if (recentlyConnectedConnectorsListHelpers.hasConnector('evm:metamask')) {\n * console.log('MetaMask was recently connected');\n * }\n * ```\n */\n hasConnector: (connectorType: ConnectorType): boolean | undefined => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n return currentList ? connectorType in currentList : false;\n },\n\n /**\n * Gets data for a specific connector from the recently connected connectors list.\n *\n * @param connectorType - The connector type to get data for\n * @returns The connector data (including address, disconnectedTimestamp, and optional icon) or undefined if not found or in SSR context\n *\n * @example\n * ```typescript\n * const metamaskData = recentlyConnectedConnectorsListHelpers.getConnector('evm:metamask');\n * if (metamaskData) {\n * console.log('MetaMask address:', metamaskData.address);\n * console.log('Disconnected at:', new Date(metamaskData.disconnectedTimestamp));\n * console.log('MetaMask icon:', metamaskData.icon);\n * }\n * ```\n */\n getConnector: (connectorType: ConnectorType): RecentlyConnectedConnectorData | undefined => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n return currentList?.[connectorType];\n },\n\n /**\n * Gets the count of recently connected connectors.\n *\n * @returns Number of connectors in the list, 0 in SSR context or if list is empty\n *\n * @example\n * ```typescript\n * const count = recentlyConnectedConnectorsListHelpers.getConnectorCount();\n * console.log(`${count} connectors recently connected`);\n * ```\n */\n getConnectorCount: (): number => {\n if (typeof window === 'undefined') {\n return 0;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n return currentList ? Object.keys(currentList).length : 0;\n },\n\n /**\n * Gets recently connected connectors sorted by disconnect time (most recent first).\n * Useful for showing connectors in order of recent usage.\n *\n * @returns Array of [ConnectorType, RecentlyConnectedConnectorData] tuples sorted by disconnectedTimestamp (descending), empty array in SSR context\n *\n * @example\n * ```typescript\n * const sortedConnectors = recentlyConnectedConnectorsListHelpers.getConnectorsSortedByTime();\n * sortedConnectors.forEach(([connectorType, data]) => {\n * console.log(`${connectorType}: disconnected ${new Date(data.disconnectedTimestamp)}`);\n * });\n * ```\n */\n getConnectorsSortedByTime: (): [ConnectorType, RecentlyConnectedConnectorData][] => {\n if (typeof window === 'undefined') {\n return [];\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n if (!currentList) {\n return [];\n }\n\n return Object.entries(currentList).sort(([, a], [, b]) => b.disconnectedTimestamp - a.disconnectedTimestamp) as [\n ConnectorType,\n RecentlyConnectedConnectorData,\n ][];\n },\n\n /**\n * Removes connectors that were disconnected before the specified timestamp.\n * Useful for cleaning up old connector entries.\n *\n * @param beforeTimestamp - Unix timestamp in milliseconds; connectors disconnected before this time will be removed\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Remove connectors disconnected more than 7 days ago\n * const weekAgo = Date.now() - (7 * 24 * 60 * 60 * 1000);\n * recentlyConnectedConnectorsListHelpers.removeConnectorsOlderThan(weekAgo);\n * ```\n */\n removeConnectorsOlderThan: (beforeTimestamp: number) => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const currentList = recentlyConnectedConnectorsListHelpers.getRecentlyConnectedConnectorsList();\n if (!currentList) {\n return;\n }\n\n const filteredList = Object.fromEntries(\n Object.entries(currentList).filter(([, data]) => data.disconnectedTimestamp >= beforeTimestamp),\n ) as RecentlyConnectedConnectorsList;\n\n window.localStorage.setItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY, JSON.stringify(filteredList));\n },\n\n /**\n * Removes all recently connected connectors from localStorage.\n *\n * @returns undefined in SSR context, void in browser\n *\n * @example\n * ```typescript\n * // Clear all recently connected connectors\n * recentlyConnectedConnectorsListHelpers.removeRecentlyConnectedConnectorsList();\n * ```\n */\n removeRecentlyConnectedConnectorsList: () =>\n typeof window !== 'undefined'\n ? window.localStorage.removeItem(recentlyConnectedConnectorsListHelpers.STORAGE_KEY)\n : undefined,\n};\n","/**\n * @file\n * This module provides adapter selection functionality for the Orbit system.\n * Part of the core infrastructure for managing blockchain adapters.\n */\n\nimport { OrbitAdapter, OrbitGenericAdapter } from '../types';\n\n/**\n * Selects an appropriate adapter based on the provided key from either a single adapter\n * or an array of adapters.\n *\n * @typeParam A - Type extending basic adapter interface with a key property\n *\n * @param options - Selection configuration object\n * @param options.adapterKey - Target adapter key to search for\n * @param options.adapter - Single adapter or array of adapters to search within\n *\n * @returns Selected adapter or undefined if no suitable adapter found\n *\n * @remarks\n * If an array is provided but no matching adapter is found, falls back to the first adapter\n * in the array with a warning message.\n *\n * @example\n * ```typescript\n * // Single adapter usage\n * const singleResult = selectAdapterByKey({\n * adapterKey: OrbitAdapter.SOLANA,\n * adapter: { key: OrbitAdapter.SOLANA, connect: async () => {...} }\n * });\n *\n * // Multiple adapters usage\n * const multiResult = selectAdapterByKey({\n * adapterKey: OrbitAdapter.EVM,\n * adapter: [\n * { key: OrbitAdapter.SOLANA, connect: async () => {...} },\n * { key: OrbitAdapter.EVM, connect: async () => {...} }\n * ]\n * });\n * ```\n *\n * @throws {Error} Logs error if adapter array is empty\n * @throws {Warning} Logs warning if requested adapter key not found in array\n */\nexport const selectAdapterByKey = <A extends { key: OrbitAdapter }>({\n adapterKey,\n adapter,\n}: { adapterKey: OrbitAdapter } & OrbitGenericAdapter<A>): A | undefined => {\n if (Array.isArray(adapter)) {\n if (adapter.length === 0) {\n console.error('Adapter selection failed: The provided adapters array is empty.');\n return undefined;\n }\n\n const foundAdapter = adapter.find((a) => a.key === adapterKey);\n\n if (foundAdapter) {\n return foundAdapter;\n } else {\n console.warn(\n `No adapter found for key: \"${adapterKey}\". Falling back to the first available adapter: \"${adapter[0].key}\".`,\n );\n return adapter[0];\n }\n }\n return adapter;\n};\n","export async function waitFor(\n predicate: () => boolean | undefined,\n maxChecks: number = 50,\n checkIntervalMs: number = 200,\n) {\n for (let i = 0; i < maxChecks; i++) {\n if (predicate()) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, checkIntervalMs));\n }\n throw new Error('Predicate not fulfilled in time');\n}\n","/**\n * Checks whether the given chain ID belongs to a Solana network.\n * Supports common Solana network names: 'devnet', 'testnet', 'mainnet-beta', 'mainnet'.\n *\n * @param {number | string} chainId - The chain ID or chain name.\n * @returns {boolean} - True if the chain ID corresponds to a Solana network, false otherwise.\n */\nexport function isSolanaChain(chainId: number | string): boolean {\n if (typeof chainId === 'string') {\n return ['devnet', 'testnet', 'mainnet-beta', 'mainnet'].includes(chainId);\n }\n return false;\n}\n\n/**\n * Sets the chain ID to a Solana-specific format if the chain is a Solana network.\n *\n * @param {number | string} chainId - The original chain ID or name.\n * @returns {string | number} - The formatted chain ID prefixed with 'solana:' if Solana, otherwise the original.\n */\nexport function setChainId(chainId: number | string): string | number {\n if (isSolanaChain(chainId)) {\n return `solana:${chainId}`;\n } else {\n return chainId;\n }\n}\n"]}