@metamask-previews/transaction-pay-controller 23.17.3-preview-9e722dac3 → 23.17.3-preview-8f30863fb
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 +5 -0
- package/dist/actions/update-payment-token.cjs +19 -4
- package/dist/actions/update-payment-token.cjs.map +1 -1
- package/dist/actions/update-payment-token.d.cts.map +1 -1
- package/dist/actions/update-payment-token.d.mts.map +1 -1
- package/dist/actions/update-payment-token.mjs +19 -4
- package/dist/actions/update-payment-token.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Allow payment token selection without a local fiat rate for post-quote transactions ([#9361](https://github.com/MetaMask/core/pull/9361))
|
|
13
|
+
- `updatePaymentToken` threw `Payment token not found` when the selected token had no market price or native-currency rate in wallet state, which blocked selecting a withdraw destination token on a chain the wallet does not actively track. For post-quote (withdraw) flows the token now resolves with zeroed fiat rates instead; standard (deposit) flows keep the strict behavior.
|
|
14
|
+
|
|
10
15
|
## [23.17.3]
|
|
11
16
|
|
|
12
17
|
### Changed
|
|
@@ -20,12 +20,19 @@ function updatePaymentToken(request, options) {
|
|
|
20
20
|
throw new Error('Transaction not found');
|
|
21
21
|
}
|
|
22
22
|
const state = messenger.call('TransactionPayController:getState');
|
|
23
|
-
const
|
|
23
|
+
const transactionPayData = state.transactionData[transactionId];
|
|
24
|
+
const accountOverride = transactionPayData?.accountOverride;
|
|
24
25
|
const paymentToken = getPaymentToken({
|
|
25
26
|
chainId,
|
|
26
27
|
from: accountOverride ?? transaction.txParams.from,
|
|
27
28
|
messenger,
|
|
28
29
|
tokenAddress,
|
|
30
|
+
// For post-quote (withdraw) flows the selected token is the receive
|
|
31
|
+
// destination, which may live on a chain the wallet does not actively
|
|
32
|
+
// track, so no local market price or native-currency rate exists.
|
|
33
|
+
// Allow resolution without a fiat rate so selection is not blocked; the
|
|
34
|
+
// received amount is determined by the quote, not local rates.
|
|
35
|
+
allowMissingFiatRate: Boolean(transactionPayData?.isPostQuote),
|
|
29
36
|
});
|
|
30
37
|
if (!paymentToken) {
|
|
31
38
|
throw new Error('Payment token not found');
|
|
@@ -45,16 +52,24 @@ exports.updatePaymentToken = updatePaymentToken;
|
|
|
45
52
|
* @param request.from - The address to get the token balance for.
|
|
46
53
|
* @param request.messenger - The transaction pay controller messenger.
|
|
47
54
|
* @param request.tokenAddress - The token address.
|
|
55
|
+
* @param request.allowMissingFiatRate - Whether to resolve the token with
|
|
56
|
+
* zeroed fiat rates when no local rate is available.
|
|
48
57
|
* @returns The payment token or undefined if the token data could not be retrieved.
|
|
49
58
|
*/
|
|
50
|
-
function getPaymentToken({ chainId, from, messenger, tokenAddress, }) {
|
|
59
|
+
function getPaymentToken({ chainId, from, messenger, tokenAddress, allowMissingFiatRate, }) {
|
|
51
60
|
const { decimals, symbol } = (0, token_1.getTokenInfo)(messenger, tokenAddress, chainId) ?? {};
|
|
52
61
|
if (decimals === undefined || !symbol) {
|
|
53
62
|
return undefined;
|
|
54
63
|
}
|
|
55
|
-
|
|
64
|
+
let tokenFiatRate = (0, token_1.getTokenFiatRate)(messenger, tokenAddress, chainId);
|
|
56
65
|
if (tokenFiatRate === undefined) {
|
|
57
|
-
|
|
66
|
+
if (!allowMissingFiatRate) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
// No local fiat rate for this chain and token, such as a withdraw
|
|
70
|
+
// destination on a chain the wallet does not track. Resolve with zeroed
|
|
71
|
+
// fiat rates so the token can be selected; fiat display is best-effort.
|
|
72
|
+
tokenFiatRate = { usdRate: '0', fiatRate: '0' };
|
|
58
73
|
}
|
|
59
74
|
const balance = (0, token_1.getTokenBalance)(messenger, from, chainId, tokenAddress);
|
|
60
75
|
const { raw: balanceRaw, human: balanceHuman, usd: balanceUsd, fiat: balanceFiat, } = (0, token_1.computeTokenAmounts)(balance, decimals, tokenFiatRate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.cjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":";;;AAAA,2CAAqD;AAIrD,0CAA0C;AAM1C,8CAKwB;AACxB,0DAAsD;AAEtD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClE,MAAM,
|
|
1
|
+
{"version":3,"file":"update-payment-token.cjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n computeTokenAmounts,\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n): void {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const state = messenger.call('TransactionPayController:getState');\n const transactionPayData = state.transactionData[transactionId];\n const accountOverride = transactionPayData?.accountOverride;\n\n const paymentToken = getPaymentToken({\n chainId,\n from: accountOverride ?? (transaction.txParams.from as Hex),\n messenger,\n tokenAddress,\n // For post-quote (withdraw) flows the selected token is the receive\n // destination, which may live on a chain the wallet does not actively\n // track, so no local market price or native-currency rate exists.\n // Allow resolution without a fiat rate so selection is not blocked; the\n // received amount is determined by the quote, not local rates.\n allowMissingFiatRate: Boolean(transactionPayData?.isPostQuote),\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n data.fiatPayment = {};\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @param request.allowMissingFiatRate - Whether to resolve the token with\n * zeroed fiat rates when no local rate is available.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n allowMissingFiatRate,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n allowMissingFiatRate?: boolean;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n let tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n if (!allowMissingFiatRate) {\n return undefined;\n }\n\n // No local fiat rate for this chain and token, such as a withdraw\n // destination on a chain the wallet does not track. Resolve with zeroed\n // fiat rates so the token can be selected; fiat display is best-effort.\n tokenFiatRate = { usdRate: '0', fiatRate: '0' };\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n\n const {\n raw: balanceRaw,\n human: balanceHuman,\n usd: balanceUsd,\n fiat: balanceFiat,\n } = computeTokenAmounts(balance, decimals, tokenFiatRate);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.d.cts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,
|
|
1
|
+
{"version":3,"file":"update-payment-token.d.cts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,CAqCN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.d.mts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,
|
|
1
|
+
{"version":3,"file":"update-payment-token.d.mts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,CAqCN"}
|
|
@@ -17,12 +17,19 @@ export function updatePaymentToken(request, options) {
|
|
|
17
17
|
throw new Error('Transaction not found');
|
|
18
18
|
}
|
|
19
19
|
const state = messenger.call('TransactionPayController:getState');
|
|
20
|
-
const
|
|
20
|
+
const transactionPayData = state.transactionData[transactionId];
|
|
21
|
+
const accountOverride = transactionPayData?.accountOverride;
|
|
21
22
|
const paymentToken = getPaymentToken({
|
|
22
23
|
chainId,
|
|
23
24
|
from: accountOverride ?? transaction.txParams.from,
|
|
24
25
|
messenger,
|
|
25
26
|
tokenAddress,
|
|
27
|
+
// For post-quote (withdraw) flows the selected token is the receive
|
|
28
|
+
// destination, which may live on a chain the wallet does not actively
|
|
29
|
+
// track, so no local market price or native-currency rate exists.
|
|
30
|
+
// Allow resolution without a fiat rate so selection is not blocked; the
|
|
31
|
+
// received amount is determined by the quote, not local rates.
|
|
32
|
+
allowMissingFiatRate: Boolean(transactionPayData?.isPostQuote),
|
|
26
33
|
});
|
|
27
34
|
if (!paymentToken) {
|
|
28
35
|
throw new Error('Payment token not found');
|
|
@@ -41,16 +48,24 @@ export function updatePaymentToken(request, options) {
|
|
|
41
48
|
* @param request.from - The address to get the token balance for.
|
|
42
49
|
* @param request.messenger - The transaction pay controller messenger.
|
|
43
50
|
* @param request.tokenAddress - The token address.
|
|
51
|
+
* @param request.allowMissingFiatRate - Whether to resolve the token with
|
|
52
|
+
* zeroed fiat rates when no local rate is available.
|
|
44
53
|
* @returns The payment token or undefined if the token data could not be retrieved.
|
|
45
54
|
*/
|
|
46
|
-
function getPaymentToken({ chainId, from, messenger, tokenAddress, }) {
|
|
55
|
+
function getPaymentToken({ chainId, from, messenger, tokenAddress, allowMissingFiatRate, }) {
|
|
47
56
|
const { decimals, symbol } = getTokenInfo(messenger, tokenAddress, chainId) ?? {};
|
|
48
57
|
if (decimals === undefined || !symbol) {
|
|
49
58
|
return undefined;
|
|
50
59
|
}
|
|
51
|
-
|
|
60
|
+
let tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);
|
|
52
61
|
if (tokenFiatRate === undefined) {
|
|
53
|
-
|
|
62
|
+
if (!allowMissingFiatRate) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
// No local fiat rate for this chain and token, such as a withdraw
|
|
66
|
+
// destination on a chain the wallet does not track. Resolve with zeroed
|
|
67
|
+
// fiat rates so the token can be selected; fiat display is best-effort.
|
|
68
|
+
tokenFiatRate = { usdRate: '0', fiatRate: '0' };
|
|
54
69
|
}
|
|
55
70
|
const balance = getTokenBalance(messenger, from, chainId, tokenAddress);
|
|
56
71
|
const { raw: balanceRaw, human: balanceHuman, usd: balanceUsd, fiat: balanceFiat, } = computeTokenAmounts(balance, decimals, tokenFiatRate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.mjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAIrD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAM1C,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,2BAAuB;AACxB,OAAO,EAAE,cAAc,EAAE,iCAA6B;AAEtD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClE,MAAM,
|
|
1
|
+
{"version":3,"file":"update-payment-token.mjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n computeTokenAmounts,\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n): void {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const state = messenger.call('TransactionPayController:getState');\n const transactionPayData = state.transactionData[transactionId];\n const accountOverride = transactionPayData?.accountOverride;\n\n const paymentToken = getPaymentToken({\n chainId,\n from: accountOverride ?? (transaction.txParams.from as Hex),\n messenger,\n tokenAddress,\n // For post-quote (withdraw) flows the selected token is the receive\n // destination, which may live on a chain the wallet does not actively\n // track, so no local market price or native-currency rate exists.\n // Allow resolution without a fiat rate so selection is not blocked; the\n // received amount is determined by the quote, not local rates.\n allowMissingFiatRate: Boolean(transactionPayData?.isPostQuote),\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n data.fiatPayment = {};\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @param request.allowMissingFiatRate - Whether to resolve the token with\n * zeroed fiat rates when no local rate is available.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n allowMissingFiatRate,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n allowMissingFiatRate?: boolean;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n let tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n if (!allowMissingFiatRate) {\n return undefined;\n }\n\n // No local fiat rate for this chain and token, such as a withdraw\n // destination on a chain the wallet does not track. Resolve with zeroed\n // fiat rates so the token can be selected; fiat display is best-effort.\n tokenFiatRate = { usdRate: '0', fiatRate: '0' };\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n\n const {\n raw: balanceRaw,\n human: balanceHuman,\n usd: balanceUsd,\n fiat: balanceFiat,\n } = computeTokenAmounts(balance, decimals, tokenFiatRate);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/transaction-pay-controller",
|
|
3
|
-
"version": "23.17.3-preview-
|
|
3
|
+
"version": "23.17.3-preview-8f30863fb",
|
|
4
4
|
"description": "Manages alternate payment strategies to provide required funds for transactions in MetaMask",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|