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); }