@metamask/transaction-pay-controller 6.0.0 → 8.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.
- package/CHANGELOG.md +21 -1
- package/dist/constants.cjs +5 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +4 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +4 -0
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +4 -0
- package/dist/constants.mjs.map +1 -1
- package/dist/strategy/bridge/bridge-quotes.cjs +37 -22
- package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
- package/dist/strategy/bridge/bridge-quotes.mjs +37 -22
- package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
- package/dist/strategy/relay/constants.cjs +1 -4
- package/dist/strategy/relay/constants.cjs.map +1 -1
- package/dist/strategy/relay/constants.d.cts +0 -3
- package/dist/strategy/relay/constants.d.cts.map +1 -1
- package/dist/strategy/relay/constants.d.mts +0 -3
- package/dist/strategy/relay/constants.d.mts.map +1 -1
- package/dist/strategy/relay/constants.mjs +0 -3
- package/dist/strategy/relay/constants.mjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.cjs +34 -8
- 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 +32 -6
- 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/strategy/test/TestStrategy.cjs +24 -2
- package/dist/strategy/test/TestStrategy.cjs.map +1 -1
- package/dist/strategy/test/TestStrategy.d.cts.map +1 -1
- package/dist/strategy/test/TestStrategy.d.mts.map +1 -1
- package/dist/strategy/test/TestStrategy.mjs +24 -2
- package/dist/strategy/test/TestStrategy.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +17 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +17 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/gas.cjs +85 -12
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.d.cts +12 -3
- package/dist/utils/gas.d.cts.map +1 -1
- package/dist/utils/gas.d.mts +12 -3
- package/dist/utils/gas.d.mts.map +1 -1
- package/dist/utils/gas.mjs +86 -13
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/quotes.cjs +1 -1
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.mjs +1 -1
- package/dist/utils/quotes.mjs.map +1 -1
- package/dist/utils/source-amounts.cjs +1 -1
- package/dist/utils/source-amounts.cjs.map +1 -1
- package/dist/utils/source-amounts.d.cts.map +1 -1
- package/dist/utils/source-amounts.d.mts.map +1 -1
- package/dist/utils/source-amounts.mjs +1 -1
- package/dist/utils/source-amounts.mjs.map +1 -1
- package/dist/utils/token.cjs +11 -4
- package/dist/utils/token.cjs.map +1 -1
- package/dist/utils/token.d.cts +1 -1
- package/dist/utils/token.d.cts.map +1 -1
- package/dist/utils/token.d.mts +1 -1
- package/dist/utils/token.d.mts.map +1 -1
- package/dist/utils/token.mjs +12 -5
- package/dist/utils/token.mjs.map +1 -1
- package/dist/utils/totals.cjs +51 -26
- package/dist/utils/totals.cjs.map +1 -1
- package/dist/utils/totals.d.cts.map +1 -1
- package/dist/utils/totals.d.mts.map +1 -1
- package/dist/utils/totals.mjs +51 -26
- package/dist/utils/totals.mjs.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [8.0.0]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **BREAKING:** Bump `@metamask/assets-controller` from `^88.0.0` to `^89.0.0` ([#7179](https://github.com/MetaMask/core/pull/7179))
|
|
15
|
+
- **BREAKING:** Bump `@metamask/bridge-controller` from `^60.0.0` to `^61.0.0` ([#7179](https://github.com/MetaMask/core/pull/7179))
|
|
16
|
+
- **BREAKING:** Bump `@metamask/bridge-status-controller` from `^60.0.0` to `^61.0.0` ([#7179](https://github.com/MetaMask/core/pull/7179))
|
|
17
|
+
|
|
18
|
+
## [7.0.0]
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **BREAKING:** Add `sourceAmount` to `TransactionPayQuote` ([#7159](https://github.com/MetaMask/core/pull/7159))
|
|
23
|
+
- Add `estimate` and `max` properties to `fee.sourceNetwork` in `TransactionPayQuote`.
|
|
24
|
+
- Add `isTargetGasFeeToken` to `fee` in `TransactionPayQuote`.
|
|
25
|
+
- Add matching properties to `TransactionPayTotals`.
|
|
26
|
+
- Use fixed fiat rate for Polygon USDCe and Arbitrum USDC.
|
|
27
|
+
|
|
10
28
|
## [6.0.0]
|
|
11
29
|
|
|
12
30
|
### Fixed
|
|
@@ -90,7 +108,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
90
108
|
|
|
91
109
|
- Initial release ([#6820](https://github.com/MetaMask/core/pull/6820))
|
|
92
110
|
|
|
93
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@
|
|
111
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@8.0.0...HEAD
|
|
112
|
+
[8.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@7.0.0...@metamask/transaction-pay-controller@8.0.0
|
|
113
|
+
[7.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@6.0.0...@metamask/transaction-pay-controller@7.0.0
|
|
94
114
|
[6.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@5.0.0...@metamask/transaction-pay-controller@6.0.0
|
|
95
115
|
[5.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@4.0.0...@metamask/transaction-pay-controller@5.0.0
|
|
96
116
|
[4.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@3.1.0...@metamask/transaction-pay-controller@4.0.0
|
package/dist/constants.cjs
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TransactionPayStrategy = exports.NATIVE_TOKEN_ADDRESS = exports.CONTROLLER_NAME = void 0;
|
|
3
|
+
exports.TransactionPayStrategy = exports.POLYGON_USDCE_ADDRESS = exports.ARBITRUM_USDC_ADDRESS = exports.NATIVE_TOKEN_ADDRESS = exports.CHAIN_ID_POLYGON = exports.CHAIN_ID_ARBITRUM = exports.CONTROLLER_NAME = void 0;
|
|
4
4
|
exports.CONTROLLER_NAME = 'TransactionPayController';
|
|
5
|
+
exports.CHAIN_ID_ARBITRUM = '0xa4b1';
|
|
6
|
+
exports.CHAIN_ID_POLYGON = '0x89';
|
|
5
7
|
exports.NATIVE_TOKEN_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
8
|
+
exports.ARBITRUM_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';
|
|
9
|
+
exports.POLYGON_USDCE_ADDRESS = '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174';
|
|
6
10
|
var TransactionPayStrategy;
|
|
7
11
|
(function (TransactionPayStrategy) {
|
|
8
12
|
TransactionPayStrategy["Bridge"] = "bridge";
|
package/dist/constants.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAG,0BAA0B,CAAC;AAC7C,QAAA,iBAAiB,GAAG,QAAe,CAAC;AACpC,QAAA,gBAAgB,GAAG,MAAa,CAAC;AAEjC,QAAA,oBAAoB,GAC/B,4CAAmD,CAAC;AAEzC,QAAA,qBAAqB,GAChC,4CAAmD,CAAC;AAEzC,QAAA,qBAAqB,GAChC,4CAAmD,CAAC;AAEtD,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,2CAAiB,CAAA;IACjB,yCAAe,CAAA;IACf,uCAAa,CAAA;AACf,CAAC,EAJW,sBAAsB,sCAAtB,sBAAsB,QAIjC","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport const CONTROLLER_NAME = 'TransactionPayController';\nexport const CHAIN_ID_ARBITRUM = '0xa4b1' as Hex;\nexport const CHAIN_ID_POLYGON = '0x89' as Hex;\n\nexport const NATIVE_TOKEN_ADDRESS =\n '0x0000000000000000000000000000000000000000' as Hex;\n\nexport const ARBITRUM_USDC_ADDRESS =\n '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as Hex;\n\nexport const POLYGON_USDCE_ADDRESS =\n '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Hex;\n\nexport enum TransactionPayStrategy {\n Bridge = 'bridge',\n Relay = 'relay',\n Test = 'test',\n}\n"]}
|
package/dist/constants.d.cts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export declare const CONTROLLER_NAME = "TransactionPayController";
|
|
2
|
+
export declare const CHAIN_ID_ARBITRUM: `0x${string}`;
|
|
3
|
+
export declare const CHAIN_ID_POLYGON: `0x${string}`;
|
|
2
4
|
export declare const NATIVE_TOKEN_ADDRESS: `0x${string}`;
|
|
5
|
+
export declare const ARBITRUM_USDC_ADDRESS: `0x${string}`;
|
|
6
|
+
export declare const POLYGON_USDCE_ADDRESS: `0x${string}`;
|
|
3
7
|
export declare enum TransactionPayStrategy {
|
|
4
8
|
Bridge = "bridge",
|
|
5
9
|
Relay = "relay",
|
package/dist/constants.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,iBAAiB,eAAkB,CAAC;AACjD,eAAO,MAAM,gBAAgB,eAAgB,CAAC;AAE9C,eAAO,MAAM,oBAAoB,eACoB,CAAC;AAEtD,eAAO,MAAM,qBAAqB,eACmB,CAAC;AAEtD,eAAO,MAAM,qBAAqB,eACmB,CAAC;AAEtD,oBAAY,sBAAsB;IAChC,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,IAAI,SAAS;CACd"}
|
package/dist/constants.d.mts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export declare const CONTROLLER_NAME = "TransactionPayController";
|
|
2
|
+
export declare const CHAIN_ID_ARBITRUM: `0x${string}`;
|
|
3
|
+
export declare const CHAIN_ID_POLYGON: `0x${string}`;
|
|
2
4
|
export declare const NATIVE_TOKEN_ADDRESS: `0x${string}`;
|
|
5
|
+
export declare const ARBITRUM_USDC_ADDRESS: `0x${string}`;
|
|
6
|
+
export declare const POLYGON_USDCE_ADDRESS: `0x${string}`;
|
|
3
7
|
export declare enum TransactionPayStrategy {
|
|
4
8
|
Bridge = "bridge",
|
|
5
9
|
Relay = "relay",
|
package/dist/constants.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,iBAAiB,eAAkB,CAAC;AACjD,eAAO,MAAM,gBAAgB,eAAgB,CAAC;AAE9C,eAAO,MAAM,oBAAoB,eACoB,CAAC;AAEtD,eAAO,MAAM,qBAAqB,eACmB,CAAC;AAEtD,eAAO,MAAM,qBAAqB,eACmB,CAAC;AAEtD,oBAAY,sBAAsB;IAChC,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,IAAI,SAAS;CACd"}
|
package/dist/constants.mjs
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export const CONTROLLER_NAME = 'TransactionPayController';
|
|
2
|
+
export const CHAIN_ID_ARBITRUM = '0xa4b1';
|
|
3
|
+
export const CHAIN_ID_POLYGON = '0x89';
|
|
2
4
|
export const NATIVE_TOKEN_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
5
|
+
export const ARBITRUM_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';
|
|
6
|
+
export const POLYGON_USDCE_ADDRESS = '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174';
|
|
3
7
|
export var TransactionPayStrategy;
|
|
4
8
|
(function (TransactionPayStrategy) {
|
|
5
9
|
TransactionPayStrategy["Bridge"] = "bridge";
|
package/dist/constants.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAe,CAAC;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAC/B,4CAAmD,CAAC;AAEtD,MAAM,CAAC,MAAM,qBAAqB,GAChC,4CAAmD,CAAC;AAEtD,MAAM,CAAC,MAAM,qBAAqB,GAChC,4CAAmD,CAAC;AAEtD,MAAM,CAAN,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,2CAAiB,CAAA;IACjB,yCAAe,CAAA;IACf,uCAAa,CAAA;AACf,CAAC,EAJW,sBAAsB,KAAtB,sBAAsB,QAIjC","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport const CONTROLLER_NAME = 'TransactionPayController';\nexport const CHAIN_ID_ARBITRUM = '0xa4b1' as Hex;\nexport const CHAIN_ID_POLYGON = '0x89' as Hex;\n\nexport const NATIVE_TOKEN_ADDRESS =\n '0x0000000000000000000000000000000000000000' as Hex;\n\nexport const ARBITRUM_USDC_ADDRESS =\n '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as Hex;\n\nexport const POLYGON_USDCE_ADDRESS =\n '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Hex;\n\nexport enum TransactionPayStrategy {\n Bridge = 'bridge',\n Relay = 'relay',\n Test = 'test',\n}\n"]}
|
|
@@ -317,27 +317,30 @@ function normalizeQuote(quote, request, messenger, transaction) {
|
|
|
317
317
|
if (targetFiatRate === undefined) {
|
|
318
318
|
throw new Error(`Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`);
|
|
319
319
|
}
|
|
320
|
-
const targetAmountMinimumFiat =
|
|
321
|
-
const
|
|
322
|
-
const
|
|
320
|
+
const targetAmountMinimumFiat = calculateAmount(quote.quote.minDestTokenAmount, quote.quote.destAsset.decimals, targetFiatRate.fiatRate, targetFiatRate.usdRate);
|
|
321
|
+
const sourceAmount = calculateAmount(quote.quote.srcTokenAmount, quote.quote.srcAsset.decimals, sourceFiatRate.fiatRate, sourceFiatRate.usdRate);
|
|
322
|
+
const targetAmount = calculateAmount(request.targetAmountMinimum, quote.quote.destAsset.decimals, targetFiatRate.fiatRate, targetFiatRate.usdRate);
|
|
323
323
|
const targetNetwork = (0, gas_1.calculateTransactionGasCost)(transaction, messenger);
|
|
324
|
-
const sourceNetwork =
|
|
324
|
+
const sourceNetwork = {
|
|
325
|
+
estimate: calculateSourceNetworkFee(quote, messenger),
|
|
326
|
+
max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),
|
|
327
|
+
};
|
|
325
328
|
return {
|
|
326
329
|
estimatedDuration: quote.estimatedProcessingTimeInSeconds,
|
|
327
330
|
dust: {
|
|
328
331
|
fiat: new bignumber_js_1.BigNumber(targetAmountMinimumFiat.fiat)
|
|
329
|
-
.minus(
|
|
332
|
+
.minus(targetAmount.fiat)
|
|
330
333
|
.toString(10),
|
|
331
334
|
usd: new bignumber_js_1.BigNumber(targetAmountMinimumFiat.usd)
|
|
332
|
-
.minus(
|
|
335
|
+
.minus(targetAmount.usd)
|
|
333
336
|
.toString(10),
|
|
334
337
|
},
|
|
335
338
|
fees: {
|
|
336
339
|
provider: {
|
|
337
|
-
fiat: new bignumber_js_1.BigNumber(
|
|
340
|
+
fiat: new bignumber_js_1.BigNumber(sourceAmount.fiat)
|
|
338
341
|
.minus(targetAmountMinimumFiat.fiat)
|
|
339
342
|
.toString(10),
|
|
340
|
-
usd: new bignumber_js_1.BigNumber(
|
|
343
|
+
usd: new bignumber_js_1.BigNumber(sourceAmount.usd)
|
|
341
344
|
.minus(targetAmountMinimumFiat.usd)
|
|
342
345
|
.toString(10),
|
|
343
346
|
},
|
|
@@ -346,39 +349,47 @@ function normalizeQuote(quote, request, messenger, transaction) {
|
|
|
346
349
|
},
|
|
347
350
|
original: quote,
|
|
348
351
|
request,
|
|
352
|
+
sourceAmount,
|
|
349
353
|
strategy: __1.TransactionPayStrategy.Bridge,
|
|
350
354
|
};
|
|
351
355
|
}
|
|
352
356
|
/**
|
|
353
|
-
* Calculate
|
|
357
|
+
* Calculate amount from raw value and fiat rates.
|
|
354
358
|
*
|
|
355
|
-
* @param
|
|
359
|
+
* @param raw - Amount to convert.
|
|
356
360
|
* @param decimals - Token decimals.
|
|
357
361
|
* @param fiatRateFiat - Fiat rate.
|
|
358
362
|
* @param fiatRateUsd - USD rate.
|
|
359
|
-
* @returns
|
|
363
|
+
* @returns Amount object.
|
|
360
364
|
*/
|
|
361
|
-
function
|
|
362
|
-
const
|
|
363
|
-
const
|
|
364
|
-
const
|
|
365
|
-
|
|
365
|
+
function calculateAmount(raw, decimals, fiatRateFiat, fiatRateUsd) {
|
|
366
|
+
const humanValue = new bignumber_js_1.BigNumber(raw).shiftedBy(-decimals);
|
|
367
|
+
const human = humanValue.toString(10);
|
|
368
|
+
const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);
|
|
369
|
+
const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);
|
|
370
|
+
return { fiat, human, raw, usd };
|
|
366
371
|
}
|
|
367
372
|
/**
|
|
368
373
|
* Calculate the source network fee for a bridge quote.
|
|
369
374
|
*
|
|
370
375
|
* @param quote - Bridge quote response.
|
|
371
376
|
* @param messenger - Controller messenger.
|
|
377
|
+
* @param options - Calculation options.
|
|
378
|
+
* @param options.isMax - Whether to calculate the maximum cost.
|
|
372
379
|
* @returns Estimated gas cost for the source network.
|
|
373
380
|
*/
|
|
374
|
-
function calculateSourceNetworkFee(quote, messenger) {
|
|
381
|
+
function calculateSourceNetworkFee(quote, messenger, { isMax = false } = {}) {
|
|
375
382
|
const { approval, trade } = quote;
|
|
376
383
|
const approvalCost = approval
|
|
377
|
-
? calculateTransactionCost(approval, messenger)
|
|
378
|
-
: { fiat: '0', usd: '0' };
|
|
379
|
-
const tradeCost = calculateTransactionCost(trade, messenger
|
|
384
|
+
? calculateTransactionCost(approval, messenger, { isMax })
|
|
385
|
+
: { fiat: '0', human: '0', raw: '0', usd: '0' };
|
|
386
|
+
const tradeCost = calculateTransactionCost(trade, messenger, {
|
|
387
|
+
isMax,
|
|
388
|
+
});
|
|
380
389
|
return {
|
|
381
390
|
fiat: new bignumber_js_1.BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),
|
|
391
|
+
human: new bignumber_js_1.BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),
|
|
392
|
+
raw: new bignumber_js_1.BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),
|
|
382
393
|
usd: new bignumber_js_1.BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),
|
|
383
394
|
};
|
|
384
395
|
}
|
|
@@ -387,14 +398,18 @@ function calculateSourceNetworkFee(quote, messenger) {
|
|
|
387
398
|
*
|
|
388
399
|
* @param transaction - Transaction parameters.
|
|
389
400
|
* @param messenger - Controller messenger
|
|
401
|
+
* @param options - Calculation options.
|
|
402
|
+
* @param options.isMax - Whether to calculate the maximum cost.
|
|
390
403
|
* @returns Estimated gas cost for a bridge transaction.
|
|
391
404
|
*/
|
|
392
|
-
function calculateTransactionCost(transaction, messenger) {
|
|
393
|
-
const { effectiveGas, gasLimit } = transaction;
|
|
405
|
+
function calculateTransactionCost(transaction, messenger, { isMax }) {
|
|
406
|
+
const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;
|
|
407
|
+
const effectiveGas = isMax ? undefined : effectiveGasOriginal;
|
|
394
408
|
return (0, gas_1.calculateGasCost)({
|
|
395
409
|
...transaction,
|
|
396
410
|
gas: effectiveGas || gasLimit || '0x0',
|
|
397
411
|
messenger,
|
|
412
|
+
isMax,
|
|
398
413
|
});
|
|
399
414
|
}
|
|
400
415
|
//# sourceMappingURL=bridge-quotes.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-quotes.cjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FeatureId,\n type GenericQuoteRequest,\n} from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n FiatValue,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateFiatValue(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmountFiat = calculateFiatValue(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmountGoal = calculateFiatValue(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n const sourceNetwork = calculateSourceNetworkFee(quote, messenger);\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmountGoal.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmountGoal.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmountFiat.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmountFiat.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate fiat value from amount and fiat rates.\n *\n * @param amount - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Fiat value.\n */\nfunction calculateFiatValue(\n amount: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): FiatValue {\n const amountHuman = new BigNumber(amount).shiftedBy(-decimals);\n const usd = amountHuman.multipliedBy(fiatRateUsd).toString(10);\n const fiat = amountHuman.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n): FiatValue {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger)\n : { fiat: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger);\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n): FiatValue {\n const { effectiveGas, gasLimit } = transaction;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bridge-quotes.cjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FeatureId,\n type GenericQuoteRequest,\n} from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateAmount(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmount = calculateAmount(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmount = calculateAmount(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n\n const sourceNetwork = {\n estimate: calculateSourceNetworkFee(quote, messenger),\n max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),\n };\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmount.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmount.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmount.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmount.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate amount from raw value and fiat rates.\n *\n * @param raw - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Amount object.\n */\nfunction calculateAmount(\n raw: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): Amount {\n const humanValue = new BigNumber(raw).shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);\n const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, human, raw, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n { isMax = false } = {},\n): Amount {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger, { isMax })\n : { fiat: '0', human: '0', raw: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger, {\n isMax,\n });\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n human: new BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),\n raw: new BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax: boolean },\n): Amount {\n const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;\n const effectiveGas = isMax ? undefined : effectiveGasOriginal;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n isMax,\n });\n}\n"]}
|
|
@@ -311,27 +311,30 @@ function normalizeQuote(quote, request, messenger, transaction) {
|
|
|
311
311
|
if (targetFiatRate === undefined) {
|
|
312
312
|
throw new Error(`Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`);
|
|
313
313
|
}
|
|
314
|
-
const targetAmountMinimumFiat =
|
|
315
|
-
const
|
|
316
|
-
const
|
|
314
|
+
const targetAmountMinimumFiat = calculateAmount(quote.quote.minDestTokenAmount, quote.quote.destAsset.decimals, targetFiatRate.fiatRate, targetFiatRate.usdRate);
|
|
315
|
+
const sourceAmount = calculateAmount(quote.quote.srcTokenAmount, quote.quote.srcAsset.decimals, sourceFiatRate.fiatRate, sourceFiatRate.usdRate);
|
|
316
|
+
const targetAmount = calculateAmount(request.targetAmountMinimum, quote.quote.destAsset.decimals, targetFiatRate.fiatRate, targetFiatRate.usdRate);
|
|
317
317
|
const targetNetwork = calculateTransactionGasCost(transaction, messenger);
|
|
318
|
-
const sourceNetwork =
|
|
318
|
+
const sourceNetwork = {
|
|
319
|
+
estimate: calculateSourceNetworkFee(quote, messenger),
|
|
320
|
+
max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),
|
|
321
|
+
};
|
|
319
322
|
return {
|
|
320
323
|
estimatedDuration: quote.estimatedProcessingTimeInSeconds,
|
|
321
324
|
dust: {
|
|
322
325
|
fiat: new BigNumber(targetAmountMinimumFiat.fiat)
|
|
323
|
-
.minus(
|
|
326
|
+
.minus(targetAmount.fiat)
|
|
324
327
|
.toString(10),
|
|
325
328
|
usd: new BigNumber(targetAmountMinimumFiat.usd)
|
|
326
|
-
.minus(
|
|
329
|
+
.minus(targetAmount.usd)
|
|
327
330
|
.toString(10),
|
|
328
331
|
},
|
|
329
332
|
fees: {
|
|
330
333
|
provider: {
|
|
331
|
-
fiat: new BigNumber(
|
|
334
|
+
fiat: new BigNumber(sourceAmount.fiat)
|
|
332
335
|
.minus(targetAmountMinimumFiat.fiat)
|
|
333
336
|
.toString(10),
|
|
334
|
-
usd: new BigNumber(
|
|
337
|
+
usd: new BigNumber(sourceAmount.usd)
|
|
335
338
|
.minus(targetAmountMinimumFiat.usd)
|
|
336
339
|
.toString(10),
|
|
337
340
|
},
|
|
@@ -340,39 +343,47 @@ function normalizeQuote(quote, request, messenger, transaction) {
|
|
|
340
343
|
},
|
|
341
344
|
original: quote,
|
|
342
345
|
request,
|
|
346
|
+
sourceAmount,
|
|
343
347
|
strategy: TransactionPayStrategy.Bridge,
|
|
344
348
|
};
|
|
345
349
|
}
|
|
346
350
|
/**
|
|
347
|
-
* Calculate
|
|
351
|
+
* Calculate amount from raw value and fiat rates.
|
|
348
352
|
*
|
|
349
|
-
* @param
|
|
353
|
+
* @param raw - Amount to convert.
|
|
350
354
|
* @param decimals - Token decimals.
|
|
351
355
|
* @param fiatRateFiat - Fiat rate.
|
|
352
356
|
* @param fiatRateUsd - USD rate.
|
|
353
|
-
* @returns
|
|
357
|
+
* @returns Amount object.
|
|
354
358
|
*/
|
|
355
|
-
function
|
|
356
|
-
const
|
|
357
|
-
const
|
|
358
|
-
const
|
|
359
|
-
|
|
359
|
+
function calculateAmount(raw, decimals, fiatRateFiat, fiatRateUsd) {
|
|
360
|
+
const humanValue = new BigNumber(raw).shiftedBy(-decimals);
|
|
361
|
+
const human = humanValue.toString(10);
|
|
362
|
+
const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);
|
|
363
|
+
const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);
|
|
364
|
+
return { fiat, human, raw, usd };
|
|
360
365
|
}
|
|
361
366
|
/**
|
|
362
367
|
* Calculate the source network fee for a bridge quote.
|
|
363
368
|
*
|
|
364
369
|
* @param quote - Bridge quote response.
|
|
365
370
|
* @param messenger - Controller messenger.
|
|
371
|
+
* @param options - Calculation options.
|
|
372
|
+
* @param options.isMax - Whether to calculate the maximum cost.
|
|
366
373
|
* @returns Estimated gas cost for the source network.
|
|
367
374
|
*/
|
|
368
|
-
function calculateSourceNetworkFee(quote, messenger) {
|
|
375
|
+
function calculateSourceNetworkFee(quote, messenger, { isMax = false } = {}) {
|
|
369
376
|
const { approval, trade } = quote;
|
|
370
377
|
const approvalCost = approval
|
|
371
|
-
? calculateTransactionCost(approval, messenger)
|
|
372
|
-
: { fiat: '0', usd: '0' };
|
|
373
|
-
const tradeCost = calculateTransactionCost(trade, messenger
|
|
378
|
+
? calculateTransactionCost(approval, messenger, { isMax })
|
|
379
|
+
: { fiat: '0', human: '0', raw: '0', usd: '0' };
|
|
380
|
+
const tradeCost = calculateTransactionCost(trade, messenger, {
|
|
381
|
+
isMax,
|
|
382
|
+
});
|
|
374
383
|
return {
|
|
375
384
|
fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),
|
|
385
|
+
human: new BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),
|
|
386
|
+
raw: new BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),
|
|
376
387
|
usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),
|
|
377
388
|
};
|
|
378
389
|
}
|
|
@@ -381,14 +392,18 @@ function calculateSourceNetworkFee(quote, messenger) {
|
|
|
381
392
|
*
|
|
382
393
|
* @param transaction - Transaction parameters.
|
|
383
394
|
* @param messenger - Controller messenger
|
|
395
|
+
* @param options - Calculation options.
|
|
396
|
+
* @param options.isMax - Whether to calculate the maximum cost.
|
|
384
397
|
* @returns Estimated gas cost for a bridge transaction.
|
|
385
398
|
*/
|
|
386
|
-
function calculateTransactionCost(transaction, messenger) {
|
|
387
|
-
const { effectiveGas, gasLimit } = transaction;
|
|
399
|
+
function calculateTransactionCost(transaction, messenger, { isMax }) {
|
|
400
|
+
const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;
|
|
401
|
+
const effectiveGas = isMax ? undefined : effectiveGasOriginal;
|
|
388
402
|
return calculateGasCost({
|
|
389
403
|
...transaction,
|
|
390
404
|
gas: effectiveGas || gasLimit || '0x0',
|
|
391
405
|
messenger,
|
|
406
|
+
isMax,
|
|
392
407
|
});
|
|
393
408
|
}
|
|
394
409
|
//# sourceMappingURL=bridge-quotes.mjs.map
|