import { Fee, FeeOption, FeeType, Fees } from './types' export function singleFee(feeType: FeeType, amount: Fee): Fees { return Object.values(FeeOption).reduce>((a, x) => ((a[x] = amount), a), { type: feeType, }) as Fees } export function standardFees(feeType: FeeType, amount: Fee): Fees { return { ...singleFee(feeType, amount), [FeeOption.Average]: amount.times(0.5), [FeeOption.Fastest]: amount.times(5.0), } } export function calcFees( feeRates: Record, calcFee: (feeRate: T, ...args: U) => Fee, ...args: U ): Fees { return (Object.entries(feeRates) as Array<[FeeOption, T]>) .map(([k, v]) => [k, calcFee(v, ...args)] as const) .reduce>((a, [k, v]) => ((a[k] = v), a), { type: FeeType.PerByte }) as Fees } export async function calcFeesAsync( feeRates: Record, calcFee: (feeRate: T, ...args: U) => Fee, ...args: U ): Promise { return ( await Promise.all( (Object.entries(feeRates) as Array<[FeeOption, T]>).map( async ([k, v]) => [k, await calcFee(v, ...args)] as const, ), ) ).reduce>((a, [k, v]) => ((a[k] = v), a), { type: FeeType.PerByte }) as Fees }