diff --git a/src/core/payments/constants.ts b/src/core/payments/constants.ts index 6f044cc..924cb5b 100644 --- a/src/core/payments/constants.ts +++ b/src/core/payments/constants.ts @@ -51,3 +51,9 @@ export const BUFFER_DENOMINATOR = 10n */ export const STORAGE_SCALE_MAX = 10_000_000 export const STORAGE_SCALE_MAX_BI = BigInt(STORAGE_SCALE_MAX) + +/** PDP Leaf Size - the payment rate is based on `rawSize` bytes rounded up to the next multiple of 32. + * + * @see - https://github.com/FilOzone/synapse-sdk/issues/339#issue-3539254596 + */ +export const PDP_LEAF_SIZE = 32 diff --git a/src/core/payments/index.ts b/src/core/payments/index.ts index 2100abc..1e0354a 100644 --- a/src/core/payments/index.ts +++ b/src/core/payments/index.ts @@ -32,6 +32,7 @@ import { } from './constants.js' import { applyFloorPricing } from './floor-pricing.js' import type { PaymentStatus, ServiceApprovalStatus, StorageAllowances, StorageRunwaySummary } from './types.js' +import { padSizeToPDPLeaves } from './utils.js' // Re-export all constants export * from './constants.js' @@ -826,7 +827,8 @@ export function calculateDepositCapacity( * @returns Required allowances for the piece */ export function calculateRequiredAllowances(pieceSizeBytes: number, pricePerTiBPerEpoch: bigint): StorageAllowances { - const storageTiB = pieceSizeBytes / Number(SIZE_CONSTANTS.TiB) + const paddedSizeBytes = padSizeToPDPLeaves(pieceSizeBytes) + const storageTiB = paddedSizeBytes / Number(SIZE_CONSTANTS.TiB) return calculateStorageAllowances(storageTiB, pricePerTiBPerEpoch) } diff --git a/src/core/payments/utils.ts b/src/core/payments/utils.ts new file mode 100644 index 0000000..500a930 --- /dev/null +++ b/src/core/payments/utils.ts @@ -0,0 +1,11 @@ +import { PDP_LEAF_SIZE } from './constants.js' + +/** + * Pad raw size to the next multiple of 32 bytes + * + * @param rawSizeBytes - The actual size in bytes + * @returns Padded size (next multiple of 32) + */ +export function padSizeToPDPLeaves(rawSizeBytes: number): number { + return Math.ceil(rawSizeBytes / PDP_LEAF_SIZE) * PDP_LEAF_SIZE +}