@metamask-previews/bridge-status-controller 78.0.2-preview-f8a21ed80 → 78.0.2-preview-c3ccf7def
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 +1 -0
- package/dist/strategy/evm-strategy.d.ts.map +1 -1
- package/dist/strategy/evm-strategy.js +6 -9
- package/dist/strategy/evm-strategy.js.map +1 -1
- package/dist/utils/swap-received-amount.d.ts +6 -1
- package/dist/utils/swap-received-amount.d.ts.map +1 -1
- package/dist/utils/swap-received-amount.js +17 -16
- package/dist/utils/swap-received-amount.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
### Changed
|
|
11
11
|
|
|
12
|
+
- `getReceivedERC20Amount` utility now adds up all transferred ERC20 amounts to a given wallet address ([#11402](https://github.com/MetaMask/core/pull/11402))
|
|
12
13
|
- Bump `@metamask/profile-sync-controller` from `^36.0.0` to `^36.1.0` ([#11396](https://github.com/MetaMask/core/pull/11396))
|
|
13
14
|
|
|
14
15
|
## [78.0.2]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-strategy.d.ts","sourceRoot":"","sources":["../../src/strategy/evm-strategy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EACL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAgB1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"evm-strategy.d.ts","sourceRoot":"","sources":["../../src/strategy/evm-strategy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EACL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAgB1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAyGzE,eAAO,MAAM,kBAAkB,SACvB,oBAAoB,aACf,MAAM,yCAKhB,CAAC;AAEJ;;;;;GAKG;AACH,wBAAuB,gBAAgB,CACrC,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,GACjC,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CA0F9C"}
|
|
@@ -67,15 +67,12 @@ const approve = async (args, actionId) => {
|
|
|
67
67
|
trade: resetApproval,
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
});
|
|
77
|
-
return approvalTxMeta;
|
|
78
|
-
}
|
|
70
|
+
return await handleSingleTx({
|
|
71
|
+
...args,
|
|
72
|
+
transactionType,
|
|
73
|
+
trade: approval,
|
|
74
|
+
actionId,
|
|
75
|
+
});
|
|
79
76
|
};
|
|
80
77
|
export const handleEvmApprovals = async (args, actionId) => await args.traceFn(getApprovalTraceParams(args.quoteResponses[0], args.isStxEnabled), async () => await approve(args, actionId));
|
|
81
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-strategy.js","sourceRoot":"","sources":["../../src/strategy/evm-strategy.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable consistent-return */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { formatChainIdToHex, isEvmTxData } from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n TransactionMeta,\n TransactionType,\n} from '@metamask/transaction-controller';\n\nimport { BridgeStatusControllerMessenger } from '../types.js';\nimport { getAccountByAddress } from '../utils/accounts.js';\nimport { getNetworkClientIdByChainId } from '../utils/network.js';\nimport { getApprovalTraceParams } from '../utils/trace.js';\nimport {\n addTransaction,\n generateActionId,\n getTransactionMetaByActionId,\n handleApprovalDelay,\n handleMobileHardwareWalletDelay,\n toTransactionParams,\n waitForTxConfirmation,\n} from '../utils/transaction.js';\nimport { SubmitStep } from './types.js';\nimport type { SubmitStrategyParams, SubmitStepResult } from './types.js';\n\n/**\n * Submits a single tx to the TransactionController and returns the txMetaId\n *\n * @param args - The parameters for the transaction\n * @param args.transactionType - The type of transaction to submit\n * @param args.trade - The trade data to confirm\n * @param args.requireApproval - Whether to require approval for the transaction\n * @param args.txFee - Optional gas fee parameters from the quote (used when gasIncluded is true)\n * @param args.txFee.maxFeePerGas - The maximum fee per gas from the quote\n * @param args.txFee.maxPriorityFeePerGas - The maximum priority fee per gas from the quote\n * @param args.actionId - Optional actionId for pre-submission history (if not provided, one is generated)\n * @param args.messenger - The messenger to use for the transaction\n * @returns The transaction meta\n */\nconst handleSingleTx = async ({\n messenger,\n trade,\n transactionType,\n requireApproval = false,\n txFee,\n // Use provided actionId (for pre-submission history) or generate one\n actionId = generateActionId(),\n}: {\n messenger: BridgeStatusControllerMessenger;\n transactionType: TransactionType;\n trade: TxData;\n requireApproval?: boolean;\n txFee?: { maxFeePerGas: string; maxPriorityFeePerGas: string };\n actionId?: string;\n}): Promise<TransactionMeta> => {\n const selectedAccount = getAccountByAddress(messenger, trade.from);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = getNetworkClientIdByChainId(messenger, hexChainId);\n\n const requestOptions = {\n actionId,\n networkClientId,\n requireApproval,\n type: transactionType,\n origin: 'metamask',\n isInternal: true,\n };\n\n const transactionParamsWithMaxGas = await toTransactionParams(\n messenger,\n trade,\n networkClientId,\n hexChainId,\n txFee,\n );\n\n return await addTransaction(\n messenger,\n { ...transactionParamsWithMaxGas, from: trade.from },\n requestOptions,\n );\n};\n\n/**\n * Submits the approval and resetApproval transactions through the TransactionController.\n * If there is a resetApproval, it will be submitted first.\n * But only the approval's txMetaId will be returned.\n *\n * @param args - The parameters for the submission flow\n * @param actionId - The actionId for the approval transaction\n *\n * @returns The approval txMeta of the approval transaction\n */\nconst approve = async (args: SubmitStrategyParams, actionId?: string) => {\n const {\n quoteResponses: [quoteResponse],\n isBridgeTx,\n } = args;\n const { approval, resetApproval } = quoteResponse;\n if (!approval || !isEvmTxData(approval)) {\n return;\n }\n\n const transactionType = isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval;\n\n if (resetApproval) {\n await handleSingleTx({\n ...args,\n transactionType,\n trade: resetApproval,\n });\n }\n\n if (approval) {\n const approvalTxMeta = await handleSingleTx({\n ...args,\n transactionType,\n trade: approval,\n actionId,\n });\n return approvalTxMeta;\n }\n};\n\nexport const handleEvmApprovals = async (\n args: SubmitStrategyParams,\n actionId?: string,\n) =>\n await args.traceFn(\n getApprovalTraceParams(args.quoteResponses[0], args.isStxEnabled),\n async () => await approve(args, actionId),\n );\n\n/**\n * Sequentially submits EVM resetApproval, approval and trade transactions through the TransactionController.\n *\n * @param args - The parameters for the transaction\n * @yields Data for updating the BridgeStatusController\n */\nexport async function* submitEvmHandler(\n args: SubmitStrategyParams<TxData>,\n): AsyncGenerator<SubmitStepResult, void, void> {\n const {\n quoteResponses: [quoteResponse],\n requireApproval,\n isBridgeTx,\n } = args;\n\n // Generate actionId for pre-submission history\n const actionId = generateActionId();\n\n // Add pre-submission history keyed by actionId\n // This ensures we have quote data available if transaction fails during submission\n yield {\n type: SubmitStep.AddHistoryItem,\n payload: {\n historyKey: actionId,\n actionId,\n quoteResponse,\n },\n };\n\n // Submit resetApproval and approval transactions if present\n const approvalTxMeta = await handleEvmApprovals(args, actionId);\n const approvalTxId = approvalTxMeta?.id;\n\n let tradeActionId = actionId;\n\n // Delay after approval\n if (approvalTxId) {\n // Generate a new actionId for the trade transaction since approval used the first one\n tradeActionId = generateActionId();\n yield {\n type: SubmitStep.RekeyHistoryItem,\n payload: {\n oldHistoryKey: actionId,\n newHistoryKey: tradeActionId,\n historyItemOverrides: {\n approvalTxId,\n },\n },\n };\n await handleApprovalDelay(quoteResponse.quote.srcChainId);\n }\n // Hardware-wallet delay first (Ledger second-prompt spacing), then wait for\n // on-chain approval confirmation so swap gas estimation runs after allowance is set.\n await handleMobileHardwareWalletDelay(requireApproval);\n if (requireApproval && approvalTxId) {\n await waitForTxConfirmation(args.messenger, approvalTxId);\n }\n\n const transactionType = isBridgeTx\n ? TransactionType.bridge\n : TransactionType.swap;\n\n let tradeMeta: TransactionMeta | undefined;\n try {\n tradeMeta = await handleSingleTx({\n ...args,\n transactionType,\n trade: quoteResponse.trade,\n // TODO figure out if this is needed\n // Pass txFee when gasIncluded is true to use the quote's gas fees\n // instead of re-estimating (which would fail for max native token swaps)\n txFee: quoteResponse.quote.gasIncluded\n ? quoteResponse.quote.feeData.txFee\n : undefined,\n actionId: tradeActionId,\n });\n } catch (error) {\n // Silence the error if tx has been added to the TransactionController to prevent duplicate Failed events\n tradeMeta = getTransactionMetaByActionId(args.messenger, tradeActionId);\n if (!tradeMeta) {\n throw error;\n }\n }\n\n yield {\n type: SubmitStep.SetTradeMeta,\n payload: { tradeMeta },\n };\n\n // Use the tradeMeta's id as history key\n yield {\n type: SubmitStep.RekeyHistoryItem,\n payload: {\n oldHistoryKey: tradeActionId,\n newHistoryKey: tradeMeta.id,\n tradeMeta,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"evm-strategy.js","sourceRoot":"","sources":["../../src/strategy/evm-strategy.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable consistent-return */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { formatChainIdToHex, isEvmTxData } from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n TransactionMeta,\n TransactionType,\n} from '@metamask/transaction-controller';\n\nimport { BridgeStatusControllerMessenger } from '../types.js';\nimport { getAccountByAddress } from '../utils/accounts.js';\nimport { getNetworkClientIdByChainId } from '../utils/network.js';\nimport { getApprovalTraceParams } from '../utils/trace.js';\nimport {\n addTransaction,\n generateActionId,\n getTransactionMetaByActionId,\n handleApprovalDelay,\n handleMobileHardwareWalletDelay,\n toTransactionParams,\n waitForTxConfirmation,\n} from '../utils/transaction.js';\nimport { SubmitStep } from './types.js';\nimport type { SubmitStrategyParams, SubmitStepResult } from './types.js';\n\n/**\n * Submits a single tx to the TransactionController and returns the txMetaId\n *\n * @param args - The parameters for the transaction\n * @param args.transactionType - The type of transaction to submit\n * @param args.trade - The trade data to confirm\n * @param args.requireApproval - Whether to require approval for the transaction\n * @param args.txFee - Optional gas fee parameters from the quote (used when gasIncluded is true)\n * @param args.txFee.maxFeePerGas - The maximum fee per gas from the quote\n * @param args.txFee.maxPriorityFeePerGas - The maximum priority fee per gas from the quote\n * @param args.actionId - Optional actionId for pre-submission history (if not provided, one is generated)\n * @param args.messenger - The messenger to use for the transaction\n * @returns The transaction meta\n */\nconst handleSingleTx = async ({\n messenger,\n trade,\n transactionType,\n requireApproval = false,\n txFee,\n // Use provided actionId (for pre-submission history) or generate one\n actionId = generateActionId(),\n}: {\n messenger: BridgeStatusControllerMessenger;\n transactionType: TransactionType;\n trade: TxData;\n requireApproval?: boolean;\n txFee?: { maxFeePerGas: string; maxPriorityFeePerGas: string };\n actionId?: string;\n}): Promise<TransactionMeta> => {\n const selectedAccount = getAccountByAddress(messenger, trade.from);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = getNetworkClientIdByChainId(messenger, hexChainId);\n\n const requestOptions = {\n actionId,\n networkClientId,\n requireApproval,\n type: transactionType,\n origin: 'metamask',\n isInternal: true,\n };\n\n const transactionParamsWithMaxGas = await toTransactionParams(\n messenger,\n trade,\n networkClientId,\n hexChainId,\n txFee,\n );\n\n return await addTransaction(\n messenger,\n { ...transactionParamsWithMaxGas, from: trade.from },\n requestOptions,\n );\n};\n\n/**\n * Submits the approval and resetApproval transactions through the TransactionController.\n * If there is a resetApproval, it will be submitted first.\n * But only the approval's txMetaId will be returned.\n *\n * @param args - The parameters for the submission flow\n * @param actionId - The actionId for the approval transaction\n *\n * @returns The approval txMeta of the approval transaction\n */\nconst approve = async (args: SubmitStrategyParams, actionId?: string) => {\n const {\n quoteResponses: [quoteResponse],\n isBridgeTx,\n } = args;\n const { approval, resetApproval } = quoteResponse;\n if (!approval || !isEvmTxData(approval)) {\n return;\n }\n\n const transactionType = isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval;\n\n if (resetApproval) {\n await handleSingleTx({\n ...args,\n transactionType,\n trade: resetApproval,\n });\n }\n\n return await handleSingleTx({\n ...args,\n transactionType,\n trade: approval,\n actionId,\n });\n};\n\nexport const handleEvmApprovals = async (\n args: SubmitStrategyParams,\n actionId?: string,\n) =>\n await args.traceFn(\n getApprovalTraceParams(args.quoteResponses[0], args.isStxEnabled),\n async () => await approve(args, actionId),\n );\n\n/**\n * Sequentially submits EVM resetApproval, approval and trade transactions through the TransactionController.\n *\n * @param args - The parameters for the transaction\n * @yields Data for updating the BridgeStatusController\n */\nexport async function* submitEvmHandler(\n args: SubmitStrategyParams<TxData>,\n): AsyncGenerator<SubmitStepResult, void, void> {\n const {\n quoteResponses: [quoteResponse],\n requireApproval,\n isBridgeTx,\n } = args;\n\n // Generate actionId for pre-submission history\n const actionId = generateActionId();\n\n // Add pre-submission history keyed by actionId\n // This ensures we have quote data available if transaction fails during submission\n yield {\n type: SubmitStep.AddHistoryItem,\n payload: {\n historyKey: actionId,\n actionId,\n quoteResponse,\n },\n };\n\n // Submit resetApproval and approval transactions if present\n const approvalTxMeta = await handleEvmApprovals(args, actionId);\n const approvalTxId = approvalTxMeta?.id;\n\n let tradeActionId = actionId;\n\n // Delay after approval\n if (approvalTxId) {\n // Generate a new actionId for the trade transaction since approval used the first one\n tradeActionId = generateActionId();\n yield {\n type: SubmitStep.RekeyHistoryItem,\n payload: {\n oldHistoryKey: actionId,\n newHistoryKey: tradeActionId,\n historyItemOverrides: {\n approvalTxId,\n },\n },\n };\n await handleApprovalDelay(quoteResponse.quote.srcChainId);\n }\n // Hardware-wallet delay first (Ledger second-prompt spacing), then wait for\n // on-chain approval confirmation so swap gas estimation runs after allowance is set.\n await handleMobileHardwareWalletDelay(requireApproval);\n if (requireApproval && approvalTxId) {\n await waitForTxConfirmation(args.messenger, approvalTxId);\n }\n\n const transactionType = isBridgeTx\n ? TransactionType.bridge\n : TransactionType.swap;\n\n let tradeMeta: TransactionMeta | undefined;\n try {\n tradeMeta = await handleSingleTx({\n ...args,\n transactionType,\n trade: quoteResponse.trade,\n // TODO figure out if this is needed\n // Pass txFee when gasIncluded is true to use the quote's gas fees\n // instead of re-estimating (which would fail for max native token swaps)\n txFee: quoteResponse.quote.gasIncluded\n ? quoteResponse.quote.feeData.txFee\n : undefined,\n actionId: tradeActionId,\n });\n } catch (error) {\n // Silence the error if tx has been added to the TransactionController to prevent duplicate Failed events\n tradeMeta = getTransactionMetaByActionId(args.messenger, tradeActionId);\n if (!tradeMeta) {\n throw error;\n }\n }\n\n yield {\n type: SubmitStep.SetTradeMeta,\n payload: { tradeMeta },\n };\n\n // Use the tradeMeta's id as history key\n yield {\n type: SubmitStep.RekeyHistoryItem,\n payload: {\n oldHistoryKey: tradeActionId,\n newHistoryKey: tradeMeta.id,\n tradeMeta,\n },\n };\n}\n"]}
|
|
@@ -2,6 +2,11 @@ import type { TokenAmountValues } from '@metamask/bridge-controller';
|
|
|
2
2
|
import type { TransactionMeta } from '@metamask/transaction-controller';
|
|
3
3
|
import { BigNumber } from 'bignumber.js';
|
|
4
4
|
import type { BridgeHistoryItem } from '../types.js';
|
|
5
|
+
export declare const getReceivedERC20Amount: (walletAddress: string, destAssetAddress: string, logs?: {
|
|
6
|
+
address?: string;
|
|
7
|
+
topics?: string[];
|
|
8
|
+
data?: string;
|
|
9
|
+
}[]) => BigNumber | null;
|
|
5
10
|
/**
|
|
6
11
|
* Calculate the amount received after a swap transaction based on the txMeta
|
|
7
12
|
*
|
|
@@ -11,7 +16,7 @@ import type { BridgeHistoryItem } from '../types.js';
|
|
|
11
16
|
* @returns The actual amount received for the swap transaction
|
|
12
17
|
*/
|
|
13
18
|
export declare const getActualSwapReceivedAmount: (historyItem: BridgeHistoryItem, actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null, txMeta?: TransactionMeta) => {
|
|
14
|
-
amount: string | BigNumber | null;
|
|
19
|
+
amount: string | BigNumber | null | undefined;
|
|
15
20
|
usd: BigNumber | null;
|
|
16
21
|
} | null;
|
|
17
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap-received-amount.d.ts","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"swap-received-amount.d.ts","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAyBrD,eAAO,MAAM,sBAAsB,kBAClB,MAAM,oBACH,MAAM,SACjB;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,qBAkChE,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,gBACzB,iBAAiB,aACnB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,IAAI,WACnD,eAAe;;;QAkCzB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,gBAC3B,iBAAiB,KAC7B,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,IAc/C,CAAC"}
|
|
@@ -16,26 +16,25 @@ const getReceivedNativeAmount = (historyItem, actualGas, txMeta) => {
|
|
|
16
16
|
.div(10 ** historyItem.quote.destAsset.decimals)
|
|
17
17
|
: null;
|
|
18
18
|
};
|
|
19
|
-
const getReceivedERC20Amount = (
|
|
20
|
-
|
|
21
|
-
if (!txReceipt?.logs || txReceipt.status === '0x0') {
|
|
19
|
+
export const getReceivedERC20Amount = (walletAddress, destAssetAddress, logs) => {
|
|
20
|
+
if (!logs) {
|
|
22
21
|
return null;
|
|
23
22
|
}
|
|
24
|
-
const { account: accountAddress, quote } = historyItem;
|
|
25
23
|
const TOKEN_TRANSFER_LOG_TOPIC_HASH = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
|
|
26
|
-
const
|
|
27
|
-
const isTokenTransfer = txReceiptLog.topics?.[0]
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
const tokenTransferLogs = logs.filter((txReceiptLog) => {
|
|
25
|
+
const isTokenTransfer = txReceiptLog.topics?.[0]
|
|
26
|
+
?.toLowerCase()
|
|
27
|
+
.startsWith(TOKEN_TRANSFER_LOG_TOPIC_HASH);
|
|
28
|
+
const isTransferFromGivenToken = txReceiptLog.address?.toLowerCase() === destAssetAddress?.toLowerCase();
|
|
30
29
|
const isTransferFromGivenAddress = txReceiptLog.topics?.[2] &&
|
|
31
|
-
(txReceiptLog.topics[2] ===
|
|
32
|
-
txReceiptLog.topics[2]
|
|
30
|
+
(txReceiptLog.topics[2].toLowerCase() === walletAddress?.toLowerCase() ||
|
|
31
|
+
txReceiptLog.topics[2]
|
|
32
|
+
.toLowerCase()
|
|
33
|
+
.match(walletAddress?.slice(2).toLowerCase()));
|
|
33
34
|
return (isTokenTransfer && isTransferFromGivenToken && isTransferFromGivenAddress);
|
|
34
35
|
});
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
return null;
|
|
36
|
+
const totalReceivedAmount = tokenTransferLogs.reduce((sum, tokenTransferLog) => tokenTransferLog?.data ? sum.plus(tokenTransferLog.data, 16) : sum, new BigNumber(0));
|
|
37
|
+
return totalReceivedAmount.gt(0) ? totalReceivedAmount : null;
|
|
39
38
|
};
|
|
40
39
|
/**
|
|
41
40
|
* Calculate the amount received after a swap transaction based on the txMeta
|
|
@@ -48,12 +47,14 @@ const getReceivedERC20Amount = (historyItem, txMeta) => {
|
|
|
48
47
|
export const getActualSwapReceivedAmount = (historyItem, actualGas, txMeta) => {
|
|
49
48
|
const { pricingData } = historyItem;
|
|
50
49
|
const quotedReturnAmount = historyItem.quote.destTokenAmount;
|
|
51
|
-
if (!txMeta?.txReceipt) {
|
|
50
|
+
if (!txMeta?.txReceipt || txMeta?.txReceipt.status === '0x0') {
|
|
52
51
|
return null;
|
|
53
52
|
}
|
|
54
53
|
const actualReturnAmount = isNativeAddress(historyItem.quote.destAsset.address)
|
|
55
54
|
? getReceivedNativeAmount(historyItem, actualGas, txMeta)
|
|
56
|
-
: getReceivedERC20Amount(historyItem,
|
|
55
|
+
: getReceivedERC20Amount(historyItem.account, historyItem.quote.destAsset.address,
|
|
56
|
+
// @ts-expect-error - txReceipt.logs is not typed correctly
|
|
57
|
+
txMeta?.txReceipt?.logs)?.div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals));
|
|
57
58
|
const returnUsdExchangeRate = pricingData?.quotedReturnInUsd && quotedReturnAmount
|
|
58
59
|
? new BigNumber(pricingData.quotedReturnInUsd)
|
|
59
60
|
.div(quotedReturnAmount)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap-received-amount.js","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,MAAM,uBAAuB,GAAG,CAC9B,WAA8B,EAC9B,SAA4D,EAC5D,MAAuB,EACvB,EAAE;IACF,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAE/C,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACtE,yFAAyF;QACzF,yFAAyF;QACzF,OAAO,IAAI,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC;aACpD,GAAG,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;aAChE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,IAAI,aAAa,IAAI,YAAY;QAC/C,CAAC,CAAC,IAAI,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC;aAC7B,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;aACvB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;aACvB,GAAG,CAAC,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;QACpD,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,
|
|
1
|
+
{"version":3,"file":"swap-received-amount.js","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TokenAmountValues } from '@metamask/bridge-controller';\nimport { isNativeAddress } from '@metamask/bridge-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { BridgeHistoryItem } from '../types.js';\n\nconst getReceivedNativeAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta: TransactionMeta,\n) => {\n const { preTxBalance, postTxBalance } = txMeta;\n\n if (!preTxBalance || !postTxBalance || preTxBalance === postTxBalance) {\n // If preTxBalance and postTxBalance are equal, postTxBalance hasn't been updated on time\n // because of the RPC provider delay, so we return an estimated receiving amount instead.\n return new BigNumber(historyItem.quote.destTokenAmount)\n .div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals))\n .toString(10);\n }\n\n return actualGas && postTxBalance && preTxBalance\n ? new BigNumber(postTxBalance, 16)\n .minus(preTxBalance, 16)\n .minus(actualGas.amount)\n .div(10 ** historyItem.quote.destAsset.decimals)\n : null;\n};\n\nexport const getReceivedERC20Amount = (\n walletAddress: string,\n destAssetAddress: string,\n logs?: { address?: string; topics?: string[]; data?: string }[],\n) => {\n if (!logs) {\n return null;\n }\n\n const TOKEN_TRANSFER_LOG_TOPIC_HASH =\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\n const tokenTransferLogs = logs.filter((txReceiptLog) => {\n const isTokenTransfer = txReceiptLog.topics?.[0]\n ?.toLowerCase()\n .startsWith(TOKEN_TRANSFER_LOG_TOPIC_HASH);\n const isTransferFromGivenToken =\n txReceiptLog.address?.toLowerCase() === destAssetAddress?.toLowerCase();\n const isTransferFromGivenAddress =\n txReceiptLog.topics?.[2] &&\n (txReceiptLog.topics[2].toLowerCase() === walletAddress?.toLowerCase() ||\n txReceiptLog.topics[2]\n .toLowerCase()\n .match(walletAddress?.slice(2).toLowerCase()));\n\n return (\n isTokenTransfer && isTransferFromGivenToken && isTransferFromGivenAddress\n );\n });\n\n const totalReceivedAmount = tokenTransferLogs.reduce(\n (sum, tokenTransferLog) =>\n tokenTransferLog?.data ? sum.plus(tokenTransferLog.data, 16) : sum,\n new BigNumber(0),\n );\n\n return totalReceivedAmount.gt(0) ? totalReceivedAmount : null;\n};\n\n/**\n * Calculate the amount received after a swap transaction based on the txMeta\n *\n * @param historyItem - The bridge history item\n * @param actualGas - The actual gas used for the transaction\n * @param txMeta - The transaction meta from the TransactionController\n * @returns The actual amount received for the swap transaction\n */\nexport const getActualSwapReceivedAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta?: TransactionMeta,\n) => {\n const { pricingData } = historyItem;\n const quotedReturnAmount = historyItem.quote.destTokenAmount;\n\n if (!txMeta?.txReceipt || txMeta?.txReceipt.status === '0x0') {\n return null;\n }\n\n const actualReturnAmount = isNativeAddress(\n historyItem.quote.destAsset.address,\n )\n ? getReceivedNativeAmount(historyItem, actualGas, txMeta)\n : getReceivedERC20Amount(\n historyItem.account,\n historyItem.quote.destAsset.address,\n // @ts-expect-error - txReceipt.logs is not typed correctly\n txMeta?.txReceipt?.logs,\n )?.div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals));\n\n const returnUsdExchangeRate =\n pricingData?.quotedReturnInUsd && quotedReturnAmount\n ? new BigNumber(pricingData.quotedReturnInUsd)\n .div(quotedReturnAmount)\n .multipliedBy(10 ** historyItem.quote.destAsset.decimals)\n : null;\n\n return {\n amount: actualReturnAmount,\n usd:\n actualReturnAmount && returnUsdExchangeRate\n ? returnUsdExchangeRate.multipliedBy(actualReturnAmount)\n : null,\n };\n};\n\n/**\n * Calculate the amount received after a bridge transaction based on the getTxStatus's\n * amount field\n *\n * @param historyItem - The bridge history item\n * @returns The actual amount received for the bridge transaction\n */\nexport const getActualBridgeReceivedAmount = (\n historyItem: BridgeHistoryItem,\n): Omit<TokenAmountValues, 'valueInCurrency'> | null => {\n const { quote, pricingData, status } = historyItem;\n\n const usdExchangeRate = pricingData?.quotedReturnInUsd\n ? new BigNumber(pricingData.quotedReturnInUsd).div(quote.destTokenAmount)\n : null;\n\n const actualAmount = status.destChain?.amount;\n return actualAmount && usdExchangeRate\n ? {\n amount: actualAmount,\n usd: usdExchangeRate.multipliedBy(actualAmount).toString(10),\n }\n : null;\n};\n"]}
|
package/package.json
CHANGED