@metamask/transaction-pay-controller 17.0.0 → 18.0.0

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.
Files changed (86) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/dist/TransactionPayController-method-action-types.cjs +7 -0
  3. package/dist/TransactionPayController-method-action-types.cjs.map +1 -0
  4. package/dist/TransactionPayController-method-action-types.d.cts +81 -0
  5. package/dist/TransactionPayController-method-action-types.d.cts.map +1 -0
  6. package/dist/TransactionPayController-method-action-types.d.mts +81 -0
  7. package/dist/TransactionPayController-method-action-types.d.mts.map +1 -0
  8. package/dist/TransactionPayController-method-action-types.mjs +6 -0
  9. package/dist/TransactionPayController-method-action-types.mjs.map +1 -0
  10. package/dist/TransactionPayController.cjs +66 -8
  11. package/dist/TransactionPayController.cjs.map +1 -1
  12. package/dist/TransactionPayController.d.cts +56 -2
  13. package/dist/TransactionPayController.d.cts.map +1 -1
  14. package/dist/TransactionPayController.d.mts +56 -2
  15. package/dist/TransactionPayController.d.mts.map +1 -1
  16. package/dist/TransactionPayController.mjs +66 -8
  17. package/dist/TransactionPayController.mjs.map +1 -1
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +2 -1
  20. package/dist/index.d.cts.map +1 -1
  21. package/dist/index.d.mts +2 -1
  22. package/dist/index.d.mts.map +1 -1
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/strategy/across/across-quotes.cjs +64 -93
  25. package/dist/strategy/across/across-quotes.cjs.map +1 -1
  26. package/dist/strategy/across/across-quotes.d.cts.map +1 -1
  27. package/dist/strategy/across/across-quotes.d.mts.map +1 -1
  28. package/dist/strategy/across/across-quotes.mjs +65 -94
  29. package/dist/strategy/across/across-quotes.mjs.map +1 -1
  30. package/dist/strategy/across/across-submit.cjs +38 -37
  31. package/dist/strategy/across/across-submit.cjs.map +1 -1
  32. package/dist/strategy/across/across-submit.d.cts.map +1 -1
  33. package/dist/strategy/across/across-submit.d.mts.map +1 -1
  34. package/dist/strategy/across/across-submit.mjs +38 -37
  35. package/dist/strategy/across/across-submit.mjs.map +1 -1
  36. package/dist/strategy/across/transactions.cjs +23 -0
  37. package/dist/strategy/across/transactions.cjs.map +1 -0
  38. package/dist/strategy/across/transactions.d.cts +18 -0
  39. package/dist/strategy/across/transactions.d.cts.map +1 -0
  40. package/dist/strategy/across/transactions.d.mts +18 -0
  41. package/dist/strategy/across/transactions.d.mts.map +1 -0
  42. package/dist/strategy/across/transactions.mjs +19 -0
  43. package/dist/strategy/across/transactions.mjs.map +1 -0
  44. package/dist/strategy/across/types.cjs.map +1 -1
  45. package/dist/strategy/across/types.d.cts +6 -10
  46. package/dist/strategy/across/types.d.cts.map +1 -1
  47. package/dist/strategy/across/types.d.mts +6 -10
  48. package/dist/strategy/across/types.d.mts.map +1 -1
  49. package/dist/strategy/across/types.mjs.map +1 -1
  50. package/dist/strategy/relay/relay-quotes.cjs +49 -135
  51. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  52. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  53. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  54. package/dist/strategy/relay/relay-quotes.mjs +51 -137
  55. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  56. package/dist/strategy/relay/relay-submit.cjs +4 -3
  57. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  58. package/dist/strategy/relay/relay-submit.mjs +4 -3
  59. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  60. package/dist/strategy/relay/types.cjs.map +1 -1
  61. package/dist/strategy/relay/types.d.cts +10 -5
  62. package/dist/strategy/relay/types.d.cts.map +1 -1
  63. package/dist/strategy/relay/types.d.mts +10 -5
  64. package/dist/strategy/relay/types.d.mts.map +1 -1
  65. package/dist/strategy/relay/types.mjs.map +1 -1
  66. package/dist/tests/messenger-mock.cjs.map +1 -1
  67. package/dist/tests/messenger-mock.d.cts +8 -1
  68. package/dist/tests/messenger-mock.d.cts.map +1 -1
  69. package/dist/tests/messenger-mock.d.mts +8 -1
  70. package/dist/tests/messenger-mock.d.mts.map +1 -1
  71. package/dist/tests/messenger-mock.mjs.map +1 -1
  72. package/dist/types.cjs.map +1 -1
  73. package/dist/types.d.cts +2 -25
  74. package/dist/types.d.cts.map +1 -1
  75. package/dist/types.d.mts +2 -25
  76. package/dist/types.d.mts.map +1 -1
  77. package/dist/types.mjs.map +1 -1
  78. package/dist/utils/quote-gas.cjs +143 -0
  79. package/dist/utils/quote-gas.cjs.map +1 -0
  80. package/dist/utils/quote-gas.d.cts +31 -0
  81. package/dist/utils/quote-gas.d.cts.map +1 -0
  82. package/dist/utils/quote-gas.d.mts +31 -0
  83. package/dist/utils/quote-gas.d.mts.map +1 -0
  84. package/dist/utils/quote-gas.mjs +139 -0
  85. package/dist/utils/quote-gas.mjs.map +1 -0
  86. package/package.json +9 -7
