@tuwaio/satellite-solana 1.0.0-fix-test-alpha.6.49ff3eb → 1.0.0-fix-test-alpha.7.13eb435
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.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 +6 -4
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var orbitCore=require('@tuwaio/orbit-core'),orbitSolana=require('@tuwaio/orbit-solana'),
|
|
1
|
+
'use strict';var orbitCore=require('@tuwaio/orbit-core'),orbitSolana=require('@tuwaio/orbit-solana'),features=require('@wallet-standard/features'),ui=require('@wallet-standard/ui'),uiRegistry=require('@wallet-standard/ui-registry'),walletStandardMobile=require('@solana-mobile/wallet-standard-mobile');async function d(o,t){let e=ui.getWalletFeature(o,features.StandardConnect),{accounts:n}=await e.connect(t);return n.map(r=>uiRegistry.getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiRegistry.getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(o),r))}async function u(o){await ui.getWalletFeature(o,features.StandardDisconnect)?.disconnect();}function b({rpcUrls:o}){return {key:orbitCore.OrbitAdapter.SOLANA,async connect({walletType:t,chainId:e,connectors:n}){let r=n.find(a=>orbitCore.getWalletTypeFromConnectorName(orbitCore.OrbitAdapter.SOLANA,a.name)===t);if(!r)throw new Error("Cannot find connector with this wallet type");try{let a=await d(r),S=orbitSolana.getAvailableWallets(),s=orbitSolana.getCluster({cluster:e});return {walletType:t,address:a[0].address,chainId:s,rpcURL:orbitSolana.getRpcUrlForCluster({cluster:s,rpcUrls:o}),isConnected:!0,isContractAddress:!1,connectedAccount:a[0],connectedWallet:S.filter(f=>f.accounts.length>0)[0]}}catch(a){throw new Error(a instanceof Error?a.message:String(a))}},async disconnect(){let e=orbitSolana.getAvailableWallets().filter(n=>n.accounts.length>0)[0];await u(e);},async getConnectors(){let t=orbitSolana.getAvailableWallets();return {adapter:orbitCore.OrbitAdapter.SOLANA,connectors:t}},async checkAndSwitchNetwork(t,e,n){if(e!==t&&n){let r=orbitSolana.getCluster({cluster:t});n({chainId:r,rpcURL:orbitSolana.getRpcUrlForCluster({cluster:r,rpcUrls:o})});}},getExplorerUrl(t,e){return orbitSolana.getSolanaExplorerLink(t,e)},async getName(t){return orbitSolana.getSolanaAddressName(t)},async getAvatar(t){return orbitSolana.getSolanaAddressAvatar(t)}}}function z({rpcUrls:o,...t}){if(typeof window>"u")return;if(!window.isSecureContext){console.warn("Solana Mobile Connectors not loaded: https connection required");return}let e=Object.keys(o).map(n=>`solana:${n}`);if(e.length===0){console.warn("Solana Mobile Connectors not loaded: no chains provided");return}walletStandardMobile.registerMwa({appIdentity:{uri:t?.appUrl,icon:t?.appLogoUrl,name:t?.appName},authorizationCache:walletStandardMobile.createDefaultAuthorizationCache(),chains:e,chainSelector:walletStandardMobile.createDefaultChainSelector(),onWalletNotFound:walletStandardMobile.createDefaultWalletNotFoundHandler()});}exports.connect=d;exports.disconnect=u;exports.initializeSolanaMobileConnectors=z;exports.satelliteSolanaAdapter=b;//# 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","../src/connectors/initializeSolanaMobileConnectors.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","getAvailableWallets","getWallets","getOrCreateUiWalletForStandardWallet","OrbitAdapter","walletType","chainId","connectors","connector","getWalletTypeFromConnectorName","connectedAccount","wallets","cluster","getCluster","getRpcUrlForCluster","wallet","e","connectedWallet","currentChainId","updateActiveWallet","url","getSolanaExplorerLink","address","name","initializeSolanaMobileConnectors","props","chains","key","registerMwa","createDefaultAuthorizationCache","createDefaultChainSelector","createDefaultWalletNotFoundHandler"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, type 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<readonly UiWalletAccount[]> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n\n // Convert accounts to UI wallet accounts\n return accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\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 // Attempt disconnection if feature is supported\n await disconnectFeature?.disconnect();\n}\n","import { getWalletTypeFromConnectorName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport { getCluster, getRpcUrlForCluster, getSolanaExplorerLink, SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport { ConnectorSolana, SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { getWallets } from '@wallet-standard/app';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { getOrCreateUiWalletForStandardWallet_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getOrCreateUiWalletForStandardWallet } from '@wallet-standard/ui-registry';\nimport { SolanaClusterMoniker } from 'gill';\n\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 wallet connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent wallet 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({ rpcUrls }: SolanaRPCUrls): SatelliteAdapter {\n /**\n * Helper to get all available wallets\n */\n const getAvailableWallets = () => getWallets().get().map(getOrCreateUiWalletForStandardWallet);\n\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ walletType, chainId, connectors }) {\n const connector = connectors.find(\n (connector) => getWalletTypeFromConnectorName(OrbitAdapter.SOLANA, connector.name) === walletType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const connectedAccount = await connect(connector as UiWallet);\n const wallets = getAvailableWallets();\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n walletType,\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 connectedAccount: connectedAccount[0],\n connectedWallet: wallets.filter((wallet) => wallet.accounts.length > 0)[0],\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect() {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) => wallet.accounts.length > 0)[0];\n await disconnect(connectedWallet);\n },\n\n async getConnectors() {\n const connectors = getAvailableWallets();\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 getExplorerUrl(url, chainId) {\n const cluster = getCluster({ cluster: chainId as string }) ?? 'mainnet';\n return getSolanaExplorerLink(url, cluster as SolanaClusterMoniker);\n },\n\n async getName(address) {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) =>\n wallet.accounts.some((account) => account.address.toLowerCase() === address.toLowerCase()),\n )[0];\n return connectedWallet?.accounts[0]?.label ?? address;\n },\n\n async getAvatar(name) {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) =>\n wallet.accounts.some((account) => account.label?.toLowerCase() === name.toLowerCase()),\n )[0];\n return connectedWallet?.accounts[0]?.icon ?? name;\n },\n };\n}\n","import {\n createDefaultAuthorizationCache,\n createDefaultChainSelector,\n createDefaultWalletNotFoundHandler,\n registerMwa,\n} from '@solana-mobile/wallet-standard-mobile';\nimport { SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport { ConnectorsInitProps } from '@tuwaio/satellite-core';\n\n/**\n * Combined props for initializing Solana mobile connectors\n */\ntype InitializeSolanaMobileConnectorsProps = ConnectorsInitProps & SolanaRPCUrls;\n\n/**\n * Initializes Solana Mobile Wallet Adapter (MWA) for mobile wallet connections\n *\n * @remarks\n * This function sets up the Solana Mobile Wallet Adapter with appropriate configuration\n * for secure mobile wallet connections. It includes security checks and chain validation.\n * Only works in secure contexts (HTTPS) and requires at least one valid chain configuration.\n *\n * @param props - Combined initialization properties\n * @param props.rpcUrls - RPC endpoints for different Solana networks\n * @param props.appName - Application name to display in wallet\n * @param props.appUrl - Application URL\n * @param props.appLogoUrl - Application logo URL\n *\n * @example\n * ```typescript\n * initializeSolanaMobileConnectors({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * },\n * appName: 'My Solana App',\n * appUrl: 'https://myapp.com',\n * appLogoUrl: 'https://myapp.com/logo.png'\n * });\n * ```\n *\n * @throws {Warning} If not in secure context (non-HTTPS)\n * @throws {Warning} If no chains are configured\n */\nexport function initializeSolanaMobileConnectors({ rpcUrls, ...props }: InitializeSolanaMobileConnectorsProps): void {\n // Only run in browser environment\n if (typeof window === 'undefined') {\n return;\n }\n // Ensure secure context (HTTPS)\n if (!window.isSecureContext) {\n console.warn('Solana Mobile Connectors not loaded: https connection required');\n return;\n }\n\n // Generate chain identifiers\n const chains = Object.keys(rpcUrls).map((key) => `solana:${key}` as `solana:${string}`);\n\n // Validate chain configuration\n if (chains.length === 0) {\n console.warn('Solana Mobile Connectors not loaded: no chains provided');\n return;\n }\n\n // Register Mobile Wallet Adapter\n registerMwa({\n appIdentity: {\n uri: props?.appUrl,\n icon: props?.appLogoUrl,\n name: props?.appName,\n },\n authorizationCache: createDefaultAuthorizationCache(),\n chains,\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: createDefaultWalletNotFoundHandler(),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/connectionUtils.ts","../src/adapters/solanaAdapter.ts","../src/connectors/initializeSolanaMobileConnectors.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","OrbitAdapter","walletType","chainId","connectors","connector","getWalletTypeFromConnectorName","connectedAccount","wallets","getAvailableWallets","cluster","getCluster","getRpcUrlForCluster","wallet","e","connectedWallet","currentChainId","updateActiveWallet","url","getSolanaExplorerLink","address","getSolanaAddressName","name","getSolanaAddressAvatar","initializeSolanaMobileConnectors","props","chains","key","registerMwa","createDefaultAuthorizationCache","createDefaultChainSelector","createDefaultWalletNotFoundHandler"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, type 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<readonly UiWalletAccount[]> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n\n // Convert accounts to UI wallet accounts\n return accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\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 // Attempt disconnection if feature is supported\n await disconnectFeature?.disconnect();\n}\n","import { getWalletTypeFromConnectorName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport {\n getAvailableWallets,\n getCluster,\n getRpcUrlForCluster,\n getSolanaAddressAvatar,\n getSolanaAddressName,\n getSolanaExplorerLink,\n SolanaRPCUrls,\n} from '@tuwaio/orbit-solana';\nimport { ConnectorSolana, SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { SolanaClusterMoniker } from 'gill';\n\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 wallet connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent wallet 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({ rpcUrls }: SolanaRPCUrls): SatelliteAdapter {\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ walletType, chainId, connectors }) {\n const connector = connectors.find(\n (connector) => getWalletTypeFromConnectorName(OrbitAdapter.SOLANA, connector.name) === walletType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const connectedAccount = await connect(connector as UiWallet);\n const wallets = getAvailableWallets();\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n walletType,\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 connectedAccount: connectedAccount[0],\n connectedWallet: wallets.filter((wallet) => wallet.accounts.length > 0)[0],\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect() {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) => wallet.accounts.length > 0)[0];\n await disconnect(connectedWallet);\n },\n\n async getConnectors() {\n const connectors = getAvailableWallets();\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 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}\n","import {\n createDefaultAuthorizationCache,\n createDefaultChainSelector,\n createDefaultWalletNotFoundHandler,\n registerMwa,\n} from '@solana-mobile/wallet-standard-mobile';\nimport { SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport { ConnectorsInitProps } from '@tuwaio/satellite-core';\n\n/**\n * Combined props for initializing Solana mobile connectors\n */\ntype InitializeSolanaMobileConnectorsProps = ConnectorsInitProps & SolanaRPCUrls;\n\n/**\n * Initializes Solana Mobile Wallet Adapter (MWA) for mobile wallet connections\n *\n * @remarks\n * This function sets up the Solana Mobile Wallet Adapter with appropriate configuration\n * for secure mobile wallet connections. It includes security checks and chain validation.\n * Only works in secure contexts (HTTPS) and requires at least one valid chain configuration.\n *\n * @param props - Combined initialization properties\n * @param props.rpcUrls - RPC endpoints for different Solana networks\n * @param props.appName - Application name to display in wallet\n * @param props.appUrl - Application URL\n * @param props.appLogoUrl - Application logo URL\n *\n * @example\n * ```typescript\n * initializeSolanaMobileConnectors({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * },\n * appName: 'My Solana App',\n * appUrl: 'https://myapp.com',\n * appLogoUrl: 'https://myapp.com/logo.png'\n * });\n * ```\n *\n * @throws {Warning} If not in secure context (non-HTTPS)\n * @throws {Warning} If no chains are configured\n */\nexport function initializeSolanaMobileConnectors({ rpcUrls, ...props }: InitializeSolanaMobileConnectorsProps): void {\n // Only run in browser environment\n if (typeof window === 'undefined') {\n return;\n }\n // Ensure secure context (HTTPS)\n if (!window.isSecureContext) {\n console.warn('Solana Mobile Connectors not loaded: https connection required');\n return;\n }\n\n // Generate chain identifiers\n const chains = Object.keys(rpcUrls).map((key) => `solana:${key}` as `solana:${string}`);\n\n // Validate chain configuration\n if (chains.length === 0) {\n console.warn('Solana Mobile Connectors not loaded: no chains provided');\n return;\n }\n\n // Register Mobile Wallet Adapter\n registerMwa({\n appIdentity: {\n uri: props?.appUrl,\n icon: props?.appLogoUrl,\n name: props?.appName,\n },\n authorizationCache: createDefaultAuthorizationCache(),\n chains,\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: createDefaultWalletNotFoundHandler(),\n });\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {OrbitAdapter,getWalletTypeFromConnectorName}from'@tuwaio/orbit-core';import {
|
|
1
|
+
import {OrbitAdapter,getWalletTypeFromConnectorName}from'@tuwaio/orbit-core';import {getSolanaAddressAvatar,getSolanaAddressName,getSolanaExplorerLink,getCluster,getRpcUrlForCluster,getAvailableWallets}from'@tuwaio/orbit-solana';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';import {registerMwa,createDefaultWalletNotFoundHandler,createDefaultChainSelector,createDefaultAuthorizationCache}from'@solana-mobile/wallet-standard-mobile';async function d(o,t){let e=getWalletFeature(o,StandardConnect),{accounts:n}=await e.connect(t);return n.map(r=>getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(o),r))}async function u(o){await getWalletFeature(o,StandardDisconnect)?.disconnect();}function b({rpcUrls:o}){return {key:OrbitAdapter.SOLANA,async connect({walletType:t,chainId:e,connectors:n}){let r=n.find(a=>getWalletTypeFromConnectorName(OrbitAdapter.SOLANA,a.name)===t);if(!r)throw new Error("Cannot find connector with this wallet type");try{let a=await d(r),S=getAvailableWallets(),s=getCluster({cluster:e});return {walletType:t,address:a[0].address,chainId:s,rpcURL:getRpcUrlForCluster({cluster:s,rpcUrls:o}),isConnected:!0,isContractAddress:!1,connectedAccount:a[0],connectedWallet:S.filter(f=>f.accounts.length>0)[0]}}catch(a){throw new Error(a instanceof Error?a.message:String(a))}},async disconnect(){let e=getAvailableWallets().filter(n=>n.accounts.length>0)[0];await u(e);},async getConnectors(){let t=getAvailableWallets();return {adapter:OrbitAdapter.SOLANA,connectors:t}},async checkAndSwitchNetwork(t,e,n){if(e!==t&&n){let r=getCluster({cluster:t});n({chainId:r,rpcURL:getRpcUrlForCluster({cluster:r,rpcUrls:o})});}},getExplorerUrl(t,e){return getSolanaExplorerLink(t,e)},async getName(t){return getSolanaAddressName(t)},async getAvatar(t){return getSolanaAddressAvatar(t)}}}function z({rpcUrls:o,...t}){if(typeof window>"u")return;if(!window.isSecureContext){console.warn("Solana Mobile Connectors not loaded: https connection required");return}let e=Object.keys(o).map(n=>`solana:${n}`);if(e.length===0){console.warn("Solana Mobile Connectors not loaded: no chains provided");return}registerMwa({appIdentity:{uri:t?.appUrl,icon:t?.appLogoUrl,name:t?.appName},authorizationCache:createDefaultAuthorizationCache(),chains:e,chainSelector:createDefaultChainSelector(),onWalletNotFound:createDefaultWalletNotFoundHandler()});}export{d as connect,u as disconnect,z as initializeSolanaMobileConnectors,b 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","../src/connectors/initializeSolanaMobileConnectors.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","getAvailableWallets","getWallets","getOrCreateUiWalletForStandardWallet","OrbitAdapter","walletType","chainId","connectors","connector","getWalletTypeFromConnectorName","connectedAccount","wallets","cluster","getCluster","getRpcUrlForCluster","wallet","e","connectedWallet","currentChainId","updateActiveWallet","url","getSolanaExplorerLink","address","name","initializeSolanaMobileConnectors","props","chains","key","registerMwa","createDefaultAuthorizationCache","createDefaultChainSelector","createDefaultWalletNotFoundHandler"],"mappings":"quBAoCA,eAAsBA,CAAAA,CACpBC,CAAAA,CACAC,EACqC,CAErC,IAAMC,CAAAA,CAAiBC,gBAAAA,CAAiBH,CAAAA,CAAUI,eAAe,EAG3D,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAI,MAAMH,CAAAA,CAAe,QAAQD,CAAK,CAAA,CAGvD,OAAOI,CAAAA,CAAS,GAAA,CAAKC,CAAAA,EACnBC,mFAAmDC,kDAAAA,CAAmBR,CAAQ,CAAA,CAAGM,CAAO,CAC1F,CACF,CAkBA,eAAsBG,CAAAA,CAAWT,CAAAA,CAAmC,CAOlE,MAL0BG,gBAAAA,CAAiBH,EAAUU,kBAAkB,CAAA,EAK9C,UAAA,GAC3B,CC5CO,SAASC,EAAuB,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAoC,CAInF,IAAMC,EAAsB,IAAMC,UAAAA,EAAW,CAAE,GAAA,EAAI,CAAE,GAAA,CAAIC,oEAAoC,CAAA,CAE7F,OAAO,CACL,GAAA,CAAKC,YAAAA,CAAa,MAAA,CAElB,MAAM,OAAA,CAAQ,CAAE,UAAA,CAAAC,CAAAA,CAAY,OAAA,CAAAC,CAAAA,CAAS,WAAAC,CAAW,CAAA,CAAG,CACjD,IAAMC,CAAAA,CAAYD,CAAAA,CAAW,KAC1BC,CAAAA,EAAcC,8BAAAA,CAA+BL,YAAAA,CAAa,MAAA,CAAQI,CAAAA,CAAU,IAAI,IAAMH,CACzF,CAAA,CACA,GAAI,CAACG,CAAAA,CAAW,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA,CAE7E,GAAI,CACF,IAAME,EAAmB,MAAMvB,CAAAA,CAAQqB,CAAqB,CAAA,CACtDG,CAAAA,CAAUV,CAAAA,GACVW,CAAAA,CAAUC,UAAAA,CAAW,CAAE,OAAA,CAASP,CAAkB,CAAC,EAEzD,OAAO,CACL,UAAA,CAAAD,CAAAA,CACA,OAAA,CAASK,CAAAA,CAAiB,CAAC,CAAA,CAAE,OAAA,CAC7B,OAAA,CAASE,CAAAA,CACT,MAAA,CAAQE,mBAAAA,CAAoB,CAC1B,OAAA,CAASF,CAAAA,CACT,OAAA,CAAAZ,CACF,CAAC,CAAA,CACD,YAAa,CAAA,CAAA,CACb,iBAAA,CAAmB,CAAA,CAAA,CACnB,gBAAA,CAAkBU,CAAAA,CAAiB,CAAC,EACpC,eAAA,CAAiBC,CAAAA,CAAQ,MAAA,CAAQI,CAAAA,EAAWA,CAAAA,CAAO,QAAA,CAAS,OAAS,CAAC,CAAA,CAAE,CAAC,CAC3E,CACF,CAAA,MAASC,EAAG,CACV,MAAM,IAAI,KAAA,CAAMA,CAAAA,YAAa,KAAA,CAAQA,EAAE,OAAA,CAAU,MAAA,CAAOA,CAAC,CAAC,CAC5D,CACF,EAEA,MAAM,UAAA,EAAa,CAEjB,IAAMC,CAAAA,CADUhB,CAAAA,EAAoB,CACJ,MAAA,CAAQc,CAAAA,EAAWA,CAAAA,CAAO,QAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA,CAChF,MAAMlB,CAAAA,CAAWoB,CAAe,EAClC,CAAA,CAEA,MAAM,aAAA,EAAgB,CACpB,IAAMV,CAAAA,CAAaN,CAAAA,EAAoB,CACvC,OAAO,CACL,OAAA,CAASG,YAAAA,CAAa,MAAA,CACtB,UAAA,CAAYG,CACd,CACF,CAAA,CAEA,MAAM,qBAAA,CAAsBD,CAAAA,CAASY,CAAAA,CAAgBC,CAAAA,CAAoB,CACvE,GAAID,CAAAA,GAAmBZ,CAAAA,EAAWa,CAAAA,CAAoB,CACpD,IAAMP,EAAUC,UAAAA,CAAW,CAAE,OAAA,CAASP,CAAkB,CAAC,CAAA,CACzDa,EAAmB,CACjB,OAAA,CAASP,CAAAA,CACT,MAAA,CAAQE,mBAAAA,CAAoB,CAC1B,QAASF,CAAAA,CACT,OAAA,CAAAZ,CACF,CAAC,CACH,CAAC,EACH,CACF,CAAA,CAEA,cAAA,CAAeoB,CAAAA,CAAKd,CAAAA,CAAS,CAC3B,IAAMM,CAAAA,CAAUC,UAAAA,CAAW,CAAE,OAAA,CAASP,CAAkB,CAAC,GAAK,SAAA,CAC9D,OAAOe,qBAAAA,CAAsBD,CAAAA,CAAKR,CAA+B,CACnE,EAEA,MAAM,OAAA,CAAQU,CAAAA,CAAS,CAKrB,OAJgBrB,CAAAA,GACgB,MAAA,CAAQc,CAAAA,EACtCA,CAAAA,CAAO,QAAA,CAAS,IAAA,CAAMrB,CAAAA,EAAYA,EAAQ,OAAA,CAAQ,WAAA,EAAY,GAAM4B,CAAAA,CAAQ,WAAA,EAAa,CAC3F,CAAA,CAAE,CAAC,CAAA,EACqB,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,EAASA,CAChD,CAAA,CAEA,MAAM,SAAA,CAAUC,CAAAA,CAAM,CAKpB,OAJgBtB,GAAoB,CACJ,MAAA,CAAQc,CAAAA,EACtCA,CAAAA,CAAO,QAAA,CAAS,IAAA,CAAMrB,GAAYA,CAAAA,CAAQ,KAAA,EAAO,WAAA,EAAY,GAAM6B,CAAAA,CAAK,WAAA,EAAa,CACvF,CAAA,CAAE,CAAC,CAAA,EACqB,QAAA,CAAS,CAAC,GAAG,IAAA,EAAQA,CAC/C,CACF,CACF,CC1EO,SAASC,CAAAA,CAAiC,CAAE,OAAA,CAAAxB,CAAAA,CAAS,GAAGyB,CAAM,CAAA,CAAgD,CAEnH,GAAI,OAAO,MAAA,CAAW,IACpB,OAGF,GAAI,CAAC,MAAA,CAAO,eAAA,CAAiB,CAC3B,QAAQ,IAAA,CAAK,gEAAgE,CAAA,CAC7E,MACF,CAGA,IAAMC,EAAS,MAAA,CAAO,IAAA,CAAK1B,CAAO,CAAA,CAAE,GAAA,CAAK2B,CAAAA,EAAQ,UAAUA,CAAG,CAAA,CAAwB,CAAA,CAGtF,GAAID,CAAAA,CAAO,MAAA,GAAW,EAAG,CACvB,OAAA,CAAQ,IAAA,CAAK,yDAAyD,CAAA,CACtE,MACF,CAGAE,WAAAA,CAAY,CACV,WAAA,CAAa,CACX,GAAA,CAAKH,CAAAA,EAAO,OACZ,IAAA,CAAMA,CAAAA,EAAO,UAAA,CACb,IAAA,CAAMA,CAAAA,EAAO,OACf,EACA,kBAAA,CAAoBI,+BAAAA,EAAgC,CACpD,MAAA,CAAAH,CAAAA,CACA,aAAA,CAAeI,0BAAAA,EAA2B,CAC1C,gBAAA,CAAkBC,kCAAAA,EACpB,CAAC,EACH","file":"index.mjs","sourcesContent":["import type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, type 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<readonly UiWalletAccount[]> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n\n // Convert accounts to UI wallet accounts\n return accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\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 // Attempt disconnection if feature is supported\n await disconnectFeature?.disconnect();\n}\n","import { getWalletTypeFromConnectorName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport { getCluster, getRpcUrlForCluster, getSolanaExplorerLink, SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport { ConnectorSolana, SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { getWallets } from '@wallet-standard/app';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { getOrCreateUiWalletForStandardWallet_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as getOrCreateUiWalletForStandardWallet } from '@wallet-standard/ui-registry';\nimport { SolanaClusterMoniker } from 'gill';\n\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 wallet connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent wallet 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({ rpcUrls }: SolanaRPCUrls): SatelliteAdapter {\n /**\n * Helper to get all available wallets\n */\n const getAvailableWallets = () => getWallets().get().map(getOrCreateUiWalletForStandardWallet);\n\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ walletType, chainId, connectors }) {\n const connector = connectors.find(\n (connector) => getWalletTypeFromConnectorName(OrbitAdapter.SOLANA, connector.name) === walletType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const connectedAccount = await connect(connector as UiWallet);\n const wallets = getAvailableWallets();\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n walletType,\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 connectedAccount: connectedAccount[0],\n connectedWallet: wallets.filter((wallet) => wallet.accounts.length > 0)[0],\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect() {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) => wallet.accounts.length > 0)[0];\n await disconnect(connectedWallet);\n },\n\n async getConnectors() {\n const connectors = getAvailableWallets();\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 getExplorerUrl(url, chainId) {\n const cluster = getCluster({ cluster: chainId as string }) ?? 'mainnet';\n return getSolanaExplorerLink(url, cluster as SolanaClusterMoniker);\n },\n\n async getName(address) {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) =>\n wallet.accounts.some((account) => account.address.toLowerCase() === address.toLowerCase()),\n )[0];\n return connectedWallet?.accounts[0]?.label ?? address;\n },\n\n async getAvatar(name) {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) =>\n wallet.accounts.some((account) => account.label?.toLowerCase() === name.toLowerCase()),\n )[0];\n return connectedWallet?.accounts[0]?.icon ?? name;\n },\n };\n}\n","import {\n createDefaultAuthorizationCache,\n createDefaultChainSelector,\n createDefaultWalletNotFoundHandler,\n registerMwa,\n} from '@solana-mobile/wallet-standard-mobile';\nimport { SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport { ConnectorsInitProps } from '@tuwaio/satellite-core';\n\n/**\n * Combined props for initializing Solana mobile connectors\n */\ntype InitializeSolanaMobileConnectorsProps = ConnectorsInitProps & SolanaRPCUrls;\n\n/**\n * Initializes Solana Mobile Wallet Adapter (MWA) for mobile wallet connections\n *\n * @remarks\n * This function sets up the Solana Mobile Wallet Adapter with appropriate configuration\n * for secure mobile wallet connections. It includes security checks and chain validation.\n * Only works in secure contexts (HTTPS) and requires at least one valid chain configuration.\n *\n * @param props - Combined initialization properties\n * @param props.rpcUrls - RPC endpoints for different Solana networks\n * @param props.appName - Application name to display in wallet\n * @param props.appUrl - Application URL\n * @param props.appLogoUrl - Application logo URL\n *\n * @example\n * ```typescript\n * initializeSolanaMobileConnectors({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * },\n * appName: 'My Solana App',\n * appUrl: 'https://myapp.com',\n * appLogoUrl: 'https://myapp.com/logo.png'\n * });\n * ```\n *\n * @throws {Warning} If not in secure context (non-HTTPS)\n * @throws {Warning} If no chains are configured\n */\nexport function initializeSolanaMobileConnectors({ rpcUrls, ...props }: InitializeSolanaMobileConnectorsProps): void {\n // Only run in browser environment\n if (typeof window === 'undefined') {\n return;\n }\n // Ensure secure context (HTTPS)\n if (!window.isSecureContext) {\n console.warn('Solana Mobile Connectors not loaded: https connection required');\n return;\n }\n\n // Generate chain identifiers\n const chains = Object.keys(rpcUrls).map((key) => `solana:${key}` as `solana:${string}`);\n\n // Validate chain configuration\n if (chains.length === 0) {\n console.warn('Solana Mobile Connectors not loaded: no chains provided');\n return;\n }\n\n // Register Mobile Wallet Adapter\n registerMwa({\n appIdentity: {\n uri: props?.appUrl,\n icon: props?.appLogoUrl,\n name: props?.appName,\n },\n authorizationCache: createDefaultAuthorizationCache(),\n chains,\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: createDefaultWalletNotFoundHandler(),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/connectionUtils.ts","../src/adapters/solanaAdapter.ts","../src/connectors/initializeSolanaMobileConnectors.ts"],"names":["connect","uiWallet","input","connectFeature","getWalletFeature","StandardConnect","accounts","account","getOrCreateUiWalletAccountForStandardWalletAccount","getWalletForHandle","disconnect","StandardDisconnect","satelliteSolanaAdapter","rpcUrls","OrbitAdapter","walletType","chainId","connectors","connector","getWalletTypeFromConnectorName","connectedAccount","wallets","getAvailableWallets","cluster","getCluster","getRpcUrlForCluster","wallet","e","connectedWallet","currentChainId","updateActiveWallet","url","getSolanaExplorerLink","address","getSolanaAddressName","name","getSolanaAddressAvatar","initializeSolanaMobileConnectors","props","chains","key","registerMwa","createDefaultAuthorizationCache","createDefaultChainSelector","createDefaultWalletNotFoundHandler"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\nimport { StandardConnect, StandardDisconnect } from '@wallet-standard/features';\nimport { getWalletFeature, type UiWallet, type 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<readonly UiWalletAccount[]> {\n // Get the connect feature from the wallet\n const connectFeature = getWalletFeature(uiWallet, StandardConnect) as StandardConnectFeature[typeof StandardConnect];\n\n // Initiate connection and get accounts\n const { accounts } = await connectFeature.connect(input);\n\n // Convert accounts to UI wallet accounts\n return accounts.map((account) =>\n getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(uiWallet), account),\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 // Attempt disconnection if feature is supported\n await disconnectFeature?.disconnect();\n}\n","import { getWalletTypeFromConnectorName, OrbitAdapter } from '@tuwaio/orbit-core';\nimport {\n getAvailableWallets,\n getCluster,\n getRpcUrlForCluster,\n getSolanaAddressAvatar,\n getSolanaAddressName,\n getSolanaExplorerLink,\n SolanaRPCUrls,\n} from '@tuwaio/orbit-solana';\nimport { ConnectorSolana, SatelliteAdapter } from '@tuwaio/satellite-core';\nimport { UiWallet } from '@wallet-standard/ui';\nimport { SolanaClusterMoniker } from 'gill';\n\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 wallet connection, network switching, and name resolution capabilities.\n * It uses the Wallet Standard for consistent wallet 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({ rpcUrls }: SolanaRPCUrls): SatelliteAdapter {\n return {\n key: OrbitAdapter.SOLANA,\n\n async connect({ walletType, chainId, connectors }) {\n const connector = connectors.find(\n (connector) => getWalletTypeFromConnectorName(OrbitAdapter.SOLANA, connector.name) === walletType,\n );\n if (!connector) throw new Error('Cannot find connector with this wallet type');\n\n try {\n const connectedAccount = await connect(connector as UiWallet);\n const wallets = getAvailableWallets();\n const cluster = getCluster({ cluster: chainId as string });\n\n return {\n walletType,\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 connectedAccount: connectedAccount[0],\n connectedWallet: wallets.filter((wallet) => wallet.accounts.length > 0)[0],\n };\n } catch (e) {\n throw new Error(e instanceof Error ? e.message : String(e));\n }\n },\n\n async disconnect() {\n const wallets = getAvailableWallets();\n const connectedWallet = wallets.filter((wallet) => wallet.accounts.length > 0)[0];\n await disconnect(connectedWallet);\n },\n\n async getConnectors() {\n const connectors = getAvailableWallets();\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 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}\n","import {\n createDefaultAuthorizationCache,\n createDefaultChainSelector,\n createDefaultWalletNotFoundHandler,\n registerMwa,\n} from '@solana-mobile/wallet-standard-mobile';\nimport { SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport { ConnectorsInitProps } from '@tuwaio/satellite-core';\n\n/**\n * Combined props for initializing Solana mobile connectors\n */\ntype InitializeSolanaMobileConnectorsProps = ConnectorsInitProps & SolanaRPCUrls;\n\n/**\n * Initializes Solana Mobile Wallet Adapter (MWA) for mobile wallet connections\n *\n * @remarks\n * This function sets up the Solana Mobile Wallet Adapter with appropriate configuration\n * for secure mobile wallet connections. It includes security checks and chain validation.\n * Only works in secure contexts (HTTPS) and requires at least one valid chain configuration.\n *\n * @param props - Combined initialization properties\n * @param props.rpcUrls - RPC endpoints for different Solana networks\n * @param props.appName - Application name to display in wallet\n * @param props.appUrl - Application URL\n * @param props.appLogoUrl - Application logo URL\n *\n * @example\n * ```typescript\n * initializeSolanaMobileConnectors({\n * rpcUrls: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * },\n * appName: 'My Solana App',\n * appUrl: 'https://myapp.com',\n * appLogoUrl: 'https://myapp.com/logo.png'\n * });\n * ```\n *\n * @throws {Warning} If not in secure context (non-HTTPS)\n * @throws {Warning} If no chains are configured\n */\nexport function initializeSolanaMobileConnectors({ rpcUrls, ...props }: InitializeSolanaMobileConnectorsProps): void {\n // Only run in browser environment\n if (typeof window === 'undefined') {\n return;\n }\n // Ensure secure context (HTTPS)\n if (!window.isSecureContext) {\n console.warn('Solana Mobile Connectors not loaded: https connection required');\n return;\n }\n\n // Generate chain identifiers\n const chains = Object.keys(rpcUrls).map((key) => `solana:${key}` as `solana:${string}`);\n\n // Validate chain configuration\n if (chains.length === 0) {\n console.warn('Solana Mobile Connectors not loaded: no chains provided');\n return;\n }\n\n // Register Mobile Wallet Adapter\n registerMwa({\n appIdentity: {\n uri: props?.appUrl,\n icon: props?.appLogoUrl,\n name: props?.appName,\n },\n authorizationCache: createDefaultAuthorizationCache(),\n chains,\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: createDefaultWalletNotFoundHandler(),\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-test-alpha.
|
|
3
|
+
"version": "1.0.0-fix-test-alpha.7.13eb435",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Oleksandr Tkach",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"@wallet-standard/app": ">=1.1",
|
|
50
50
|
"@wallet-standard/base": ">=1.1",
|
|
51
51
|
"@wallet-standard/features": ">=1.1",
|
|
52
|
+
"@wallet-standard/ui-core": ">=1",
|
|
52
53
|
"@wallet-standard/ui": ">=1",
|
|
53
54
|
"@wallet-standard/ui-registry": ">=1"
|
|
54
55
|
},
|
|
@@ -58,6 +59,7 @@
|
|
|
58
59
|
"@wallet-standard/base": "^1.1.0",
|
|
59
60
|
"@wallet-standard/features": "^1.1.0",
|
|
60
61
|
"@wallet-standard/ui": "^1.0.1",
|
|
62
|
+
"@wallet-standard/ui-core": "^1.0.0",
|
|
61
63
|
"@wallet-standard/ui-registry": "^1.0.1",
|
|
62
64
|
"gill": "^0.11.0",
|
|
63
65
|
"immer": "^10.1.3",
|
|
@@ -66,9 +68,9 @@
|
|
|
66
68
|
"typescript": "^5.9.2",
|
|
67
69
|
"vitest": "^3.2.4",
|
|
68
70
|
"zustand": "^5.0.8",
|
|
69
|
-
"@tuwaio/orbit-
|
|
70
|
-
"@tuwaio/satellite-core": "^1.0.0-fix-test-alpha.
|
|
71
|
-
"@tuwaio/orbit-
|
|
71
|
+
"@tuwaio/orbit-solana": "^1.0.0-fix-test-alpha.7.13eb435",
|
|
72
|
+
"@tuwaio/satellite-core": "^1.0.0-fix-test-alpha.7.13eb435",
|
|
73
|
+
"@tuwaio/orbit-core": "^1.0.0-fix-test-alpha.7.13eb435"
|
|
72
74
|
},
|
|
73
75
|
"scripts": {
|
|
74
76
|
"start": "tsup src/index.ts --watch",
|