UNPKG

@wuwei-labs/srsly

Version:
212 lines 6.42 kB
"use strict"; /** * @purpose Simple SDK configuration management * * Provides global configuration with per-call overrides. * Supports both @solana/kit (default) and @solana/web3.js modes. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.setSdkConfig = setSdkConfig; exports.getSdkConfig = getSdkConfig; exports.clearSdkConfig = clearSdkConfig; exports.mergeConfig = mergeConfig; exports.getRpcUrl = getRpcUrl; exports.getProgramId = getProgramId; exports.getCommitment = getCommitment; exports.getAffiliateConfig = getAffiliateConfig; exports.getAddresses = getAddresses; exports.detectProgramSet = detectProgramSet; const codama_1 = require("../generated/codama"); const addresses_1 = require("./addresses"); const rpc_1 = require("./rpc"); const slyvault_1 = require("@wuwei-labs/slyvault"); /** * Default RPC URLs keyed by genesis hash */ const DEFAULT_RPC_URLS = { [addresses_1.MAINNET_GENESIS]: 'https://api.mainnet-beta.solana.com', [addresses_1.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 = codama_1.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' * }); * ``` */ function setSdkConfig(config) { globalConfig = { ...globalConfig, ...config }; // Propagate relevant config to slyvault SDK (0, slyvault_1.setSdkConfig)({ rpcUrl: config.rpcUrl, PublicKey: config.PublicKey, }); } /** * Get the current global SDK configuration * * @returns A copy of the current global configuration */ function getSdkConfig() { return { ...globalConfig }; } /** * Clear global SDK configuration (resets to defaults) */ function clearSdkConfig() { globalConfig = { programs: 'atlasnet', }; } /** * Merge global config with optional overrides * * @param overrides - Optional configuration overrides * @returns Merged configuration */ 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 */ 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[addresses_1.DEVNET_GENESIS]); } /** * Get the effective program ID for a configuration * * @param config - SDK configuration * @returns Program ID to use */ 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 */ 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 */ 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...' * ``` */ function getAddresses(config) { const finalConfig = mergeConfig(config); const networkAddresses = (0, addresses_1.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 }); * ``` */ async function detectProgramSet(rpcUrl) { const rpc = (0, rpc_1.createRpc)(rpcUrl); const genesisHash = await rpc.getGenesisHash().send(); return genesisHash; } //# sourceMappingURL=config.js.map