@chorus-one/ethereum
Version:
All-in-one toolkit for building staking dApps on Ethereum network
56 lines (45 loc) • 1.58 kB
text/typescript
import { PublicClient, toHex } from 'viem'
import { NetworkConfig } from './getNetworkConfig'
export type Queue = {
length: bigint
fee: bigint
}
// https://eips.ethereum.org/EIPS/eip-7002#fee-calculation
export const getWithdrawalQueue = async (ethPublicClient: PublicClient, config: NetworkConfig): Promise<Queue> => {
const length = await getWithdrawalQueueLength(ethPublicClient, config)
const fee = getRequiredFee(config.consolidationRequestFeeAddition, length, config.minConsolidationRequestFee)
return { length, fee }
}
export const getWithdrawalQueueLength = async (
ethPublicClient: PublicClient,
config: NetworkConfig
): Promise<bigint> => {
let queueLengthHex: string | undefined
try {
queueLengthHex = await ethPublicClient.getStorageAt({
address: config.withdrawalContractAddress!,
slot: toHex(config.excessWithdrawalRequestsStorageSlot)
})
if (!queueLengthHex) {
throw new Error('Unable to get withdrawal queue length')
}
if (queueLengthHex === config.excessInhibitor) {
throw new Error('Withdrawal queue is disabled')
}
} catch (error) {
console.error(error)
queueLengthHex = '0x0'
}
return BigInt(queueLengthHex)
}
const getRequiredFee = (factor: bigint, queueLength: bigint, denominator: bigint): bigint => {
let i = 1n
let output = 0n
let numeratorAccum = factor * denominator
while (numeratorAccum > 0n) {
output = output + numeratorAccum
numeratorAccum = (numeratorAccum * queueLength) / (i * denominator)
i = i + 1n
}
return output / denominator
}