@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
93 lines • 3.41 kB
JavaScript
/**
* @purpose Config account utilities for SRSLY
*
* Fetches global config state data from the SRSLY program.
*/
import { getBase64Encoder } from '@solana/kit';
import { fetchConfigState, CONFIG_STATE_DISCRIMINATOR, getConfigStateDecoder, } from '../generated/codama/accounts';
import { SRSLY_PROGRAM_ADDRESS } from '../generated/codama/programs/srsly';
import { getRpcUrl } from '../utils/config';
import { deriveConfig } from '../pda/srsly';
import { createRpc } from '../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);
* ```
*/
export async function fetchConfig(rpcUrl) {
try {
// Get RPC URL from config or use provided
const resolvedRpcUrl = rpcUrl || getRpcUrl();
const rpc = createRpc(resolvedRpcUrl);
// Derive config PDA
const configAddress = await deriveConfig();
// Use Codama-generated fetch function
const account = await 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));
* ```
*/
export async function fetchAllConfigs(rpcUrl) {
try {
const resolvedRpcUrl = rpcUrl || getRpcUrl();
const rpc = createRpc(resolvedRpcUrl);
const discriminatorBase64 = btoa(String.fromCharCode(...CONFIG_STATE_DISCRIMINATOR));
const response = await rpc
.getProgramAccounts(SRSLY_PROGRAM_ADDRESS, {
encoding: 'base64',
filters: [
{
memcmp: {
offset: 0n,
bytes: discriminatorBase64,
encoding: 'base64',
},
},
],
})
.send();
const base64Encoder = getBase64Encoder();
const decoder = 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