@metamask-previews/transaction-pay-controller 16.2.0-preview-8c978cc75 → 16.3.0-preview-15dd7d63f
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.
- package/CHANGELOG.md +17 -1
- package/dist/TransactionPayController.cjs +2 -0
- package/dist/TransactionPayController.cjs.map +1 -1
- package/dist/TransactionPayController.d.cts.map +1 -1
- package/dist/TransactionPayController.d.mts.map +1 -1
- package/dist/TransactionPayController.mjs +2 -0
- package/dist/TransactionPayController.mjs.map +1 -1
- package/dist/strategy/relay/gas-station.cjs +92 -0
- package/dist/strategy/relay/gas-station.cjs.map +1 -0
- package/dist/strategy/relay/gas-station.d.cts +22 -0
- package/dist/strategy/relay/gas-station.d.cts.map +1 -0
- package/dist/strategy/relay/gas-station.d.mts +22 -0
- package/dist/strategy/relay/gas-station.d.mts.map +1 -0
- package/dist/strategy/relay/gas-station.mjs +87 -0
- package/dist/strategy/relay/gas-station.mjs.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.cjs +242 -0
- package/dist/strategy/relay/relay-max-gas-station.cjs.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.d.cts +22 -0
- package/dist/strategy/relay/relay-max-gas-station.d.cts.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.d.mts +22 -0
- package/dist/strategy/relay/relay-max-gas-station.d.mts.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.mjs +238 -0
- package/dist/strategy/relay/relay-max-gas-station.mjs.map +1 -0
- package/dist/strategy/relay/relay-quotes.cjs +32 -40
- package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
- package/dist/strategy/relay/relay-quotes.mjs +34 -42
- package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
- package/dist/strategy/relay/types.cjs.map +1 -1
- package/dist/strategy/relay/types.d.cts +1 -0
- package/dist/strategy/relay/types.d.cts.map +1 -1
- package/dist/strategy/relay/types.d.mts +1 -0
- package/dist/strategy/relay/types.d.mts.map +1 -1
- package/dist/strategy/relay/types.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +20 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +20 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/quotes.cjs +8 -3
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.d.cts.map +1 -1
- package/dist/utils/quotes.d.mts.map +1 -1
- package/dist/utils/quotes.mjs +8 -3
- package/dist/utils/quotes.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Adds a dedicated max-amount gas-station fallback flow for Relay quoting ([#7927](https://github.com/MetaMask/core/pull/7927))
|
|
13
|
+
|
|
14
|
+
## [16.3.0]
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Add optional `refundTo` field to `TransactionConfig`, `TransactionData`, and `QuoteRequest` types, allowing callers to specify an address that receives refunds if a Relay transaction fails ([#8112](https://github.com/MetaMask/core/pull/8112))
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Bump `@metamask/assets-controllers` from `^100.0.3` to `^100.1.0` ([#8107](https://github.com/MetaMask/core/pull/8107))
|
|
23
|
+
- Bump `@metamask/transaction-controller` from `^62.19.0` to `^62.20.0` ([#8104](https://github.com/MetaMask/core/pull/8104))
|
|
24
|
+
|
|
10
25
|
## [16.2.0]
|
|
11
26
|
|
|
12
27
|
### Changed
|
|
@@ -465,7 +480,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
465
480
|
|
|
466
481
|
- Initial release ([#6820](https://github.com/MetaMask/core/pull/6820))
|
|
467
482
|
|
|
468
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@16.
|
|
483
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@16.3.0...HEAD
|
|
484
|
+
[16.3.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@16.2.0...@metamask/transaction-pay-controller@16.3.0
|
|
469
485
|
[16.2.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@16.1.2...@metamask/transaction-pay-controller@16.2.0
|
|
470
486
|
[16.1.2]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@16.1.1...@metamask/transaction-pay-controller@16.1.2
|
|
471
487
|
[16.1.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@16.1.0...@metamask/transaction-pay-controller@16.1.1
|
|
@@ -62,10 +62,12 @@ class TransactionPayController extends base_controller_1.BaseController {
|
|
|
62
62
|
const config = {
|
|
63
63
|
isMaxAmount: transactionData.isMaxAmount,
|
|
64
64
|
isPostQuote: transactionData.isPostQuote,
|
|
65
|
+
refundTo: transactionData.refundTo,
|
|
65
66
|
};
|
|
66
67
|
callback(config);
|
|
67
68
|
transactionData.isMaxAmount = config.isMaxAmount;
|
|
68
69
|
transactionData.isPostQuote = config.isPostQuote;
|
|
70
|
+
transactionData.refundTo = config.refundTo;
|
|
69
71
|
});
|
|
70
72
|
}
|
|
71
73
|
updatePaymentToken(request) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.cjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.#registerActionHandlers();\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n });\n }\n\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #registerActionHandlers(): void {\n this.messenger.registerActionHandler(\n 'TransactionPayController:getDelegationTransaction',\n this.#getDelegationTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:getStrategy',\n (transaction: TransactionMeta): TransactionPayStrategy =>\n this.#getStrategiesWithFallback(transaction)[0],\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:setTransactionConfig',\n this.setTransactionConfig.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:updatePaymentToken',\n this.updatePaymentToken.bind(this),\n );\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n return validStrategies.length\n ? validStrategies\n : getStrategyOrder(this.messenger);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionPayController.cjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.#registerActionHandlers();\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #registerActionHandlers(): void {\n this.messenger.registerActionHandler(\n 'TransactionPayController:getDelegationTransaction',\n this.#getDelegationTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:getStrategy',\n (transaction: TransactionMeta): TransactionPayStrategy =>\n this.#getStrategiesWithFallback(transaction)[0],\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:setTransactionConfig',\n this.setTransactionConfig.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:updatePaymentToken',\n this.updatePaymentToken.bind(this),\n );\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n return validStrategies.length\n ? validStrategies\n : getStrategyOrder(this.messenger);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.d.cts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAM3D,OAAO,EACL,eAAe,EAGhB,wBAAoB;AAErB,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EAC1B,oBAAgB;AAmBjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA4BlC,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;
|
|
1
|
+
{"version":3,"file":"TransactionPayController.d.cts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAM3D,OAAO,EACL,eAAe,EAGhB,wBAAoB;AAErB,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EAC1B,oBAAgB;AAmBjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA4BlC,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IAgBP,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;CA6G7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.d.mts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAM3D,OAAO,EACL,eAAe,EAGhB,wBAAoB;AAErB,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EAC1B,oBAAgB;AAmBjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA4BlC,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;
|
|
1
|
+
{"version":3,"file":"TransactionPayController.d.mts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAM3D,OAAO,EACL,eAAe,EAGhB,wBAAoB;AAErB,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EAC1B,oBAAgB;AAmBjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA4BlC,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IAgBP,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;CA6G7D"}
|
|
@@ -60,10 +60,12 @@ export class TransactionPayController extends BaseController {
|
|
|
60
60
|
const config = {
|
|
61
61
|
isMaxAmount: transactionData.isMaxAmount,
|
|
62
62
|
isPostQuote: transactionData.isPostQuote,
|
|
63
|
+
refundTo: transactionData.refundTo,
|
|
63
64
|
};
|
|
64
65
|
callback(config);
|
|
65
66
|
transactionData.isMaxAmount = config.isMaxAmount;
|
|
66
67
|
transactionData.isPostQuote = config.isPostQuote;
|
|
68
|
+
transactionData.refundTo = config.refundTo;
|
|
67
69
|
});
|
|
68
70
|
}
|
|
69
71
|
updatePaymentToken(request) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.mjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.#registerActionHandlers();\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n });\n }\n\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #registerActionHandlers(): void {\n this.messenger.registerActionHandler(\n 'TransactionPayController:getDelegationTransaction',\n this.#getDelegationTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:getStrategy',\n (transaction: TransactionMeta): TransactionPayStrategy =>\n this.#getStrategiesWithFallback(transaction)[0],\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:setTransactionConfig',\n this.setTransactionConfig.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:updatePaymentToken',\n this.updatePaymentToken.bind(this),\n );\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n return validStrategies.length\n ? validStrategies\n : getStrategyOrder(this.messenger);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionPayController.mjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;;;AAK3D,OAAO,EAAE,kBAAkB,EAAE,2CAAuC;AACpE,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACvB,wBAAoB;AACrB,OAAO,EAAE,cAAc,EAAE,qCAAiC;AAU1D,OAAO,EAAE,gBAAgB,EAAE,kCAA8B;AACzD,OAAO,EAAE,YAAY,EAAE,2BAAuB;AAC9C,OAAO,EAAE,mBAAmB,EAAE,mCAA+B;AAC7D,OAAO,EAAE,sBAAsB,EAAE,gCAA4B;AAE7D,MAAM,aAAa,GAAiD;IAClE,eAAe,EAAE;QACf,sBAAsB,EAAE,KAAK;QAC7B,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,GAAkC,EAAE,CAAC,CAAC;IAC5D,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,OAAO,wBAAyB,SAAQ,cAI7C;IAWC,YAAY,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GAC2B;QAChC,KAAK,CAAC;YACJ,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,EAAE,GAAG,KAAK,EAAE;SAC1C,CAAC,CAAC;;QAtBI,qEAA4D;QAE5D,wDAEmB;QAEnB,0DAEqB;QAgB5B,uBAAA,IAAI,sDAA6B,wBAAwB,MAAA,CAAC;QAC1D,uBAAA,IAAI,yCAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,2CAAkB,aAAa,MAAA,CAAC;QAEpC,uBAAA,IAAI,6FAAwB,MAA5B,IAAI,CAA0B,CAAC;QAE/B,sBAAsB,CACpB,SAAS,EACT,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EACtC,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;QAEF,kCAAkC;QAClC,IAAI,cAAc,CAAC;YACjB,aAAa,EAAE,uBAAA,IAAI,gGAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,SAAS;YACT,qBAAqB,EAAE,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB,CAClB,aAAqB,EACrB,QAAmC;QAEnC,uBAAA,IAAI,4FAAuB,MAA3B,IAAI,EAAwB,aAAa,EAAE,CAAC,eAAe,EAAE,EAAE;YAC7D,MAAM,MAAM,GAAG;gBACb,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,QAAQ,EAAE,eAAe,CAAC,QAAQ;aACnC,CAAC;YAEF,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEjB,eAAe,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACjD,eAAe,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACjD,eAAe,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,OAAkC;QACnD,kBAAkB,CAAC,OAAO,EAAE;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,qBAAqB,EAAE,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;CAwGF;oVAtGwB,aAAqB;IAC1C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,OAAO,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,6GAGC,aAAqB,EACrB,EAAqD;IAErD,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;QAClC,IAAI,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,oBAAoB,GAAG,OAAO,EAAE,YAAY,CAAC;QACnD,MAAM,cAAc,GAAG,OAAO,EAAE,MAAM,CAAC;QACvC,MAAM,mBAAmB,GAAG,OAAO,EAAE,WAAW,CAAC;QACjD,MAAM,mBAAmB,GAAG,OAAO,EAAE,WAAW,CAAC;QAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,eAAe,CAAC,aAAa,CAAC,GAAG;gBAC/B,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;QAED,EAAE,CAAC,OAAO,CAAC,CAAC;QAEZ,MAAM,qBAAqB,GACzB,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE;YAC1C,oBAAoB,EAAE,OAAO,EAAE,WAAW,EAAE;YAC9C,OAAO,CAAC,YAAY,EAAE,OAAO,KAAK,oBAAoB,EAAE,OAAO,CAAC;QAElE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,KAAK,cAAc,CAAC;QAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,KAAK,mBAAmB,CAAC;QACnE,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,KAAK,mBAAmB,CAAC;QAEvE,IACE,qBAAqB;YACrB,cAAc;YACd,eAAe;YACf,kBAAkB,EAClB,CAAC;YACD,mBAAmB,CAAC,aAAa,EAAE,OAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAErE,kBAAkB,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,kBAAkB,EAAE,CAAC;QACvB,YAAY,CAAC;YACX,aAAa,EAAE,uBAAA,IAAI,gGAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC;YAC1D,aAAa;YACb,qBAAqB,EAAE,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;IAGC,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,mDAAmD,EACnD,uBAAA,IAAI,0DAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1C,CAAC;IAEF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,sCAAsC,EACtC,CAAC,WAA4B,EAA0B,EAAE,CACvD,uBAAA,IAAI,gGAA2B,MAA/B,IAAI,EAA4B,WAAW,CAAC,CAAC,CAAC,CAAC,CAClD,CAAC;IAEF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,+CAA+C,EAC/C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CACrC,CAAC;IAEF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,6CAA6C,EAC7C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CACnC,CAAC;AACJ,CAAC,qHAGC,WAA4B;IAE5B,MAAM,kBAAkB,GACtB,uBAAA,IAAI,+CAAe,EAAE,KAArB,IAAI,EAAkB,WAAW,CAAC;QAClC,CAAC,uBAAA,IAAI,6CAAa,CAAC,CAAC,CAAC,CAAC,uBAAA,IAAI,6CAAa,MAAjB,IAAI,EAAc,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9D,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAC/C,CAAC,QAAQ,EAAsC,EAAE,CAC/C,wBAAwB,CAAC,QAAQ,CAAC,CACrC,CAAC;IAEF,OAAO,eAAe,CAAC,MAAM;QAC3B,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.#registerActionHandlers();\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #registerActionHandlers(): void {\n this.messenger.registerActionHandler(\n 'TransactionPayController:getDelegationTransaction',\n this.#getDelegationTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:getStrategy',\n (transaction: TransactionMeta): TransactionPayStrategy =>\n this.#getStrategiesWithFallback(transaction)[0],\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:setTransactionConfig',\n this.setTransactionConfig.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'TransactionPayController:updatePaymentToken',\n this.updatePaymentToken.bind(this),\n );\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n return validStrategies.length\n ? validStrategies\n : getStrategyOrder(this.messenger);\n }\n}\n"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGasStationCostInSourceTokenRaw = exports.getGasStationEligibility = void 0;
|
|
4
|
+
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
|
+
const utils_1 = require("@metamask/utils");
|
|
6
|
+
const bignumber_js_1 = require("bignumber.js");
|
|
7
|
+
const logger_1 = require("../../logger.cjs");
|
|
8
|
+
const feature_flags_1 = require("../../utils/feature-flags.cjs");
|
|
9
|
+
const gas_1 = require("../../utils/gas.cjs");
|
|
10
|
+
const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'relay-gas-station');
|
|
11
|
+
function getGasStationEligibility(messenger, sourceChainId) {
|
|
12
|
+
const { relayDisabledGasStationChains } = (0, feature_flags_1.getFeatureFlags)(messenger);
|
|
13
|
+
const supportedChains = (0, feature_flags_1.getEIP7702SupportedChains)(messenger);
|
|
14
|
+
const chainSupportsGasStation = supportedChains.some((supportedChainId) => supportedChainId.toLowerCase() === sourceChainId.toLowerCase());
|
|
15
|
+
const isDisabledChain = relayDisabledGasStationChains.includes(sourceChainId);
|
|
16
|
+
return {
|
|
17
|
+
chainSupportsGasStation,
|
|
18
|
+
isDisabledChain,
|
|
19
|
+
isEligible: !isDisabledChain && chainSupportsGasStation,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
exports.getGasStationEligibility = getGasStationEligibility;
|
|
23
|
+
async function getGasStationCostInSourceTokenRaw({ firstStepData, messenger, request, totalGasEstimate, totalItemCount, }) {
|
|
24
|
+
const { data, to, value } = firstStepData;
|
|
25
|
+
const { from, sourceChainId, sourceTokenAddress } = request;
|
|
26
|
+
let gasFeeTokens;
|
|
27
|
+
try {
|
|
28
|
+
gasFeeTokens = await messenger.call('TransactionController:getGasFeeTokens', {
|
|
29
|
+
chainId: sourceChainId,
|
|
30
|
+
data,
|
|
31
|
+
from,
|
|
32
|
+
to,
|
|
33
|
+
value: (0, controller_utils_1.toHex)(value ?? '0'),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
log('Failed to estimate gas fee tokens', {
|
|
38
|
+
error,
|
|
39
|
+
sourceChainId,
|
|
40
|
+
});
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const gasFeeToken = gasFeeTokens.find((singleGasFeeToken) => singleGasFeeToken.tokenAddress.toLowerCase() ===
|
|
44
|
+
sourceTokenAddress.toLowerCase());
|
|
45
|
+
if (!gasFeeToken) {
|
|
46
|
+
log('No matching source token in gas fee token estimate', {
|
|
47
|
+
sourceTokenAddress,
|
|
48
|
+
sourceChainId,
|
|
49
|
+
});
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const gasFeeTokenWithNormalizedAmount = {
|
|
53
|
+
...gasFeeToken,
|
|
54
|
+
amount: (0, controller_utils_1.toHex)(getNormalizedGasFeeTokenAmount({
|
|
55
|
+
gasFeeToken,
|
|
56
|
+
totalGasEstimate,
|
|
57
|
+
totalItemCount,
|
|
58
|
+
})),
|
|
59
|
+
};
|
|
60
|
+
const gasFeeTokenCost = (0, gas_1.calculateGasFeeTokenCost)({
|
|
61
|
+
chainId: sourceChainId,
|
|
62
|
+
gasFeeToken: gasFeeTokenWithNormalizedAmount,
|
|
63
|
+
messenger,
|
|
64
|
+
});
|
|
65
|
+
if (!gasFeeTokenCost) {
|
|
66
|
+
log('Unable to calculate gas fee token cost using fiat rates', {
|
|
67
|
+
sourceTokenAddress,
|
|
68
|
+
sourceChainId,
|
|
69
|
+
});
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
log('Estimated gas station cost for source token', {
|
|
73
|
+
amount: gasFeeTokenCost.raw,
|
|
74
|
+
sourceTokenAddress,
|
|
75
|
+
sourceChainId,
|
|
76
|
+
});
|
|
77
|
+
return gasFeeTokenCost;
|
|
78
|
+
}
|
|
79
|
+
exports.getGasStationCostInSourceTokenRaw = getGasStationCostInSourceTokenRaw;
|
|
80
|
+
function getNormalizedGasFeeTokenAmount({ gasFeeToken, totalGasEstimate, totalItemCount, }) {
|
|
81
|
+
let amount = new bignumber_js_1.BigNumber(gasFeeToken.amount);
|
|
82
|
+
if (totalItemCount > 1) {
|
|
83
|
+
const gas = new bignumber_js_1.BigNumber(gasFeeToken.gas);
|
|
84
|
+
const gasFeeAmount = new bignumber_js_1.BigNumber(gasFeeToken.amount);
|
|
85
|
+
if (totalGasEstimate > 0 && gas.isGreaterThan(0)) {
|
|
86
|
+
const gasRate = gasFeeAmount.dividedBy(gas);
|
|
87
|
+
amount = gasRate.multipliedBy(totalGasEstimate);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return amount.integerValue(bignumber_js_1.BigNumber.ROUND_CEIL).toFixed(0);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=gas-station.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas-station.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/gas-station.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { GasFeeToken } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n QuoteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n getEIP7702SupportedChains,\n getFeatureFlags,\n} from '../../utils/feature-flags';\nimport { calculateGasFeeTokenCost } from '../../utils/gas';\n\nconst log = createModuleLogger(projectLogger, 'relay-gas-station');\n\ntype GasStationCostParams = {\n firstStepData: {\n data: Hex;\n to: Hex;\n value?: string;\n };\n messenger: TransactionPayControllerMessenger;\n request: Pick<QuoteRequest, 'from' | 'sourceChainId' | 'sourceTokenAddress'>;\n totalGasEstimate: number;\n totalItemCount: number;\n};\n\nexport type GasStationEligibility = {\n chainSupportsGasStation: boolean;\n isDisabledChain: boolean;\n isEligible: boolean;\n};\n\nexport function getGasStationEligibility(\n messenger: TransactionPayControllerMessenger,\n sourceChainId: QuoteRequest['sourceChainId'],\n): GasStationEligibility {\n const { relayDisabledGasStationChains } = getFeatureFlags(messenger);\n const supportedChains = getEIP7702SupportedChains(messenger);\n const chainSupportsGasStation = supportedChains.some(\n (supportedChainId) =>\n supportedChainId.toLowerCase() === sourceChainId.toLowerCase(),\n );\n\n const isDisabledChain = relayDisabledGasStationChains.includes(sourceChainId);\n\n return {\n chainSupportsGasStation,\n isDisabledChain,\n isEligible: !isDisabledChain && chainSupportsGasStation,\n };\n}\n\nexport async function getGasStationCostInSourceTokenRaw({\n firstStepData,\n messenger,\n request,\n totalGasEstimate,\n totalItemCount,\n}: GasStationCostParams): Promise<Amount | undefined> {\n const { data, to, value } = firstStepData;\n const { from, sourceChainId, sourceTokenAddress } = request;\n\n let gasFeeTokens: GasFeeToken[];\n\n try {\n gasFeeTokens = await messenger.call(\n 'TransactionController:getGasFeeTokens',\n {\n chainId: sourceChainId,\n data,\n from,\n to,\n value: toHex(value ?? '0'),\n },\n );\n } catch (error) {\n log('Failed to estimate gas fee tokens', {\n error,\n sourceChainId,\n });\n return undefined;\n }\n\n const gasFeeToken = gasFeeTokens.find(\n (singleGasFeeToken) =>\n singleGasFeeToken.tokenAddress.toLowerCase() ===\n sourceTokenAddress.toLowerCase(),\n );\n\n if (!gasFeeToken) {\n log('No matching source token in gas fee token estimate', {\n sourceTokenAddress,\n sourceChainId,\n });\n return undefined;\n }\n\n const gasFeeTokenWithNormalizedAmount = {\n ...gasFeeToken,\n amount: toHex(\n getNormalizedGasFeeTokenAmount({\n gasFeeToken,\n totalGasEstimate,\n totalItemCount,\n }),\n ),\n };\n\n const gasFeeTokenCost = calculateGasFeeTokenCost({\n chainId: sourceChainId,\n gasFeeToken: gasFeeTokenWithNormalizedAmount,\n messenger,\n });\n\n if (!gasFeeTokenCost) {\n log('Unable to calculate gas fee token cost using fiat rates', {\n sourceTokenAddress,\n sourceChainId,\n });\n return undefined;\n }\n\n log('Estimated gas station cost for source token', {\n amount: gasFeeTokenCost.raw,\n sourceTokenAddress,\n sourceChainId,\n });\n\n return gasFeeTokenCost;\n}\n\nfunction getNormalizedGasFeeTokenAmount({\n gasFeeToken,\n totalGasEstimate,\n totalItemCount,\n}: {\n gasFeeToken: GasFeeToken;\n totalGasEstimate: number;\n totalItemCount: number;\n}): string {\n let amount = new BigNumber(gasFeeToken.amount);\n\n if (totalItemCount > 1) {\n const gas = new BigNumber(gasFeeToken.gas);\n const gasFeeAmount = new BigNumber(gasFeeToken.amount);\n\n if (totalGasEstimate > 0 && gas.isGreaterThan(0)) {\n const gasRate = gasFeeAmount.dividedBy(gas);\n amount = gasRate.multipliedBy(totalGasEstimate);\n }\n }\n\n return amount.integerValue(BigNumber.ROUND_CEIL).toFixed(0);\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { Amount, QuoteRequest, TransactionPayControllerMessenger } from "../../types.cjs";
|
|
3
|
+
type GasStationCostParams = {
|
|
4
|
+
firstStepData: {
|
|
5
|
+
data: Hex;
|
|
6
|
+
to: Hex;
|
|
7
|
+
value?: string;
|
|
8
|
+
};
|
|
9
|
+
messenger: TransactionPayControllerMessenger;
|
|
10
|
+
request: Pick<QuoteRequest, 'from' | 'sourceChainId' | 'sourceTokenAddress'>;
|
|
11
|
+
totalGasEstimate: number;
|
|
12
|
+
totalItemCount: number;
|
|
13
|
+
};
|
|
14
|
+
export type GasStationEligibility = {
|
|
15
|
+
chainSupportsGasStation: boolean;
|
|
16
|
+
isDisabledChain: boolean;
|
|
17
|
+
isEligible: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function getGasStationEligibility(messenger: TransactionPayControllerMessenger, sourceChainId: QuoteRequest['sourceChainId']): GasStationEligibility;
|
|
20
|
+
export declare function getGasStationCostInSourceTokenRaw({ firstStepData, messenger, request, totalGasEstimate, totalItemCount, }: GasStationCostParams): Promise<Amount | undefined>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=gas-station.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas-station.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/gas-station.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,iCAAiC,EAClC,wBAAoB;AASrB,KAAK,oBAAoB,GAAG;IAC1B,aAAa,EAAE;QACb,IAAI,EAAE,GAAG,CAAC;QACV,EAAE,EAAE,GAAG,CAAC;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,iCAAiC,CAAC;IAC7C,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,GAAG,oBAAoB,CAAC,CAAC;IAC7E,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,uBAAuB,EAAE,OAAO,CAAC;IACjC,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,iCAAiC,EAC5C,aAAa,EAAE,YAAY,CAAC,eAAe,CAAC,GAC3C,qBAAqB,CAevB;AAED,wBAAsB,iCAAiC,CAAC,EACtD,aAAa,EACb,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,cAAc,GACf,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuEpD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { Amount, QuoteRequest, TransactionPayControllerMessenger } from "../../types.mjs";
|
|
3
|
+
type GasStationCostParams = {
|
|
4
|
+
firstStepData: {
|
|
5
|
+
data: Hex;
|
|
6
|
+
to: Hex;
|
|
7
|
+
value?: string;
|
|
8
|
+
};
|
|
9
|
+
messenger: TransactionPayControllerMessenger;
|
|
10
|
+
request: Pick<QuoteRequest, 'from' | 'sourceChainId' | 'sourceTokenAddress'>;
|
|
11
|
+
totalGasEstimate: number;
|
|
12
|
+
totalItemCount: number;
|
|
13
|
+
};
|
|
14
|
+
export type GasStationEligibility = {
|
|
15
|
+
chainSupportsGasStation: boolean;
|
|
16
|
+
isDisabledChain: boolean;
|
|
17
|
+
isEligible: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function getGasStationEligibility(messenger: TransactionPayControllerMessenger, sourceChainId: QuoteRequest['sourceChainId']): GasStationEligibility;
|
|
20
|
+
export declare function getGasStationCostInSourceTokenRaw({ firstStepData, messenger, request, totalGasEstimate, totalItemCount, }: GasStationCostParams): Promise<Amount | undefined>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=gas-station.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas-station.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/gas-station.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,iCAAiC,EAClC,wBAAoB;AASrB,KAAK,oBAAoB,GAAG;IAC1B,aAAa,EAAE;QACb,IAAI,EAAE,GAAG,CAAC;QACV,EAAE,EAAE,GAAG,CAAC;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,iCAAiC,CAAC;IAC7C,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,GAAG,oBAAoB,CAAC,CAAC;IAC7E,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,uBAAuB,EAAE,OAAO,CAAC;IACjC,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,iCAAiC,EAC5C,aAAa,EAAE,YAAY,CAAC,eAAe,CAAC,GAC3C,qBAAqB,CAevB;AAED,wBAAsB,iCAAiC,CAAC,EACtD,aAAa,EACb,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,cAAc,GACf,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuEpD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { toHex } from "@metamask/controller-utils";
|
|
2
|
+
import { createModuleLogger } from "@metamask/utils";
|
|
3
|
+
import { BigNumber } from "bignumber.js";
|
|
4
|
+
import { projectLogger } from "../../logger.mjs";
|
|
5
|
+
import { getEIP7702SupportedChains, getFeatureFlags } from "../../utils/feature-flags.mjs";
|
|
6
|
+
import { calculateGasFeeTokenCost } from "../../utils/gas.mjs";
|
|
7
|
+
const log = createModuleLogger(projectLogger, 'relay-gas-station');
|
|
8
|
+
export function getGasStationEligibility(messenger, sourceChainId) {
|
|
9
|
+
const { relayDisabledGasStationChains } = getFeatureFlags(messenger);
|
|
10
|
+
const supportedChains = getEIP7702SupportedChains(messenger);
|
|
11
|
+
const chainSupportsGasStation = supportedChains.some((supportedChainId) => supportedChainId.toLowerCase() === sourceChainId.toLowerCase());
|
|
12
|
+
const isDisabledChain = relayDisabledGasStationChains.includes(sourceChainId);
|
|
13
|
+
return {
|
|
14
|
+
chainSupportsGasStation,
|
|
15
|
+
isDisabledChain,
|
|
16
|
+
isEligible: !isDisabledChain && chainSupportsGasStation,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function getGasStationCostInSourceTokenRaw({ firstStepData, messenger, request, totalGasEstimate, totalItemCount, }) {
|
|
20
|
+
const { data, to, value } = firstStepData;
|
|
21
|
+
const { from, sourceChainId, sourceTokenAddress } = request;
|
|
22
|
+
let gasFeeTokens;
|
|
23
|
+
try {
|
|
24
|
+
gasFeeTokens = await messenger.call('TransactionController:getGasFeeTokens', {
|
|
25
|
+
chainId: sourceChainId,
|
|
26
|
+
data,
|
|
27
|
+
from,
|
|
28
|
+
to,
|
|
29
|
+
value: toHex(value ?? '0'),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
log('Failed to estimate gas fee tokens', {
|
|
34
|
+
error,
|
|
35
|
+
sourceChainId,
|
|
36
|
+
});
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const gasFeeToken = gasFeeTokens.find((singleGasFeeToken) => singleGasFeeToken.tokenAddress.toLowerCase() ===
|
|
40
|
+
sourceTokenAddress.toLowerCase());
|
|
41
|
+
if (!gasFeeToken) {
|
|
42
|
+
log('No matching source token in gas fee token estimate', {
|
|
43
|
+
sourceTokenAddress,
|
|
44
|
+
sourceChainId,
|
|
45
|
+
});
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const gasFeeTokenWithNormalizedAmount = {
|
|
49
|
+
...gasFeeToken,
|
|
50
|
+
amount: toHex(getNormalizedGasFeeTokenAmount({
|
|
51
|
+
gasFeeToken,
|
|
52
|
+
totalGasEstimate,
|
|
53
|
+
totalItemCount,
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
const gasFeeTokenCost = calculateGasFeeTokenCost({
|
|
57
|
+
chainId: sourceChainId,
|
|
58
|
+
gasFeeToken: gasFeeTokenWithNormalizedAmount,
|
|
59
|
+
messenger,
|
|
60
|
+
});
|
|
61
|
+
if (!gasFeeTokenCost) {
|
|
62
|
+
log('Unable to calculate gas fee token cost using fiat rates', {
|
|
63
|
+
sourceTokenAddress,
|
|
64
|
+
sourceChainId,
|
|
65
|
+
});
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
log('Estimated gas station cost for source token', {
|
|
69
|
+
amount: gasFeeTokenCost.raw,
|
|
70
|
+
sourceTokenAddress,
|
|
71
|
+
sourceChainId,
|
|
72
|
+
});
|
|
73
|
+
return gasFeeTokenCost;
|
|
74
|
+
}
|
|
75
|
+
function getNormalizedGasFeeTokenAmount({ gasFeeToken, totalGasEstimate, totalItemCount, }) {
|
|
76
|
+
let amount = new BigNumber(gasFeeToken.amount);
|
|
77
|
+
if (totalItemCount > 1) {
|
|
78
|
+
const gas = new BigNumber(gasFeeToken.gas);
|
|
79
|
+
const gasFeeAmount = new BigNumber(gasFeeToken.amount);
|
|
80
|
+
if (totalGasEstimate > 0 && gas.isGreaterThan(0)) {
|
|
81
|
+
const gasRate = gasFeeAmount.dividedBy(gas);
|
|
82
|
+
amount = gasRate.multipliedBy(totalGasEstimate);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return amount.integerValue(BigNumber.ROUND_CEIL).toFixed(0);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=gas-station.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas-station.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/gas-station.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { GasFeeToken } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n QuoteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n getEIP7702SupportedChains,\n getFeatureFlags,\n} from '../../utils/feature-flags';\nimport { calculateGasFeeTokenCost } from '../../utils/gas';\n\nconst log = createModuleLogger(projectLogger, 'relay-gas-station');\n\ntype GasStationCostParams = {\n firstStepData: {\n data: Hex;\n to: Hex;\n value?: string;\n };\n messenger: TransactionPayControllerMessenger;\n request: Pick<QuoteRequest, 'from' | 'sourceChainId' | 'sourceTokenAddress'>;\n totalGasEstimate: number;\n totalItemCount: number;\n};\n\nexport type GasStationEligibility = {\n chainSupportsGasStation: boolean;\n isDisabledChain: boolean;\n isEligible: boolean;\n};\n\nexport function getGasStationEligibility(\n messenger: TransactionPayControllerMessenger,\n sourceChainId: QuoteRequest['sourceChainId'],\n): GasStationEligibility {\n const { relayDisabledGasStationChains } = getFeatureFlags(messenger);\n const supportedChains = getEIP7702SupportedChains(messenger);\n const chainSupportsGasStation = supportedChains.some(\n (supportedChainId) =>\n supportedChainId.toLowerCase() === sourceChainId.toLowerCase(),\n );\n\n const isDisabledChain = relayDisabledGasStationChains.includes(sourceChainId);\n\n return {\n chainSupportsGasStation,\n isDisabledChain,\n isEligible: !isDisabledChain && chainSupportsGasStation,\n };\n}\n\nexport async function getGasStationCostInSourceTokenRaw({\n firstStepData,\n messenger,\n request,\n totalGasEstimate,\n totalItemCount,\n}: GasStationCostParams): Promise<Amount | undefined> {\n const { data, to, value } = firstStepData;\n const { from, sourceChainId, sourceTokenAddress } = request;\n\n let gasFeeTokens: GasFeeToken[];\n\n try {\n gasFeeTokens = await messenger.call(\n 'TransactionController:getGasFeeTokens',\n {\n chainId: sourceChainId,\n data,\n from,\n to,\n value: toHex(value ?? '0'),\n },\n );\n } catch (error) {\n log('Failed to estimate gas fee tokens', {\n error,\n sourceChainId,\n });\n return undefined;\n }\n\n const gasFeeToken = gasFeeTokens.find(\n (singleGasFeeToken) =>\n singleGasFeeToken.tokenAddress.toLowerCase() ===\n sourceTokenAddress.toLowerCase(),\n );\n\n if (!gasFeeToken) {\n log('No matching source token in gas fee token estimate', {\n sourceTokenAddress,\n sourceChainId,\n });\n return undefined;\n }\n\n const gasFeeTokenWithNormalizedAmount = {\n ...gasFeeToken,\n amount: toHex(\n getNormalizedGasFeeTokenAmount({\n gasFeeToken,\n totalGasEstimate,\n totalItemCount,\n }),\n ),\n };\n\n const gasFeeTokenCost = calculateGasFeeTokenCost({\n chainId: sourceChainId,\n gasFeeToken: gasFeeTokenWithNormalizedAmount,\n messenger,\n });\n\n if (!gasFeeTokenCost) {\n log('Unable to calculate gas fee token cost using fiat rates', {\n sourceTokenAddress,\n sourceChainId,\n });\n return undefined;\n }\n\n log('Estimated gas station cost for source token', {\n amount: gasFeeTokenCost.raw,\n sourceTokenAddress,\n sourceChainId,\n });\n\n return gasFeeTokenCost;\n}\n\nfunction getNormalizedGasFeeTokenAmount({\n gasFeeToken,\n totalGasEstimate,\n totalItemCount,\n}: {\n gasFeeToken: GasFeeToken;\n totalGasEstimate: number;\n totalItemCount: number;\n}): string {\n let amount = new BigNumber(gasFeeToken.amount);\n\n if (totalItemCount > 1) {\n const gas = new BigNumber(gasFeeToken.gas);\n const gasFeeAmount = new BigNumber(gasFeeToken.amount);\n\n if (totalGasEstimate > 0 && gas.isGreaterThan(0)) {\n const gasRate = gasFeeAmount.dividedBy(gas);\n amount = gasRate.multipliedBy(totalGasEstimate);\n }\n }\n\n return amount.integerValue(BigNumber.ROUND_CEIL).toFixed(0);\n}\n"]}
|