@fuel-ts/account 0.0.0-rc-2034-20240411123358 → 0.0.0-rc-2021-20240411141803
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @fuel-ts/account might be problematic. Click here for more details.
- package/README.md +1 -1
- package/dist/account.d.ts +5 -4
- package/dist/account.d.ts.map +1 -1
- package/dist/configs.d.ts.map +1 -1
- package/dist/configs.global.js +1 -1
- package/dist/configs.global.js.map +1 -1
- package/dist/configs.js +1 -1
- package/dist/configs.js.map +1 -1
- package/dist/configs.mjs +1 -1
- package/dist/configs.mjs.map +1 -1
- package/dist/index.global.js +819 -568
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +805 -572
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +639 -407
- package/dist/index.mjs.map +1 -1
- package/dist/predicate/predicate.d.ts +10 -2
- package/dist/predicate/predicate.d.ts.map +1 -1
- package/dist/providers/__generated__/operations.d.ts +888 -322
- package/dist/providers/__generated__/operations.d.ts.map +1 -1
- package/dist/providers/coin-quantity.d.ts +1 -1
- package/dist/providers/coin-quantity.d.ts.map +1 -1
- package/dist/providers/coin.d.ts +4 -2
- package/dist/providers/coin.d.ts.map +1 -1
- package/dist/providers/fuel-graphql-subscriber.d.ts.map +1 -1
- package/dist/providers/message.d.ts +3 -1
- package/dist/providers/message.d.ts.map +1 -1
- package/dist/providers/provider.d.ts +37 -30
- package/dist/providers/provider.d.ts.map +1 -1
- package/dist/providers/transaction-request/create-transaction-request.d.ts.map +1 -1
- package/dist/providers/transaction-request/input.d.ts +2 -2
- package/dist/providers/transaction-request/input.d.ts.map +1 -1
- package/dist/providers/transaction-request/script-transaction-request.d.ts.map +1 -1
- package/dist/providers/transaction-request/transaction-request.d.ts +8 -25
- package/dist/providers/transaction-request/transaction-request.d.ts.map +1 -1
- package/dist/providers/transaction-request/utils.d.ts +3 -0
- package/dist/providers/transaction-request/utils.d.ts.map +1 -1
- package/dist/providers/transaction-response/transaction-response.d.ts.map +1 -1
- package/dist/providers/transaction-summary/assemble-transaction-summary.d.ts +2 -0
- package/dist/providers/transaction-summary/assemble-transaction-summary.d.ts.map +1 -1
- package/dist/providers/transaction-summary/calculate-transaction-fee.d.ts +3 -2
- package/dist/providers/transaction-summary/calculate-transaction-fee.d.ts.map +1 -1
- package/dist/providers/transaction-summary/get-transaction-summary.d.ts.map +1 -1
- package/dist/providers/utils/gas.d.ts +8 -2
- package/dist/providers/utils/gas.d.ts.map +1 -1
- package/dist/test-utils/launchNode.d.ts.map +1 -1
- package/dist/test-utils.global.js +1535 -1067
- package/dist/test-utils.global.js.map +1 -1
- package/dist/test-utils.js +780 -565
- package/dist/test-utils.js.map +1 -1
- package/dist/test-utils.mjs +631 -416
- package/dist/test-utils.mjs.map +1 -1
- package/dist/wallet/base-wallet-unlocked.d.ts.map +1 -1
- package/package.json +17 -17
package/dist/test-utils.mjs
CHANGED
@@ -27,8 +27,9 @@ import { Address as Address3 } from "@fuel-ts/address";
|
|
27
27
|
import { BaseAssetId as BaseAssetId3 } from "@fuel-ts/address/configs";
|
28
28
|
import { ErrorCode as ErrorCode15, FuelError as FuelError15 } from "@fuel-ts/errors";
|
29
29
|
import { AbstractAccount } from "@fuel-ts/interfaces";
|
30
|
-
import { bn as
|
30
|
+
import { bn as bn18 } from "@fuel-ts/math";
|
31
31
|
import { arrayify as arrayify14 } from "@fuel-ts/utils";
|
32
|
+
import { clone as clone4 } from "ramda";
|
32
33
|
|
33
34
|
// src/providers/coin-quantity.ts
|
34
35
|
import { BaseAssetId } from "@fuel-ts/address/configs";
|
@@ -37,24 +38,24 @@ import { hexlify } from "@fuel-ts/utils";
|
|
37
38
|
var coinQuantityfy = (coinQuantityLike) => {
|
38
39
|
let assetId;
|
39
40
|
let amount;
|
40
|
-
let
|
41
|
+
let max;
|
41
42
|
if (Array.isArray(coinQuantityLike)) {
|
42
43
|
amount = coinQuantityLike[0];
|
43
44
|
assetId = coinQuantityLike[1] ?? BaseAssetId;
|
44
|
-
|
45
|
+
max = coinQuantityLike[2] ?? void 0;
|
45
46
|
} else {
|
46
47
|
amount = coinQuantityLike.amount;
|
47
48
|
assetId = coinQuantityLike.assetId ?? BaseAssetId;
|
48
|
-
|
49
|
+
max = coinQuantityLike.max ?? void 0;
|
49
50
|
}
|
50
51
|
const bnAmount = bn(amount);
|
51
52
|
return {
|
52
53
|
assetId: hexlify(assetId),
|
53
54
|
amount: bnAmount.lt(1) ? bn(1) : bnAmount,
|
54
|
-
max:
|
55
|
+
max: max ? bn(max) : void 0
|
55
56
|
};
|
56
57
|
};
|
57
|
-
var
|
58
|
+
var addAmountToCoinQuantities = (params) => {
|
58
59
|
const { amount, assetId } = params;
|
59
60
|
const coinQuantities = [...params.coinQuantities];
|
60
61
|
const assetIdx = coinQuantities.findIndex((coinQuantity) => coinQuantity.assetId === assetId);
|
@@ -69,9 +70,9 @@ var addAmountToAsset = (params) => {
|
|
69
70
|
// src/providers/provider.ts
|
70
71
|
import { Address as Address2 } from "@fuel-ts/address";
|
71
72
|
import { ErrorCode as ErrorCode13, FuelError as FuelError13 } from "@fuel-ts/errors";
|
72
|
-
import { BN, bn as
|
73
|
+
import { BN, bn as bn16 } from "@fuel-ts/math";
|
73
74
|
import {
|
74
|
-
InputType as
|
75
|
+
InputType as InputType7,
|
75
76
|
TransactionType as TransactionType8,
|
76
77
|
InputMessageCoder,
|
77
78
|
TransactionCoder as TransactionCoder5
|
@@ -87,14 +88,10 @@ import { clone as clone3 } from "ramda";
|
|
87
88
|
import gql from "graphql-tag";
|
88
89
|
var ReceiptFragmentFragmentDoc = gql`
|
89
90
|
fragment receiptFragment on Receipt {
|
90
|
-
|
91
|
-
id
|
92
|
-
}
|
91
|
+
id
|
93
92
|
pc
|
94
93
|
is
|
95
|
-
to
|
96
|
-
id
|
97
|
-
}
|
94
|
+
to
|
98
95
|
toAddress
|
99
96
|
amount
|
100
97
|
assetId
|
@@ -132,10 +129,16 @@ var TransactionStatusFragmentFragmentDoc = gql`
|
|
132
129
|
id
|
133
130
|
}
|
134
131
|
time
|
132
|
+
receipts {
|
133
|
+
...receiptFragment
|
134
|
+
}
|
135
135
|
programState {
|
136
136
|
returnType
|
137
137
|
data
|
138
138
|
}
|
139
|
+
receipts {
|
140
|
+
...receiptFragment
|
141
|
+
}
|
139
142
|
}
|
140
143
|
... on FailureStatus {
|
141
144
|
block {
|
@@ -143,26 +146,24 @@ var TransactionStatusFragmentFragmentDoc = gql`
|
|
143
146
|
}
|
144
147
|
time
|
145
148
|
reason
|
149
|
+
receipts {
|
150
|
+
...receiptFragment
|
151
|
+
}
|
146
152
|
}
|
147
153
|
... on SqueezedOutStatus {
|
148
154
|
reason
|
149
155
|
}
|
150
156
|
}
|
151
|
-
`;
|
157
|
+
${ReceiptFragmentFragmentDoc}`;
|
152
158
|
var TransactionFragmentFragmentDoc = gql`
|
153
159
|
fragment transactionFragment on Transaction {
|
154
160
|
id
|
155
161
|
rawPayload
|
156
|
-
gasPrice
|
157
|
-
receipts {
|
158
|
-
...receiptFragment
|
159
|
-
}
|
160
162
|
status {
|
161
163
|
...transactionStatusFragment
|
162
164
|
}
|
163
165
|
}
|
164
|
-
${
|
165
|
-
${TransactionStatusFragmentFragmentDoc}`;
|
166
|
+
${TransactionStatusFragmentFragmentDoc}`;
|
166
167
|
var InputEstimatePredicatesFragmentFragmentDoc = gql`
|
167
168
|
fragment inputEstimatePredicatesFragment on Input {
|
168
169
|
... on InputCoin {
|
@@ -180,6 +181,46 @@ var TransactionEstimatePredicatesFragmentFragmentDoc = gql`
|
|
180
181
|
}
|
181
182
|
}
|
182
183
|
${InputEstimatePredicatesFragmentFragmentDoc}`;
|
184
|
+
var DryRunFailureStatusFragmentFragmentDoc = gql`
|
185
|
+
fragment dryRunFailureStatusFragment on DryRunFailureStatus {
|
186
|
+
reason
|
187
|
+
programState {
|
188
|
+
returnType
|
189
|
+
data
|
190
|
+
}
|
191
|
+
}
|
192
|
+
`;
|
193
|
+
var DryRunSuccessStatusFragmentFragmentDoc = gql`
|
194
|
+
fragment dryRunSuccessStatusFragment on DryRunSuccessStatus {
|
195
|
+
programState {
|
196
|
+
returnType
|
197
|
+
data
|
198
|
+
}
|
199
|
+
}
|
200
|
+
`;
|
201
|
+
var DryRunTransactionStatusFragmentFragmentDoc = gql`
|
202
|
+
fragment dryRunTransactionStatusFragment on DryRunTransactionStatus {
|
203
|
+
... on DryRunFailureStatus {
|
204
|
+
...dryRunFailureStatusFragment
|
205
|
+
}
|
206
|
+
... on DryRunSuccessStatus {
|
207
|
+
...dryRunSuccessStatusFragment
|
208
|
+
}
|
209
|
+
}
|
210
|
+
${DryRunFailureStatusFragmentFragmentDoc}
|
211
|
+
${DryRunSuccessStatusFragmentFragmentDoc}`;
|
212
|
+
var DryRunTransactionExecutionStatusFragmentFragmentDoc = gql`
|
213
|
+
fragment dryRunTransactionExecutionStatusFragment on DryRunTransactionExecutionStatus {
|
214
|
+
id
|
215
|
+
status {
|
216
|
+
...dryRunTransactionStatusFragment
|
217
|
+
}
|
218
|
+
receipts {
|
219
|
+
...receiptFragment
|
220
|
+
}
|
221
|
+
}
|
222
|
+
${DryRunTransactionStatusFragmentFragmentDoc}
|
223
|
+
${ReceiptFragmentFragmentDoc}`;
|
183
224
|
var CoinFragmentFragmentDoc = gql`
|
184
225
|
fragment coinFragment on Coin {
|
185
226
|
__typename
|
@@ -187,7 +228,6 @@ var CoinFragmentFragmentDoc = gql`
|
|
187
228
|
owner
|
188
229
|
amount
|
189
230
|
assetId
|
190
|
-
maturity
|
191
231
|
blockCreated
|
192
232
|
txCreatedIdx
|
193
233
|
}
|
@@ -232,7 +272,6 @@ var MessageProofFragmentFragmentDoc = gql`
|
|
232
272
|
prevRoot
|
233
273
|
time
|
234
274
|
applicationHash
|
235
|
-
messageReceiptRoot
|
236
275
|
messageReceiptCount
|
237
276
|
}
|
238
277
|
commitBlockHeader {
|
@@ -244,7 +283,6 @@ var MessageProofFragmentFragmentDoc = gql`
|
|
244
283
|
prevRoot
|
245
284
|
time
|
246
285
|
applicationHash
|
247
|
-
messageReceiptRoot
|
248
286
|
messageReceiptCount
|
249
287
|
}
|
250
288
|
sender
|
@@ -264,8 +302,8 @@ var BalanceFragmentFragmentDoc = gql`
|
|
264
302
|
var BlockFragmentFragmentDoc = gql`
|
265
303
|
fragment blockFragment on Block {
|
266
304
|
id
|
305
|
+
height
|
267
306
|
header {
|
268
|
-
height
|
269
307
|
time
|
270
308
|
}
|
271
309
|
transactions {
|
@@ -323,6 +361,11 @@ var DependentCostFragmentFragmentDoc = gql`
|
|
323
361
|
`;
|
324
362
|
var GasCostsFragmentFragmentDoc = gql`
|
325
363
|
fragment GasCostsFragment on GasCosts {
|
364
|
+
version {
|
365
|
+
... on Version {
|
366
|
+
value
|
367
|
+
}
|
368
|
+
}
|
326
369
|
add
|
327
370
|
addi
|
328
371
|
aloc
|
@@ -335,7 +378,6 @@ var GasCostsFragmentFragmentDoc = gql`
|
|
335
378
|
cb
|
336
379
|
cfei
|
337
380
|
cfsi
|
338
|
-
croo
|
339
381
|
div
|
340
382
|
divi
|
341
383
|
ecr1
|
@@ -418,6 +460,9 @@ var GasCostsFragmentFragmentDoc = gql`
|
|
418
460
|
ccp {
|
419
461
|
...DependentCostFragment
|
420
462
|
}
|
463
|
+
croo {
|
464
|
+
...DependentCostFragment
|
465
|
+
}
|
421
466
|
csiz {
|
422
467
|
...DependentCostFragment
|
423
468
|
}
|
@@ -477,6 +522,11 @@ var GasCostsFragmentFragmentDoc = gql`
|
|
477
522
|
${DependentCostFragmentFragmentDoc}`;
|
478
523
|
var ConsensusParametersFragmentFragmentDoc = gql`
|
479
524
|
fragment consensusParametersFragment on ConsensusParameters {
|
525
|
+
version {
|
526
|
+
... on Version {
|
527
|
+
value
|
528
|
+
}
|
529
|
+
}
|
480
530
|
txParams {
|
481
531
|
...TxParametersFragment
|
482
532
|
}
|
@@ -536,18 +586,9 @@ var NodeInfoFragmentFragmentDoc = gql`
|
|
536
586
|
fragment nodeInfoFragment on NodeInfo {
|
537
587
|
utxoValidation
|
538
588
|
vmBacktrace
|
539
|
-
minGasPrice
|
540
589
|
maxTx
|
541
590
|
maxDepth
|
542
591
|
nodeVersion
|
543
|
-
peers {
|
544
|
-
id
|
545
|
-
addresses
|
546
|
-
clientVersion
|
547
|
-
blockHeight
|
548
|
-
lastHeartbeatMs
|
549
|
-
appScore
|
550
|
-
}
|
551
592
|
}
|
552
593
|
`;
|
553
594
|
var GetVersionDocument = gql`
|
@@ -582,13 +623,9 @@ var GetTransactionWithReceiptsDocument = gql`
|
|
582
623
|
query getTransactionWithReceipts($transactionId: TransactionId!) {
|
583
624
|
transaction(id: $transactionId) {
|
584
625
|
...transactionFragment
|
585
|
-
receipts {
|
586
|
-
...receiptFragment
|
587
|
-
}
|
588
626
|
}
|
589
627
|
}
|
590
|
-
${TransactionFragmentFragmentDoc}
|
591
|
-
${ReceiptFragmentFragmentDoc}`;
|
628
|
+
${TransactionFragmentFragmentDoc}`;
|
592
629
|
var GetTransactionsDocument = gql`
|
593
630
|
query getTransactions($after: String, $before: String, $first: Int, $last: Int) {
|
594
631
|
transactions(after: $after, before: $before, first: $first, last: $last) {
|
@@ -716,6 +753,20 @@ var GetBalanceDocument = gql`
|
|
716
753
|
}
|
717
754
|
}
|
718
755
|
${BalanceFragmentFragmentDoc}`;
|
756
|
+
var GetLatestGasPriceDocument = gql`
|
757
|
+
query getLatestGasPrice {
|
758
|
+
latestGasPrice {
|
759
|
+
gasPrice
|
760
|
+
}
|
761
|
+
}
|
762
|
+
`;
|
763
|
+
var EstimateGasPriceDocument = gql`
|
764
|
+
query estimateGasPrice($blockHorizon: U32!) {
|
765
|
+
estimateGasPrice(blockHorizon: $blockHorizon) {
|
766
|
+
gasPrice
|
767
|
+
}
|
768
|
+
}
|
769
|
+
`;
|
719
770
|
var GetBalancesDocument = gql`
|
720
771
|
query getBalances($filter: BalanceFilterInput!, $after: String, $before: String, $first: Int, $last: Int) {
|
721
772
|
balances(
|
@@ -770,12 +821,12 @@ var GetMessageStatusDocument = gql`
|
|
770
821
|
}
|
771
822
|
`;
|
772
823
|
var DryRunDocument = gql`
|
773
|
-
mutation dryRun($
|
774
|
-
dryRun(
|
775
|
-
...
|
824
|
+
mutation dryRun($encodedTransactions: [HexString!]!, $utxoValidation: Boolean) {
|
825
|
+
dryRun(txs: $encodedTransactions, utxoValidation: $utxoValidation) {
|
826
|
+
...dryRunTransactionExecutionStatusFragment
|
776
827
|
}
|
777
828
|
}
|
778
|
-
${
|
829
|
+
${DryRunTransactionExecutionStatusFragmentFragmentDoc}`;
|
779
830
|
var SubmitDocument = gql`
|
780
831
|
mutation submit($encodedTransaction: HexString!) {
|
781
832
|
submit(tx: $encodedTransaction) {
|
@@ -858,6 +909,12 @@ function getSdk(requester) {
|
|
858
909
|
getBalance(variables, options) {
|
859
910
|
return requester(GetBalanceDocument, variables, options);
|
860
911
|
},
|
912
|
+
getLatestGasPrice(variables, options) {
|
913
|
+
return requester(GetLatestGasPriceDocument, variables, options);
|
914
|
+
},
|
915
|
+
estimateGasPrice(variables, options) {
|
916
|
+
return requester(EstimateGasPriceDocument, variables, options);
|
917
|
+
},
|
861
918
|
getBalances(variables, options) {
|
862
919
|
return requester(GetBalancesDocument, variables, options);
|
863
920
|
},
|
@@ -927,11 +984,14 @@ var _FuelGraphqlSubscriber = class {
|
|
927
984
|
let data;
|
928
985
|
let errors;
|
929
986
|
try {
|
930
|
-
|
987
|
+
const sanitizedText = text.replace(/\s/g, "");
|
988
|
+
({ data, errors } = JSON.parse(sanitizedText.replace(/^data:/, "")));
|
931
989
|
} catch (e) {
|
932
990
|
throw new FuelError(
|
933
991
|
ErrorCode.STREAM_PARSING_ERROR,
|
934
|
-
`Error while parsing stream data response: ${text}
|
992
|
+
`Error while parsing stream data response: ${text}
|
993
|
+
|
994
|
+
Thrown error: ${e}`
|
935
995
|
);
|
936
996
|
}
|
937
997
|
if (Array.isArray(errors)) {
|
@@ -1018,7 +1078,6 @@ var MemoryCache = class {
|
|
1018
1078
|
};
|
1019
1079
|
|
1020
1080
|
// src/providers/transaction-request/input.ts
|
1021
|
-
import { BYTES_32, UTXO_ID_LEN } from "@fuel-ts/abi-coder";
|
1022
1081
|
import { ZeroBytes32 } from "@fuel-ts/address/configs";
|
1023
1082
|
import { ErrorCode as ErrorCode3, FuelError as FuelError3 } from "@fuel-ts/errors";
|
1024
1083
|
import { bn as bn2, toNumber } from "@fuel-ts/math";
|
@@ -1032,8 +1091,8 @@ var inputify = (value) => {
|
|
1032
1091
|
const predicateData = arrayify(value.predicateData ?? "0x");
|
1033
1092
|
return {
|
1034
1093
|
type: InputType.Coin,
|
1035
|
-
txID: hexlify3(arrayify(value.id).slice(0,
|
1036
|
-
outputIndex: toNumber(arrayify(value.id).slice(
|
1094
|
+
txID: hexlify3(arrayify(value.id).slice(0, 32)),
|
1095
|
+
outputIndex: toNumber(arrayify(value.id).slice(32, 34)),
|
1037
1096
|
owner: hexlify3(value.owner),
|
1038
1097
|
amount: bn2(value.amount),
|
1039
1098
|
assetId: hexlify3(value.assetId),
|
@@ -1042,10 +1101,9 @@ var inputify = (value) => {
|
|
1042
1101
|
txIndex: toNumber(arrayify(value.txPointer).slice(8, 16))
|
1043
1102
|
},
|
1044
1103
|
witnessIndex: value.witnessIndex,
|
1045
|
-
maturity: value.maturity ?? 0,
|
1046
1104
|
predicateGasUsed: bn2(value.predicateGasUsed),
|
1047
|
-
predicateLength: predicate.length,
|
1048
|
-
predicateDataLength: predicateData.length,
|
1105
|
+
predicateLength: bn2(predicate.length),
|
1106
|
+
predicateDataLength: bn2(predicateData.length),
|
1049
1107
|
predicate: hexlify3(predicate),
|
1050
1108
|
predicateData: hexlify3(predicateData)
|
1051
1109
|
};
|
@@ -1076,8 +1134,8 @@ var inputify = (value) => {
|
|
1076
1134
|
nonce: hexlify3(value.nonce),
|
1077
1135
|
witnessIndex: value.witnessIndex,
|
1078
1136
|
predicateGasUsed: bn2(value.predicateGasUsed),
|
1079
|
-
predicateLength: predicate.length,
|
1080
|
-
predicateDataLength: predicateData.length,
|
1137
|
+
predicateLength: bn2(predicate.length),
|
1138
|
+
predicateDataLength: bn2(predicateData.length),
|
1081
1139
|
predicate: hexlify3(predicate),
|
1082
1140
|
predicateData: hexlify3(predicateData),
|
1083
1141
|
data: hexlify3(data),
|
@@ -1151,10 +1209,8 @@ var outputify = (value) => {
|
|
1151
1209
|
};
|
1152
1210
|
|
1153
1211
|
// src/providers/transaction-request/transaction-request.ts
|
1154
|
-
import { UTXO_ID_LEN as UTXO_ID_LEN2 } from "@fuel-ts/abi-coder";
|
1155
1212
|
import { Address, addressify } from "@fuel-ts/address";
|
1156
1213
|
import { BaseAssetId as BaseAssetId2, ZeroBytes32 as ZeroBytes324 } from "@fuel-ts/address/configs";
|
1157
|
-
import { randomBytes } from "@fuel-ts/crypto";
|
1158
1214
|
import { bn as bn7 } from "@fuel-ts/math";
|
1159
1215
|
import {
|
1160
1216
|
PolicyType,
|
@@ -1164,6 +1220,7 @@ import {
|
|
1164
1220
|
TransactionType
|
1165
1221
|
} from "@fuel-ts/transactions";
|
1166
1222
|
import { concat, hexlify as hexlify7 } from "@fuel-ts/utils";
|
1223
|
+
import { randomBytes } from "ethers";
|
1167
1224
|
|
1168
1225
|
// src/providers/resource.ts
|
1169
1226
|
var isCoin = (resource) => "id" in resource;
|
@@ -1204,8 +1261,8 @@ function assembleReceiptByType(receipt) {
|
|
1204
1261
|
case "CALL" /* Call */: {
|
1205
1262
|
const callReceipt = {
|
1206
1263
|
type: ReceiptType.Call,
|
1207
|
-
from: hexOrZero(receipt.
|
1208
|
-
to: hexOrZero(receipt?.to
|
1264
|
+
from: hexOrZero(receipt.id || receipt.contractId),
|
1265
|
+
to: hexOrZero(receipt?.to),
|
1209
1266
|
amount: bn4(receipt.amount),
|
1210
1267
|
assetId: hexOrZero(receipt.assetId),
|
1211
1268
|
gas: bn4(receipt.gas),
|
@@ -1219,7 +1276,7 @@ function assembleReceiptByType(receipt) {
|
|
1219
1276
|
case "RETURN" /* Return */: {
|
1220
1277
|
const returnReceipt = {
|
1221
1278
|
type: ReceiptType.Return,
|
1222
|
-
id: hexOrZero(receipt.
|
1279
|
+
id: hexOrZero(receipt.id || receipt.contractId),
|
1223
1280
|
val: bn4(receipt.val),
|
1224
1281
|
pc: bn4(receipt.pc),
|
1225
1282
|
is: bn4(receipt.is)
|
@@ -1229,7 +1286,7 @@ function assembleReceiptByType(receipt) {
|
|
1229
1286
|
case "RETURN_DATA" /* ReturnData */: {
|
1230
1287
|
const returnDataReceipt = {
|
1231
1288
|
type: ReceiptType.ReturnData,
|
1232
|
-
id: hexOrZero(receipt.
|
1289
|
+
id: hexOrZero(receipt.id || receipt.contractId),
|
1233
1290
|
ptr: bn4(receipt.ptr),
|
1234
1291
|
len: bn4(receipt.len),
|
1235
1292
|
digest: hexOrZero(receipt.digest),
|
@@ -1241,7 +1298,7 @@ function assembleReceiptByType(receipt) {
|
|
1241
1298
|
case "PANIC" /* Panic */: {
|
1242
1299
|
const panicReceipt = {
|
1243
1300
|
type: ReceiptType.Panic,
|
1244
|
-
id: hexOrZero(receipt.
|
1301
|
+
id: hexOrZero(receipt.id),
|
1245
1302
|
reason: bn4(receipt.reason),
|
1246
1303
|
pc: bn4(receipt.pc),
|
1247
1304
|
is: bn4(receipt.is),
|
@@ -1252,7 +1309,7 @@ function assembleReceiptByType(receipt) {
|
|
1252
1309
|
case "REVERT" /* Revert */: {
|
1253
1310
|
const revertReceipt = {
|
1254
1311
|
type: ReceiptType.Revert,
|
1255
|
-
id: hexOrZero(receipt.
|
1312
|
+
id: hexOrZero(receipt.id || receipt.contractId),
|
1256
1313
|
val: bn4(receipt.ra),
|
1257
1314
|
pc: bn4(receipt.pc),
|
1258
1315
|
is: bn4(receipt.is)
|
@@ -1262,7 +1319,7 @@ function assembleReceiptByType(receipt) {
|
|
1262
1319
|
case "LOG" /* Log */: {
|
1263
1320
|
const logReceipt = {
|
1264
1321
|
type: ReceiptType.Log,
|
1265
|
-
id: hexOrZero(receipt.
|
1322
|
+
id: hexOrZero(receipt.id || receipt.contractId),
|
1266
1323
|
val0: bn4(receipt.ra),
|
1267
1324
|
val1: bn4(receipt.rb),
|
1268
1325
|
val2: bn4(receipt.rc),
|
@@ -1275,7 +1332,7 @@ function assembleReceiptByType(receipt) {
|
|
1275
1332
|
case "LOG_DATA" /* LogData */: {
|
1276
1333
|
const logDataReceipt = {
|
1277
1334
|
type: ReceiptType.LogData,
|
1278
|
-
id: hexOrZero(receipt.
|
1335
|
+
id: hexOrZero(receipt.id || receipt.contractId),
|
1279
1336
|
val0: bn4(receipt.ra),
|
1280
1337
|
val1: bn4(receipt.rb),
|
1281
1338
|
ptr: bn4(receipt.ptr),
|
@@ -1289,8 +1346,8 @@ function assembleReceiptByType(receipt) {
|
|
1289
1346
|
case "TRANSFER" /* Transfer */: {
|
1290
1347
|
const transferReceipt = {
|
1291
1348
|
type: ReceiptType.Transfer,
|
1292
|
-
from: hexOrZero(receipt.
|
1293
|
-
to: hexOrZero(receipt.toAddress || receipt?.to
|
1349
|
+
from: hexOrZero(receipt.id || receipt.contractId),
|
1350
|
+
to: hexOrZero(receipt.toAddress || receipt?.to),
|
1294
1351
|
amount: bn4(receipt.amount),
|
1295
1352
|
assetId: hexOrZero(receipt.assetId),
|
1296
1353
|
pc: bn4(receipt.pc),
|
@@ -1301,8 +1358,8 @@ function assembleReceiptByType(receipt) {
|
|
1301
1358
|
case "TRANSFER_OUT" /* TransferOut */: {
|
1302
1359
|
const transferOutReceipt = {
|
1303
1360
|
type: ReceiptType.TransferOut,
|
1304
|
-
from: hexOrZero(receipt.
|
1305
|
-
to: hexOrZero(receipt.toAddress || receipt.to
|
1361
|
+
from: hexOrZero(receipt.id || receipt.contractId),
|
1362
|
+
to: hexOrZero(receipt.toAddress || receipt.to),
|
1306
1363
|
amount: bn4(receipt.amount),
|
1307
1364
|
assetId: hexOrZero(receipt.assetId),
|
1308
1365
|
pc: bn4(receipt.pc),
|
@@ -1345,7 +1402,7 @@ function assembleReceiptByType(receipt) {
|
|
1345
1402
|
return receiptMessageOut;
|
1346
1403
|
}
|
1347
1404
|
case "MINT" /* Mint */: {
|
1348
|
-
const contractId = hexOrZero(receipt.
|
1405
|
+
const contractId = hexOrZero(receipt.id || receipt.contractId);
|
1349
1406
|
const subId = hexOrZero(receipt.subId);
|
1350
1407
|
const assetId = ReceiptMintCoder.getAssetId(contractId, subId);
|
1351
1408
|
const mintReceipt = {
|
@@ -1360,7 +1417,7 @@ function assembleReceiptByType(receipt) {
|
|
1360
1417
|
return mintReceipt;
|
1361
1418
|
}
|
1362
1419
|
case "BURN" /* Burn */: {
|
1363
|
-
const contractId = hexOrZero(receipt.
|
1420
|
+
const contractId = hexOrZero(receipt.id || receipt.contractId);
|
1364
1421
|
const subId = hexOrZero(receipt.subId);
|
1365
1422
|
const assetId = ReceiptBurnCoder.getAssetId(contractId, subId);
|
1366
1423
|
const burnReceipt = {
|
@@ -1386,7 +1443,6 @@ import { ErrorCode as ErrorCode6, FuelError as FuelError6 } from "@fuel-ts/error
|
|
1386
1443
|
import { bn as bn5 } from "@fuel-ts/math";
|
1387
1444
|
import { ReceiptType as ReceiptType2 } from "@fuel-ts/transactions";
|
1388
1445
|
import { arrayify as arrayify3 } from "@fuel-ts/utils";
|
1389
|
-
var calculatePriceWithFactor = (gas, gasPrice, priceFactor) => bn5(Math.ceil(gas.mul(gasPrice).toNumber() / priceFactor.toNumber()));
|
1390
1446
|
var getGasUsedFromReceipts = (receipts) => {
|
1391
1447
|
const scriptResult = receipts.filter(
|
1392
1448
|
(receipt) => receipt.type === ReceiptType2.ScriptResult
|
@@ -1407,18 +1463,28 @@ function resolveGasDependentCosts(byteSize, gasDependentCost) {
|
|
1407
1463
|
}
|
1408
1464
|
function gasUsedByInputs(inputs, txBytesSize, gasCosts) {
|
1409
1465
|
const witnessCache = [];
|
1410
|
-
const
|
1466
|
+
const chargeableInputs = inputs.filter((input) => {
|
1467
|
+
const isCoinOrMessage = "owner" in input || "sender" in input;
|
1468
|
+
if (isCoinOrMessage) {
|
1469
|
+
if ("predicate" in input && input.predicate && input.predicate !== "0x") {
|
1470
|
+
return true;
|
1471
|
+
}
|
1472
|
+
if (!witnessCache.includes(input.witnessIndex)) {
|
1473
|
+
witnessCache.push(input.witnessIndex);
|
1474
|
+
return true;
|
1475
|
+
}
|
1476
|
+
}
|
1477
|
+
return false;
|
1478
|
+
});
|
1479
|
+
const vmInitializationCost = resolveGasDependentCosts(txBytesSize, gasCosts.vmInitialization);
|
1480
|
+
const totalGas = chargeableInputs.reduce((total, input) => {
|
1411
1481
|
if ("predicate" in input && input.predicate && input.predicate !== "0x") {
|
1412
1482
|
return total.add(
|
1413
|
-
|
1483
|
+
vmInitializationCost.add(resolveGasDependentCosts(arrayify3(input.predicate).length, gasCosts.contractRoot)).add(bn5(input.predicateGasUsed))
|
1414
1484
|
);
|
1415
1485
|
}
|
1416
|
-
|
1417
|
-
|
1418
|
-
return total.add(gasCosts.ecr1);
|
1419
|
-
}
|
1420
|
-
return total;
|
1421
|
-
}, bn5());
|
1486
|
+
return total.add(gasCosts.ecr1);
|
1487
|
+
}, bn5(0));
|
1422
1488
|
return totalGas;
|
1423
1489
|
}
|
1424
1490
|
function getMinGas(params) {
|
@@ -1430,12 +1496,20 @@ function getMinGas(params) {
|
|
1430
1496
|
return minGas;
|
1431
1497
|
}
|
1432
1498
|
function getMaxGas(params) {
|
1433
|
-
const {
|
1499
|
+
const {
|
1500
|
+
gasPerByte,
|
1501
|
+
witnessesLength,
|
1502
|
+
witnessLimit,
|
1503
|
+
minGas,
|
1504
|
+
gasLimit = bn5(0),
|
1505
|
+
maxGasPerTx
|
1506
|
+
} = params;
|
1434
1507
|
let remainingAllowedWitnessGas = bn5(0);
|
1435
1508
|
if (witnessLimit?.gt(0) && witnessLimit.gte(witnessesLength)) {
|
1436
1509
|
remainingAllowedWitnessGas = bn5(witnessLimit).sub(witnessesLength).mul(gasPerByte);
|
1437
1510
|
}
|
1438
|
-
|
1511
|
+
const maxGas = remainingAllowedWitnessGas.add(minGas).add(gasLimit);
|
1512
|
+
return maxGas.gte(maxGasPerTx) ? maxGasPerTx : maxGas;
|
1439
1513
|
}
|
1440
1514
|
function calculateMetadataGasForTxCreate({
|
1441
1515
|
gasCosts,
|
@@ -1457,6 +1531,10 @@ function calculateMetadataGasForTxScript({
|
|
1457
1531
|
}) {
|
1458
1532
|
return resolveGasDependentCosts(txBytesSize, gasCosts.s256);
|
1459
1533
|
}
|
1534
|
+
var calculateGasFee = (params) => {
|
1535
|
+
const { gas, gasPrice, priceFactor, tip } = params;
|
1536
|
+
return gas.mul(gasPrice).div(priceFactor).add(tip);
|
1537
|
+
};
|
1460
1538
|
|
1461
1539
|
// src/providers/utils/json.ts
|
1462
1540
|
import { hexlify as hexlify5 } from "@fuel-ts/utils";
|
@@ -1601,7 +1679,7 @@ var witnessify = (value) => {
|
|
1601
1679
|
// src/providers/transaction-request/transaction-request.ts
|
1602
1680
|
var BaseTransactionRequest = class {
|
1603
1681
|
/** Gas price for transaction */
|
1604
|
-
|
1682
|
+
tip;
|
1605
1683
|
/** Block until which tx cannot be included */
|
1606
1684
|
maturity;
|
1607
1685
|
/** The maximum fee payable by this transaction using BASE_ASSET. */
|
@@ -1620,7 +1698,7 @@ var BaseTransactionRequest = class {
|
|
1620
1698
|
* @param baseTransactionRequest - Optional object containing properties to initialize the transaction request.
|
1621
1699
|
*/
|
1622
1700
|
constructor({
|
1623
|
-
|
1701
|
+
tip,
|
1624
1702
|
maturity,
|
1625
1703
|
maxFee,
|
1626
1704
|
witnessLimit,
|
@@ -1628,7 +1706,7 @@ var BaseTransactionRequest = class {
|
|
1628
1706
|
outputs,
|
1629
1707
|
witnesses
|
1630
1708
|
} = {}) {
|
1631
|
-
this.
|
1709
|
+
this.tip = bn7(tip);
|
1632
1710
|
this.maturity = maturity ?? 0;
|
1633
1711
|
this.witnessLimit = witnessLimit ? bn7(witnessLimit) : void 0;
|
1634
1712
|
this.maxFee = maxFee ? bn7(maxFee) : void 0;
|
@@ -1639,9 +1717,9 @@ var BaseTransactionRequest = class {
|
|
1639
1717
|
static getPolicyMeta(req) {
|
1640
1718
|
let policyTypes = 0;
|
1641
1719
|
const policies = [];
|
1642
|
-
if (req.
|
1643
|
-
policyTypes += PolicyType.
|
1644
|
-
policies.push({ data: req.
|
1720
|
+
if (req.tip) {
|
1721
|
+
policyTypes += PolicyType.Tip;
|
1722
|
+
policies.push({ data: req.tip, type: PolicyType.Tip });
|
1645
1723
|
}
|
1646
1724
|
if (req.witnessLimit) {
|
1647
1725
|
policyTypes += PolicyType.WitnessLimit;
|
@@ -1828,10 +1906,10 @@ var BaseTransactionRequest = class {
|
|
1828
1906
|
* @param predicate - Predicate bytes.
|
1829
1907
|
* @param predicateData - Predicate data bytes.
|
1830
1908
|
*/
|
1831
|
-
addCoinInput(coin
|
1909
|
+
addCoinInput(coin) {
|
1832
1910
|
const { assetId, owner, amount } = coin;
|
1833
1911
|
let witnessIndex;
|
1834
|
-
if (predicate) {
|
1912
|
+
if (coin.predicate) {
|
1835
1913
|
witnessIndex = 0;
|
1836
1914
|
} else {
|
1837
1915
|
witnessIndex = this.getCoinInputWitnessIndexByOwner(owner);
|
@@ -1846,8 +1924,7 @@ var BaseTransactionRequest = class {
|
|
1846
1924
|
amount,
|
1847
1925
|
assetId,
|
1848
1926
|
txPointer: "0x00000000000000000000000000000000",
|
1849
|
-
witnessIndex
|
1850
|
-
predicate: predicate?.bytes
|
1927
|
+
witnessIndex
|
1851
1928
|
};
|
1852
1929
|
this.pushInput(input);
|
1853
1930
|
this.addChangeOutput(owner, assetId);
|
@@ -1860,11 +1937,11 @@ var BaseTransactionRequest = class {
|
|
1860
1937
|
* @param predicate - Predicate bytes.
|
1861
1938
|
* @param predicateData - Predicate data bytes.
|
1862
1939
|
*/
|
1863
|
-
addMessageInput(message
|
1940
|
+
addMessageInput(message) {
|
1864
1941
|
const { recipient, sender, amount } = message;
|
1865
1942
|
const assetId = BaseAssetId2;
|
1866
1943
|
let witnessIndex;
|
1867
|
-
if (predicate) {
|
1944
|
+
if (message.predicate) {
|
1868
1945
|
witnessIndex = 0;
|
1869
1946
|
} else {
|
1870
1947
|
witnessIndex = this.getCoinInputWitnessIndexByOwner(recipient);
|
@@ -1878,8 +1955,7 @@ var BaseTransactionRequest = class {
|
|
1878
1955
|
sender: sender.toB256(),
|
1879
1956
|
recipient: recipient.toB256(),
|
1880
1957
|
amount,
|
1881
|
-
witnessIndex
|
1882
|
-
predicate: predicate?.bytes
|
1958
|
+
witnessIndex
|
1883
1959
|
};
|
1884
1960
|
this.pushInput(input);
|
1885
1961
|
this.addChangeOutput(recipient, assetId);
|
@@ -1910,32 +1986,6 @@ var BaseTransactionRequest = class {
|
|
1910
1986
|
resources.forEach((resource) => this.addResource(resource));
|
1911
1987
|
return this;
|
1912
1988
|
}
|
1913
|
-
/**
|
1914
|
-
* Adds multiple resources to the transaction by adding coin/message inputs and change
|
1915
|
-
* outputs from the related assetIds.
|
1916
|
-
*
|
1917
|
-
* @param resources - The resources to add.
|
1918
|
-
* @returns This transaction.
|
1919
|
-
*/
|
1920
|
-
addPredicateResource(resource, predicate) {
|
1921
|
-
if (isCoin(resource)) {
|
1922
|
-
this.addCoinInput(resource, predicate);
|
1923
|
-
} else {
|
1924
|
-
this.addMessageInput(resource, predicate);
|
1925
|
-
}
|
1926
|
-
return this;
|
1927
|
-
}
|
1928
|
-
/**
|
1929
|
-
* Adds multiple predicate coin/message inputs to the transaction and change outputs
|
1930
|
-
* from the related assetIds.
|
1931
|
-
*
|
1932
|
-
* @param resources - The resources to add.
|
1933
|
-
* @returns This transaction.
|
1934
|
-
*/
|
1935
|
-
addPredicateResources(resources, predicate) {
|
1936
|
-
resources.forEach((resource) => this.addPredicateResource(resource, predicate));
|
1937
|
-
return this;
|
1938
|
-
}
|
1939
1989
|
/**
|
1940
1990
|
* Adds a coin output to the transaction.
|
1941
1991
|
*
|
@@ -2015,7 +2065,7 @@ var BaseTransactionRequest = class {
|
|
2015
2065
|
}
|
2016
2066
|
calculateMaxGas(chainInfo, minGas) {
|
2017
2067
|
const { consensusParameters } = chainInfo;
|
2018
|
-
const { gasPerByte } = consensusParameters;
|
2068
|
+
const { gasPerByte, maxGasPerTx } = consensusParameters;
|
2019
2069
|
const witnessesLength = this.toTransaction().witnesses.reduce(
|
2020
2070
|
(acc, wit) => acc + wit.dataLength,
|
2021
2071
|
0
|
@@ -2024,7 +2074,8 @@ var BaseTransactionRequest = class {
|
|
2024
2074
|
gasPerByte,
|
2025
2075
|
minGas,
|
2026
2076
|
witnessesLength,
|
2027
|
-
witnessLimit: this.witnessLimit
|
2077
|
+
witnessLimit: this.witnessLimit,
|
2078
|
+
maxGasPerTx
|
2028
2079
|
});
|
2029
2080
|
}
|
2030
2081
|
/**
|
@@ -2042,17 +2093,20 @@ var BaseTransactionRequest = class {
|
|
2042
2093
|
});
|
2043
2094
|
const updateAssetInput = (assetId, quantity) => {
|
2044
2095
|
const assetInput = findAssetInput(assetId);
|
2096
|
+
let usedQuantity = quantity;
|
2097
|
+
if (assetId === BaseAssetId2) {
|
2098
|
+
usedQuantity = bn7("1000000000000000000");
|
2099
|
+
}
|
2045
2100
|
if (assetInput && "assetId" in assetInput) {
|
2046
|
-
assetInput.id = hexlify7(randomBytes(
|
2047
|
-
assetInput.amount =
|
2101
|
+
assetInput.id = hexlify7(randomBytes(34));
|
2102
|
+
assetInput.amount = usedQuantity;
|
2048
2103
|
} else {
|
2049
2104
|
this.addResources([
|
2050
2105
|
{
|
2051
|
-
id: hexlify7(randomBytes(
|
2052
|
-
amount:
|
2106
|
+
id: hexlify7(randomBytes(34)),
|
2107
|
+
amount: usedQuantity,
|
2053
2108
|
assetId,
|
2054
2109
|
owner: resourcesOwner || Address.fromRandom(),
|
2055
|
-
maturity: 0,
|
2056
2110
|
blockCreated: bn7(1),
|
2057
2111
|
txCreatedIdx: bn7(1)
|
2058
2112
|
}
|
@@ -2084,7 +2138,7 @@ var BaseTransactionRequest = class {
|
|
2084
2138
|
toJSON() {
|
2085
2139
|
return normalizeJSON(this);
|
2086
2140
|
}
|
2087
|
-
|
2141
|
+
updatePredicateGasUsed(inputs) {
|
2088
2142
|
this.inputs.forEach((i) => {
|
2089
2143
|
let correspondingInput;
|
2090
2144
|
switch (i.type) {
|
@@ -2106,6 +2160,15 @@ var BaseTransactionRequest = class {
|
|
2106
2160
|
}
|
2107
2161
|
});
|
2108
2162
|
}
|
2163
|
+
shiftPredicateData() {
|
2164
|
+
this.inputs.forEach((input) => {
|
2165
|
+
if ("predicateData" in input && "paddPredicateData" in input && typeof input.paddPredicateData === "function") {
|
2166
|
+
input.predicateData = input.paddPredicateData(
|
2167
|
+
BaseTransactionRequest.getPolicyMeta(this).policies.length
|
2168
|
+
);
|
2169
|
+
}
|
2170
|
+
});
|
2171
|
+
}
|
2109
2172
|
};
|
2110
2173
|
|
2111
2174
|
// src/providers/transaction-request/create-transaction-request.ts
|
@@ -2252,9 +2315,8 @@ var CreateTransactionRequest = class extends BaseTransactionRequest {
|
|
2252
2315
|
return {
|
2253
2316
|
type: TransactionType3.Create,
|
2254
2317
|
...baseTransaction,
|
2255
|
-
bytecodeLength: baseTransaction.witnesses[bytecodeWitnessIndex].dataLength / 4,
|
2256
2318
|
bytecodeWitnessIndex,
|
2257
|
-
storageSlotsCount: storageSlots.length,
|
2319
|
+
storageSlotsCount: bn9(storageSlots.length),
|
2258
2320
|
salt: this.salt ? hexlify9(this.salt) : ZeroBytes326,
|
2259
2321
|
storageSlots
|
2260
2322
|
};
|
@@ -2377,8 +2439,8 @@ var ScriptTransactionRequest = class extends BaseTransactionRequest {
|
|
2377
2439
|
type: TransactionType4.Script,
|
2378
2440
|
scriptGasLimit: this.gasLimit,
|
2379
2441
|
...super.getBaseTransaction(),
|
2380
|
-
scriptLength: script.length,
|
2381
|
-
scriptDataLength: scriptData.length,
|
2442
|
+
scriptLength: bn10(script.length),
|
2443
|
+
scriptDataLength: bn10(scriptData.length),
|
2382
2444
|
receiptsRoot: ZeroBytes327,
|
2383
2445
|
script: hexlify10(script),
|
2384
2446
|
scriptData: hexlify10(scriptData)
|
@@ -2442,7 +2504,7 @@ var ScriptTransactionRequest = class extends BaseTransactionRequest {
|
|
2442
2504
|
}
|
2443
2505
|
calculateMaxGas(chainInfo, minGas) {
|
2444
2506
|
const { consensusParameters } = chainInfo;
|
2445
|
-
const { gasPerByte } = consensusParameters;
|
2507
|
+
const { gasPerByte, maxGasPerTx } = consensusParameters;
|
2446
2508
|
const witnessesLength = this.toTransaction().witnesses.reduce(
|
2447
2509
|
(acc, wit) => acc + wit.dataLength,
|
2448
2510
|
0
|
@@ -2452,7 +2514,8 @@ var ScriptTransactionRequest = class extends BaseTransactionRequest {
|
|
2452
2514
|
minGas,
|
2453
2515
|
witnessesLength,
|
2454
2516
|
witnessLimit: this.witnessLimit,
|
2455
|
-
gasLimit: this.gasLimit
|
2517
|
+
gasLimit: this.gasLimit,
|
2518
|
+
maxGasPerTx
|
2456
2519
|
});
|
2457
2520
|
}
|
2458
2521
|
/**
|
@@ -2509,7 +2572,7 @@ var ScriptTransactionRequest = class extends BaseTransactionRequest {
|
|
2509
2572
|
|
2510
2573
|
// src/providers/transaction-request/utils.ts
|
2511
2574
|
import { ErrorCode as ErrorCode8, FuelError as FuelError8 } from "@fuel-ts/errors";
|
2512
|
-
import { TransactionType as TransactionType5 } from "@fuel-ts/transactions";
|
2575
|
+
import { TransactionType as TransactionType5, InputType as InputType5 } from "@fuel-ts/transactions";
|
2513
2576
|
var transactionRequestify = (obj) => {
|
2514
2577
|
if (obj instanceof ScriptTransactionRequest || obj instanceof CreateTransactionRequest) {
|
2515
2578
|
return obj;
|
@@ -2527,14 +2590,31 @@ var transactionRequestify = (obj) => {
|
|
2527
2590
|
}
|
2528
2591
|
}
|
2529
2592
|
};
|
2593
|
+
var cacheTxInputsFromOwner = (inputs, owner) => inputs.reduce(
|
2594
|
+
(acc, input) => {
|
2595
|
+
if (input.type === InputType5.Coin && input.owner === owner) {
|
2596
|
+
acc.utxos.push(input.id);
|
2597
|
+
}
|
2598
|
+
if (input.type === InputType5.Message && input.recipient === owner) {
|
2599
|
+
acc.messages.push(input.nonce);
|
2600
|
+
}
|
2601
|
+
return acc;
|
2602
|
+
},
|
2603
|
+
{
|
2604
|
+
utxos: [],
|
2605
|
+
messages: []
|
2606
|
+
}
|
2607
|
+
);
|
2530
2608
|
|
2531
2609
|
// src/providers/transaction-response/transaction-response.ts
|
2532
2610
|
import { ErrorCode as ErrorCode12, FuelError as FuelError12 } from "@fuel-ts/errors";
|
2533
|
-
import { bn as
|
2611
|
+
import { bn as bn15 } from "@fuel-ts/math";
|
2534
2612
|
import { TransactionCoder as TransactionCoder4 } from "@fuel-ts/transactions";
|
2535
2613
|
import { arrayify as arrayify10 } from "@fuel-ts/utils";
|
2536
2614
|
|
2537
2615
|
// src/providers/transaction-summary/assemble-transaction-summary.ts
|
2616
|
+
import { bn as bn14 } from "@fuel-ts/math";
|
2617
|
+
import { PolicyType as PolicyType3 } from "@fuel-ts/transactions";
|
2538
2618
|
import { DateTime, hexlify as hexlify11 } from "@fuel-ts/utils";
|
2539
2619
|
|
2540
2620
|
// src/providers/transaction-summary/calculate-transaction-fee.ts
|
@@ -2543,9 +2623,10 @@ import { PolicyType as PolicyType2, TransactionCoder as TransactionCoder3, Trans
|
|
2543
2623
|
import { arrayify as arrayify9 } from "@fuel-ts/utils";
|
2544
2624
|
var calculateTransactionFee = (params) => {
|
2545
2625
|
const {
|
2546
|
-
|
2626
|
+
gasPrice,
|
2547
2627
|
rawPayload,
|
2548
|
-
|
2628
|
+
tip,
|
2629
|
+
consensusParameters: { gasCosts, feeParams, maxGasPerTx }
|
2549
2630
|
} = params;
|
2550
2631
|
const gasPerByte = bn11(feeParams.gasPerByte);
|
2551
2632
|
const gasPriceFactor = bn11(feeParams.gasPriceFactor);
|
@@ -2555,8 +2636,7 @@ var calculateTransactionFee = (params) => {
|
|
2555
2636
|
return {
|
2556
2637
|
fee: bn11(0),
|
2557
2638
|
minFee: bn11(0),
|
2558
|
-
maxFee: bn11(0)
|
2559
|
-
feeFromGasUsed: bn11(0)
|
2639
|
+
maxFee: bn11(0)
|
2560
2640
|
};
|
2561
2641
|
}
|
2562
2642
|
const { type, witnesses, inputs, policies } = transaction;
|
@@ -2588,7 +2668,6 @@ var calculateTransactionFee = (params) => {
|
|
2588
2668
|
metadataGas,
|
2589
2669
|
txBytesSize: transactionBytes.length
|
2590
2670
|
});
|
2591
|
-
const gasPrice = bn11(policies.find((policy) => policy.type === PolicyType2.GasPrice)?.data);
|
2592
2671
|
const witnessLimit = policies.find((policy) => policy.type === PolicyType2.WitnessLimit)?.data;
|
2593
2672
|
const witnessesLength = witnesses.reduce((acc, wit) => acc + wit.dataLength, 0);
|
2594
2673
|
const maxGas = getMaxGas({
|
@@ -2596,17 +2675,25 @@ var calculateTransactionFee = (params) => {
|
|
2596
2675
|
minGas,
|
2597
2676
|
witnessesLength,
|
2598
2677
|
gasLimit,
|
2599
|
-
witnessLimit
|
2678
|
+
witnessLimit,
|
2679
|
+
maxGasPerTx
|
2680
|
+
});
|
2681
|
+
const minFee = calculateGasFee({
|
2682
|
+
gasPrice,
|
2683
|
+
gas: minGas,
|
2684
|
+
priceFactor: gasPriceFactor,
|
2685
|
+
tip
|
2686
|
+
});
|
2687
|
+
const maxFee = calculateGasFee({
|
2688
|
+
gasPrice,
|
2689
|
+
gas: maxGas,
|
2690
|
+
priceFactor: gasPriceFactor,
|
2691
|
+
tip
|
2600
2692
|
});
|
2601
|
-
const feeFromGasUsed = calculatePriceWithFactor(gasUsed, gasPrice, gasPriceFactor);
|
2602
|
-
const minFee = calculatePriceWithFactor(minGas, gasPrice, gasPriceFactor);
|
2603
|
-
const maxFee = calculatePriceWithFactor(maxGas, gasPrice, gasPriceFactor);
|
2604
|
-
const fee = minFee.add(feeFromGasUsed);
|
2605
2693
|
return {
|
2606
|
-
fee,
|
2607
2694
|
minFee,
|
2608
2695
|
maxFee,
|
2609
|
-
|
2696
|
+
fee: maxFee
|
2610
2697
|
};
|
2611
2698
|
};
|
2612
2699
|
|
@@ -2662,7 +2749,7 @@ var getFunctionCall = ({ abi, receipt, rawPayload, maxInputs }) => {
|
|
2662
2749
|
|
2663
2750
|
// src/providers/transaction-summary/input.ts
|
2664
2751
|
import { ErrorCode as ErrorCode9, FuelError as FuelError9 } from "@fuel-ts/errors";
|
2665
|
-
import { InputType as
|
2752
|
+
import { InputType as InputType6 } from "@fuel-ts/transactions";
|
2666
2753
|
function getInputsByTypes(inputs, types) {
|
2667
2754
|
return inputs.filter((i) => types.includes(i.type));
|
2668
2755
|
}
|
@@ -2670,16 +2757,16 @@ function getInputsByType(inputs, type) {
|
|
2670
2757
|
return inputs.filter((i) => i.type === type);
|
2671
2758
|
}
|
2672
2759
|
function getInputsCoin(inputs) {
|
2673
|
-
return getInputsByType(inputs,
|
2760
|
+
return getInputsByType(inputs, InputType6.Coin);
|
2674
2761
|
}
|
2675
2762
|
function getInputsMessage(inputs) {
|
2676
|
-
return getInputsByType(inputs,
|
2763
|
+
return getInputsByType(inputs, InputType6.Message);
|
2677
2764
|
}
|
2678
2765
|
function getInputsCoinAndMessage(inputs) {
|
2679
|
-
return getInputsByTypes(inputs, [
|
2766
|
+
return getInputsByTypes(inputs, [InputType6.Coin, InputType6.Message]);
|
2680
2767
|
}
|
2681
2768
|
function getInputsContract(inputs) {
|
2682
|
-
return getInputsByType(inputs,
|
2769
|
+
return getInputsByType(inputs, InputType6.Contract);
|
2683
2770
|
}
|
2684
2771
|
function getInputFromAssetId(inputs, assetId) {
|
2685
2772
|
const coinInputs = getInputsCoin(inputs);
|
@@ -2698,7 +2785,7 @@ function getInputContractFromIndex(inputs, inputIndex) {
|
|
2698
2785
|
if (!contractInput) {
|
2699
2786
|
return void 0;
|
2700
2787
|
}
|
2701
|
-
if (contractInput.type !==
|
2788
|
+
if (contractInput.type !== InputType6.Contract) {
|
2702
2789
|
throw new FuelError9(
|
2703
2790
|
ErrorCode9.INVALID_TRANSACTION_INPUT,
|
2704
2791
|
`Contract input should be of type 'contract'.`
|
@@ -2707,10 +2794,10 @@ function getInputContractFromIndex(inputs, inputIndex) {
|
|
2707
2794
|
return contractInput;
|
2708
2795
|
}
|
2709
2796
|
function getInputAccountAddress(input) {
|
2710
|
-
if (input.type ===
|
2797
|
+
if (input.type === InputType6.Coin) {
|
2711
2798
|
return input.owner.toString();
|
2712
2799
|
}
|
2713
|
-
if (input.type ===
|
2800
|
+
if (input.type === InputType6.Message) {
|
2714
2801
|
return input.recipient.toString();
|
2715
2802
|
}
|
2716
2803
|
return "";
|
@@ -3173,7 +3260,9 @@ function assembleTransactionSummary(params) {
|
|
3173
3260
|
gqlTransactionStatus,
|
3174
3261
|
abiMap = {},
|
3175
3262
|
maxInputs,
|
3176
|
-
gasCosts
|
3263
|
+
gasCosts,
|
3264
|
+
maxGasPerTx,
|
3265
|
+
gasPrice
|
3177
3266
|
} = params;
|
3178
3267
|
const gasUsed = getGasUsedFromReceipts(receipts);
|
3179
3268
|
const rawPayload = hexlify11(transactionBytes);
|
@@ -3187,11 +3276,14 @@ function assembleTransactionSummary(params) {
|
|
3187
3276
|
maxInputs
|
3188
3277
|
});
|
3189
3278
|
const typeName = getTransactionTypeName(transaction.type);
|
3279
|
+
const tip = bn14(transaction.policies?.find((policy) => policy.type === PolicyType3.Tip)?.data);
|
3190
3280
|
const { fee } = calculateTransactionFee({
|
3191
|
-
|
3281
|
+
gasPrice,
|
3192
3282
|
rawPayload,
|
3283
|
+
tip,
|
3193
3284
|
consensusParameters: {
|
3194
3285
|
gasCosts,
|
3286
|
+
maxGasPerTx,
|
3195
3287
|
feeParams: {
|
3196
3288
|
gasPerByte,
|
3197
3289
|
gasPriceFactor
|
@@ -3251,7 +3343,7 @@ var TransactionResponse = class {
|
|
3251
3343
|
/** Current provider */
|
3252
3344
|
provider;
|
3253
3345
|
/** Gas used on the transaction */
|
3254
|
-
gasUsed =
|
3346
|
+
gasUsed = bn15(0);
|
3255
3347
|
/** The graphql Transaction with receipts object. */
|
3256
3348
|
gqlTransaction;
|
3257
3349
|
abis;
|
@@ -3329,8 +3421,13 @@ var TransactionResponse = class {
|
|
3329
3421
|
const decodedTransaction = this.decodeTransaction(
|
3330
3422
|
transaction
|
3331
3423
|
);
|
3332
|
-
|
3333
|
-
|
3424
|
+
let txReceipts = [];
|
3425
|
+
if (transaction?.status && "receipts" in transaction.status) {
|
3426
|
+
txReceipts = transaction.status.receipts;
|
3427
|
+
}
|
3428
|
+
const receipts = txReceipts.map(processGqlReceipt) || [];
|
3429
|
+
const { gasPerByte, gasPriceFactor, gasCosts, maxGasPerTx } = this.provider.getGasConfig();
|
3430
|
+
const gasPrice = await this.provider.getLatestGasPrice();
|
3334
3431
|
const maxInputs = this.provider.getChain().consensusParameters.maxInputs;
|
3335
3432
|
const transactionSummary = assembleTransactionSummary({
|
3336
3433
|
id: this.id,
|
@@ -3342,7 +3439,9 @@ var TransactionResponse = class {
|
|
3342
3439
|
gasPriceFactor,
|
3343
3440
|
abiMap: contractsAbiMap,
|
3344
3441
|
maxInputs,
|
3345
|
-
gasCosts
|
3442
|
+
gasCosts,
|
3443
|
+
maxGasPerTx,
|
3444
|
+
gasPrice
|
3346
3445
|
});
|
3347
3446
|
return transactionSummary;
|
3348
3447
|
}
|
@@ -3469,29 +3568,29 @@ var processGqlChain = (chain) => {
|
|
3469
3568
|
const { contractParams, feeParams, predicateParams, scriptParams, txParams, gasCosts } = consensusParameters;
|
3470
3569
|
return {
|
3471
3570
|
name,
|
3472
|
-
baseChainHeight:
|
3571
|
+
baseChainHeight: bn16(daHeight),
|
3473
3572
|
consensusParameters: {
|
3474
|
-
contractMaxSize:
|
3475
|
-
maxInputs:
|
3476
|
-
maxOutputs:
|
3477
|
-
maxWitnesses:
|
3478
|
-
maxGasPerTx:
|
3479
|
-
maxScriptLength:
|
3480
|
-
maxScriptDataLength:
|
3481
|
-
maxStorageSlots:
|
3482
|
-
maxPredicateLength:
|
3483
|
-
maxPredicateDataLength:
|
3484
|
-
maxGasPerPredicate:
|
3485
|
-
gasPriceFactor:
|
3486
|
-
gasPerByte:
|
3487
|
-
maxMessageDataLength:
|
3488
|
-
chainId:
|
3573
|
+
contractMaxSize: bn16(contractParams.contractMaxSize),
|
3574
|
+
maxInputs: bn16(txParams.maxInputs),
|
3575
|
+
maxOutputs: bn16(txParams.maxOutputs),
|
3576
|
+
maxWitnesses: bn16(txParams.maxWitnesses),
|
3577
|
+
maxGasPerTx: bn16(txParams.maxGasPerTx),
|
3578
|
+
maxScriptLength: bn16(scriptParams.maxScriptLength),
|
3579
|
+
maxScriptDataLength: bn16(scriptParams.maxScriptDataLength),
|
3580
|
+
maxStorageSlots: bn16(contractParams.maxStorageSlots),
|
3581
|
+
maxPredicateLength: bn16(predicateParams.maxPredicateLength),
|
3582
|
+
maxPredicateDataLength: bn16(predicateParams.maxPredicateDataLength),
|
3583
|
+
maxGasPerPredicate: bn16(predicateParams.maxGasPerPredicate),
|
3584
|
+
gasPriceFactor: bn16(feeParams.gasPriceFactor),
|
3585
|
+
gasPerByte: bn16(feeParams.gasPerByte),
|
3586
|
+
maxMessageDataLength: bn16(predicateParams.maxMessageDataLength),
|
3587
|
+
chainId: bn16(consensusParameters.chainId),
|
3489
3588
|
gasCosts
|
3490
3589
|
},
|
3491
3590
|
gasCosts,
|
3492
3591
|
latestBlock: {
|
3493
3592
|
id: latestBlock.id,
|
3494
|
-
height:
|
3593
|
+
height: bn16(latestBlock.height),
|
3495
3594
|
time: latestBlock.header.time,
|
3496
3595
|
transactions: latestBlock.transactions.map((i) => ({
|
3497
3596
|
id: i.id
|
@@ -3585,10 +3684,8 @@ var _Provider = class {
|
|
3585
3684
|
* Returns some helpful parameters related to gas fees.
|
3586
3685
|
*/
|
3587
3686
|
getGasConfig() {
|
3588
|
-
const { minGasPrice } = this.getNode();
|
3589
3687
|
const { maxGasPerTx, maxGasPerPredicate, gasPriceFactor, gasPerByte, gasCosts } = this.getChain().consensusParameters;
|
3590
3688
|
return {
|
3591
|
-
minGasPrice,
|
3592
3689
|
maxGasPerTx,
|
3593
3690
|
maxGasPerPredicate,
|
3594
3691
|
gasPriceFactor,
|
@@ -3686,7 +3783,7 @@ var _Provider = class {
|
|
3686
3783
|
*/
|
3687
3784
|
async getBlockNumber() {
|
3688
3785
|
const { chain } = await this.operations.getChain();
|
3689
|
-
return
|
3786
|
+
return bn16(chain.latestBlock.height, 10);
|
3690
3787
|
}
|
3691
3788
|
/**
|
3692
3789
|
* Returns the chain information.
|
@@ -3696,13 +3793,11 @@ var _Provider = class {
|
|
3696
3793
|
async fetchNode() {
|
3697
3794
|
const { nodeInfo } = await this.operations.getNodeInfo();
|
3698
3795
|
const processedNodeInfo = {
|
3699
|
-
maxDepth:
|
3700
|
-
maxTx:
|
3701
|
-
minGasPrice: bn15(nodeInfo.minGasPrice),
|
3796
|
+
maxDepth: bn16(nodeInfo.maxDepth),
|
3797
|
+
maxTx: bn16(nodeInfo.maxTx),
|
3702
3798
|
nodeVersion: nodeInfo.nodeVersion,
|
3703
3799
|
utxoValidation: nodeInfo.utxoValidation,
|
3704
|
-
vmBacktrace: nodeInfo.vmBacktrace
|
3705
|
-
peers: nodeInfo.peers
|
3800
|
+
vmBacktrace: nodeInfo.vmBacktrace
|
3706
3801
|
};
|
3707
3802
|
_Provider.nodeInfoCache[this.url] = processedNodeInfo;
|
3708
3803
|
return processedNodeInfo;
|
@@ -3788,14 +3883,13 @@ var _Provider = class {
|
|
3788
3883
|
return this.estimateTxDependencies(transactionRequest);
|
3789
3884
|
}
|
3790
3885
|
const encodedTransaction = hexlify12(transactionRequest.toTransactionBytes());
|
3791
|
-
const { dryRun:
|
3792
|
-
encodedTransaction,
|
3886
|
+
const { dryRun: dryRunStatuses } = await this.operations.dryRun({
|
3887
|
+
encodedTransactions: encodedTransaction,
|
3793
3888
|
utxoValidation: utxoValidation || false
|
3794
3889
|
});
|
3795
|
-
const receipts =
|
3796
|
-
|
3797
|
-
|
3798
|
-
};
|
3890
|
+
const [{ receipts: rawReceipts, status }] = dryRunStatuses;
|
3891
|
+
const receipts = rawReceipts.map(processGqlReceipt);
|
3892
|
+
return { receipts, dryrunStatus: status };
|
3799
3893
|
}
|
3800
3894
|
/**
|
3801
3895
|
* Verifies whether enough gas is available to complete transaction.
|
@@ -3821,7 +3915,7 @@ var _Provider = class {
|
|
3821
3915
|
} = response;
|
3822
3916
|
if (inputs) {
|
3823
3917
|
inputs.forEach((input, index) => {
|
3824
|
-
if ("predicateGasUsed" in input &&
|
3918
|
+
if ("predicateGasUsed" in input && bn16(input.predicateGasUsed).gt(0)) {
|
3825
3919
|
transactionRequest.inputs[index].predicateGasUsed = input.predicateGasUsed;
|
3826
3920
|
}
|
3827
3921
|
});
|
@@ -3834,9 +3928,6 @@ var _Provider = class {
|
|
3834
3928
|
* If there are missing variable outputs,
|
3835
3929
|
* `addVariableOutputs` is called on the transaction.
|
3836
3930
|
*
|
3837
|
-
* @privateRemarks
|
3838
|
-
* TODO: Investigate support for missing contract IDs
|
3839
|
-
* TODO: Add support for missing output messages
|
3840
3931
|
*
|
3841
3932
|
* @param transactionRequest - The transaction request object.
|
3842
3933
|
* @returns A promise.
|
@@ -3849,16 +3940,19 @@ var _Provider = class {
|
|
3849
3940
|
missingContractIds: []
|
3850
3941
|
};
|
3851
3942
|
}
|
3852
|
-
await this.estimatePredicates(transactionRequest);
|
3853
3943
|
let receipts = [];
|
3854
3944
|
const missingContractIds = [];
|
3855
3945
|
let outputVariables = 0;
|
3946
|
+
let dryrunStatus;
|
3856
3947
|
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
3857
|
-
const {
|
3858
|
-
|
3948
|
+
const {
|
3949
|
+
dryRun: [{ receipts: rawReceipts, status }]
|
3950
|
+
} = await this.operations.dryRun({
|
3951
|
+
encodedTransactions: [hexlify12(transactionRequest.toTransactionBytes())],
|
3859
3952
|
utxoValidation: false
|
3860
3953
|
});
|
3861
|
-
receipts =
|
3954
|
+
receipts = rawReceipts.map(processGqlReceipt);
|
3955
|
+
dryrunStatus = status;
|
3862
3956
|
const { missingOutputVariables, missingOutputContractIds } = getReceiptsWithMissingData(receipts);
|
3863
3957
|
const hasMissingOutputs = missingOutputVariables.length !== 0 || missingOutputContractIds.length !== 0;
|
3864
3958
|
if (hasMissingOutputs) {
|
@@ -3868,6 +3962,11 @@ var _Provider = class {
|
|
3868
3962
|
transactionRequest.addContractInputAndOutput(Address2.fromString(contractId));
|
3869
3963
|
missingContractIds.push(contractId);
|
3870
3964
|
});
|
3965
|
+
const { maxFee } = await this.estimateTxGasAndFee({
|
3966
|
+
transactionRequest,
|
3967
|
+
optimizeGas: false
|
3968
|
+
});
|
3969
|
+
transactionRequest.maxFee = maxFee;
|
3871
3970
|
} else {
|
3872
3971
|
break;
|
3873
3972
|
}
|
@@ -3875,37 +3974,133 @@ var _Provider = class {
|
|
3875
3974
|
return {
|
3876
3975
|
receipts,
|
3877
3976
|
outputVariables,
|
3878
|
-
missingContractIds
|
3977
|
+
missingContractIds,
|
3978
|
+
dryrunStatus
|
3879
3979
|
};
|
3880
3980
|
}
|
3881
3981
|
/**
|
3882
|
-
*
|
3883
|
-
*
|
3884
|
-
*
|
3982
|
+
* Dry runs multiple transactions and checks for missing dependencies in batches.
|
3983
|
+
*
|
3984
|
+
* Transactions are dry run in batches. After each dry run, transactions requiring
|
3985
|
+
* further modifications are identified. The method iteratively updates these transactions
|
3986
|
+
* and performs subsequent dry runs until all dependencies for each transaction are satisfied.
|
3987
|
+
*
|
3988
|
+
* @param transactionRequests - Array of transaction request objects.
|
3989
|
+
* @returns A promise that resolves to an array of results for each transaction.
|
3885
3990
|
*/
|
3886
|
-
|
3887
|
-
const
|
3888
|
-
|
3991
|
+
async estimateMultipleTxDependencies(transactionRequests) {
|
3992
|
+
const results = transactionRequests.map(() => ({
|
3993
|
+
receipts: [],
|
3994
|
+
outputVariables: 0,
|
3995
|
+
missingContractIds: [],
|
3996
|
+
dryrunStatus: void 0
|
3997
|
+
}));
|
3998
|
+
const allRequests = clone3(transactionRequests);
|
3999
|
+
const serializedTransactionsMap = /* @__PURE__ */ new Map();
|
4000
|
+
allRequests.forEach((req, index) => {
|
4001
|
+
if (req.type === TransactionType8.Script) {
|
4002
|
+
serializedTransactionsMap.set(index, hexlify12(req.toTransactionBytes()));
|
4003
|
+
}
|
4004
|
+
});
|
4005
|
+
let transactionsToProcess = Array.from(serializedTransactionsMap.keys());
|
4006
|
+
let attempt = 0;
|
4007
|
+
while (transactionsToProcess.length > 0 && attempt < MAX_RETRIES) {
|
4008
|
+
const encodedTransactions = transactionsToProcess.map(
|
4009
|
+
(index) => serializedTransactionsMap.get(index)
|
4010
|
+
);
|
4011
|
+
const dryRunResults = await this.operations.dryRun({
|
4012
|
+
encodedTransactions,
|
4013
|
+
utxoValidation: false
|
4014
|
+
});
|
4015
|
+
const nextRoundTransactions = [];
|
4016
|
+
for (let i = 0; i < dryRunResults.dryRun.length; i++) {
|
4017
|
+
const currentResultIndex = transactionsToProcess[i];
|
4018
|
+
const { receipts: rawReceipts, status } = dryRunResults.dryRun[i];
|
4019
|
+
results[currentResultIndex].receipts = rawReceipts.map(processGqlReceipt);
|
4020
|
+
results[currentResultIndex].dryrunStatus = status;
|
4021
|
+
const { missingOutputVariables, missingOutputContractIds } = getReceiptsWithMissingData(
|
4022
|
+
results[currentResultIndex].receipts
|
4023
|
+
);
|
4024
|
+
const hasMissingOutputs = missingOutputVariables.length > 0 || missingOutputContractIds.length > 0;
|
4025
|
+
const requestToProcess = allRequests[currentResultIndex];
|
4026
|
+
if (hasMissingOutputs && requestToProcess?.type === TransactionType8.Script) {
|
4027
|
+
results[currentResultIndex].outputVariables += missingOutputVariables.length;
|
4028
|
+
requestToProcess.addVariableOutputs(missingOutputVariables.length);
|
4029
|
+
missingOutputContractIds.forEach(({ contractId }) => {
|
4030
|
+
requestToProcess.addContractInputAndOutput(Address2.fromString(contractId));
|
4031
|
+
results[currentResultIndex].missingContractIds.push(contractId);
|
4032
|
+
});
|
4033
|
+
const { maxFee } = await this.estimateTxGasAndFee({
|
4034
|
+
transactionRequest: requestToProcess,
|
4035
|
+
optimizeGas: false
|
4036
|
+
});
|
4037
|
+
requestToProcess.maxFee = maxFee;
|
4038
|
+
serializedTransactionsMap.set(
|
4039
|
+
currentResultIndex,
|
4040
|
+
hexlify12(requestToProcess.toTransactionBytes())
|
4041
|
+
);
|
4042
|
+
nextRoundTransactions.push(currentResultIndex);
|
4043
|
+
allRequests[currentResultIndex] = requestToProcess;
|
4044
|
+
}
|
4045
|
+
}
|
4046
|
+
transactionsToProcess = nextRoundTransactions;
|
4047
|
+
attempt += 1;
|
4048
|
+
}
|
4049
|
+
return results;
|
4050
|
+
}
|
4051
|
+
async dryRunMultipleTransactions(transactionRequests, { utxoValidation, estimateTxDependencies = true } = {}) {
|
4052
|
+
if (estimateTxDependencies) {
|
4053
|
+
return this.estimateMultipleTxDependencies(transactionRequests);
|
4054
|
+
}
|
4055
|
+
const encodedTransactions = transactionRequests.map((tx) => hexlify12(tx.toTransactionBytes()));
|
4056
|
+
const { dryRun: dryRunStatuses } = await this.operations.dryRun({
|
4057
|
+
encodedTransactions,
|
4058
|
+
utxoValidation: utxoValidation || false
|
4059
|
+
});
|
4060
|
+
const results = dryRunStatuses.map(({ receipts: rawReceipts, status }) => {
|
4061
|
+
const receipts = rawReceipts.map(processGqlReceipt);
|
4062
|
+
return { receipts, dryrunStatus: status };
|
4063
|
+
});
|
4064
|
+
return results;
|
4065
|
+
}
|
4066
|
+
async estimateTxGasAndFee(params) {
|
4067
|
+
const { transactionRequest, optimizeGas = true } = params;
|
4068
|
+
let { gasPrice } = params;
|
3889
4069
|
const chainInfo = this.getChain();
|
3890
|
-
const
|
3891
|
-
transactionRequest.gasPrice = gasPrice;
|
4070
|
+
const { gasPriceFactor } = this.getGasConfig();
|
3892
4071
|
const minGas = transactionRequest.calculateMinGas(chainInfo);
|
3893
|
-
|
4072
|
+
if (!gasPrice) {
|
4073
|
+
gasPrice = await this.estimateGasPrice(10);
|
4074
|
+
}
|
4075
|
+
const minFee = calculateGasFee({
|
4076
|
+
gasPrice: bn16(gasPrice),
|
4077
|
+
gas: minGas,
|
4078
|
+
priceFactor: gasPriceFactor,
|
4079
|
+
tip: transactionRequest.tip
|
4080
|
+
}).add(1);
|
4081
|
+
let gasLimit = bn16(0);
|
3894
4082
|
if (transactionRequest.type === TransactionType8.Script) {
|
3895
|
-
|
4083
|
+
gasLimit = transactionRequest.gasLimit;
|
4084
|
+
if (!optimizeGas) {
|
3896
4085
|
transactionRequest.gasLimit = minGas;
|
3897
|
-
|
3898
|
-
|
3899
|
-
);
|
4086
|
+
gasLimit = transactionRequest.calculateMaxGas(chainInfo, minGas);
|
4087
|
+
transactionRequest.gasLimit = gasLimit;
|
3900
4088
|
}
|
3901
4089
|
}
|
3902
4090
|
const maxGas = transactionRequest.calculateMaxGas(chainInfo, minGas);
|
3903
|
-
const maxFee =
|
4091
|
+
const maxFee = calculateGasFee({
|
4092
|
+
gasPrice: bn16(gasPrice),
|
4093
|
+
gas: maxGas,
|
4094
|
+
priceFactor: gasPriceFactor,
|
4095
|
+
tip: transactionRequest.tip
|
4096
|
+
}).add(1);
|
3904
4097
|
return {
|
3905
4098
|
minGas,
|
3906
4099
|
minFee,
|
3907
4100
|
maxGas,
|
3908
|
-
maxFee
|
4101
|
+
maxFee,
|
4102
|
+
gasPrice,
|
4103
|
+
gasLimit
|
3909
4104
|
};
|
3910
4105
|
}
|
3911
4106
|
/**
|
@@ -3923,15 +4118,17 @@ var _Provider = class {
|
|
3923
4118
|
if (estimateTxDependencies) {
|
3924
4119
|
return this.estimateTxDependencies(transactionRequest);
|
3925
4120
|
}
|
3926
|
-
const
|
3927
|
-
const { dryRun:
|
3928
|
-
|
4121
|
+
const encodedTransactions = [hexlify12(transactionRequest.toTransactionBytes())];
|
4122
|
+
const { dryRun: dryRunStatuses } = await this.operations.dryRun({
|
4123
|
+
encodedTransactions,
|
3929
4124
|
utxoValidation: true
|
3930
4125
|
});
|
3931
|
-
const
|
3932
|
-
|
3933
|
-
receipts
|
3934
|
-
|
4126
|
+
const callResult = dryRunStatuses.map((dryRunStatus) => {
|
4127
|
+
const { id, receipts, status } = dryRunStatus;
|
4128
|
+
const processedReceipts = receipts.map(processGqlReceipt);
|
4129
|
+
return { id, receipts: processedReceipts, status };
|
4130
|
+
});
|
4131
|
+
return { receipts: callResult[0].receipts };
|
3935
4132
|
}
|
3936
4133
|
/**
|
3937
4134
|
* Returns a transaction cost to enable user
|
@@ -3948,77 +4145,80 @@ var _Provider = class {
|
|
3948
4145
|
* @param tolerance - The tolerance to add on top of the gasUsed.
|
3949
4146
|
* @returns A promise that resolves to the transaction cost object.
|
3950
4147
|
*/
|
3951
|
-
async getTransactionCost(transactionRequestLike,
|
3952
|
-
estimateTxDependencies = true,
|
3953
|
-
estimatePredicates = true,
|
3954
|
-
resourcesOwner,
|
3955
|
-
signatureCallback
|
3956
|
-
} = {}) {
|
4148
|
+
async getTransactionCost(transactionRequestLike, { resourcesOwner, signatureCallback, quantitiesToContract = [] } = {}) {
|
3957
4149
|
const txRequestClone = clone3(transactionRequestify(transactionRequestLike));
|
3958
|
-
const { minGasPrice } = this.getGasConfig();
|
3959
|
-
const setGasPrice = max(txRequestClone.gasPrice, minGasPrice);
|
3960
4150
|
const isScriptTransaction = txRequestClone.type === TransactionType8.Script;
|
3961
4151
|
const coinOutputsQuantities = txRequestClone.getCoinOutputsQuantities();
|
3962
|
-
const allQuantities = mergeQuantities(coinOutputsQuantities,
|
4152
|
+
const allQuantities = mergeQuantities(coinOutputsQuantities, quantitiesToContract);
|
3963
4153
|
txRequestClone.fundWithFakeUtxos(allQuantities, resourcesOwner?.address);
|
4154
|
+
txRequestClone.maxFee = bn16(0);
|
3964
4155
|
if (isScriptTransaction) {
|
3965
|
-
txRequestClone.gasLimit =
|
4156
|
+
txRequestClone.gasLimit = bn16(0);
|
3966
4157
|
}
|
3967
|
-
if (
|
3968
|
-
|
3969
|
-
resourcesOwner.populateTransactionPredicateData(txRequestClone);
|
3970
|
-
}
|
3971
|
-
await this.estimatePredicates(txRequestClone);
|
4158
|
+
if (resourcesOwner && "populateTransactionPredicateData" in resourcesOwner) {
|
4159
|
+
resourcesOwner.populateTransactionPredicateData(txRequestClone);
|
3972
4160
|
}
|
4161
|
+
const signedRequest = clone3(txRequestClone);
|
4162
|
+
let addedSignatures = 0;
|
3973
4163
|
if (signatureCallback && isScriptTransaction) {
|
3974
|
-
|
3975
|
-
|
3976
|
-
|
3977
|
-
|
4164
|
+
const lengthBefore = signedRequest.witnesses.length;
|
4165
|
+
await signatureCallback(signedRequest);
|
4166
|
+
addedSignatures = signedRequest.witnesses.length - lengthBefore;
|
4167
|
+
}
|
4168
|
+
await this.estimatePredicates(signedRequest);
|
4169
|
+
let { maxFee, maxGas, minFee, minGas, gasPrice, gasLimit } = await this.estimateTxGasAndFee({
|
4170
|
+
transactionRequest: signedRequest,
|
4171
|
+
optimizeGas: false
|
3978
4172
|
});
|
4173
|
+
txRequestClone.maxFee = maxFee;
|
3979
4174
|
let receipts = [];
|
3980
4175
|
let missingContractIds = [];
|
3981
4176
|
let outputVariables = 0;
|
3982
|
-
let gasUsed =
|
3983
|
-
|
3984
|
-
|
4177
|
+
let gasUsed = bn16(0);
|
4178
|
+
txRequestClone.updatePredicateGasUsed(signedRequest.inputs);
|
4179
|
+
if (isScriptTransaction) {
|
4180
|
+
if (signatureCallback) {
|
4181
|
+
await signatureCallback(txRequestClone);
|
4182
|
+
}
|
4183
|
+
txRequestClone.gasLimit = gasLimit;
|
3985
4184
|
const result = await this.estimateTxDependencies(txRequestClone);
|
3986
4185
|
receipts = result.receipts;
|
3987
4186
|
outputVariables = result.outputVariables;
|
3988
4187
|
missingContractIds = result.missingContractIds;
|
3989
|
-
gasUsed =
|
4188
|
+
gasUsed = getGasUsedFromReceipts(receipts);
|
3990
4189
|
txRequestClone.gasLimit = gasUsed;
|
3991
|
-
|
3992
|
-
|
3993
|
-
|
4190
|
+
({ maxFee, maxGas, minFee, minGas, gasPrice } = await this.estimateTxGasAndFee({
|
4191
|
+
transactionRequest: txRequestClone,
|
4192
|
+
gasPrice
|
3994
4193
|
}));
|
3995
4194
|
}
|
3996
4195
|
return {
|
3997
4196
|
requiredQuantities: allQuantities,
|
3998
4197
|
receipts,
|
3999
4198
|
gasUsed,
|
4000
|
-
|
4001
|
-
gasPrice: setGasPrice,
|
4199
|
+
gasPrice,
|
4002
4200
|
minGas,
|
4003
4201
|
maxGas,
|
4004
4202
|
minFee,
|
4005
4203
|
maxFee,
|
4006
|
-
estimatedInputs: txRequestClone.inputs,
|
4007
4204
|
outputVariables,
|
4008
|
-
missingContractIds
|
4205
|
+
missingContractIds,
|
4206
|
+
addedSignatures,
|
4207
|
+
estimatedPredicates: txRequestClone.inputs
|
4009
4208
|
};
|
4010
4209
|
}
|
4011
|
-
async getResourcesForTransaction(owner, transactionRequestLike,
|
4210
|
+
async getResourcesForTransaction(owner, transactionRequestLike, quantitiesToContract = []) {
|
4012
4211
|
const ownerAddress = Address2.fromAddressOrString(owner);
|
4013
4212
|
const transactionRequest = transactionRequestify(clone3(transactionRequestLike));
|
4014
|
-
const transactionCost = await this.getTransactionCost(transactionRequest,
|
4213
|
+
const transactionCost = await this.getTransactionCost(transactionRequest, {
|
4214
|
+
quantitiesToContract
|
4215
|
+
});
|
4015
4216
|
transactionRequest.addResources(
|
4016
4217
|
await this.getResourcesToSpend(ownerAddress, transactionCost.requiredQuantities)
|
4017
4218
|
);
|
4018
|
-
const { requiredQuantities, ...txCost } = await this.getTransactionCost(
|
4019
|
-
|
4020
|
-
|
4021
|
-
);
|
4219
|
+
const { requiredQuantities, ...txCost } = await this.getTransactionCost(transactionRequest, {
|
4220
|
+
quantitiesToContract
|
4221
|
+
});
|
4022
4222
|
const resources = await this.getResourcesToSpend(ownerAddress, requiredQuantities);
|
4023
4223
|
return {
|
4024
4224
|
resources,
|
@@ -4040,11 +4240,10 @@ var _Provider = class {
|
|
4040
4240
|
return coins.map((coin) => ({
|
4041
4241
|
id: coin.utxoId,
|
4042
4242
|
assetId: coin.assetId,
|
4043
|
-
amount:
|
4243
|
+
amount: bn16(coin.amount),
|
4044
4244
|
owner: Address2.fromAddressOrString(coin.owner),
|
4045
|
-
|
4046
|
-
|
4047
|
-
txCreatedIdx: bn15(coin.txCreatedIdx)
|
4245
|
+
blockCreated: bn16(coin.blockCreated),
|
4246
|
+
txCreatedIdx: bn16(coin.txCreatedIdx)
|
4048
4247
|
}));
|
4049
4248
|
}
|
4050
4249
|
/**
|
@@ -4081,9 +4280,9 @@ var _Provider = class {
|
|
4081
4280
|
switch (coin.__typename) {
|
4082
4281
|
case "MessageCoin":
|
4083
4282
|
return {
|
4084
|
-
amount:
|
4283
|
+
amount: bn16(coin.amount),
|
4085
4284
|
assetId: coin.assetId,
|
4086
|
-
daHeight:
|
4285
|
+
daHeight: bn16(coin.daHeight),
|
4087
4286
|
sender: Address2.fromAddressOrString(coin.sender),
|
4088
4287
|
recipient: Address2.fromAddressOrString(coin.recipient),
|
4089
4288
|
nonce: coin.nonce
|
@@ -4091,12 +4290,11 @@ var _Provider = class {
|
|
4091
4290
|
case "Coin":
|
4092
4291
|
return {
|
4093
4292
|
id: coin.utxoId,
|
4094
|
-
amount:
|
4293
|
+
amount: bn16(coin.amount),
|
4095
4294
|
assetId: coin.assetId,
|
4096
4295
|
owner: Address2.fromAddressOrString(coin.owner),
|
4097
|
-
|
4098
|
-
|
4099
|
-
txCreatedIdx: bn15(coin.txCreatedIdx)
|
4296
|
+
blockCreated: bn16(coin.blockCreated),
|
4297
|
+
txCreatedIdx: bn16(coin.txCreatedIdx)
|
4100
4298
|
};
|
4101
4299
|
default:
|
4102
4300
|
return null;
|
@@ -4113,13 +4311,13 @@ var _Provider = class {
|
|
4113
4311
|
async getBlock(idOrHeight) {
|
4114
4312
|
let variables;
|
4115
4313
|
if (typeof idOrHeight === "number") {
|
4116
|
-
variables = { height:
|
4314
|
+
variables = { height: bn16(idOrHeight).toString(10) };
|
4117
4315
|
} else if (idOrHeight === "latest") {
|
4118
4316
|
variables = { height: (await this.getBlockNumber()).toString(10) };
|
4119
4317
|
} else if (idOrHeight.length === 66) {
|
4120
4318
|
variables = { blockId: idOrHeight };
|
4121
4319
|
} else {
|
4122
|
-
variables = { blockId:
|
4320
|
+
variables = { blockId: bn16(idOrHeight).toString(10) };
|
4123
4321
|
}
|
4124
4322
|
const { block } = await this.operations.getBlock(variables);
|
4125
4323
|
if (!block) {
|
@@ -4127,7 +4325,7 @@ var _Provider = class {
|
|
4127
4325
|
}
|
4128
4326
|
return {
|
4129
4327
|
id: block.id,
|
4130
|
-
height:
|
4328
|
+
height: bn16(block.height),
|
4131
4329
|
time: block.header.time,
|
4132
4330
|
transactionIds: block.transactions.map((tx) => tx.id)
|
4133
4331
|
};
|
@@ -4142,7 +4340,7 @@ var _Provider = class {
|
|
4142
4340
|
const { blocks: fetchedData } = await this.operations.getBlocks(params);
|
4143
4341
|
const blocks = fetchedData.edges.map(({ node: block }) => ({
|
4144
4342
|
id: block.id,
|
4145
|
-
height:
|
4343
|
+
height: bn16(block.height),
|
4146
4344
|
time: block.header.time,
|
4147
4345
|
transactionIds: block.transactions.map((tx) => tx.id)
|
4148
4346
|
}));
|
@@ -4157,7 +4355,7 @@ var _Provider = class {
|
|
4157
4355
|
async getBlockWithTransactions(idOrHeight) {
|
4158
4356
|
let variables;
|
4159
4357
|
if (typeof idOrHeight === "number") {
|
4160
|
-
variables = { blockHeight:
|
4358
|
+
variables = { blockHeight: bn16(idOrHeight).toString(10) };
|
4161
4359
|
} else if (idOrHeight === "latest") {
|
4162
4360
|
variables = { blockHeight: (await this.getBlockNumber()).toString() };
|
4163
4361
|
} else {
|
@@ -4169,7 +4367,7 @@ var _Provider = class {
|
|
4169
4367
|
}
|
4170
4368
|
return {
|
4171
4369
|
id: block.id,
|
4172
|
-
height:
|
4370
|
+
height: bn16(block.height, 10),
|
4173
4371
|
time: block.header.time,
|
4174
4372
|
transactionIds: block.transactions.map((tx) => tx.id),
|
4175
4373
|
transactions: block.transactions.map(
|
@@ -4218,7 +4416,7 @@ var _Provider = class {
|
|
4218
4416
|
contract: Address2.fromAddressOrString(contractId).toB256(),
|
4219
4417
|
asset: hexlify12(assetId)
|
4220
4418
|
});
|
4221
|
-
return
|
4419
|
+
return bn16(contractBalance.amount, 10);
|
4222
4420
|
}
|
4223
4421
|
/**
|
4224
4422
|
* Returns the balance for the given owner for the given asset ID.
|
@@ -4232,7 +4430,7 @@ var _Provider = class {
|
|
4232
4430
|
owner: Address2.fromAddressOrString(owner).toB256(),
|
4233
4431
|
assetId: hexlify12(assetId)
|
4234
4432
|
});
|
4235
|
-
return
|
4433
|
+
return bn16(balance.amount, 10);
|
4236
4434
|
}
|
4237
4435
|
/**
|
4238
4436
|
* Returns balances for the given owner.
|
@@ -4250,7 +4448,7 @@ var _Provider = class {
|
|
4250
4448
|
const balances = result.balances.edges.map((edge) => edge.node);
|
4251
4449
|
return balances.map((balance) => ({
|
4252
4450
|
assetId: balance.assetId,
|
4253
|
-
amount:
|
4451
|
+
amount: bn16(balance.amount)
|
4254
4452
|
}));
|
4255
4453
|
}
|
4256
4454
|
/**
|
@@ -4272,15 +4470,15 @@ var _Provider = class {
|
|
4272
4470
|
sender: message.sender,
|
4273
4471
|
recipient: message.recipient,
|
4274
4472
|
nonce: message.nonce,
|
4275
|
-
amount:
|
4473
|
+
amount: bn16(message.amount),
|
4276
4474
|
data: message.data
|
4277
4475
|
}),
|
4278
4476
|
sender: Address2.fromAddressOrString(message.sender),
|
4279
4477
|
recipient: Address2.fromAddressOrString(message.recipient),
|
4280
4478
|
nonce: message.nonce,
|
4281
|
-
amount:
|
4479
|
+
amount: bn16(message.amount),
|
4282
4480
|
data: InputMessageCoder.decodeData(message.data),
|
4283
|
-
daHeight:
|
4481
|
+
daHeight: bn16(message.daHeight)
|
4284
4482
|
}));
|
4285
4483
|
}
|
4286
4484
|
/**
|
@@ -4333,44 +4531,52 @@ var _Provider = class {
|
|
4333
4531
|
} = result.messageProof;
|
4334
4532
|
return {
|
4335
4533
|
messageProof: {
|
4336
|
-
proofIndex:
|
4534
|
+
proofIndex: bn16(messageProof.proofIndex),
|
4337
4535
|
proofSet: messageProof.proofSet
|
4338
4536
|
},
|
4339
4537
|
blockProof: {
|
4340
|
-
proofIndex:
|
4538
|
+
proofIndex: bn16(blockProof.proofIndex),
|
4341
4539
|
proofSet: blockProof.proofSet
|
4342
4540
|
},
|
4343
4541
|
messageBlockHeader: {
|
4344
4542
|
id: messageBlockHeader.id,
|
4345
|
-
daHeight:
|
4346
|
-
transactionsCount:
|
4543
|
+
daHeight: bn16(messageBlockHeader.daHeight),
|
4544
|
+
transactionsCount: bn16(messageBlockHeader.transactionsCount),
|
4347
4545
|
transactionsRoot: messageBlockHeader.transactionsRoot,
|
4348
|
-
height:
|
4546
|
+
height: bn16(messageBlockHeader.height),
|
4349
4547
|
prevRoot: messageBlockHeader.prevRoot,
|
4350
4548
|
time: messageBlockHeader.time,
|
4351
4549
|
applicationHash: messageBlockHeader.applicationHash,
|
4352
|
-
|
4353
|
-
messageReceiptCount: bn15(messageBlockHeader.messageReceiptCount)
|
4550
|
+
messageReceiptCount: bn16(messageBlockHeader.messageReceiptCount)
|
4354
4551
|
},
|
4355
4552
|
commitBlockHeader: {
|
4356
4553
|
id: commitBlockHeader.id,
|
4357
|
-
daHeight:
|
4358
|
-
transactionsCount:
|
4554
|
+
daHeight: bn16(commitBlockHeader.daHeight),
|
4555
|
+
transactionsCount: bn16(commitBlockHeader.transactionsCount),
|
4359
4556
|
transactionsRoot: commitBlockHeader.transactionsRoot,
|
4360
|
-
height:
|
4557
|
+
height: bn16(commitBlockHeader.height),
|
4361
4558
|
prevRoot: commitBlockHeader.prevRoot,
|
4362
4559
|
time: commitBlockHeader.time,
|
4363
4560
|
applicationHash: commitBlockHeader.applicationHash,
|
4364
|
-
|
4365
|
-
messageReceiptCount: bn15(commitBlockHeader.messageReceiptCount)
|
4561
|
+
messageReceiptCount: bn16(commitBlockHeader.messageReceiptCount)
|
4366
4562
|
},
|
4367
4563
|
sender: Address2.fromAddressOrString(sender),
|
4368
4564
|
recipient: Address2.fromAddressOrString(recipient),
|
4369
4565
|
nonce,
|
4370
|
-
amount:
|
4566
|
+
amount: bn16(amount),
|
4371
4567
|
data
|
4372
4568
|
};
|
4373
4569
|
}
|
4570
|
+
async getLatestGasPrice() {
|
4571
|
+
const { latestGasPrice } = await this.operations.getLatestGasPrice();
|
4572
|
+
return bn16(latestGasPrice.gasPrice);
|
4573
|
+
}
|
4574
|
+
async estimateGasPrice(blockHorizon) {
|
4575
|
+
const { estimateGasPrice } = await this.operations.estimateGasPrice({
|
4576
|
+
blockHorizon: String(blockHorizon)
|
4577
|
+
});
|
4578
|
+
return bn16(estimateGasPrice.gasPrice);
|
4579
|
+
}
|
4374
4580
|
/**
|
4375
4581
|
* Returns Message Proof for given transaction id and the message id from MessageOut receipt.
|
4376
4582
|
*
|
@@ -4390,10 +4596,10 @@ var _Provider = class {
|
|
4390
4596
|
*/
|
4391
4597
|
async produceBlocks(amount, startTime) {
|
4392
4598
|
const { produceBlocks: latestBlockHeight } = await this.operations.produceBlocks({
|
4393
|
-
blocksToProduce:
|
4599
|
+
blocksToProduce: bn16(amount).toString(10),
|
4394
4600
|
startTimestamp: startTime ? DateTime2.fromUnixMilliseconds(startTime).toTai64() : void 0
|
4395
4601
|
});
|
4396
|
-
return
|
4602
|
+
return bn16(latestBlockHeight);
|
4397
4603
|
}
|
4398
4604
|
// eslint-disable-next-line @typescript-eslint/require-await
|
4399
4605
|
async getTransactionResponse(transactionId) {
|
@@ -4407,7 +4613,7 @@ cacheInputs_fn = function(inputs) {
|
|
4407
4613
|
return;
|
4408
4614
|
}
|
4409
4615
|
inputs.forEach((input) => {
|
4410
|
-
if (input.type ===
|
4616
|
+
if (input.type === InputType7.Coin) {
|
4411
4617
|
this.cache?.set(input.id);
|
4412
4618
|
}
|
4413
4619
|
});
|
@@ -4417,7 +4623,7 @@ __publicField(Provider, "nodeInfoCache", {});
|
|
4417
4623
|
|
4418
4624
|
// src/providers/transaction-summary/get-transaction-summary.ts
|
4419
4625
|
import { ErrorCode as ErrorCode14, FuelError as FuelError14 } from "@fuel-ts/errors";
|
4420
|
-
import { bn as
|
4626
|
+
import { bn as bn17 } from "@fuel-ts/math";
|
4421
4627
|
import { TransactionCoder as TransactionCoder6 } from "@fuel-ts/transactions";
|
4422
4628
|
import { arrayify as arrayify12 } from "@fuel-ts/utils";
|
4423
4629
|
|
@@ -4663,36 +4869,33 @@ var Account = class extends AbstractAccount {
|
|
4663
4869
|
* @param fee - The estimated transaction fee.
|
4664
4870
|
* @returns A promise that resolves when the resources are added to the transaction.
|
4665
4871
|
*/
|
4666
|
-
async fund(request,
|
4667
|
-
const
|
4668
|
-
|
4872
|
+
async fund(request, params) {
|
4873
|
+
const { addedSignatures, estimatedPredicates, maxFee: fee, requiredQuantities } = params;
|
4874
|
+
const txRequest = request;
|
4875
|
+
const requiredQuantitiesWithFee = addAmountToCoinQuantities({
|
4876
|
+
amount: bn18(fee),
|
4669
4877
|
assetId: BaseAssetId3,
|
4670
|
-
coinQuantities
|
4878
|
+
coinQuantities: requiredQuantities
|
4671
4879
|
});
|
4672
4880
|
const quantitiesDict = {};
|
4673
|
-
|
4881
|
+
requiredQuantitiesWithFee.forEach(({ amount, assetId }) => {
|
4674
4882
|
quantitiesDict[assetId] = {
|
4675
4883
|
required: amount,
|
4676
|
-
owned:
|
4884
|
+
owned: bn18(0)
|
4677
4885
|
};
|
4678
4886
|
});
|
4679
|
-
|
4680
|
-
const cachedMessages = [];
|
4681
|
-
const owner = this.address.toB256();
|
4682
|
-
request.inputs.forEach((input) => {
|
4887
|
+
txRequest.inputs.forEach((input) => {
|
4683
4888
|
const isResource = "amount" in input;
|
4684
4889
|
if (isResource) {
|
4685
4890
|
const isCoin2 = "owner" in input;
|
4686
4891
|
if (isCoin2) {
|
4687
4892
|
const assetId = String(input.assetId);
|
4688
|
-
if (
|
4689
|
-
const amount =
|
4893
|
+
if (quantitiesDict[assetId]) {
|
4894
|
+
const amount = bn18(input.amount);
|
4690
4895
|
quantitiesDict[assetId].owned = quantitiesDict[assetId].owned.add(amount);
|
4691
|
-
cachedUtxos.push(input.id);
|
4692
4896
|
}
|
4693
|
-
} else if (input.
|
4897
|
+
} else if (input.amount && quantitiesDict[BaseAssetId3]) {
|
4694
4898
|
quantitiesDict[BaseAssetId3].owned = quantitiesDict[BaseAssetId3].owned.add(input.amount);
|
4695
|
-
cachedMessages.push(input.nonce);
|
4696
4899
|
}
|
4697
4900
|
}
|
4698
4901
|
});
|
@@ -4707,12 +4910,23 @@ var Account = class extends AbstractAccount {
|
|
4707
4910
|
});
|
4708
4911
|
const needsToBeFunded = missingQuantities.length;
|
4709
4912
|
if (needsToBeFunded) {
|
4710
|
-
const
|
4711
|
-
|
4712
|
-
|
4713
|
-
|
4714
|
-
|
4913
|
+
const excludedIds = cacheTxInputsFromOwner(txRequest.inputs, this.address.toB256());
|
4914
|
+
const resources = await this.getResourcesToSpend(missingQuantities, excludedIds);
|
4915
|
+
txRequest.addResources(resources);
|
4916
|
+
}
|
4917
|
+
txRequest.shiftPredicateData();
|
4918
|
+
txRequest.updatePredicateGasUsed(estimatedPredicates);
|
4919
|
+
const requestToBeReEstimate = clone4(txRequest);
|
4920
|
+
if (addedSignatures) {
|
4921
|
+
Array.from({ length: addedSignatures }).forEach(
|
4922
|
+
() => requestToBeReEstimate.addEmptyWitness()
|
4923
|
+
);
|
4715
4924
|
}
|
4925
|
+
const { maxFee } = await this.provider.estimateTxGasAndFee({
|
4926
|
+
transactionRequest: requestToBeReEstimate
|
4927
|
+
});
|
4928
|
+
txRequest.maxFee = maxFee;
|
4929
|
+
return txRequest;
|
4716
4930
|
}
|
4717
4931
|
/**
|
4718
4932
|
* A helper that creates a transfer transaction request and returns it.
|
@@ -4720,28 +4934,25 @@ var Account = class extends AbstractAccount {
|
|
4720
4934
|
* @param destination - The address of the destination.
|
4721
4935
|
* @param amount - The amount of coins to transfer.
|
4722
4936
|
* @param assetId - The asset ID of the coins to transfer.
|
4723
|
-
* @param txParams - The transaction parameters (gasLimit,
|
4937
|
+
* @param txParams - The transaction parameters (gasLimit, tip, maturity, maxFee, witnessLimit).
|
4724
4938
|
* @returns A promise that resolves to the prepared transaction request.
|
4725
4939
|
*/
|
4726
4940
|
async createTransfer(destination, amount, assetId = BaseAssetId3, txParams = {}) {
|
4727
|
-
const
|
4728
|
-
const params = { gasPrice: minGasPrice, ...txParams };
|
4729
|
-
const request = new ScriptTransactionRequest(params);
|
4941
|
+
const request = new ScriptTransactionRequest(txParams);
|
4730
4942
|
request.addCoinOutput(Address3.fromAddressOrString(destination), amount, assetId);
|
4731
|
-
const
|
4943
|
+
const txCost = await this.provider.getTransactionCost(request, {
|
4732
4944
|
estimateTxDependencies: true,
|
4733
4945
|
resourcesOwner: this
|
4734
4946
|
});
|
4735
|
-
|
4736
|
-
|
4737
|
-
|
4738
|
-
|
4739
|
-
|
4740
|
-
|
4741
|
-
|
4742
|
-
|
4743
|
-
await this.fund(request,
|
4744
|
-
request.updatePredicateInputs(estimatedInputs);
|
4947
|
+
if ("gasLimit" in txParams) {
|
4948
|
+
this.validateGas({
|
4949
|
+
gasUsed: txCost.gasUsed,
|
4950
|
+
gasLimit: request.gasLimit
|
4951
|
+
});
|
4952
|
+
}
|
4953
|
+
request.gasLimit = txCost.gasUsed;
|
4954
|
+
request.maxFee = txCost.maxFee;
|
4955
|
+
await this.fund(request, txCost);
|
4745
4956
|
return request;
|
4746
4957
|
}
|
4747
4958
|
/**
|
@@ -4754,7 +4965,7 @@ var Account = class extends AbstractAccount {
|
|
4754
4965
|
* @returns A promise that resolves to the transaction response.
|
4755
4966
|
*/
|
4756
4967
|
async transfer(destination, amount, assetId = BaseAssetId3, txParams = {}) {
|
4757
|
-
if (
|
4968
|
+
if (bn18(amount).lte(0)) {
|
4758
4969
|
throw new FuelError15(
|
4759
4970
|
ErrorCode15.INVALID_TRANSFER_AMOUNT,
|
4760
4971
|
"Transfer amount must be a positive number."
|
@@ -4773,38 +4984,37 @@ var Account = class extends AbstractAccount {
|
|
4773
4984
|
* @returns A promise that resolves to the transaction response.
|
4774
4985
|
*/
|
4775
4986
|
async transferToContract(contractId, amount, assetId = BaseAssetId3, txParams = {}) {
|
4776
|
-
if (
|
4987
|
+
if (bn18(amount).lte(0)) {
|
4777
4988
|
throw new FuelError15(
|
4778
4989
|
ErrorCode15.INVALID_TRANSFER_AMOUNT,
|
4779
4990
|
"Transfer amount must be a positive number."
|
4780
4991
|
);
|
4781
4992
|
}
|
4782
4993
|
const contractAddress = Address3.fromAddressOrString(contractId);
|
4783
|
-
const { minGasPrice } = this.provider.getGasConfig();
|
4784
|
-
const params = { gasPrice: minGasPrice, ...txParams };
|
4785
4994
|
const { script, scriptData } = await assembleTransferToContractScript({
|
4786
4995
|
hexlifiedContractId: contractAddress.toB256(),
|
4787
|
-
amountToTransfer:
|
4996
|
+
amountToTransfer: bn18(amount),
|
4788
4997
|
assetId
|
4789
4998
|
});
|
4790
4999
|
const request = new ScriptTransactionRequest({
|
4791
|
-
...
|
5000
|
+
...txParams,
|
4792
5001
|
script,
|
4793
5002
|
scriptData
|
4794
5003
|
});
|
4795
5004
|
request.addContractInputAndOutput(contractAddress);
|
4796
|
-
const
|
4797
|
-
|
4798
|
-
[{ amount:
|
4799
|
-
);
|
4800
|
-
request.gasLimit = bn17(params.gasLimit ?? gasUsed);
|
4801
|
-
this.validateGas({
|
4802
|
-
gasUsed,
|
4803
|
-
gasPrice: request.gasPrice,
|
4804
|
-
gasLimit: request.gasLimit,
|
4805
|
-
minGasPrice
|
5005
|
+
const txCost = await this.provider.getTransactionCost(request, {
|
5006
|
+
resourcesOwner: this,
|
5007
|
+
quantitiesToContract: [{ amount: bn18(amount), assetId: String(assetId) }]
|
4806
5008
|
});
|
4807
|
-
|
5009
|
+
if (txParams.gasLimit) {
|
5010
|
+
this.validateGas({
|
5011
|
+
gasUsed: txCost.gasUsed,
|
5012
|
+
gasLimit: request.gasLimit
|
5013
|
+
});
|
5014
|
+
}
|
5015
|
+
request.gasLimit = txCost.gasUsed;
|
5016
|
+
request.maxFee = txCost.maxFee;
|
5017
|
+
await this.fund(request, txCost);
|
4808
5018
|
return this.sendTransaction(request);
|
4809
5019
|
}
|
4810
5020
|
/**
|
@@ -4816,34 +5026,31 @@ var Account = class extends AbstractAccount {
|
|
4816
5026
|
* @returns A promise that resolves to the transaction response.
|
4817
5027
|
*/
|
4818
5028
|
async withdrawToBaseLayer(recipient, amount, txParams = {}) {
|
4819
|
-
const { minGasPrice } = this.provider.getGasConfig();
|
4820
5029
|
const recipientAddress = Address3.fromAddressOrString(recipient);
|
4821
5030
|
const recipientDataArray = arrayify14(
|
4822
5031
|
"0x".concat(recipientAddress.toHexString().substring(2).padStart(64, "0"))
|
4823
5032
|
);
|
4824
5033
|
const amountDataArray = arrayify14(
|
4825
|
-
"0x".concat(
|
5034
|
+
"0x".concat(bn18(amount).toHex().substring(2).padStart(16, "0"))
|
4826
5035
|
);
|
4827
5036
|
const script = new Uint8Array([
|
4828
5037
|
...arrayify14(withdrawScript.bytes),
|
4829
5038
|
...recipientDataArray,
|
4830
5039
|
...amountDataArray
|
4831
5040
|
]);
|
4832
|
-
const params = { script,
|
5041
|
+
const params = { script, ...txParams };
|
4833
5042
|
const request = new ScriptTransactionRequest(params);
|
4834
|
-
const
|
4835
|
-
const
|
4836
|
-
|
4837
|
-
|
4838
|
-
|
4839
|
-
|
4840
|
-
|
4841
|
-
|
4842
|
-
|
4843
|
-
|
4844
|
-
|
4845
|
-
});
|
4846
|
-
await this.fund(request, requiredQuantities, maxFee);
|
5043
|
+
const quantitiesToContract = [{ amount: bn18(amount), assetId: BaseAssetId3 }];
|
5044
|
+
const txCost = await this.provider.getTransactionCost(request, { quantitiesToContract });
|
5045
|
+
if (txParams.gasLimit) {
|
5046
|
+
this.validateGas({
|
5047
|
+
gasUsed: txCost.gasUsed,
|
5048
|
+
gasLimit: request.gasLimit
|
5049
|
+
});
|
5050
|
+
}
|
5051
|
+
request.maxFee = txCost.maxFee;
|
5052
|
+
request.gasLimit = txCost.gasUsed;
|
5053
|
+
await this.fund(request, txCost);
|
4847
5054
|
return this.sendTransaction(request);
|
4848
5055
|
}
|
4849
5056
|
async signMessage(message) {
|
@@ -4901,18 +5108,7 @@ var Account = class extends AbstractAccount {
|
|
4901
5108
|
}
|
4902
5109
|
return this.provider.simulate(transactionRequest, { estimateTxDependencies: false });
|
4903
5110
|
}
|
4904
|
-
validateGas({
|
4905
|
-
gasUsed,
|
4906
|
-
gasPrice,
|
4907
|
-
gasLimit,
|
4908
|
-
minGasPrice
|
4909
|
-
}) {
|
4910
|
-
if (minGasPrice.gt(gasPrice)) {
|
4911
|
-
throw new FuelError15(
|
4912
|
-
ErrorCode15.GAS_PRICE_TOO_LOW,
|
4913
|
-
`Gas price '${gasPrice}' is lower than the required: '${minGasPrice}'.`
|
4914
|
-
);
|
4915
|
-
}
|
5111
|
+
validateGas({ gasUsed, gasLimit }) {
|
4916
5112
|
if (gasUsed.gt(gasLimit)) {
|
4917
5113
|
throw new FuelError15(
|
4918
5114
|
ErrorCode15.GAS_LIMIT_TOO_LOW,
|
@@ -5204,7 +5400,7 @@ var BaseWalletUnlocked = class extends Account {
|
|
5204
5400
|
* @param transactionRequestLike - The transaction request to send.
|
5205
5401
|
* @returns A promise that resolves to the TransactionResponse object.
|
5206
5402
|
*/
|
5207
|
-
async sendTransaction(transactionRequestLike, { estimateTxDependencies =
|
5403
|
+
async sendTransaction(transactionRequestLike, { estimateTxDependencies = false, awaitExecution } = {}) {
|
5208
5404
|
const transactionRequest = transactionRequestify(transactionRequestLike);
|
5209
5405
|
if (estimateTxDependencies) {
|
5210
5406
|
await this.provider.estimateTxDependencies(transactionRequest);
|
@@ -5245,7 +5441,7 @@ __publicField(BaseWalletUnlocked, "defaultPath", "m/44'/1179993420'/0'/0/0");
|
|
5245
5441
|
// src/hdwallet/hdwallet.ts
|
5246
5442
|
import { ErrorCode as ErrorCode19, FuelError as FuelError19 } from "@fuel-ts/errors";
|
5247
5443
|
import { sha256 as sha2564 } from "@fuel-ts/hasher";
|
5248
|
-
import { bn as
|
5444
|
+
import { bn as bn19, toBytes as toBytes2, toHex } from "@fuel-ts/math";
|
5249
5445
|
import { arrayify as arrayify18, hexlify as hexlify17, concat as concat5 } from "@fuel-ts/utils";
|
5250
5446
|
import { toBeHex, dataSlice as dataSlice2, encodeBase58 as encodeBase582, decodeBase58, computeHmac as computeHmac2, ripemd160 } from "ethers";
|
5251
5447
|
|
@@ -7711,7 +7907,7 @@ var HDWallet = class {
|
|
7711
7907
|
const IR = bytes.slice(32);
|
7712
7908
|
if (privateKey) {
|
7713
7909
|
const N = "0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141";
|
7714
|
-
const ki =
|
7910
|
+
const ki = bn19(IL).add(privateKey).mod(N).toBytes(32);
|
7715
7911
|
return new HDWallet({
|
7716
7912
|
privateKey: ki,
|
7717
7913
|
chainCode: IR,
|
@@ -7982,14 +8178,15 @@ var seedTestWallet = async (wallet, quantities) => {
|
|
7982
8178
|
process.env.GENESIS_SECRET || randomBytes5(32),
|
7983
8179
|
wallet.provider
|
7984
8180
|
);
|
7985
|
-
const
|
7986
|
-
|
7987
|
-
|
7988
|
-
|
7989
|
-
gasPrice: minGasPrice
|
8181
|
+
const request = new ScriptTransactionRequest();
|
8182
|
+
quantities.forEach((quantity) => {
|
8183
|
+
const { amount, assetId } = coinQuantityfy(quantity);
|
8184
|
+
request.addCoinOutput(wallet.address, amount, assetId);
|
7990
8185
|
});
|
7991
|
-
|
7992
|
-
|
8186
|
+
const txCost = await genesisWallet.provider.getTransactionCost(request);
|
8187
|
+
request.gasLimit = txCost.gasUsed;
|
8188
|
+
request.maxFee = txCost.maxFee;
|
8189
|
+
await genesisWallet.fund(request, txCost);
|
7993
8190
|
await genesisWallet.sendTransaction(request, { awaitExecution: true });
|
7994
8191
|
};
|
7995
8192
|
|
@@ -8004,11 +8201,11 @@ var generateTestWallet = async (provider, quantities) => {
|
|
8004
8201
|
|
8005
8202
|
// src/test-utils/launchNode.ts
|
8006
8203
|
import { BaseAssetId as BaseAssetId4 } from "@fuel-ts/address/configs";
|
8007
|
-
import {
|
8008
|
-
import { defaultChainConfig, defaultConsensusKey, hexlify as hexlify18 } from "@fuel-ts/utils";
|
8204
|
+
import { defaultChainConfigs, defaultConsensusKey, hexlify as hexlify18 } from "@fuel-ts/utils";
|
8009
8205
|
import { findBinPath } from "@fuel-ts/utils/cli-utils";
|
8010
8206
|
import { spawn } from "child_process";
|
8011
8207
|
import { randomUUID } from "crypto";
|
8208
|
+
import { randomBytes as randomBytes6 } from "ethers";
|
8012
8209
|
import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
|
8013
8210
|
import os from "os";
|
8014
8211
|
import path from "path";
|
@@ -8057,12 +8254,12 @@ var launchNode = async ({
|
|
8057
8254
|
// eslint-disable-next-line no-async-promise-executor
|
8058
8255
|
new Promise(async (resolve, reject) => {
|
8059
8256
|
const remainingArgs = extractRemainingArgs(args, [
|
8060
|
-
"--
|
8257
|
+
"--snapshot",
|
8061
8258
|
"--consensus-key",
|
8062
8259
|
"--db-type",
|
8063
8260
|
"--poa-instant"
|
8064
8261
|
]);
|
8065
|
-
const chainConfigPath = getFlagValueFromArgs(args, "--
|
8262
|
+
const chainConfigPath = getFlagValueFromArgs(args, "--snapshot");
|
8066
8263
|
const consensusKey = getFlagValueFromArgs(args, "--consensus-key") || defaultConsensusKey;
|
8067
8264
|
const dbTypeFlagValue = getFlagValueFromArgs(args, "--db-type");
|
8068
8265
|
const useInMemoryDb = dbTypeFlagValue === "in-memory" || dbTypeFlagValue === void 0;
|
@@ -8081,36 +8278,54 @@ var launchNode = async ({
|
|
8081
8278
|
let chainConfigPathToUse;
|
8082
8279
|
const prefix = basePath || os.tmpdir();
|
8083
8280
|
const suffix = basePath ? "" : randomUUID();
|
8084
|
-
const tempDirPath = path.join(prefix, ".fuels", suffix);
|
8281
|
+
const tempDirPath = path.join(prefix, ".fuels", suffix, "chainConfigs");
|
8085
8282
|
if (chainConfigPath) {
|
8086
8283
|
chainConfigPathToUse = chainConfigPath;
|
8087
8284
|
} else {
|
8088
8285
|
if (!existsSync(tempDirPath)) {
|
8089
8286
|
mkdirSync(tempDirPath, { recursive: true });
|
8090
8287
|
}
|
8091
|
-
|
8092
|
-
|
8288
|
+
let { stateConfigJson } = defaultChainConfigs;
|
8289
|
+
const { chainConfigJson, metadataJson } = defaultChainConfigs;
|
8290
|
+
stateConfigJson = {
|
8291
|
+
...stateConfigJson,
|
8292
|
+
coins: [
|
8293
|
+
...stateConfigJson.coins.map((coin) => ({
|
8294
|
+
...coin,
|
8295
|
+
amount: "18446744073709551615"
|
8296
|
+
}))
|
8297
|
+
],
|
8298
|
+
messages: stateConfigJson.messages.map((message) => ({
|
8299
|
+
...message,
|
8300
|
+
amount: "18446744073709551615"
|
8301
|
+
}))
|
8302
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
8303
|
+
};
|
8093
8304
|
if (!process.env.GENESIS_SECRET) {
|
8094
8305
|
const pk = Signer.generatePrivateKey();
|
8095
8306
|
const signer = new Signer(pk);
|
8096
8307
|
process.env.GENESIS_SECRET = hexlify18(pk);
|
8097
|
-
|
8098
|
-
|
8099
|
-
|
8100
|
-
|
8101
|
-
|
8102
|
-
|
8103
|
-
|
8104
|
-
|
8105
|
-
|
8106
|
-
|
8107
|
-
}
|
8108
|
-
]
|
8109
|
-
}
|
8110
|
-
};
|
8308
|
+
stateConfigJson.coins.push({
|
8309
|
+
tx_id: hexlify18(randomBytes6(34)),
|
8310
|
+
owner: signer.address.toHexString(),
|
8311
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
8312
|
+
amount: "18446744073709551615",
|
8313
|
+
asset_id: BaseAssetId4,
|
8314
|
+
output_index: 0,
|
8315
|
+
tx_pointer_block_height: 0,
|
8316
|
+
tx_pointer_tx_idx: 0
|
8317
|
+
});
|
8111
8318
|
}
|
8112
|
-
|
8113
|
-
|
8319
|
+
let fixedStateConfigJSON = JSON.stringify(stateConfigJson);
|
8320
|
+
const regexMakeNumber = /("amount":)"(\d+)"/gm;
|
8321
|
+
fixedStateConfigJSON = fixedStateConfigJSON.replace(regexMakeNumber, "$1$2");
|
8322
|
+
const chainConfigWritePath = path.join(tempDirPath, "chainConfig.json");
|
8323
|
+
const stateConfigWritePath = path.join(tempDirPath, "stateConfig.json");
|
8324
|
+
const metadataWritePath = path.join(tempDirPath, "metadata.json");
|
8325
|
+
writeFileSync(chainConfigWritePath, JSON.stringify(chainConfigJson), "utf8");
|
8326
|
+
writeFileSync(stateConfigWritePath, fixedStateConfigJSON, "utf8");
|
8327
|
+
writeFileSync(metadataWritePath, JSON.stringify(metadataJson), "utf8");
|
8328
|
+
chainConfigPathToUse = tempDirPath;
|
8114
8329
|
}
|
8115
8330
|
const child = spawn(
|
8116
8331
|
command,
|
@@ -8119,10 +8334,10 @@ var launchNode = async ({
|
|
8119
8334
|
["--ip", ipToUse],
|
8120
8335
|
["--port", portToUse],
|
8121
8336
|
useInMemoryDb ? ["--db-type", "in-memory"] : ["--db-path", tempDirPath],
|
8122
|
-
["--min-gas-price", "
|
8337
|
+
["--min-gas-price", "1"],
|
8123
8338
|
poaInstant ? ["--poa-instant", "true"] : [],
|
8124
8339
|
["--consensus-key", consensusKey],
|
8125
|
-
["--
|
8340
|
+
["--snapshot", chainConfigPathToUse],
|
8126
8341
|
"--vm-backtrace",
|
8127
8342
|
"--utxo-validation",
|
8128
8343
|
"--debug",
|
@@ -8181,7 +8396,7 @@ var launchNodeAndGetWallets = async ({
|
|
8181
8396
|
walletCount = 10
|
8182
8397
|
} = {}) => {
|
8183
8398
|
const { cleanup: closeNode, ip, port } = await launchNode(launchNodeOptions || {});
|
8184
|
-
const provider = await Provider.create(`http://${ip}:${port}/graphql`);
|
8399
|
+
const provider = await Provider.create(`http://${ip}:${port}/v1/graphql`);
|
8185
8400
|
const wallets = await generateWallets(walletCount, provider);
|
8186
8401
|
const cleanup = () => {
|
8187
8402
|
closeNode();
|