From c43d090e8f5c719c1bfbc552b19db43ef2e997df Mon Sep 17 00:00:00 2001 From: Danitello123 Date: Mon, 31 Aug 2026 11:17:44 +0100 Subject: [PATCH] fix: use create-specific resource fee fallback for create_stream insufficient-balance path --- src/soroban.ts | 8 ++++++++ src/streams.ts | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/soroban.ts b/src/soroban.ts index 9792d54..4f3bd06 100644 --- a/src/soroban.ts +++ b/src/soroban.ts @@ -512,6 +512,14 @@ export async function queryXlmBalance( */ export const DEFAULT_RESOURCE_FEE_ESTIMATE = 1_000_000n; +/** + * Larger fallback used for expensive operations that deploy or instantiate + * contracts (e.g. `create_stream`). This is a conservative default sized in + * stroops (3 XLM) to avoid under-estimating required balance in the + * insufficient-balance error path when the simulation carries no fee fields. + */ +export const CREATE_RESOURCE_FEE_ESTIMATE = 30_000_000n; + /** * Estimate the minimum resource fee required for a transaction simulation. * diff --git a/src/streams.ts b/src/streams.ts index 26c725c..55db40d 100644 --- a/src/streams.ts +++ b/src/streams.ts @@ -31,6 +31,7 @@ import { catchNetworkError, queryXlmBalance, estimateRequiredFee, + CREATE_RESOURCE_FEE_ESTIMATE, DEFAULT_RPC, NETWORK_PASSPHRASE, DEFAULT_CONFIRMATION_MAX_ATTEMPTS, @@ -258,7 +259,7 @@ export class StreamsModule { // query the actual XLM balance and estimate the required fee. if (err instanceof InsufficientBalanceError && err.currentBalance === 0n && err.requiredBalance === 0n) { const xlmBalance = await queryXlmBalance(this.rpcUrl, this.passphrase, senderAddr).catch(() => 0n); - const requiredFee = estimateRequiredFee(sim); + const requiredFee = estimateRequiredFee(sim, CREATE_RESOURCE_FEE_ESTIMATE); const required = depositStroops + requiredFee; throw new InsufficientBalanceError(xlmBalance, required, sim.error); }