@tuwaio/satellite-solana 1.0.0-fix-adapters-independ-alpha.7.0de606d → 1.0.0-fix-adapters-independ-alpha.9.583293c
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 +56 -1
- package/dist/index.d.ts +56 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -2,6 +2,7 @@ import { SolanaRPCUrls } from '@tuwaio/orbit-solana';
|
|
|
2
2
|
import { BaseConnector, SatelliteAdapter } from '@tuwaio/satellite-core';
|
|
3
3
|
import { UiWallet, UiWalletAccount } from '@wallet-standard/ui';
|
|
4
4
|
import { StandardConnectMethod } from '@wallet-standard/features';
|
|
5
|
+
import { ConnectorType } from '@tuwaio/orbit-core';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Extended wallet interface for Solana-specific properties
|
|
@@ -85,4 +86,58 @@ declare function connect(uiWallet: UiWallet, input?: Omit<NonNullable<Parameters
|
|
|
85
86
|
*/
|
|
86
87
|
declare function disconnect(uiWallet: UiWallet): Promise<void>;
|
|
87
88
|
|
|
88
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Callback functions interface for the Solana connections watcher.
|
|
91
|
+
* These callbacks are used to interact with the global state store.
|
|
92
|
+
*/
|
|
93
|
+
interface SolanaWatcherCallbacks {
|
|
94
|
+
/** The currently active Solana connection from the global store */
|
|
95
|
+
activeConnection: SolanaConnection | undefined;
|
|
96
|
+
/** Function to disconnect a specific connector type */
|
|
97
|
+
disconnect: (connectorType: ConnectorType) => void;
|
|
98
|
+
/** Current connection error state, if any */
|
|
99
|
+
connectionError: string | undefined;
|
|
100
|
+
/** Function to update the active connection's properties */
|
|
101
|
+
updateActiveConnection: (connection: Partial<SolanaConnection>) => void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Configuration interface for the Solana connections watcher.
|
|
105
|
+
*/
|
|
106
|
+
interface SolanaWatcherConfig {
|
|
107
|
+
/** Array of available Solana wallets from the Wallet Standard */
|
|
108
|
+
wallets: UiWallet[];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates and initializes a Solana connections watcher that monitors wallet standard changes
|
|
112
|
+
* and synchronizes them with the global state store.
|
|
113
|
+
*
|
|
114
|
+
* This function provides a pure, framework-agnostic way to watch Solana wallet connections
|
|
115
|
+
* without being tied to React hooks or components.
|
|
116
|
+
*
|
|
117
|
+
* Unlike EVM connections, Solana uses the Wallet Standard which doesn't provide
|
|
118
|
+
* native watchers, so this function implements the watching logic directly.
|
|
119
|
+
*
|
|
120
|
+
* @param config - Configuration object containing wallets array from Wallet Standard
|
|
121
|
+
* @param callbacks - Callback functions for interacting with the global state
|
|
122
|
+
* @returns A cleanup function to stop watching connections (currently a no-op as Wallet Standard doesn't provide native watchers)
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const unwatch = createSolanaConnectionsWatcher(
|
|
127
|
+
* { wallets },
|
|
128
|
+
* { activeConnection, disconnect, connectionError, updateActiveConnection }
|
|
129
|
+
* );
|
|
130
|
+
*
|
|
131
|
+
* // Later, when you need to stop watching (currently no cleanup needed):
|
|
132
|
+
* unwatch();
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @remarks
|
|
136
|
+
* The Solana watcher works differently from the EVM watcher because:
|
|
137
|
+
* - It relies on the Wallet Standard's wallets array changes
|
|
138
|
+
* - It doesn't have native connection event listeners like wagmi
|
|
139
|
+
* - The watching is done by comparing wallet state changes in the wallets array
|
|
140
|
+
*/
|
|
141
|
+
declare function createSolanaConnectionsWatcher(config: SolanaWatcherConfig, callbacks: SolanaWatcherCallbacks): () => void;
|
|
142
|
+
|
|
143
|
+
export { type ConnectorSolana, type SolanaConnection, type SolanaWatcherCallbacks, type SolanaWatcherConfig, connect, createSolanaConnectionsWatcher, disconnect, satelliteSolanaAdapter };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { SolanaRPCUrls } from '@tuwaio/orbit-solana';
|
|
|
2
2
|
import { BaseConnector, SatelliteAdapter } from '@tuwaio/satellite-core';
|
|
3
3
|
import { UiWallet, UiWalletAccount } from '@wallet-standard/ui';
|
|
4
4
|
import { StandardConnectMethod } from '@wallet-standard/features';
|
|
5
|
+
import { ConnectorType } from '@tuwaio/orbit-core';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Extended wallet interface for Solana-specific properties
|
|
@@ -85,4 +86,58 @@ declare function connect(uiWallet: UiWallet, input?: Omit<NonNullable<Parameters
|
|
|
85
86
|
*/
|
|
86
87
|
declare function disconnect(uiWallet: UiWallet): Promise<void>;
|
|
87
88
|
|
|
88
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Callback functions interface for the Solana connections watcher.
|
|
91
|
+
* These callbacks are used to interact with the global state store.
|
|
92
|
+
*/
|
|
93
|
+
interface SolanaWatcherCallbacks {
|
|
94
|
+
/** The currently active Solana connection from the global store */
|
|
95
|
+
activeConnection: SolanaConnection | undefined;
|
|
96
|
+
/** Function to disconnect a specific connector type */
|
|
97
|
+
disconnect: (connectorType: ConnectorType) => void;
|
|
98
|
+
/** Current connection error state, if any */
|
|
99
|
+
connectionError: string | undefined;
|
|
100
|
+
/** Function to update the active connection's properties */
|
|
101
|
+
updateActiveConnection: (connection: Partial<SolanaConnection>) => void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Configuration interface for the Solana connections watcher.
|
|
105
|
+
*/
|
|
106
|
+
interface SolanaWatcherConfig {
|
|
107
|
+
/** Array of available Solana wallets from the Wallet Standard */
|
|
108
|
+
wallets: UiWallet[];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates and initializes a Solana connections watcher that monitors wallet standard changes
|
|
112
|
+
* and synchronizes them with the global state store.
|
|
113
|
+
*
|
|
114
|
+
* This function provides a pure, framework-agnostic way to watch Solana wallet connections
|
|
115
|
+
* without being tied to React hooks or components.
|
|
116
|
+
*
|
|
117
|
+
* Unlike EVM connections, Solana uses the Wallet Standard which doesn't provide
|
|
118
|
+
* native watchers, so this function implements the watching logic directly.
|
|
119
|
+
*
|
|
120
|
+
* @param config - Configuration object containing wallets array from Wallet Standard
|
|
121
|
+
* @param callbacks - Callback functions for interacting with the global state
|
|
122
|
+
* @returns A cleanup function to stop watching connections (currently a no-op as Wallet Standard doesn't provide native watchers)
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const unwatch = createSolanaConnectionsWatcher(
|
|
127
|
+
* { wallets },
|
|
128
|
+
* { activeConnection, disconnect, connectionError, updateActiveConnection }
|
|
129
|
+
* );
|
|
130
|
+
*
|
|
131
|
+
* // Later, when you need to stop watching (currently no cleanup needed):
|
|
132
|
+
* unwatch();
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @remarks
|
|
136
|
+
* The Solana watcher works differently from the EVM watcher because:
|
|
137
|
+
* - It relies on the Wallet Standard's wallets array changes
|
|
138
|
+
* - It doesn't have native connection event listeners like wagmi
|
|
139
|
+
* - The watching is done by comparing wallet state changes in the wallets array
|
|
140
|
+
*/
|
|
141
|
+
declare function createSolanaConnectionsWatcher(config: SolanaWatcherConfig, callbacks: SolanaWatcherCallbacks): () => void;
|
|
142
|
+
|
|
143
|
+
export { type ConnectorSolana, type SolanaConnection, type SolanaWatcherCallbacks, type SolanaWatcherConfig, connect, createSolanaConnectionsWatcher, disconnect, satelliteSolanaAdapter };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var orbitCore=require('@tuwaio/orbit-core'),orbitSolana=require('@tuwaio/orbit-solana'),gill=require('gill'),features=require('@wallet-standard/features'),ui=require('@wallet-standard/ui'),uiRegistry=require('@wallet-standard/ui-registry');async function
|
|
1
|
+
'use strict';var orbitCore=require('@tuwaio/orbit-core'),orbitSolana=require('@tuwaio/orbit-solana'),gill=require('gill'),features=require('@wallet-standard/features'),ui=require('@wallet-standard/ui'),uiRegistry=require('@wallet-standard/ui-registry');async function m(r,n){let a=ui.getWalletFeature(r,features.StandardConnect),{accounts:t}=await a.connect(n);return {uiWallet:orbitSolana.getAvailableSolanaConnectors().filter(o=>o.accounts.find(c=>c.address.toLowerCase()===t[0].address.toLowerCase()))[0],accounts:t.map(o=>uiRegistry.getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiRegistry.getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(r),o))}}async function C(r){await ui.getWalletFeature(r,features.StandardDisconnect)?.disconnect();}function G({rpcUrls:r}){return {key:orbitCore.OrbitAdapter.SOLANA,async connect({connectorType:n,chainId:a}){let e=orbitSolana.getAvailableSolanaConnectors().find(o=>orbitCore.getConnectorTypeFromName(orbitCore.OrbitAdapter.SOLANA,orbitCore.formatConnectorName(o.name))===n);if(!e)throw new Error("Cannot find connector with this wallet type");try{let{uiWallet:o,accounts:c}=await m(e),u=orbitSolana.getCluster({cluster:a});return {connectorType:n,address:c[0].address,chainId:u,rpcURL:orbitSolana.getRpcUrlForCluster({cluster:u,rpcUrls:r}),isConnected:!0,isContractAddress:!1,icon:o?.icon?.trim(),connectedAccount:c[0],connectedWallet:o}}catch(o){throw new Error(o instanceof Error?o.message:String(o))}},async disconnect(n){if(n&&n?.connectedWallet)await C(n.connectedWallet);else {let t=orbitSolana.getAvailableSolanaConnectors().filter(e=>e.accounts.length>0);await Promise.allSettled(t.map(async e=>{try{await C(e);}catch{}}));}},getConnectors(){let n=orbitSolana.getAvailableSolanaConnectors();return {adapter:orbitCore.OrbitAdapter.SOLANA,connectors:n}},async checkAndSwitchNetwork(n,a,t){if(a!==n&&t){let e=orbitSolana.getCluster({cluster:n});t({chainId:e,rpcURL:orbitSolana.getRpcUrlForCluster({cluster:e,rpcUrls:r})});}},getBalance:async(n,a)=>{let e=await orbitSolana.createSolanaRPC({rpcUrlOrMoniker:orbitSolana.getCluster({cluster:a}),rpcUrls:r}).getBalance(gill.address(n)).send();return {value:gill.lamportsToSol(e.value),symbol:"SOL"}},getExplorerUrl(n,a){return orbitSolana.getSolanaExplorerLink(n,a)},async getName(n){return orbitSolana.getSolanaAddressName(n)},async getAvatar(n){return orbitSolana.getSolanaAddressAvatar(n)},switchConnection:async n=>{let t=orbitSolana.getAvailableSolanaConnectors().find(e=>orbitCore.getConnectorTypeFromName(orbitCore.OrbitAdapter.SOLANA,orbitCore.formatConnectorName(e.name))===n);if(!t)throw new Error(`Cannot find connector with type: ${n}`);try{await m(t);}catch(e){throw new Error(`Failed to switch to connector ${n}: ${e instanceof Error?e.message:String(e)}`)}}}}function V(r,n){let{wallets:a}=r,{activeConnection:t,disconnect:e,connectionError:o,updateActiveConnection:c}=n;return (()=>{if(!t||orbitCore.getAdapterFromConnectorType(t.connectorType)!==orbitCore.OrbitAdapter.SOLANA)return;let s=a.find(l=>orbitCore.getConnectorTypeFromName(orbitCore.OrbitAdapter.SOLANA,orbitCore.formatConnectorName(l.name))===t.connectorType);if(!o&&s){let l={address:s.accounts[0]?.address,isConnected:s.accounts.length>0,connectedAccount:s.accounts[0],connectedWallet:s};(l.address!==t.address||l.isConnected!==t.isConnected)&&c(l);}s?.accounts.length===0&&t.connectorType&&e(t.connectorType);})(),()=>{}}exports.connect=m;exports.createSolanaConnectionsWatcher=V;exports.disconnect=C;exports.satelliteSolanaAdapter=G;//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/connectionUtils.ts","../src/adapters/solanaAdapter.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","getAvailableSolanaConnectors","w","a","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","OrbitAdapter","connectorType","chainId","connector","getConnectorTypeFromName","formatConnectorName","connectedAccount","cluster","getCluster","getRpcUrlForCluster","activeWallet","connectedWallets","wallet","connectors","currentChainId","updateActiveWallet","address","balance","createSolanaRPC","adr","lamportsToSol","url","getSolanaExplorerLink","getSolanaAddressName","name","getSolanaAddressAvatar","c","e"],"mappings":"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","file":"index.js","sourcesContent":["import { getAvailableSolanaConnectors } from '@tuwaio/orbit-solana';\nimport type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, UiWalletAccount } from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getOrCreateUiWalletAccountForStandardWalletAccount,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getWalletForHandle,\n} from '@wallet-standard/ui-registry';\n\n/**\n * Establishes connection with a wallet using Wallet Standard\n *\n * @remarks\n * Connects to a wallet that implements the Wallet Standard interface.\n * Uses the StandardConnect feature to establish connection and retrieve accounts.\n * Converts standard wallet accounts to UI wallet accounts.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @param input - Optional connection parameters (excluding silent flag)\n * @returns Promise resolving to array of connected wallet accounts\n *\n * @throws {Error} If wallet doesn't support StandardConnect feature\n * @throws {Error} If connection attempt fails\n *\n * @example\n * ```typescript\n * const accounts = await connect(wallet, {\n * // Optional connection parameters\n * });\n * const firstAccount = accounts[0];\n * console.log('Connected account:', firstAccount.address);\n * ```\n */\nexport async function connect(\n uiWallet: UiWallet,\n input?: Omit<NonNullable<Parameters<StandardConnectMethod>[0]>, 'silent'>,\n): Promise<{ uiWallet: UiWallet; accounts: UiWalletAccount[] }> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n const wallets = getAvailableSolanaConnectors();\n // Convert accounts to UI wallet accounts\n return {\n uiWallet: wallets.filter((w) =>\n w.accounts.find((a) => a.address.toLowerCase() === accounts[0].address.toLowerCase()),\n )[0],\n accounts: accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\n ),\n };\n}\n\n/**\n * Disconnects from a connected wallet\n *\n * @remarks\n * Safely disconnects from a wallet if it supports the StandardDisconnect feature.\n * If the wallet doesn't support disconnection, the operation is silently ignored.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @returns Promise that resolves when disconnection is complete\n *\n * @example\n * ```typescript\n * await disconnect(wallet);\n * console.log('Wallet disconnected');\n * ```\n */\nexport async function disconnect(uiWallet: UiWallet): Promise<void> {\n // Get the disconnect feature if available\n const disconnectFeature = getWalletFeature(uiWallet, StandardDisconnect) as\n | StandardDisconnectFeature[typeof StandardDisconnect]\n | undefined;\n\n await disconnectFeature?.disconnect();\n}\n","import { formatConnectorName, getConnectorTypeFromName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport {\n createSolanaRPC,\n getAvailableSolanaConnectors,\n getCluster,\n getRpcUrlForCluster,\n getSolanaAddressAvatar,\n getSolanaAddressName,\n getSolanaExplorerLink,\n SolanaRPCUrls,\n} from '@tuwaio/orbit-solana';\nimport { SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { address as adr, lamportsToSol, SolanaClusterMoniker } from 'gill';\n\nimport { ConnectorSolana, SolanaConnection } from '../types';\nimport { connect, disconnect } from '../utils/connectionUtils';\n\n/**\n * Creates a Solana blockchain adapter for the Satellite Connect system\n *\n * @remarks\n * This adapter implements the SatelliteAdapter interface for Solana blockchain,\n * providing connector connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent interactions.\n *\n * @param rpcUrls - Configuration object containing RPC endpoints for different Solana networks\n * @returns SatelliteAdapter implementation for Solana\n *\n * @example\n * ```typescript\n * const solanaAdapter = satelliteSolanaAdapter({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * testnet: 'https://api.testnet.solana.com'\n * }\n * });\n * ```\n */\nexport function satelliteSolanaAdapter({\n rpcUrls,\n}: SolanaRPCUrls): SatelliteAdapter<ConnectorSolana, SolanaConnection> {\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ connectorType, chainId }) {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (connector) =>\n getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(connector.name)) === connectorType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const { uiWallet, accounts: connectedAccount } = await connect(connector as UiWallet);\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n connectorType,\n address: connectedAccount[0].address,\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n isConnected: true,\n isContractAddress: false,\n icon: uiWallet?.icon?.trim(),\n connectedAccount: connectedAccount[0],\n connectedWallet: uiWallet,\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect(activeWallet) {\n if (activeWallet && (activeWallet as SolanaConnection)?.connectedWallet) {\n await disconnect((activeWallet as SolanaConnection).connectedWallet as UiWallet);\n } else {\n const connectors = getAvailableSolanaConnectors();\n const connectedWallets = connectors.filter((wallet) => wallet.accounts.length > 0);\n await Promise.allSettled(\n connectedWallets.map(async (w) => {\n try {\n await disconnect(w);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n /* empty */\n }\n }),\n );\n }\n },\n\n getConnectors() {\n const connectors = getAvailableSolanaConnectors();\n return {\n adapter: OrbitAdapter.SOLANA,\n connectors: connectors as ConnectorSolana[],\n };\n },\n\n async checkAndSwitchNetwork(chainId, currentChainId, updateActiveWallet) {\n if (currentChainId !== chainId && updateActiveWallet) {\n const cluster = getCluster({ cluster: chainId as string });\n updateActiveWallet({\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n });\n }\n },\n\n getBalance: async (address, chainId) => {\n const rpc = createSolanaRPC({ rpcUrlOrMoniker: getCluster({ cluster: chainId as string }), rpcUrls });\n const balance = await rpc.getBalance(adr(address)).send();\n return {\n value: lamportsToSol(balance.value),\n symbol: 'SOL',\n };\n },\n\n getExplorerUrl(url, chainId) {\n return getSolanaExplorerLink(url, chainId);\n },\n async getName(address) {\n return getSolanaAddressName(address);\n },\n async getAvatar(name) {\n return getSolanaAddressAvatar(name);\n },\n\n switchConnection: async (connectorType) => {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (c) => getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(c.name)) === connectorType,\n );\n if (!connector) {\n throw new Error(`Cannot find connector with type: ${connectorType}`);\n }\n try {\n await connect(connector);\n } catch (e) {\n throw new Error(\n `Failed to switch to connector ${connectorType}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/connectionUtils.ts","../src/adapters/solanaAdapter.ts","../src/utils/createSolanaConnectionsWatcher.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","getAvailableSolanaConnectors","w","a","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","OrbitAdapter","connectorType","chainId","connector","getConnectorTypeFromName","formatConnectorName","connectedAccount","cluster","getCluster","getRpcUrlForCluster","e","activeWallet","connectedWallets","wallet","connectors","currentChainId","updateActiveWallet","address","balance","createSolanaRPC","adr","lamportsToSol","url","getSolanaExplorerLink","getSolanaAddressName","name","getSolanaAddressAvatar","c","createSolanaConnectionsWatcher","config","callbacks","wallets","activeConnection","connectionError","updateActiveConnection","getAdapterFromConnectorType","matchingWallet","newState"],"mappings":"6PAqCA,eAAsBA,CAAAA,CACpBC,CAAAA,CACAC,CAAAA,CAC8D,CAE9D,IAAMC,CAAAA,CAAiBC,mBAAAA,CAAiBH,CAAAA,CAAUI,wBAAe,CAAA,CAE3D,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAI,MAAMH,CAAAA,CAAe,OAAA,CAAQD,CAAK,CAAA,CAGvD,OAAO,CACL,QAAA,CAHcK,wCAAAA,EAA6B,CAGzB,MAAA,CAAQC,CAAAA,EACxBA,EAAE,QAAA,CAAS,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,WAAA,EAAY,GAAMH,CAAAA,CAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAa,CACtF,CAAA,CAAE,CAAC,CAAA,CACH,SAAUA,CAAAA,CAAS,GAAA,CAAKI,CAAAA,EACtBC,6FAAAA,CAAmDC,6DAAAA,CAAmBX,CAAQ,CAAA,CAAGS,CAAO,CAC1F,CACF,CACF,CAkBA,eAAsBG,CAAAA,CAAWZ,CAAAA,CAAmC,CAMlE,MAJ0BG,oBAAiBH,CAAAA,CAAUa,2BAAkB,CAAA,EAI9C,UAAA,GAC3B,CCxCO,SAASC,CAAAA,CAAuB,CACrC,OAAA,CAAAC,CACF,CAAA,CAAuE,CACrE,OAAO,CACL,GAAA,CAAKC,sBAAAA,CAAa,OAElB,MAAM,OAAA,CAAQ,CAAE,aAAA,CAAAC,CAAAA,CAAe,OAAA,CAAAC,CAAQ,CAAA,CAAG,CAExC,IAAMC,CAAAA,CADab,wCAAAA,EAA6B,CACnB,IAAA,CAC1Ba,CAAAA,EACCC,kCAAAA,CAAyBJ,sBAAAA,CAAa,OAAQK,6BAAAA,CAAoBF,CAAAA,CAAU,IAAI,CAAC,CAAA,GAAMF,CAC3F,CAAA,CACA,GAAI,CAACE,CAAAA,CAAW,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA,CAE7E,GAAI,CACF,GAAM,CAAE,QAAA,CAAAnB,CAAAA,CAAU,QAAA,CAAUsB,CAAiB,CAAA,CAAI,MAAMvB,CAAAA,CAAQoB,CAAqB,CAAA,CAC9EI,CAAAA,CAAUC,sBAAAA,CAAW,CAAE,OAAA,CAASN,CAAkB,CAAC,CAAA,CAEzD,OAAO,CACL,aAAA,CAAAD,CAAAA,CACA,OAAA,CAASK,CAAAA,CAAiB,CAAC,CAAA,CAAE,OAAA,CAC7B,QAASC,CAAAA,CACT,MAAA,CAAQE,+BAAAA,CAAoB,CAC1B,OAAA,CAASF,CAAAA,CACT,OAAA,CAAAR,CACF,CAAC,CAAA,CACD,WAAA,CAAa,CAAA,CAAA,CACb,iBAAA,CAAmB,CAAA,CAAA,CACnB,IAAA,CAAMf,CAAAA,EAAU,IAAA,EAAM,MAAK,CAC3B,gBAAA,CAAkBsB,CAAAA,CAAiB,CAAC,CAAA,CACpC,eAAA,CAAiBtB,CACnB,CACF,OAAS0B,CAAAA,CAAG,CACV,MAAM,IAAI,KAAA,CAAMA,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,QAAU,MAAA,CAAOA,CAAC,CAAC,CAC5D,CACF,CAAA,CAEA,MAAM,UAAA,CAAWC,EAAc,CAC7B,GAAIA,CAAAA,EAAiBA,CAAAA,EAAmC,eAAA,CACtD,MAAMf,CAAAA,CAAYe,CAAAA,CAAkC,eAA2B,CAAA,CAAA,KAC1E,CAEL,IAAMC,CAAAA,CADatB,wCAAAA,EAA6B,CACZ,MAAA,CAAQuB,CAAAA,EAAWA,EAAO,QAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CACjF,MAAM,OAAA,CAAQ,UAAA,CACZD,CAAAA,CAAiB,IAAI,MAAOrB,CAAAA,EAAM,CAChC,GAAI,CACF,MAAMK,CAAAA,CAAWL,CAAC,EAEpB,CAAA,KAAY,CAEZ,CACF,CAAC,CACH,EACF,CACF,CAAA,CAEA,eAAgB,CACd,IAAMuB,CAAAA,CAAaxB,wCAAAA,EAA6B,CAChD,OAAO,CACL,OAAA,CAASU,uBAAa,MAAA,CACtB,UAAA,CAAYc,CACd,CACF,CAAA,CAEA,MAAM,qBAAA,CAAsBZ,CAAAA,CAASa,EAAgBC,CAAAA,CAAoB,CACvE,GAAID,CAAAA,GAAmBb,CAAAA,EAAWc,CAAAA,CAAoB,CACpD,IAAMT,EAAUC,sBAAAA,CAAW,CAAE,OAAA,CAASN,CAAkB,CAAC,CAAA,CACzDc,CAAAA,CAAmB,CACjB,QAAST,CAAAA,CACT,MAAA,CAAQE,+BAAAA,CAAoB,CAC1B,OAAA,CAASF,CAAAA,CACT,OAAA,CAAAR,CACF,CAAC,CACH,CAAC,EACH,CACF,CAAA,CAEA,UAAA,CAAY,MAAOkB,CAAAA,CAASf,IAAY,CAEtC,IAAMgB,CAAAA,CAAU,MADJC,2BAAAA,CAAgB,CAAE,eAAA,CAAiBX,sBAAAA,CAAW,CAAE,OAAA,CAASN,CAAkB,CAAC,CAAA,CAAG,OAAA,CAAAH,CAAQ,CAAC,CAAA,CAC1E,WAAWqB,YAAAA,CAAIH,CAAO,CAAC,CAAA,CAAE,IAAA,EAAK,CACxD,OAAO,CACL,MAAOI,kBAAAA,CAAcH,CAAAA,CAAQ,KAAK,CAAA,CAClC,MAAA,CAAQ,KACV,CACF,CAAA,CAEA,eAAeI,CAAAA,CAAKpB,CAAAA,CAAS,CAC3B,OAAOqB,iCAAAA,CAAsBD,CAAAA,CAAKpB,CAAO,CAC3C,EACA,MAAM,OAAA,CAAQe,CAAAA,CAAS,CACrB,OAAOO,gCAAAA,CAAqBP,CAAO,CACrC,EACA,MAAM,SAAA,CAAUQ,CAAAA,CAAM,CACpB,OAAOC,kCAAAA,CAAuBD,CAAI,CACpC,EAEA,gBAAA,CAAkB,MAAOxB,CAAAA,EAAkB,CAEzC,IAAME,CAAAA,CADab,wCAAAA,EAA6B,CACnB,KAC1BqC,CAAAA,EAAMvB,kCAAAA,CAAyBJ,sBAAAA,CAAa,MAAA,CAAQK,6BAAAA,CAAoBsB,CAAAA,CAAE,IAAI,CAAC,IAAM1B,CACxF,CAAA,CACA,GAAI,CAACE,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,oCAAoCF,CAAa,CAAA,CAAE,CAAA,CAErE,GAAI,CACF,MAAMlB,CAAAA,CAAQoB,CAAS,EACzB,CAAA,MAAS,CAAA,CAAG,CACV,MAAM,IAAI,KAAA,CACR,CAAA,8BAAA,EAAiCF,CAAa,KAAK,CAAA,YAAa,KAAA,CAAQ,CAAA,CAAE,OAAA,CAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAC/F,CACF,CACF,CACF,CACF,CCxFO,SAAS2B,CAAAA,CACdC,CAAAA,CACAC,EACY,CACZ,GAAM,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAIF,CAAAA,CACd,CAAE,iBAAAG,CAAAA,CAAkB,UAAA,CAAApC,CAAAA,CAAY,eAAA,CAAAqC,CAAAA,CAAiB,sBAAA,CAAAC,CAAuB,CAAA,CAAIJ,EAkElF,OAAA,CA1DkC,IAAY,CAE5C,GAAI,CAACE,CAAAA,EAAoBG,qCAAAA,CAA4BH,CAAAA,CAAiB,aAAa,CAAA,GAAMhC,sBAAAA,CAAa,MAAA,CACpG,OAOF,IAAMoC,CAAAA,CAAiBL,CAAAA,CAAQ,IAAA,CAC5BlB,GACCT,kCAAAA,CAAyBJ,sBAAAA,CAAa,MAAA,CAAQK,6BAAAA,CAAoBQ,CAAAA,CAAO,IAAI,CAAC,CAAA,GAC9EmB,EAAiB,aACrB,CAAA,CAGA,GAAI,CAACC,CAAAA,EAAmBG,CAAAA,CAAgB,CAKtC,IAAMC,EAAsC,CAE1C,OAAA,CAASD,CAAAA,CAAe,QAAA,CAAS,CAAC,CAAA,EAAG,OAAA,CAErC,WAAA,CAAaA,EAAe,QAAA,CAAS,MAAA,CAAS,CAAA,CAE9C,gBAAA,CAAkBA,CAAAA,CAAe,QAAA,CAAS,CAAC,CAAA,CAC3C,gBAAiBA,CACnB,CAAA,CAAA,CAQEC,CAAAA,CAAS,OAAA,GAAYL,CAAAA,CAAiB,OAAA,EAAWK,CAAAA,CAAS,WAAA,GAAgBL,EAAiB,WAAA,GAI3FE,CAAAA,CAAuBG,CAAQ,EAEnC,CAOID,CAAAA,EAAgB,QAAA,CAAS,MAAA,GAAW,GAAKJ,CAAAA,CAAiB,aAAA,EAE5DpC,CAAAA,CAAWoC,CAAAA,CAAiB,aAAa,EAE7C,CAAA,GAG0B,CAQnB,IAAY,CAGnB,CACF","file":"index.js","sourcesContent":["import { getAvailableSolanaConnectors } from '@tuwaio/orbit-solana';\nimport type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, UiWalletAccount } from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getOrCreateUiWalletAccountForStandardWalletAccount,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getWalletForHandle,\n} from '@wallet-standard/ui-registry';\n\n/**\n * Establishes connection with a wallet using Wallet Standard\n *\n * @remarks\n * Connects to a wallet that implements the Wallet Standard interface.\n * Uses the StandardConnect feature to establish connection and retrieve accounts.\n * Converts standard wallet accounts to UI wallet accounts.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @param input - Optional connection parameters (excluding silent flag)\n * @returns Promise resolving to array of connected wallet accounts\n *\n * @throws {Error} If wallet doesn't support StandardConnect feature\n * @throws {Error} If connection attempt fails\n *\n * @example\n * ```typescript\n * const accounts = await connect(wallet, {\n * // Optional connection parameters\n * });\n * const firstAccount = accounts[0];\n * console.log('Connected account:', firstAccount.address);\n * ```\n */\nexport async function connect(\n uiWallet: UiWallet,\n input?: Omit<NonNullable<Parameters<StandardConnectMethod>[0]>, 'silent'>,\n): Promise<{ uiWallet: UiWallet; accounts: UiWalletAccount[] }> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n const wallets = getAvailableSolanaConnectors();\n // Convert accounts to UI wallet accounts\n return {\n uiWallet: wallets.filter((w) =>\n w.accounts.find((a) => a.address.toLowerCase() === accounts[0].address.toLowerCase()),\n )[0],\n accounts: accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\n ),\n };\n}\n\n/**\n * Disconnects from a connected wallet\n *\n * @remarks\n * Safely disconnects from a wallet if it supports the StandardDisconnect feature.\n * If the wallet doesn't support disconnection, the operation is silently ignored.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @returns Promise that resolves when disconnection is complete\n *\n * @example\n * ```typescript\n * await disconnect(wallet);\n * console.log('Wallet disconnected');\n * ```\n */\nexport async function disconnect(uiWallet: UiWallet): Promise<void> {\n // Get the disconnect feature if available\n const disconnectFeature = getWalletFeature(uiWallet, StandardDisconnect) as\n | StandardDisconnectFeature[typeof StandardDisconnect]\n | undefined;\n\n await disconnectFeature?.disconnect();\n}\n","import { formatConnectorName, getConnectorTypeFromName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport {\n createSolanaRPC,\n getAvailableSolanaConnectors,\n getCluster,\n getRpcUrlForCluster,\n getSolanaAddressAvatar,\n getSolanaAddressName,\n getSolanaExplorerLink,\n SolanaRPCUrls,\n} from '@tuwaio/orbit-solana';\nimport { SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { address as adr, lamportsToSol, SolanaClusterMoniker } from 'gill';\n\nimport { ConnectorSolana, SolanaConnection } from '../types';\nimport { connect, disconnect } from '../utils/connectionUtils';\n\n/**\n * Creates a Solana blockchain adapter for the Satellite Connect system\n *\n * @remarks\n * This adapter implements the SatelliteAdapter interface for Solana blockchain,\n * providing connector connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent interactions.\n *\n * @param rpcUrls - Configuration object containing RPC endpoints for different Solana networks\n * @returns SatelliteAdapter implementation for Solana\n *\n * @example\n * ```typescript\n * const solanaAdapter = satelliteSolanaAdapter({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * testnet: 'https://api.testnet.solana.com'\n * }\n * });\n * ```\n */\nexport function satelliteSolanaAdapter({\n rpcUrls,\n}: SolanaRPCUrls): SatelliteAdapter<ConnectorSolana, SolanaConnection> {\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ connectorType, chainId }) {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (connector) =>\n getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(connector.name)) === connectorType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const { uiWallet, accounts: connectedAccount } = await connect(connector as UiWallet);\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n connectorType,\n address: connectedAccount[0].address,\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n isConnected: true,\n isContractAddress: false,\n icon: uiWallet?.icon?.trim(),\n connectedAccount: connectedAccount[0],\n connectedWallet: uiWallet,\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect(activeWallet) {\n if (activeWallet && (activeWallet as SolanaConnection)?.connectedWallet) {\n await disconnect((activeWallet as SolanaConnection).connectedWallet as UiWallet);\n } else {\n const connectors = getAvailableSolanaConnectors();\n const connectedWallets = connectors.filter((wallet) => wallet.accounts.length > 0);\n await Promise.allSettled(\n connectedWallets.map(async (w) => {\n try {\n await disconnect(w);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n /* empty */\n }\n }),\n );\n }\n },\n\n getConnectors() {\n const connectors = getAvailableSolanaConnectors();\n return {\n adapter: OrbitAdapter.SOLANA,\n connectors: connectors as ConnectorSolana[],\n };\n },\n\n async checkAndSwitchNetwork(chainId, currentChainId, updateActiveWallet) {\n if (currentChainId !== chainId && updateActiveWallet) {\n const cluster = getCluster({ cluster: chainId as string });\n updateActiveWallet({\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n });\n }\n },\n\n getBalance: async (address, chainId) => {\n const rpc = createSolanaRPC({ rpcUrlOrMoniker: getCluster({ cluster: chainId as string }), rpcUrls });\n const balance = await rpc.getBalance(adr(address)).send();\n return {\n value: lamportsToSol(balance.value),\n symbol: 'SOL',\n };\n },\n\n getExplorerUrl(url, chainId) {\n return getSolanaExplorerLink(url, chainId);\n },\n async getName(address) {\n return getSolanaAddressName(address);\n },\n async getAvatar(name) {\n return getSolanaAddressAvatar(name);\n },\n\n switchConnection: async (connectorType) => {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (c) => getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(c.name)) === connectorType,\n );\n if (!connector) {\n throw new Error(`Cannot find connector with type: ${connectorType}`);\n }\n try {\n await connect(connector);\n } catch (e) {\n throw new Error(\n `Failed to switch to connector ${connectorType}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n },\n };\n}\n","import {\n ConnectorType,\n formatConnectorName,\n getAdapterFromConnectorType,\n getConnectorTypeFromName,\n OrbitAdapter,\n} from '@tuwaio/orbit-core';\nimport type { UiWallet } from '@wallet-standard/ui';\n\nimport { SolanaConnection } from '../types';\n\n/**\n * Callback functions interface for the Solana connections watcher.\n * These callbacks are used to interact with the global state store.\n */\nexport interface SolanaWatcherCallbacks {\n /** The currently active Solana connection from the global store */\n activeConnection: SolanaConnection | undefined;\n /** Function to disconnect a specific connector type */\n disconnect: (connectorType: ConnectorType) => void;\n /** Current connection error state, if any */\n connectionError: string | undefined;\n /** Function to update the active connection's properties */\n updateActiveConnection: (connection: Partial<SolanaConnection>) => void;\n}\n\n/**\n * Configuration interface for the Solana connections watcher.\n */\nexport interface SolanaWatcherConfig {\n /** Array of available Solana wallets from the Wallet Standard */\n wallets: UiWallet[];\n}\n\n/**\n * Creates and initializes a Solana connections watcher that monitors wallet standard changes\n * and synchronizes them with the global state store.\n *\n * This function provides a pure, framework-agnostic way to watch Solana wallet connections\n * without being tied to React hooks or components.\n *\n * Unlike EVM connections, Solana uses the Wallet Standard which doesn't provide\n * native watchers, so this function implements the watching logic directly.\n *\n * @param config - Configuration object containing wallets array from Wallet Standard\n * @param callbacks - Callback functions for interacting with the global state\n * @returns A cleanup function to stop watching connections (currently a no-op as Wallet Standard doesn't provide native watchers)\n *\n * @example\n * ```typescript\n * const unwatch = createSolanaConnectionsWatcher(\n * { wallets },\n * { activeConnection, disconnect, connectionError, updateActiveConnection }\n * );\n *\n * // Later, when you need to stop watching (currently no cleanup needed):\n * unwatch();\n * ```\n *\n * @remarks\n * The Solana watcher works differently from the EVM watcher because:\n * - It relies on the Wallet Standard's wallets array changes\n * - It doesn't have native connection event listeners like wagmi\n * - The watching is done by comparing wallet state changes in the wallets array\n */\nexport function createSolanaConnectionsWatcher(\n config: SolanaWatcherConfig,\n callbacks: SolanaWatcherCallbacks,\n): () => void {\n const { wallets } = config;\n const { activeConnection, disconnect, connectionError, updateActiveConnection } = callbacks;\n\n /**\n * Processes Solana wallet changes and updates the global store accordingly.\n * This function handles the core logic of monitoring Solana wallet state changes.\n *\n * @internal\n */\n const handleSolanaWalletChanges = (): void => {\n // Early return: Only process if we have an active Solana connection\n if (!activeConnection || getAdapterFromConnectorType(activeConnection.connectorType) !== OrbitAdapter.SOLANA) {\n return;\n }\n\n /**\n * Find the wallet that matches our active connection.\n * We compare by connector type which is derived from the wallet name.\n */\n const matchingWallet = wallets.find(\n (wallet) =>\n getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(wallet.name)) ===\n activeConnection.connectorType,\n );\n\n // Skip processing if there's a connection error to prevent conflicting updates\n if (!connectionError && matchingWallet) {\n /**\n * Build new connection state from the matching wallet.\n * We extract the first account as the active account.\n */\n const newState: Partial<SolanaConnection> = {\n // Use the first account's address as the primary address\n address: matchingWallet.accounts[0]?.address,\n // Determine connection status based on account availability\n isConnected: matchingWallet.accounts.length > 0,\n // Store Wallet Standard specific information for future use\n connectedAccount: matchingWallet.accounts[0],\n connectedWallet: matchingWallet,\n };\n\n /**\n * Prevent infinite update loops by only updating when state actually changes.\n * We only compare address and isConnected because connectedAccount/connectedWallet\n * might be new object references on every call, causing infinite loops.\n */\n const hasChanged =\n newState.address !== activeConnection.address || newState.isConnected !== activeConnection.isConnected;\n\n if (hasChanged) {\n // Update the global store with the new wallet state\n updateActiveConnection(newState);\n }\n }\n\n /**\n * Handle disconnection scenario:\n * If the wallet no longer has accounts but we still have an active connection,\n * we need to clean up the connection in our store.\n */\n if (matchingWallet?.accounts.length === 0 && activeConnection.connectorType) {\n // Trigger disconnection in the global store\n disconnect(activeConnection.connectorType);\n }\n };\n\n // Execute the initial wallet state processing\n handleSolanaWalletChanges();\n\n /**\n * Return a cleanup function.\n * Note: Unlike EVM watchers, Solana/Wallet Standard doesn't provide native\n * connection watchers, so we don't have any active subscriptions to clean up.\n * This function is provided for API consistency.\n */\n return (): void => {\n // Currently no cleanup is needed for Solana watchers\n // This is kept for future extensibility and API consistency\n };\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {OrbitAdapter,getConnectorTypeFromName,formatConnectorName}from'@tuwaio/orbit-core';import {getAvailableSolanaConnectors,getSolanaAddressAvatar,getSolanaAddressName,getSolanaExplorerLink,createSolanaRPC,getCluster,getRpcUrlForCluster}from'@tuwaio/orbit-solana';import {address,lamportsToSol}from'gill';import {StandardConnect,StandardDisconnect}from'@wallet-standard/features';import {getWalletFeature}from'@wallet-standard/ui';import {getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED}from'@wallet-standard/ui-registry';async function
|
|
1
|
+
import {OrbitAdapter,getConnectorTypeFromName,formatConnectorName,getAdapterFromConnectorType}from'@tuwaio/orbit-core';import {getAvailableSolanaConnectors,getSolanaAddressAvatar,getSolanaAddressName,getSolanaExplorerLink,createSolanaRPC,getCluster,getRpcUrlForCluster}from'@tuwaio/orbit-solana';import {address,lamportsToSol}from'gill';import {StandardConnect,StandardDisconnect}from'@wallet-standard/features';import {getWalletFeature}from'@wallet-standard/ui';import {getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED}from'@wallet-standard/ui-registry';async function m(r,n){let a=getWalletFeature(r,StandardConnect),{accounts:t}=await a.connect(n);return {uiWallet:getAvailableSolanaConnectors().filter(o=>o.accounts.find(c=>c.address.toLowerCase()===t[0].address.toLowerCase()))[0],accounts:t.map(o=>getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(r),o))}}async function C(r){await getWalletFeature(r,StandardDisconnect)?.disconnect();}function G({rpcUrls:r}){return {key:OrbitAdapter.SOLANA,async connect({connectorType:n,chainId:a}){let e=getAvailableSolanaConnectors().find(o=>getConnectorTypeFromName(OrbitAdapter.SOLANA,formatConnectorName(o.name))===n);if(!e)throw new Error("Cannot find connector with this wallet type");try{let{uiWallet:o,accounts:c}=await m(e),u=getCluster({cluster:a});return {connectorType:n,address:c[0].address,chainId:u,rpcURL:getRpcUrlForCluster({cluster:u,rpcUrls:r}),isConnected:!0,isContractAddress:!1,icon:o?.icon?.trim(),connectedAccount:c[0],connectedWallet:o}}catch(o){throw new Error(o instanceof Error?o.message:String(o))}},async disconnect(n){if(n&&n?.connectedWallet)await C(n.connectedWallet);else {let t=getAvailableSolanaConnectors().filter(e=>e.accounts.length>0);await Promise.allSettled(t.map(async e=>{try{await C(e);}catch{}}));}},getConnectors(){let n=getAvailableSolanaConnectors();return {adapter:OrbitAdapter.SOLANA,connectors:n}},async checkAndSwitchNetwork(n,a,t){if(a!==n&&t){let e=getCluster({cluster:n});t({chainId:e,rpcURL:getRpcUrlForCluster({cluster:e,rpcUrls:r})});}},getBalance:async(n,a)=>{let e=await createSolanaRPC({rpcUrlOrMoniker:getCluster({cluster:a}),rpcUrls:r}).getBalance(address(n)).send();return {value:lamportsToSol(e.value),symbol:"SOL"}},getExplorerUrl(n,a){return getSolanaExplorerLink(n,a)},async getName(n){return getSolanaAddressName(n)},async getAvatar(n){return getSolanaAddressAvatar(n)},switchConnection:async n=>{let t=getAvailableSolanaConnectors().find(e=>getConnectorTypeFromName(OrbitAdapter.SOLANA,formatConnectorName(e.name))===n);if(!t)throw new Error(`Cannot find connector with type: ${n}`);try{await m(t);}catch(e){throw new Error(`Failed to switch to connector ${n}: ${e instanceof Error?e.message:String(e)}`)}}}}function V(r,n){let{wallets:a}=r,{activeConnection:t,disconnect:e,connectionError:o,updateActiveConnection:c}=n;return (()=>{if(!t||getAdapterFromConnectorType(t.connectorType)!==OrbitAdapter.SOLANA)return;let s=a.find(l=>getConnectorTypeFromName(OrbitAdapter.SOLANA,formatConnectorName(l.name))===t.connectorType);if(!o&&s){let l={address:s.accounts[0]?.address,isConnected:s.accounts.length>0,connectedAccount:s.accounts[0],connectedWallet:s};(l.address!==t.address||l.isConnected!==t.isConnected)&&c(l);}s?.accounts.length===0&&t.connectorType&&e(t.connectorType);})(),()=>{}}export{m as connect,V as createSolanaConnectionsWatcher,C as disconnect,G as satelliteSolanaAdapter};//# sourceMappingURL=index.mjs.map
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/connectionUtils.ts","../src/adapters/solanaAdapter.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","getAvailableSolanaConnectors","w","a","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","OrbitAdapter","connectorType","chainId","connector","getConnectorTypeFromName","formatConnectorName","connectedAccount","cluster","getCluster","getRpcUrlForCluster","activeWallet","connectedWallets","wallet","connectors","currentChainId","updateActiveWallet","address","balance","createSolanaRPC","adr","lamportsToSol","url","getSolanaExplorerLink","getSolanaAddressName","name","getSolanaAddressAvatar","c","e"],"mappings":"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","file":"index.mjs","sourcesContent":["import { getAvailableSolanaConnectors } from '@tuwaio/orbit-solana';\nimport type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, UiWalletAccount } from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getOrCreateUiWalletAccountForStandardWalletAccount,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getWalletForHandle,\n} from '@wallet-standard/ui-registry';\n\n/**\n * Establishes connection with a wallet using Wallet Standard\n *\n * @remarks\n * Connects to a wallet that implements the Wallet Standard interface.\n * Uses the StandardConnect feature to establish connection and retrieve accounts.\n * Converts standard wallet accounts to UI wallet accounts.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @param input - Optional connection parameters (excluding silent flag)\n * @returns Promise resolving to array of connected wallet accounts\n *\n * @throws {Error} If wallet doesn't support StandardConnect feature\n * @throws {Error} If connection attempt fails\n *\n * @example\n * ```typescript\n * const accounts = await connect(wallet, {\n * // Optional connection parameters\n * });\n * const firstAccount = accounts[0];\n * console.log('Connected account:', firstAccount.address);\n * ```\n */\nexport async function connect(\n uiWallet: UiWallet,\n input?: Omit<NonNullable<Parameters<StandardConnectMethod>[0]>, 'silent'>,\n): Promise<{ uiWallet: UiWallet; accounts: UiWalletAccount[] }> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n const wallets = getAvailableSolanaConnectors();\n // Convert accounts to UI wallet accounts\n return {\n uiWallet: wallets.filter((w) =>\n w.accounts.find((a) => a.address.toLowerCase() === accounts[0].address.toLowerCase()),\n )[0],\n accounts: accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\n ),\n };\n}\n\n/**\n * Disconnects from a connected wallet\n *\n * @remarks\n * Safely disconnects from a wallet if it supports the StandardDisconnect feature.\n * If the wallet doesn't support disconnection, the operation is silently ignored.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @returns Promise that resolves when disconnection is complete\n *\n * @example\n * ```typescript\n * await disconnect(wallet);\n * console.log('Wallet disconnected');\n * ```\n */\nexport async function disconnect(uiWallet: UiWallet): Promise<void> {\n // Get the disconnect feature if available\n const disconnectFeature = getWalletFeature(uiWallet, StandardDisconnect) as\n | StandardDisconnectFeature[typeof StandardDisconnect]\n | undefined;\n\n await disconnectFeature?.disconnect();\n}\n","import { formatConnectorName, getConnectorTypeFromName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport {\n createSolanaRPC,\n getAvailableSolanaConnectors,\n getCluster,\n getRpcUrlForCluster,\n getSolanaAddressAvatar,\n getSolanaAddressName,\n getSolanaExplorerLink,\n SolanaRPCUrls,\n} from '@tuwaio/orbit-solana';\nimport { SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { address as adr, lamportsToSol, SolanaClusterMoniker } from 'gill';\n\nimport { ConnectorSolana, SolanaConnection } from '../types';\nimport { connect, disconnect } from '../utils/connectionUtils';\n\n/**\n * Creates a Solana blockchain adapter for the Satellite Connect system\n *\n * @remarks\n * This adapter implements the SatelliteAdapter interface for Solana blockchain,\n * providing connector connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent interactions.\n *\n * @param rpcUrls - Configuration object containing RPC endpoints for different Solana networks\n * @returns SatelliteAdapter implementation for Solana\n *\n * @example\n * ```typescript\n * const solanaAdapter = satelliteSolanaAdapter({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * testnet: 'https://api.testnet.solana.com'\n * }\n * });\n * ```\n */\nexport function satelliteSolanaAdapter({\n rpcUrls,\n}: SolanaRPCUrls): SatelliteAdapter<ConnectorSolana, SolanaConnection> {\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ connectorType, chainId }) {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (connector) =>\n getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(connector.name)) === connectorType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const { uiWallet, accounts: connectedAccount } = await connect(connector as UiWallet);\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n connectorType,\n address: connectedAccount[0].address,\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n isConnected: true,\n isContractAddress: false,\n icon: uiWallet?.icon?.trim(),\n connectedAccount: connectedAccount[0],\n connectedWallet: uiWallet,\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect(activeWallet) {\n if (activeWallet && (activeWallet as SolanaConnection)?.connectedWallet) {\n await disconnect((activeWallet as SolanaConnection).connectedWallet as UiWallet);\n } else {\n const connectors = getAvailableSolanaConnectors();\n const connectedWallets = connectors.filter((wallet) => wallet.accounts.length > 0);\n await Promise.allSettled(\n connectedWallets.map(async (w) => {\n try {\n await disconnect(w);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n /* empty */\n }\n }),\n );\n }\n },\n\n getConnectors() {\n const connectors = getAvailableSolanaConnectors();\n return {\n adapter: OrbitAdapter.SOLANA,\n connectors: connectors as ConnectorSolana[],\n };\n },\n\n async checkAndSwitchNetwork(chainId, currentChainId, updateActiveWallet) {\n if (currentChainId !== chainId && updateActiveWallet) {\n const cluster = getCluster({ cluster: chainId as string });\n updateActiveWallet({\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n });\n }\n },\n\n getBalance: async (address, chainId) => {\n const rpc = createSolanaRPC({ rpcUrlOrMoniker: getCluster({ cluster: chainId as string }), rpcUrls });\n const balance = await rpc.getBalance(adr(address)).send();\n return {\n value: lamportsToSol(balance.value),\n symbol: 'SOL',\n };\n },\n\n getExplorerUrl(url, chainId) {\n return getSolanaExplorerLink(url, chainId);\n },\n async getName(address) {\n return getSolanaAddressName(address);\n },\n async getAvatar(name) {\n return getSolanaAddressAvatar(name);\n },\n\n switchConnection: async (connectorType) => {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (c) => getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(c.name)) === connectorType,\n );\n if (!connector) {\n throw new Error(`Cannot find connector with type: ${connectorType}`);\n }\n try {\n await connect(connector);\n } catch (e) {\n throw new Error(\n `Failed to switch to connector ${connectorType}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/connectionUtils.ts","../src/adapters/solanaAdapter.ts","../src/utils/createSolanaConnectionsWatcher.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","getAvailableSolanaConnectors","w","a","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","OrbitAdapter","connectorType","chainId","connector","getConnectorTypeFromName","formatConnectorName","connectedAccount","cluster","getCluster","getRpcUrlForCluster","e","activeWallet","connectedWallets","wallet","connectors","currentChainId","updateActiveWallet","address","balance","createSolanaRPC","adr","lamportsToSol","url","getSolanaExplorerLink","getSolanaAddressName","name","getSolanaAddressAvatar","c","createSolanaConnectionsWatcher","config","callbacks","wallets","activeConnection","connectionError","updateActiveConnection","getAdapterFromConnectorType","matchingWallet","newState"],"mappings":"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","file":"index.mjs","sourcesContent":["import { getAvailableSolanaConnectors } from '@tuwaio/orbit-solana';\nimport type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, UiWalletAccount } from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getOrCreateUiWalletAccountForStandardWalletAccount,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getWalletForHandle,\n} from '@wallet-standard/ui-registry';\n\n/**\n * Establishes connection with a wallet using Wallet Standard\n *\n * @remarks\n * Connects to a wallet that implements the Wallet Standard interface.\n * Uses the StandardConnect feature to establish connection and retrieve accounts.\n * Converts standard wallet accounts to UI wallet accounts.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @param input - Optional connection parameters (excluding silent flag)\n * @returns Promise resolving to array of connected wallet accounts\n *\n * @throws {Error} If wallet doesn't support StandardConnect feature\n * @throws {Error} If connection attempt fails\n *\n * @example\n * ```typescript\n * const accounts = await connect(wallet, {\n * // Optional connection parameters\n * });\n * const firstAccount = accounts[0];\n * console.log('Connected account:', firstAccount.address);\n * ```\n */\nexport async function connect(\n uiWallet: UiWallet,\n input?: Omit<NonNullable<Parameters<StandardConnectMethod>[0]>, 'silent'>,\n): Promise<{ uiWallet: UiWallet; accounts: UiWalletAccount[] }> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n const wallets = getAvailableSolanaConnectors();\n // Convert accounts to UI wallet accounts\n return {\n uiWallet: wallets.filter((w) =>\n w.accounts.find((a) => a.address.toLowerCase() === accounts[0].address.toLowerCase()),\n )[0],\n accounts: accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\n ),\n };\n}\n\n/**\n * Disconnects from a connected wallet\n *\n * @remarks\n * Safely disconnects from a wallet if it supports the StandardDisconnect feature.\n * If the wallet doesn't support disconnection, the operation is silently ignored.\n *\n * @param uiWallet - Wallet instance implementing the UI Wallet interface\n * @returns Promise that resolves when disconnection is complete\n *\n * @example\n * ```typescript\n * await disconnect(wallet);\n * console.log('Wallet disconnected');\n * ```\n */\nexport async function disconnect(uiWallet: UiWallet): Promise<void> {\n // Get the disconnect feature if available\n const disconnectFeature = getWalletFeature(uiWallet, StandardDisconnect) as\n | StandardDisconnectFeature[typeof StandardDisconnect]\n | undefined;\n\n await disconnectFeature?.disconnect();\n}\n","import { formatConnectorName, getConnectorTypeFromName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport {\n createSolanaRPC,\n getAvailableSolanaConnectors,\n getCluster,\n getRpcUrlForCluster,\n getSolanaAddressAvatar,\n getSolanaAddressName,\n getSolanaExplorerLink,\n SolanaRPCUrls,\n} from '@tuwaio/orbit-solana';\nimport { SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { address as adr, lamportsToSol, SolanaClusterMoniker } from 'gill';\n\nimport { ConnectorSolana, SolanaConnection } from '../types';\nimport { connect, disconnect } from '../utils/connectionUtils';\n\n/**\n * Creates a Solana blockchain adapter for the Satellite Connect system\n *\n * @remarks\n * This adapter implements the SatelliteAdapter interface for Solana blockchain,\n * providing connector connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent interactions.\n *\n * @param rpcUrls - Configuration object containing RPC endpoints for different Solana networks\n * @returns SatelliteAdapter implementation for Solana\n *\n * @example\n * ```typescript\n * const solanaAdapter = satelliteSolanaAdapter({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * testnet: 'https://api.testnet.solana.com'\n * }\n * });\n * ```\n */\nexport function satelliteSolanaAdapter({\n rpcUrls,\n}: SolanaRPCUrls): SatelliteAdapter<ConnectorSolana, SolanaConnection> {\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ connectorType, chainId }) {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (connector) =>\n getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(connector.name)) === connectorType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const { uiWallet, accounts: connectedAccount } = await connect(connector as UiWallet);\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n connectorType,\n address: connectedAccount[0].address,\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n isConnected: true,\n isContractAddress: false,\n icon: uiWallet?.icon?.trim(),\n connectedAccount: connectedAccount[0],\n connectedWallet: uiWallet,\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect(activeWallet) {\n if (activeWallet && (activeWallet as SolanaConnection)?.connectedWallet) {\n await disconnect((activeWallet as SolanaConnection).connectedWallet as UiWallet);\n } else {\n const connectors = getAvailableSolanaConnectors();\n const connectedWallets = connectors.filter((wallet) => wallet.accounts.length > 0);\n await Promise.allSettled(\n connectedWallets.map(async (w) => {\n try {\n await disconnect(w);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n /* empty */\n }\n }),\n );\n }\n },\n\n getConnectors() {\n const connectors = getAvailableSolanaConnectors();\n return {\n adapter: OrbitAdapter.SOLANA,\n connectors: connectors as ConnectorSolana[],\n };\n },\n\n async checkAndSwitchNetwork(chainId, currentChainId, updateActiveWallet) {\n if (currentChainId !== chainId && updateActiveWallet) {\n const cluster = getCluster({ cluster: chainId as string });\n updateActiveWallet({\n chainId: cluster,\n rpcURL: getRpcUrlForCluster({\n cluster: cluster as SolanaClusterMoniker,\n rpcUrls,\n }),\n });\n }\n },\n\n getBalance: async (address, chainId) => {\n const rpc = createSolanaRPC({ rpcUrlOrMoniker: getCluster({ cluster: chainId as string }), rpcUrls });\n const balance = await rpc.getBalance(adr(address)).send();\n return {\n value: lamportsToSol(balance.value),\n symbol: 'SOL',\n };\n },\n\n getExplorerUrl(url, chainId) {\n return getSolanaExplorerLink(url, chainId);\n },\n async getName(address) {\n return getSolanaAddressName(address);\n },\n async getAvatar(name) {\n return getSolanaAddressAvatar(name);\n },\n\n switchConnection: async (connectorType) => {\n const connectors = getAvailableSolanaConnectors();\n const connector = connectors.find(\n (c) => getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(c.name)) === connectorType,\n );\n if (!connector) {\n throw new Error(`Cannot find connector with type: ${connectorType}`);\n }\n try {\n await connect(connector);\n } catch (e) {\n throw new Error(\n `Failed to switch to connector ${connectorType}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n },\n };\n}\n","import {\n ConnectorType,\n formatConnectorName,\n getAdapterFromConnectorType,\n getConnectorTypeFromName,\n OrbitAdapter,\n} from '@tuwaio/orbit-core';\nimport type { UiWallet } from '@wallet-standard/ui';\n\nimport { SolanaConnection } from '../types';\n\n/**\n * Callback functions interface for the Solana connections watcher.\n * These callbacks are used to interact with the global state store.\n */\nexport interface SolanaWatcherCallbacks {\n /** The currently active Solana connection from the global store */\n activeConnection: SolanaConnection | undefined;\n /** Function to disconnect a specific connector type */\n disconnect: (connectorType: ConnectorType) => void;\n /** Current connection error state, if any */\n connectionError: string | undefined;\n /** Function to update the active connection's properties */\n updateActiveConnection: (connection: Partial<SolanaConnection>) => void;\n}\n\n/**\n * Configuration interface for the Solana connections watcher.\n */\nexport interface SolanaWatcherConfig {\n /** Array of available Solana wallets from the Wallet Standard */\n wallets: UiWallet[];\n}\n\n/**\n * Creates and initializes a Solana connections watcher that monitors wallet standard changes\n * and synchronizes them with the global state store.\n *\n * This function provides a pure, framework-agnostic way to watch Solana wallet connections\n * without being tied to React hooks or components.\n *\n * Unlike EVM connections, Solana uses the Wallet Standard which doesn't provide\n * native watchers, so this function implements the watching logic directly.\n *\n * @param config - Configuration object containing wallets array from Wallet Standard\n * @param callbacks - Callback functions for interacting with the global state\n * @returns A cleanup function to stop watching connections (currently a no-op as Wallet Standard doesn't provide native watchers)\n *\n * @example\n * ```typescript\n * const unwatch = createSolanaConnectionsWatcher(\n * { wallets },\n * { activeConnection, disconnect, connectionError, updateActiveConnection }\n * );\n *\n * // Later, when you need to stop watching (currently no cleanup needed):\n * unwatch();\n * ```\n *\n * @remarks\n * The Solana watcher works differently from the EVM watcher because:\n * - It relies on the Wallet Standard's wallets array changes\n * - It doesn't have native connection event listeners like wagmi\n * - The watching is done by comparing wallet state changes in the wallets array\n */\nexport function createSolanaConnectionsWatcher(\n config: SolanaWatcherConfig,\n callbacks: SolanaWatcherCallbacks,\n): () => void {\n const { wallets } = config;\n const { activeConnection, disconnect, connectionError, updateActiveConnection } = callbacks;\n\n /**\n * Processes Solana wallet changes and updates the global store accordingly.\n * This function handles the core logic of monitoring Solana wallet state changes.\n *\n * @internal\n */\n const handleSolanaWalletChanges = (): void => {\n // Early return: Only process if we have an active Solana connection\n if (!activeConnection || getAdapterFromConnectorType(activeConnection.connectorType) !== OrbitAdapter.SOLANA) {\n return;\n }\n\n /**\n * Find the wallet that matches our active connection.\n * We compare by connector type which is derived from the wallet name.\n */\n const matchingWallet = wallets.find(\n (wallet) =>\n getConnectorTypeFromName(OrbitAdapter.SOLANA, formatConnectorName(wallet.name)) ===\n activeConnection.connectorType,\n );\n\n // Skip processing if there's a connection error to prevent conflicting updates\n if (!connectionError && matchingWallet) {\n /**\n * Build new connection state from the matching wallet.\n * We extract the first account as the active account.\n */\n const newState: Partial<SolanaConnection> = {\n // Use the first account's address as the primary address\n address: matchingWallet.accounts[0]?.address,\n // Determine connection status based on account availability\n isConnected: matchingWallet.accounts.length > 0,\n // Store Wallet Standard specific information for future use\n connectedAccount: matchingWallet.accounts[0],\n connectedWallet: matchingWallet,\n };\n\n /**\n * Prevent infinite update loops by only updating when state actually changes.\n * We only compare address and isConnected because connectedAccount/connectedWallet\n * might be new object references on every call, causing infinite loops.\n */\n const hasChanged =\n newState.address !== activeConnection.address || newState.isConnected !== activeConnection.isConnected;\n\n if (hasChanged) {\n // Update the global store with the new wallet state\n updateActiveConnection(newState);\n }\n }\n\n /**\n * Handle disconnection scenario:\n * If the wallet no longer has accounts but we still have an active connection,\n * we need to clean up the connection in our store.\n */\n if (matchingWallet?.accounts.length === 0 && activeConnection.connectorType) {\n // Trigger disconnection in the global store\n disconnect(activeConnection.connectorType);\n }\n };\n\n // Execute the initial wallet state processing\n handleSolanaWalletChanges();\n\n /**\n * Return a cleanup function.\n * Note: Unlike EVM watchers, Solana/Wallet Standard doesn't provide native\n * connection watchers, so we don't have any active subscriptions to clean up.\n * This function is provided for API consistency.\n */\n return (): void => {\n // Currently no cleanup is needed for Solana watchers\n // This is kept for future extensibility and API consistency\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tuwaio/satellite-solana",
|
|
3
|
-
"version": "1.0.0-fix-adapters-independ-alpha.
|
|
3
|
+
"version": "1.0.0-fix-adapters-independ-alpha.9.583293c",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Oleksandr Tkach",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"typescript": "^5.9.3",
|
|
68
68
|
"vitest": "^4.0.15",
|
|
69
69
|
"zustand": "^5.0.9",
|
|
70
|
-
"@tuwaio/satellite-core": "^1.0.0-fix-adapters-independ-alpha.
|
|
70
|
+
"@tuwaio/satellite-core": "^1.0.0-fix-adapters-independ-alpha.9.583293c"
|
|
71
71
|
},
|
|
72
72
|
"scripts": {
|
|
73
73
|
"start": "tsup src/index.ts --watch",
|