@@ -46,7 +46,7 @@ export type TxParamsType = Pick<
46
46
47
47
export type EstimatedTxParams = Pick <
48
48
TransactionCost ,
49
- 'maxFee ' | 'estimatedPredicates ' | 'addedSignatures ' | 'requiredQuantities '
49
+ 'estimatedPredicates ' | 'addedSignatures ' | 'requiredQuantities ' | 'updateMaxFee '
50
50
> ;
51
51
const MAX_FUNDING_ATTEMPTS = 2 ;
52
52
@@ -244,21 +244,21 @@ export class Account extends AbstractAccount {
244
244
}
245
245
246
246
/**
247
- * Adds resources to the transaction enough to fund it .
247
+ * Funds a transaction request by adding the necessary resources .
248
248
*
249
- * @param request - The transaction request .
250
- * @param requiredQuantities - The coin quantities required to execute the transaction .
251
- * @param fee - The estimated transaction fee .
252
- * @returns A promise that resolves when the resources are added to the transaction.
249
+ * @typeParam T - The type of the TransactionRequest .
250
+ * @param request - The transaction request to fund .
251
+ * @param params - The estimated transaction parameters .
252
+ * @returns The funded transaction request .
253
253
*/
254
254
async fund < T extends TransactionRequest > ( request : T , params : EstimatedTxParams ) : Promise < T > {
255
- const { addedSignatures, estimatedPredicates, maxFee : fee , requiredQuantities } = params ;
255
+ const { addedSignatures, estimatedPredicates, requiredQuantities , updateMaxFee } = params ;
256
256
257
+ const fee = request . maxFee ;
257
258
const baseAssetId = this . provider . getBaseAssetId ( ) ;
258
259
const requiredInBaseAsset =
259
260
requiredQuantities . find ( ( quantity ) => quantity . assetId === baseAssetId ) ?. amount || bn ( 0 ) ;
260
261
261
- const txRequest = request as T ;
262
262
const requiredQuantitiesWithFee = addAmountToCoinQuantities ( {
263
263
amount : bn ( fee ) ,
264
264
assetId : baseAssetId ,
@@ -301,17 +301,19 @@ export class Account extends AbstractAccount {
301
301
) ;
302
302
303
303
request . addResources ( resources ) ;
304
+ request . shiftPredicateData ( ) ;
305
+ request . updatePredicateGasUsed ( estimatedPredicates ) ;
304
306
305
- txRequest . shiftPredicateData ( ) ;
306
- txRequest . updatePredicateGasUsed ( estimatedPredicates ) ;
307
-
308
- const requestToReestimate = clone ( txRequest ) ;
307
+ const requestToReestimate = clone ( request ) ;
309
308
if ( addedSignatures ) {
310
309
Array . from ( { length : addedSignatures } ) . forEach ( ( ) =>
311
310
requestToReestimate . addEmptyWitness ( )
312
311
) ;
313
312
}
314
313
314
+ if ( ! updateMaxFee ) {
315
+ break ;
316
+ }
315
317
const { maxFee : newFee } = await this . provider . estimateTxGasAndFee ( {
316
318
transactionRequest : requestToReestimate ,
317
319
} ) ;
@@ -338,20 +340,25 @@ export class Account extends AbstractAccount {
338
340
fundingAttempts += 1 ;
339
341
}
340
342
341
- txRequest . shiftPredicateData ( ) ;
342
- txRequest . updatePredicateGasUsed ( estimatedPredicates ) ;
343
+ request . shiftPredicateData ( ) ;
344
+ request . updatePredicateGasUsed ( estimatedPredicates ) ;
343
345
344
- const requestToReestimate = clone ( txRequest ) ;
346
+ const requestToReestimate = clone ( request ) ;
345
347
if ( addedSignatures ) {
346
348
Array . from ( { length : addedSignatures } ) . forEach ( ( ) => requestToReestimate . addEmptyWitness ( ) ) ;
347
349
}
350
+
351
+ if ( ! updateMaxFee ) {
352
+ return request ;
353
+ }
354
+
348
355
const { maxFee } = await this . provider . estimateTxGasAndFee ( {
349
356
transactionRequest : requestToReestimate ,
350
357
} ) ;
351
358
352
- txRequest . maxFee = maxFee ;
359
+ request . maxFee = maxFee ;
353
360
354
- return txRequest ;
361
+ return request ;
355
362
}
356
363
357
364
/**
@@ -373,23 +380,21 @@ export class Account extends AbstractAccount {
373
380
/** Tx Params */
374
381
txParams : TxParamsType = { }
375
382
) : Promise < TransactionRequest > {
376
- const request = new ScriptTransactionRequest ( txParams ) ;
383
+ let request = new ScriptTransactionRequest ( txParams ) ;
377
384
const assetIdToTransfer = assetId ?? this . provider . getBaseAssetId ( ) ;
378
385
request . addCoinOutput ( Address . fromAddressOrString ( destination ) , amount , assetIdToTransfer ) ;
379
386
const txCost = await this . provider . getTransactionCost ( request , {
380
387
estimateTxDependencies : true ,
381
388
resourcesOwner : this ,
382
389
} ) ;
383
390
384
- this . validateGasLimitAndMaxFee ( {
391
+ request = this . validateGasLimitAndMaxFee ( {
392
+ transactionRequest : request ,
385
393
gasUsed : txCost . gasUsed ,
386
394
maxFee : txCost . maxFee ,
387
395
txParams,
388
396
} ) ;
389
397
390
- request . gasLimit = txCost . gasUsed ;
391
- request . maxFee = txCost . maxFee ;
392
-
393
398
await this . fund ( request , txCost ) ;
394
399
395
400
return request ;
@@ -459,7 +464,7 @@ export class Account extends AbstractAccount {
459
464
assetId : assetIdToTransfer ,
460
465
} ) ;
461
466
462
- const request = new ScriptTransactionRequest ( {
467
+ let request = new ScriptTransactionRequest ( {
463
468
...txParams ,
464
469
script,
465
470
scriptData,
@@ -472,15 +477,13 @@ export class Account extends AbstractAccount {
472
477
quantitiesToContract : [ { amount : bn ( amount ) , assetId : String ( assetIdToTransfer ) } ] ,
473
478
} ) ;
474
479
475
- this . validateGasLimitAndMaxFee ( {
480
+ request = this . validateGasLimitAndMaxFee ( {
481
+ transactionRequest : request ,
476
482
gasUsed : txCost . gasUsed ,
477
483
maxFee : txCost . maxFee ,
478
484
txParams,
479
485
} ) ;
480
486
481
- request . gasLimit = txCost . gasUsed ;
482
- request . maxFee = txCost . maxFee ;
483
-
484
487
await this . fund ( request , txCost ) ;
485
488
486
489
return this . sendTransaction ( request ) ;
@@ -519,20 +522,18 @@ export class Account extends AbstractAccount {
519
522
const params : ScriptTransactionRequestLike = { script, ...txParams } ;
520
523
521
524
const baseAssetId = this . provider . getBaseAssetId ( ) ;
522
- const request = new ScriptTransactionRequest ( params ) ;
525
+ let request = new ScriptTransactionRequest ( params ) ;
523
526
const quantitiesToContract = [ { amount : bn ( amount ) , assetId : baseAssetId } ] ;
524
527
525
528
const txCost = await this . provider . getTransactionCost ( request , { quantitiesToContract } ) ;
526
529
527
- this . validateGasLimitAndMaxFee ( {
530
+ request = this . validateGasLimitAndMaxFee ( {
531
+ transactionRequest : request ,
528
532
gasUsed : txCost . gasUsed ,
529
533
maxFee : txCost . maxFee ,
530
534
txParams,
531
535
} ) ;
532
536
533
- request . maxFee = txCost . maxFee ;
534
- request . gasLimit = txCost . gasUsed ;
535
-
536
537
await this . fund ( request , txCost ) ;
537
538
538
539
return this . sendTransaction ( request ) ;
@@ -604,26 +605,36 @@ export class Account extends AbstractAccount {
604
605
}
605
606
606
607
private validateGasLimitAndMaxFee ( {
607
- txParams : { gasLimit : setGasLimit , maxFee : setMaxFee } ,
608
608
gasUsed,
609
609
maxFee,
610
+ transactionRequest,
611
+ txParams : { gasLimit : setGasLimit , maxFee : setMaxFee } ,
610
612
} : {
611
613
gasUsed : BN ;
612
614
maxFee : BN ;
615
+ transactionRequest : ScriptTransactionRequest ;
613
616
txParams : Pick < TxParamsType , 'gasLimit' | 'maxFee' > ;
614
617
} ) {
615
- if ( isDefined ( setGasLimit ) && gasUsed . gt ( setGasLimit ) ) {
618
+ const request = transactionRequestify ( transactionRequest ) as ScriptTransactionRequest ;
619
+
620
+ if ( ! isDefined ( setGasLimit ) ) {
621
+ request . gasLimit = gasUsed ;
622
+ } else if ( gasUsed . gt ( setGasLimit ) ) {
616
623
throw new FuelError (
617
624
ErrorCode . GAS_LIMIT_TOO_LOW ,
618
625
`Gas limit '${ setGasLimit } ' is lower than the required: '${ gasUsed } '.`
619
626
) ;
620
627
}
621
628
622
- if ( isDefined ( setMaxFee ) && maxFee . gt ( setMaxFee ) ) {
629
+ if ( ! isDefined ( setMaxFee ) ) {
630
+ request . maxFee = maxFee ;
631
+ } else if ( maxFee . gt ( setMaxFee ) ) {
623
632
throw new FuelError (
624
633
ErrorCode . MAX_FEE_TOO_LOW ,
625
634
`Max fee '${ setMaxFee } ' is lower than the required: '${ maxFee } '.`
626
635
) ;
627
636
}
637
+
638
+ return request ;
628
639
}
629
640
}
0 commit comments