getFactoryConfig()
Fetch Levr factory configuration including governance and staking parameters.
Usage
typescript
import { getFactoryConfig } from 'levr-sdk'
import { createPublicClient, http } from 'viem'
import { baseSepolia } from 'viem/chains'
const publicClient = createPublicClient({
chain: baseSepolia,
transport: http(),
})
const config = await getFactoryConfig(publicClient, baseSepolia.id)
if (!config) {
console.log('Factory not deployed on this chain')
return
}
console.log('Protocol Fee:', config.protocolFeeBps / 100, '%')
console.log('Protocol Treasury:', config.protocolTreasury)
console.log('Proposal Window:', config.proposalWindowSeconds / 3600, 'hours')
console.log('Voting Window:', config.votingWindowSeconds / 3600, 'hours')
console.log('Quorum:', config.quorumBps / 100, '%')
console.log('Approval Threshold:', config.approvalBps / 100, '%')Parameters
publicClient(required): Viem public clientchainId(required): Chain ID to get factory for
Returns
typescript
{
protocolFeeBps: number // Protocol fee in basis points (e.g., 200 = 2%)
protocolTreasury: Address // Protocol treasury receiving fees
streamWindowSeconds: number // Reward streaming window in seconds
proposalWindowSeconds: number // Proposal submission window in seconds
votingWindowSeconds: number // Voting duration in seconds
maxActiveProposals: number // Max active proposals per cycle
quorumBps: number // Quorum threshold in basis points
approvalBps: number // Approval threshold in basis points
minSTokenBpsToSubmit: number // Min staked tokens to submit (bps)
maxProposalAmountBps: number // Max proposal amount (bps of treasury)
} | nullReturns null if factory not found on the chain.
Implementation Details
The function uses a single multicall to efficiently fetch all factory parameters:
typescript
await publicClient.multicall({
contracts: [
{ functionName: 'protocolFeeBps' },
{ functionName: 'protocolTreasury' },
{ functionName: 'streamWindowSeconds' },
{ functionName: 'proposalWindowSeconds' },
{ functionName: 'votingWindowSeconds' },
{ functionName: 'maxActiveProposals' },
{ functionName: 'quorumBps' },
{ functionName: 'approvalBps' },
{ functionName: 'minSTokenBpsToSubmit' },
{ functionName: 'maxProposalAmountBps' },
],
})Example: Check Governance Rules
typescript
const config = await getFactoryConfig(publicClient, chainId)
if (config) {
console.log('Governance Rules:')
console.log(`- Proposals open for ${config.proposalWindowSeconds / 3600}h`)
console.log(`- Voting lasts ${config.votingWindowSeconds / 3600}h`)
console.log(`- Need ${config.quorumBps / 100}% quorum`)
console.log(`- Need ${config.approvalBps / 100}% approval`)
console.log(`- Max ${config.maxActiveProposals} proposals per cycle`)
console.log(`- Proposals limited to ${config.maxProposalAmountBps / 100}% of treasury`)
}Notes
- Factory config is static and rarely changes
- All time values in seconds
- All percentages in basis points (divide by 100 for percentage)
- Configuration applies to all projects using this factory
- Used to validate proposals and governance operations
Related
- useFactory - React hook for factory config
- getProject - Get project data