@@ -0,0 +1,31 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { TransactionPayControllerMessenger } from "../index.cjs";
3
+ export type QuoteGasTransaction = {
4
+ chainId: Hex;
5
+ data: Hex;
6
+ from: Hex;
7
+ gas?: number | string;
8
+ to: Hex;
9
+ value?: number | string | Hex;
10
+ };
11
+ export type QuoteGasLimit = {
12
+ estimate: number;
13
+ max: number;
14
+ };
15
+ export declare function estimateQuoteGasLimits({ fallbackGas, fallbackOnSimulationFailure, messenger, transactions, }: {
16
+ fallbackGas?: {
17
+ estimate: number;
18
+ max: number;
19
+ };
20
+ fallbackOnSimulationFailure?: boolean;
21
+ messenger: TransactionPayControllerMessenger;
22
+ transactions: QuoteGasTransaction[];
23
+ }): Promise<{
24
+ batchGasLimit?: QuoteGasLimit;
25
+ gasLimits: QuoteGasLimit[];
26
+ is7702: boolean;
27
+ totalGasEstimate: number;
28
+ totalGasLimit: number;
29
+ usedBatch: boolean;
30
+ }>;
31
+ //# sourceMappingURL=quote-gas.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote-gas.d.cts","sourceRoot":"","sources":["../../src/utils/quote-gas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAM3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAK5D,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,CAAC;IACV,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,EAC3C,WAAW,EACX,2BAAmC,EACnC,SAAS,EACT,YAAY,GACb,EAAE;IACD,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC,GAAG,OAAO,CAAC;IACV,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAwBD"}
@@ -0,0 +1,31 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { TransactionPayControllerMessenger } from "../index.mjs";
3
+ export type QuoteGasTransaction = {
4
+ chainId: Hex;
5
+ data: Hex;
6
+ from: Hex;
7
+ gas?: number | string;
8
+ to: Hex;
9
+ value?: number | string | Hex;
10
+ };
11
+ export type QuoteGasLimit = {
12
+ estimate: number;
13
+ max: number;
14
+ };
15
+ export declare function estimateQuoteGasLimits({ fallbackGas, fallbackOnSimulationFailure, messenger, transactions, }: {
16
+ fallbackGas?: {
17
+ estimate: number;
18
+ max: number;
19
+ };
20
+ fallbackOnSimulationFailure?: boolean;
21
+ messenger: TransactionPayControllerMessenger;
22
+ transactions: QuoteGasTransaction[];
23
+ }): Promise<{
24
+ batchGasLimit?: QuoteGasLimit;
25
+ gasLimits: QuoteGasLimit[];
26
+ is7702: boolean;
27
+ totalGasEstimate: number;
28
+ totalGasLimit: number;
29
+ usedBatch: boolean;
30
+ }>;
31
+ //# sourceMappingURL=quote-gas.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote-gas.d.mts","sourceRoot":"","sources":["../../src/utils/quote-gas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAM3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAK5D,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,CAAC;IACV,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,EAC3C,WAAW,EACX,2BAAmC,EACnC,SAAS,EACT,YAAY,GACb,EAAE;IACD,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC,GAAG,OAAO,CAAC;IACV,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAwBD"}
@@ -0,0 +1,139 @@
1
+ import { toHex } from "@metamask/controller-utils";
2
+ import { createModuleLogger } from "@metamask/utils";
3
+ import { BigNumber } from "bignumber.js";
4
+ import { getGasBuffer } from "./feature-flags.mjs";
5
+ import { estimateGasLimit } from "./gas.mjs";
6
+ import { projectLogger } from "../logger.mjs";
7
+ const log = createModuleLogger(projectLogger, 'quote-gas');
8
+ export async function estimateQuoteGasLimits({ fallbackGas, fallbackOnSimulationFailure = false, messenger, transactions, }) {
9
+ if (transactions.length === 0) {
10
+ throw new Error('Quote gas estimation requires at least one transaction');
11
+ }
12
+ const useBatch = transactions.length > 1;
13
+ if (useBatch) {
14
+ return {
15
+ ...(await estimateQuoteGasLimitsBatch(transactions, messenger)),
16
+ usedBatch: true,
17
+ };
18
+ }
19
+ return {
20
+ ...(await estimateQuoteGasLimitSingle({
21
+ fallbackGas,
22
+ fallbackOnSimulationFailure,
23
+ messenger,
24
+ transaction: transactions[0],
25
+ })),
26
+ is7702: false,
27
+ usedBatch: false,
28
+ };
29
+ }
30
+ async function estimateQuoteGasLimitsBatch(transactions, messenger) {
31
+ const [firstTransaction] = transactions;
32
+ const gasBuffer = getGasBuffer(messenger, firstTransaction.chainId);
33
+ const paramGasLimits = transactions.map((transaction) => parseGasLimit(transaction.gas));
34
+ const { gasLimits } = await messenger.call('TransactionController:estimateGasBatch', {
35
+ chainId: firstTransaction.chainId,
36
+ from: firstTransaction.from,
37
+ transactions: transactions.map(toBatchTransactionParams),
38
+ });
39
+ if (gasLimits.length !== 1 && gasLimits.length !== transactions.length) {
40
+ throw new Error('Unexpected batch gas limit count');
41
+ }
42
+ const bufferedGasLimits = gasLimits.map((gasLimit, index) => {
43
+ const providedGasLimit = paramGasLimits[index];
44
+ const providedGasWasPreserved = providedGasLimit !== undefined && providedGasLimit === gasLimit;
45
+ // Per-entry batch results currently preserve validated input gas values
46
+ // for transactions that already provided gas. If that contract changes
47
+ // and batch estimation returns a different value, treat it as a fresh
48
+ // estimate and apply the buffer. A single combined 7702 result is always
49
+ // buffered because it is a fresh batch estimate.
50
+ const useBuffer = gasLimits.length === 1 || !providedGasWasPreserved;
51
+ const bufferedGas = Math.ceil(gasLimit * (useBuffer ? gasBuffer : 1));
52
+ return {
53
+ estimate: bufferedGas,
54
+ max: bufferedGas,
55
+ };
56
+ });
57
+ const totalGasLimit = bufferedGasLimits.reduce((acc, gasLimit) => acc + gasLimit.max, 0);
58
+ const is7702 = bufferedGasLimits.length === 1;
59
+ const batchGasLimit = is7702 ? bufferedGasLimits[0] : undefined;
60
+ return {
61
+ ...(batchGasLimit ? { batchGasLimit } : {}),
62
+ gasLimits: bufferedGasLimits,
63
+ is7702,
64
+ totalGasEstimate: totalGasLimit,
65
+ totalGasLimit,
66
+ };
67
+ }
68
+ async function estimateQuoteGasLimitSingle({ fallbackGas, fallbackOnSimulationFailure, messenger, transaction, }) {
69
+ const providedGasLimit = parseGasLimit(transaction.gas);
70
+ if (providedGasLimit !== undefined) {
71
+ log('Using provided gas limit', {
72
+ chainId: transaction.chainId,
73
+ gas: providedGasLimit,
74
+ index: 0,
75
+ to: transaction.to,
76
+ });
77
+ return {
78
+ gasLimits: [
79
+ {
80
+ estimate: providedGasLimit,
81
+ max: providedGasLimit,
82
+ },
83
+ ],
84
+ totalGasEstimate: providedGasLimit,
85
+ totalGasLimit: providedGasLimit,
86
+ };
87
+ }
88
+ const gasLimitResult = await estimateGasLimit({
89
+ chainId: transaction.chainId,
90
+ data: transaction.data,
91
+ fallbackGas,
92
+ fallbackOnSimulationFailure,
93
+ from: transaction.from,
94
+ messenger,
95
+ to: transaction.to,
96
+ value: toHex(transaction.value ?? '0'),
97
+ });
98
+ if (gasLimitResult.usedFallback) {
99
+ log('Gas estimate failed, using fallback', {
100
+ chainId: transaction.chainId,
101
+ error: gasLimitResult.error,
102
+ index: 0,
103
+ to: transaction.to,
104
+ });
105
+ }
106
+ const gasLimit = {
107
+ estimate: gasLimitResult.estimate,
108
+ max: gasLimitResult.max,
109
+ };
110
+ return {
111
+ gasLimits: [gasLimit],
112
+ totalGasEstimate: gasLimit.estimate,
113
+ totalGasLimit: gasLimit.max,
114
+ };
115
+ }
116
+ function toBatchTransactionParams(transaction) {
117
+ return {
118
+ data: transaction.data,
119
+ gas: transaction.gas === undefined ? undefined : toHex(transaction.gas),
120
+ maxFeePerGas: undefined,
121
+ maxPriorityFeePerGas: undefined,
122
+ to: transaction.to,
123
+ value: toHex(transaction.value ?? '0'),
124
+ };
125
+ }
126
+ function parseGasLimit(gas) {
127
+ if (gas === undefined) {
128
+ return undefined;
129
+ }
130
+ const parsedGas = new BigNumber(gas);
131
+ if (!parsedGas.isFinite() ||
132
+ parsedGas.isNaN() ||
133
+ !parsedGas.isInteger() ||
134
+ parsedGas.lte(0)) {
135
+ return undefined;
136
+ }
137
+ return parsedGas.toNumber();
138
+ }
139
+ //# sourceMappingURL=quote-gas.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote-gas.mjs","sourceRoot":"","sources":["../../src/utils/quote-gas.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { BatchTransactionParams } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getGasBuffer } from './feature-flags';\nimport { estimateGasLimit } from './gas';\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\n\nconst log = createModuleLogger(projectLogger, 'quote-gas');\n\nexport type QuoteGasTransaction = {\n chainId: Hex;\n data: Hex;\n from: Hex;\n gas?: number | string;\n to: Hex;\n value?: number | string | Hex;\n};\n\nexport type QuoteGasLimit = {\n estimate: number;\n max: number;\n};\n\nexport async function estimateQuoteGasLimits({\n fallbackGas,\n fallbackOnSimulationFailure = false,\n messenger,\n transactions,\n}: {\n fallbackGas?: {\n estimate: number;\n max: number;\n };\n fallbackOnSimulationFailure?: boolean;\n messenger: TransactionPayControllerMessenger;\n transactions: QuoteGasTransaction[];\n}): Promise<{\n batchGasLimit?: QuoteGasLimit;\n gasLimits: QuoteGasLimit[];\n is7702: boolean;\n totalGasEstimate: number;\n totalGasLimit: number;\n usedBatch: boolean;\n}> {\n if (transactions.length === 0) {\n throw new Error('Quote gas estimation requires at least one transaction');\n }\n\n const useBatch = transactions.length > 1;\n\n if (useBatch) {\n return {\n ...(await estimateQuoteGasLimitsBatch(transactions, messenger)),\n usedBatch: true,\n };\n }\n\n return {\n ...(await estimateQuoteGasLimitSingle({\n fallbackGas,\n fallbackOnSimulationFailure,\n messenger,\n transaction: transactions[0],\n })),\n is7702: false,\n usedBatch: false,\n };\n}\n\nasync function estimateQuoteGasLimitsBatch(\n transactions: QuoteGasTransaction[],\n messenger: TransactionPayControllerMessenger,\n): Promise<{\n batchGasLimit?: QuoteGasLimit;\n gasLimits: QuoteGasLimit[];\n is7702: boolean;\n totalGasEstimate: number;\n totalGasLimit: number;\n}> {\n const [firstTransaction] = transactions;\n const gasBuffer = getGasBuffer(messenger, firstTransaction.chainId);\n\n const paramGasLimits = transactions.map((transaction) =>\n parseGasLimit(transaction.gas),\n );\n\n const { gasLimits } = await messenger.call(\n 'TransactionController:estimateGasBatch',\n {\n chainId: firstTransaction.chainId,\n from: firstTransaction.from,\n transactions: transactions.map(toBatchTransactionParams),\n },\n );\n\n if (gasLimits.length !== 1 && gasLimits.length !== transactions.length) {\n throw new Error('Unexpected batch gas limit count');\n }\n\n const bufferedGasLimits = gasLimits.map((gasLimit, index) => {\n const providedGasLimit = paramGasLimits[index];\n const providedGasWasPreserved =\n providedGasLimit !== undefined && providedGasLimit === gasLimit;\n\n // Per-entry batch results currently preserve validated input gas values\n // for transactions that already provided gas. If that contract changes\n // and batch estimation returns a different value, treat it as a fresh\n // estimate and apply the buffer. A single combined 7702 result is always\n // buffered because it is a fresh batch estimate.\n const useBuffer = gasLimits.length === 1 || !providedGasWasPreserved;\n const bufferedGas = Math.ceil(gasLimit * (useBuffer ? gasBuffer : 1));\n\n return {\n estimate: bufferedGas,\n max: bufferedGas,\n };\n });\n\n const totalGasLimit = bufferedGasLimits.reduce(\n (acc, gasLimit) => acc + gasLimit.max,\n 0,\n );\n const is7702 = bufferedGasLimits.length === 1;\n const batchGasLimit = is7702 ? bufferedGasLimits[0] : undefined;\n\n return {\n ...(batchGasLimit ? { batchGasLimit } : {}),\n gasLimits: bufferedGasLimits,\n is7702,\n totalGasEstimate: totalGasLimit,\n totalGasLimit,\n };\n}\n\nasync function estimateQuoteGasLimitSingle({\n fallbackGas,\n fallbackOnSimulationFailure,\n messenger,\n transaction,\n}: {\n fallbackGas?: {\n estimate: number;\n max: number;\n };\n fallbackOnSimulationFailure: boolean;\n messenger: TransactionPayControllerMessenger;\n transaction: QuoteGasTransaction;\n}): Promise<{\n gasLimits: QuoteGasLimit[];\n totalGasEstimate: number;\n totalGasLimit: number;\n}> {\n const providedGasLimit = parseGasLimit(transaction.gas);\n\n if (providedGasLimit !== undefined) {\n log('Using provided gas limit', {\n chainId: transaction.chainId,\n gas: providedGasLimit,\n index: 0,\n to: transaction.to,\n });\n\n return {\n gasLimits: [\n {\n estimate: providedGasLimit,\n max: providedGasLimit,\n },\n ],\n totalGasEstimate: providedGasLimit,\n totalGasLimit: providedGasLimit,\n };\n }\n\n const gasLimitResult = await estimateGasLimit({\n chainId: transaction.chainId,\n data: transaction.data,\n fallbackGas,\n fallbackOnSimulationFailure,\n from: transaction.from,\n messenger,\n to: transaction.to,\n value: toHex(transaction.value ?? '0'),\n });\n\n if (gasLimitResult.usedFallback) {\n log('Gas estimate failed, using fallback', {\n chainId: transaction.chainId,\n error: gasLimitResult.error,\n index: 0,\n to: transaction.to,\n });\n }\n\n const gasLimit = {\n estimate: gasLimitResult.estimate,\n max: gasLimitResult.max,\n };\n\n return {\n gasLimits: [gasLimit],\n totalGasEstimate: gasLimit.estimate,\n totalGasLimit: gasLimit.max,\n };\n}\n\nfunction toBatchTransactionParams(\n transaction: QuoteGasTransaction,\n): BatchTransactionParams {\n return {\n data: transaction.data,\n gas: transaction.gas === undefined ? undefined : toHex(transaction.gas),\n maxFeePerGas: undefined,\n maxPriorityFeePerGas: undefined,\n to: transaction.to,\n value: toHex(transaction.value ?? '0'),\n };\n}\n\nfunction parseGasLimit(gas?: number | string): number | undefined {\n if (gas === undefined) {\n return undefined;\n }\n\n const parsedGas = new BigNumber(gas);\n\n if (\n !parsedGas.isFinite() ||\n parsedGas.isNaN() ||\n !parsedGas.isInteger() ||\n parsedGas.lte(0)\n ) {\n return undefined;\n }\n\n return parsedGas.toNumber();\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/transaction-pay-controller",
3
- "version": "17.0.0",
3
+ "version": "18.0.0",
4
4
  "description": "Manages alternate payment strategies to provide required funds for transactions in MetaMask",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -40,6 +40,7 @@
