@@ -9,11 +9,15 @@ import {
9
9
} from "../ckb/index.js" ;
10
10
import { Zero } from "../fixedPoint/index.js" ;
11
11
import { Hex , HexLike , hexFrom } from "../hex/index.js" ;
12
- import { Num , NumLike , numFrom , numMax } from "../num/index.js" ;
12
+ import { Num , NumLike , numFrom , numMax , numMin } from "../num/index.js" ;
13
13
import { reduceAsync , sleep } from "../utils/index.js" ;
14
14
import { ClientCache } from "./cache/index.js" ;
15
15
import { ClientCacheMemory } from "./cache/memory.js" ;
16
- import { ClientCollectableSearchKeyLike } from "./clientTypes.advanced.js" ;
16
+ import {
17
+ ClientCollectableSearchKeyLike ,
18
+ DEFAULT_MAX_FEE_RATE ,
19
+ DEFAULT_MIN_FEE_RATE ,
20
+ } from "./clientTypes.advanced.js" ;
17
21
import {
18
22
CellDepInfo ,
19
23
CellDepInfoLike ,
@@ -26,6 +30,7 @@ import {
26
30
ClientIndexerSearchKeyLike ,
27
31
ClientIndexerSearchKeyTransactionLike ,
28
32
ClientTransactionResponse ,
33
+ ErrorClientMaxFeeRateExceeded ,
29
34
ErrorClientWaitTransactionTimeout ,
30
35
KnownScript ,
31
36
OutputsValidator ,
@@ -50,8 +55,21 @@ export abstract class Client {
50
55
abstract getFeeRateStatistics (
51
56
blockRange ?: NumLike ,
52
57
) : Promise < { mean : Num ; median : Num } > ;
53
- async getFeeRate ( blockRange ?: NumLike ) : Promise < Num > {
54
- return numMax ( ( await this . getFeeRateStatistics ( blockRange ) ) . median , 1000 ) ;
58
+ async getFeeRate (
59
+ blockRange ?: NumLike ,
60
+ options ?: { maxFeeRate ?: NumLike } ,
61
+ ) : Promise < Num > {
62
+ const feeRate = numMax (
63
+ ( await this . getFeeRateStatistics ( blockRange ) ) . median ,
64
+ DEFAULT_MIN_FEE_RATE ,
65
+ ) ;
66
+
67
+ const maxFeeRate = numFrom ( options ?. maxFeeRate ?? DEFAULT_MAX_FEE_RATE ) ;
68
+ if ( maxFeeRate === Zero ) {
69
+ return feeRate ;
70
+ }
71
+
72
+ return numMin ( feeRate , maxFeeRate ) ;
55
73
}
56
74
57
75
abstract getTip ( ) : Promise < Num > ;
@@ -476,9 +494,16 @@ export abstract class Client {
476
494
async sendTransaction (
477
495
transaction : TransactionLike ,
478
496
validator ?: OutputsValidator ,
497
+ options ?: { maxFeeRate ?: NumLike } ,
479
498
) : Promise < Hex > {
480
499
const tx = Transaction . from ( transaction ) ;
481
500
501
+ const maxFeeRate = numFrom ( options ?. maxFeeRate ?? DEFAULT_MAX_FEE_RATE ) ;
502
+ const fee = await tx . feeRate ( this ) ;
503
+ if ( maxFeeRate > Zero && fee > maxFeeRate ) {
504
+ throw new ErrorClientMaxFeeRateExceeded ( maxFeeRate , fee ) ;
505
+ }
506
+
482
507
const txHash = await this . sendTransactionNoCache ( tx , validator ) ;
483
508
484
509
await this . cache . recordTransactions ( tx ) ;
0 commit comments