UNPKG

@wuwei-labs/srsly

Version:
200 lines 6.03 kB
/** * @purpose Simple SDK configuration management * * Provides global configuration with per-call overrides. * Supports both @solana/kit (default) and @solana/web3.js modes. */ import { SRSLY_PROGRAM_ADDRESS } from '../generated/codama'; import { getProgramAddresses, MAINNET_GENESIS, DEVNET_GENESIS, } from './addresses'; import { createRpc } from './rpc'; import { setSdkConfig as setSlyvaultSdkConfig } from '@wuwei-labs/slyvault'; /** * Default RPC URLs keyed by genesis hash */ const DEFAULT_RPC_URLS = { [MAINNET_GENESIS]: 'https://api.mainnet-beta.solana.com', [DEVNET_GENESIS]: 'https://api.devnet.solana.com', // ATLASNET_GENESIS has no public RPC — requires custom URL via config }; /** * Alias-based RPC URL fallbacks (for localnet and named aliases) */ const ALIAS_RPC_URLS = { atlasnet: 'https://api.devnet.solana.com', holosim: 'https://api.devnet.solana.com', mainnet: 'https://api.mainnet-beta.solana.com', localnet: 'http://localhost:8899', }; /** * Default SRSLY program ID (from generated code) */ const DEFAULT_PROGRAM_ID = SRSLY_PROGRAM_ADDRESS; /** * Global SDK configuration state */ let globalConfig = { programs: 'atlasnet', }; /** * Set global SDK configuration * * This configuration will be used as the default for all SDK operations. * Individual function calls can override these settings. * * @param config - Configuration options to set globally * * @example * ```typescript * // Use atlasnet programs with default devnet RPC * setSdkConfig({ programs: 'atlasnet' }); * * // Use mainnet programs with web3.js * import { PublicKey } from '@solana/web3.js'; * setSdkConfig({ * programs: 'mainnet', * PublicKey * }); * * // Use mainnet programs with custom RPC (e.g., Helius, QuickNode) * setSdkConfig({ * programs: 'mainnet', * rpcUrl: 'https://my-custom-mainnet-rpc.com' * }); * * // Use atlasnet programs with custom devnet RPC * setSdkConfig({ * programs: 'atlasnet', * rpcUrl: 'https://my-custom-devnet-rpc.com' * }); * ``` */ export function setSdkConfig(config) { globalConfig = { ...globalConfig, ...config }; // Propagate relevant config to slyvault SDK setSlyvaultSdkConfig({ rpcUrl: config.rpcUrl, PublicKey: config.PublicKey, }); } /** * Get the current global SDK configuration * * @returns A copy of the current global configuration */ export function getSdkConfig() { return { ...globalConfig }; } /** * Clear global SDK configuration (resets to defaults) */ export function clearSdkConfig() { globalConfig = { programs: 'atlasnet', }; } /** * Merge global config with optional overrides * * @param overrides - Optional configuration overrides * @returns Merged configuration */ export function mergeConfig(overrides) { return { ...globalConfig, ...overrides }; } /** * Get the effective RPC URL for a configuration * * @param config - Optional SDK configuration. If not provided, uses global config * @returns RPC URL to use */ export function getRpcUrl(config) { const finalConfig = mergeConfig(config); if (finalConfig.rpcUrl) return finalConfig.rpcUrl; // Try genesis-hash-keyed lookup first, then alias fallback return (DEFAULT_RPC_URLS[finalConfig.programs] || ALIAS_RPC_URLS[finalConfig.programs] || DEFAULT_RPC_URLS[DEVNET_GENESIS]); } /** * Get the effective program ID for a configuration * * @param config - SDK configuration * @returns Program ID to use */ export function getProgramId(config) { return config.programId || DEFAULT_PROGRAM_ID; } /** * Get the effective commitment level for a configuration * * @param config - SDK configuration * @returns Commitment level to use */ export function getCommitment(config) { return config.commitment || 'confirmed'; } /** * Get the affiliate configuration from global config with optional overrides * * @param config - Optional SDK configuration overrides * @returns Affiliate configuration if set, undefined otherwise */ export function getAffiliateConfig(config) { const merged = mergeConfig(config); return merged.affiliate; } /** * Get program-specific addresses with optional overrides * * Returns addresses for the configured program set. The SRSLY program ID * can be overridden via config.programId. * * @param config - Optional SDK configuration overrides * @returns Program addresses with any config overrides applied * * @example * ```typescript * // Get atlasnet addresses (from global config) * setSdkConfig({ programs: 'atlasnet' }); * const addresses = getAddresses(); * console.log(addresses.atlasMint); // Atlasnet ATLAS mint * * // Override programs for specific call * const mainnetAddrs = getAddresses({ programs: 'mainnet' }); * * // Custom SRSLY program * const customAddrs = getAddresses({ programId: 'MyCustomProgram...' }); * console.log(customAddrs.srsly); // 'MyCustomProgram...' * ``` */ export function getAddresses(config) { const finalConfig = mergeConfig(config); const networkAddresses = getProgramAddresses(finalConfig.programs); // Return addresses with programId override if provided return { ...networkAddresses, srsly: finalConfig.programId || networkAddresses.srsly, }; } /** * Auto-detect the correct program set by querying the chain's genesis hash * * Returns the raw genesis hash string, which can be passed directly to * `setSdkConfig({ programs: genesisHash })` or `getProgramAddresses(genesisHash)`. * * @param rpcUrl - RPC endpoint URL to query * @returns Genesis hash string identifying the chain * * @example * ```typescript * const genesisHash = await detectProgramSet('https://api.mainnet-beta.solana.com'); * setSdkConfig({ programs: genesisHash }); * ``` */ export async function detectProgramSet(rpcUrl) { const rpc = createRpc(rpcUrl); const genesisHash = await rpc.getGenesisHash().send(); return genesisHash; } //# sourceMappingURL=config.js.map