40
40
  "build:docs": "typedoc",
41
41
  "changelog:update": "../../scripts/update-changelog.sh @metamask/transaction-pay-controller",
42
42
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/transaction-pay-controller",
43
+ "generate-method-action-types": "tsx ../../scripts/generate-method-action-types.ts",
43
44
  "prepare-manifest:preview": "../../scripts/prepare-preview-manifest.sh",
44
45
  "since-latest-release": "../../scripts/since-latest-release.sh",
45
46
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter",
@@ -51,18 +52,18 @@
51
52
  "@ethersproject/abi": "^5.7.0",
52
53
  "@ethersproject/contracts": "^5.7.0",
53
54
  "@ethersproject/providers": "^5.7.0",
54
- "@metamask/assets-controller": "^2.3.0",
55
- "@metamask/assets-controllers": "^100.2.1",
55
+ "@metamask/assets-controller": "^3.0.0",
56
+ "@metamask/assets-controllers": "^101.0.1",
56
57
  "@metamask/base-controller": "^9.0.0",
57
- "@metamask/bridge-controller": "^69.1.0",
58
- "@metamask/bridge-status-controller": "^68.1.0",
58
+ "@metamask/bridge-controller": "^69.1.1",
59
+ "@metamask/bridge-status-controller": "^70.0.0",
59
60
  "@metamask/controller-utils": "^11.19.0",
60
- "@metamask/gas-fee-controller": "^26.0.3",
61
+ "@metamask/gas-fee-controller": "^26.1.0",
61
62
  "@metamask/messenger": "^0.3.0",
62
63
  "@metamask/metamask-eth-abis": "^3.1.1",
63
64
  "@metamask/network-controller": "^30.0.0",
64
65
  "@metamask/remote-feature-flag-controller": "^4.1.0",
65
- "@metamask/transaction-controller": "^62.22.0",
66
+ "@metamask/transaction-controller": "^63.0.0",
66
67
  "@metamask/utils": "^11.9.0",
67
68
  "bignumber.js": "^9.1.2",
68
69
  "bn.js": "^5.2.1",
@@ -76,6 +77,7 @@
76
77
  "deepmerge": "^4.2.2",
77
78
  "jest": "^29.7.0",
78
79
  "ts-jest": "^29.2.5",
80
+ "tsx": "^4.20.5",
79
81
  "typedoc": "^0.25.13",
80
82
  "typedoc-plugin-missing-exports": "^2.0.0",
81
83
  "typescript": "~5.3.3"