@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
200 lines • 6.03 kB
JavaScript
/**
* @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