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