UNPKG

@wuwei-labs/srsly

Version:
97 lines 3.59 kB
"use strict"; /** * @purpose Config account utilities for SRSLY * * Fetches global config state data from the SRSLY program. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchConfig = fetchConfig; exports.fetchAllConfigs = fetchAllConfigs; const kit_1 = require("@solana/kit"); const accounts_1 = require("../generated/codama/accounts"); const srsly_1 = require("../generated/codama/programs/srsly"); const config_1 = require("../utils/config"); const srsly_2 = require("../pda/srsly"); const rpc_1 = require("../utils/rpc"); /** * Fetch global config state from the SRSLY program * * @param rpcUrl - Optional RPC endpoint URL. If not provided, uses RPC from global config * @returns Config state with vault, fees, durations, etc. * @throws Error if config account not found or fetch fails * * @example * ```typescript * // Uses RPC URL from global config * const config = await fetchConfig(); * console.log('Vault:', config.data.slyvault); * console.log('Service fee:', config.data.serviceFeeBps); * * // Uses specific RPC URL * const config2 = await fetchConfig('https://api.devnet.solana.com'); * console.log('Admin:', config2.data.admin); * ``` */ async function fetchConfig(rpcUrl) { try { // Get RPC URL from config or use provided const resolvedRpcUrl = rpcUrl || (0, config_1.getRpcUrl)(); const rpc = (0, rpc_1.createRpc)(resolvedRpcUrl); // Derive config PDA const configAddress = await (0, srsly_2.deriveConfig)(); // Use Codama-generated fetch function const account = await (0, accounts_1.fetchConfigState)(rpc, configAddress); return account; } catch (error) { throw new Error(`Failed to fetch config state: ${error.message}`); } } /** * Fetch all config state accounts from the SRSLY program * * Uses getProgramAccounts with a discriminator filter to find all ConfigState accounts. * * @param rpcUrl - Optional RPC endpoint URL. If not provided, uses RPC from global config * @returns Array of config states with their addresses * * @example * ```typescript * const configs = await fetchAllConfigs(); * console.log(`Found ${configs.length} configs`); * configs.forEach(c => console.log(c.address, c.data.admin)); * ``` */ async function fetchAllConfigs(rpcUrl) { try { const resolvedRpcUrl = rpcUrl || (0, config_1.getRpcUrl)(); const rpc = (0, rpc_1.createRpc)(resolvedRpcUrl); const discriminatorBase64 = btoa(String.fromCharCode(...accounts_1.CONFIG_STATE_DISCRIMINATOR)); const response = await rpc .getProgramAccounts(srsly_1.SRSLY_PROGRAM_ADDRESS, { encoding: 'base64', filters: [ { memcmp: { offset: 0n, bytes: discriminatorBase64, encoding: 'base64', }, }, ], }) .send(); const base64Encoder = (0, kit_1.getBase64Encoder)(); const decoder = (0, accounts_1.getConfigStateDecoder)(); const accounts = Array.isArray(response) ? response : response.value; return accounts.map((account) => { const bytes = base64Encoder.encode(account.account.data[0]); const decoded = decoder.decode(bytes); return { data: decoded, address: account.pubkey }; }); } catch (error) { throw new Error(`Failed to fetch all config states: ${error.message}`); } } //# sourceMappingURL=config.js.map