@metamask-previews/transaction-controller 66.0.1-preview-e37aff3 → 66.0.1-preview-c5f8cd0af

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/TransactionController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionController-method-action-types.d.cts +1 -25
  4. package/dist/TransactionController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionController-method-action-types.d.mts +1 -25
  6. package/dist/TransactionController-method-action-types.d.mts.map +1 -1
  7. package/dist/TransactionController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionController.cjs +32 -191
  9. package/dist/TransactionController.cjs.map +1 -1
  10. package/dist/TransactionController.d.cts +12 -89
  11. package/dist/TransactionController.d.cts.map +1 -1
  12. package/dist/TransactionController.d.mts +12 -89
  13. package/dist/TransactionController.d.mts.map +1 -1
  14. package/dist/TransactionController.mjs +32 -191
  15. package/dist/TransactionController.mjs.map +1 -1
  16. package/dist/api/accounts-api.cjs +1 -42
  17. package/dist/api/accounts-api.cjs.map +1 -1
  18. package/dist/api/accounts-api.d.cts +0 -51
  19. package/dist/api/accounts-api.d.cts.map +1 -1
  20. package/dist/api/accounts-api.d.mts +0 -51
  21. package/dist/api/accounts-api.d.mts.map +1 -1
  22. package/dist/api/accounts-api.mjs +0 -40
  23. package/dist/api/accounts-api.mjs.map +1 -1
  24. package/dist/helpers/MultichainTrackingHelper.cjs +27 -7
  25. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
  26. package/dist/helpers/MultichainTrackingHelper.d.cts +0 -1
  27. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
  28. package/dist/helpers/MultichainTrackingHelper.d.mts +0 -1
  29. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
  30. package/dist/helpers/MultichainTrackingHelper.mjs +27 -7
  31. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
  32. package/dist/helpers/PendingTransactionTracker.cjs +4 -82
  33. package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
  34. package/dist/helpers/PendingTransactionTracker.d.cts +1 -3
  35. package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
  36. package/dist/helpers/PendingTransactionTracker.d.mts +1 -3
  37. package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
  38. package/dist/helpers/PendingTransactionTracker.mjs +5 -83
  39. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
  40. package/dist/index.cjs +1 -3
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +3 -4
  43. package/dist/index.d.cts.map +1 -1
  44. package/dist/index.d.mts +3 -4
  45. package/dist/index.d.mts.map +1 -1
  46. package/dist/index.mjs +0 -1
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/types.cjs.map +1 -1
  49. package/dist/types.d.cts +0 -15
  50. package/dist/types.d.cts.map +1 -1
  51. package/dist/types.d.mts +0 -15
  52. package/dist/types.d.mts.map +1 -1
  53. package/dist/types.mjs.map +1 -1
  54. package/dist/utils/feature-flags.cjs +14 -33
  55. package/dist/utils/feature-flags.cjs.map +1 -1
  56. package/dist/utils/feature-flags.d.cts +1 -25
  57. package/dist/utils/feature-flags.d.cts.map +1 -1
  58. package/dist/utils/feature-flags.d.mts +1 -25
  59. package/dist/utils/feature-flags.d.mts.map +1 -1
  60. package/dist/utils/feature-flags.mjs +13 -30
  61. package/dist/utils/feature-flags.mjs.map +1 -1
  62. package/dist/utils/prepare.cjs +8 -4
  63. package/dist/utils/prepare.cjs.map +1 -1
  64. package/dist/utils/prepare.d.cts +5 -4
  65. package/dist/utils/prepare.d.cts.map +1 -1
  66. package/dist/utils/prepare.d.mts +5 -4
  67. package/dist/utils/prepare.d.mts.map +1 -1
  68. package/dist/utils/prepare.mjs +8 -4
  69. package/dist/utils/prepare.mjs.map +1 -1
  70. package/package.json +1 -1
  71. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +0 -159
  72. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +0 -1
  73. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +0 -12
  74. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +0 -1
  75. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +0 -12
  76. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +0 -1
  77. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +0 -159
  78. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +0 -1
  79. package/dist/helpers/IncomingTransactionHelper.cjs +0 -306
  80. package/dist/helpers/IncomingTransactionHelper.cjs.map +0 -1
  81. package/dist/helpers/IncomingTransactionHelper.d.cts +0 -45
  82. package/dist/helpers/IncomingTransactionHelper.d.cts.map +0 -1
  83. package/dist/helpers/IncomingTransactionHelper.d.mts +0 -45
  84. package/dist/helpers/IncomingTransactionHelper.d.mts.map +0 -1
  85. package/dist/helpers/IncomingTransactionHelper.mjs +0 -299
  86. package/dist/helpers/IncomingTransactionHelper.mjs.map +0 -1
@@ -1,159 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
- var __importDefault = (this && this.__importDefault) || function (mod) {
8
- return (mod && mod.__esModule) ? mod : { "default": mod };
9
- };
10
- var _AccountsApiRemoteTransactionSource_instances, _AccountsApiRemoteTransactionSource_queryTransactions, _AccountsApiRemoteTransactionSource_filterTransactions, _AccountsApiRemoteTransactionSource_normalizeTransaction;
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AccountsApiRemoteTransactionSource = exports.SUPPORTED_CHAIN_IDS = void 0;
13
- const controller_utils_1 = require("@metamask/controller-utils");
14
- const bn_js_1 = __importDefault(require("bn.js"));
15
- const uuid_1 = require("uuid");
16
- const accounts_api_1 = require("../api/accounts-api.cjs");
17
- const constants_1 = require("../constants.cjs");
18
- const logger_1 = require("../logger.cjs");
19
- const types_1 = require("../types.cjs");
20
- const transaction_type_1 = require("../utils/transaction-type.cjs");
21
- exports.SUPPORTED_CHAIN_IDS = [
22
- constants_1.CHAIN_IDS.MAINNET,
23
- constants_1.CHAIN_IDS.POLYGON,
24
- constants_1.CHAIN_IDS.BSC,
25
- constants_1.CHAIN_IDS.LINEA_MAINNET,
26
- constants_1.CHAIN_IDS.BASE,
27
- constants_1.CHAIN_IDS.OPTIMISM,
28
- constants_1.CHAIN_IDS.ARBITRUM,
29
- constants_1.CHAIN_IDS.SCROLL,
30
- constants_1.CHAIN_IDS.SEI,
31
- constants_1.CHAIN_IDS.MONAD,
32
- constants_1.CHAIN_IDS.HYPEREVM,
33
- ];
34
- const log = (0, logger_1.createModuleLogger)(logger_1.incomingTransactionsLogger, 'accounts-api-source');
35
- /**
36
- * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.
37
- */
38
- class AccountsApiRemoteTransactionSource {
39
- constructor() {
40
- _AccountsApiRemoteTransactionSource_instances.add(this);
41
- }
42
- getSupportedChains() {
43
- return exports.SUPPORTED_CHAIN_IDS;
44
- }
45
- async fetchTransactions(request) {
46
- const { address, chainIds } = request;
47
- const responseTransactions = await __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_queryTransactions).call(this, request, chainIds ?? exports.SUPPORTED_CHAIN_IDS);
48
- log('Fetched transactions', responseTransactions.length, responseTransactions);
49
- const normalizedTransactions = await Promise.all(responseTransactions.map((tx) => __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_normalizeTransaction).call(this, address, tx)));
50
- log('Normalized transactions', normalizedTransactions);
51
- const filteredTransactions = __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_filterTransactions).call(this, request, normalizedTransactions);
52
- log('Filtered transactions', filteredTransactions.length, filteredTransactions);
53
- return filteredTransactions;
54
- }
55
- }
56
- exports.AccountsApiRemoteTransactionSource = AccountsApiRemoteTransactionSource;
57
- _AccountsApiRemoteTransactionSource_instances = new WeakSet(), _AccountsApiRemoteTransactionSource_queryTransactions = async function _AccountsApiRemoteTransactionSource_queryTransactions(request, chainIds) {
58
- const { address, tags } = request;
59
- const transactions = [];
60
- try {
61
- const response = await (0, accounts_api_1.getAccountTransactions)({
62
- address,
63
- chainIds,
64
- sortDirection: 'DESC',
65
- tags,
66
- });
67
- if (response?.data) {
68
- transactions.push(...response.data);
69
- }
70
- }
71
- catch (error) {
72
- log('Error while fetching transactions', error);
73
- }
74
- return transactions;
75
- }, _AccountsApiRemoteTransactionSource_filterTransactions = function _AccountsApiRemoteTransactionSource_filterTransactions(request, transactions) {
76
- const { address, includeTokenTransfers, updateTransactions } = request;
77
- let filteredTransactions = transactions;
78
- if (!updateTransactions) {
79
- filteredTransactions = filteredTransactions.filter((tx) => tx.txParams.to === address);
80
- }
81
- if (!includeTokenTransfers) {
82
- filteredTransactions = filteredTransactions.filter((tx) => !tx.isTransfer);
83
- }
84
- return filteredTransactions;
85
- }, _AccountsApiRemoteTransactionSource_normalizeTransaction = async function _AccountsApiRemoteTransactionSource_normalizeTransaction(address, responseTransaction) {
86
- const blockNumber = String(responseTransaction.blockNumber);
87
- const chainId = `0x${responseTransaction.chainId.toString(16)}`;
88
- const { hash } = responseTransaction;
89
- const time = new Date(responseTransaction.timestamp).getTime();
90
- const id = (0, uuid_1.v1)({ msecs: time });
91
- const { from } = responseTransaction;
92
- const gas = (0, controller_utils_1.BNToHex)(new bn_js_1.default(responseTransaction.gas));
93
- const gasPrice = (0, controller_utils_1.BNToHex)(new bn_js_1.default(responseTransaction.gasPrice));
94
- const gasUsed = (0, controller_utils_1.BNToHex)(new bn_js_1.default(responseTransaction.gasUsed));
95
- const nonce = (0, controller_utils_1.BNToHex)(new bn_js_1.default(responseTransaction.nonce));
96
- const data = responseTransaction.methodId;
97
- const type = types_1.TransactionType.incoming;
98
- const verifiedOnBlockchain = false;
99
- const status = responseTransaction.isError
100
- ? types_1.TransactionStatus.failed
101
- : types_1.TransactionStatus.confirmed;
102
- const valueTransfer = responseTransaction.valueTransfers.find((vt) => (vt.to.toLowerCase() === address.toLowerCase() ||
103
- vt.from.toLowerCase() === address.toLowerCase()) &&
104
- vt.contractAddress);
105
- const isIncomingTokenTransfer = valueTransfer?.to.toLowerCase() === address.toLowerCase() &&
106
- from.toLowerCase() !== address.toLowerCase();
107
- const isOutgoing = from.toLowerCase() === address.toLowerCase();
108
- const amount = valueTransfer?.amount;
109
- const contractAddress = valueTransfer?.contractAddress;
110
- const decimals = valueTransfer?.decimal;
111
- const symbol = valueTransfer?.symbol;
112
- const value = (0, controller_utils_1.BNToHex)(new bn_js_1.default(isIncomingTokenTransfer
113
- ? (valueTransfer?.amount ?? responseTransaction.value)
114
- : responseTransaction.value));
115
- const to = isIncomingTokenTransfer ? address : responseTransaction.to;
116
- const error = status === types_1.TransactionStatus.failed
117
- ? new Error('Transaction failed')
118
- : undefined;
119
- const transferInformation = valueTransfer
120
- ? {
121
- amount,
122
- contractAddress,
123
- decimals,
124
- symbol,
125
- }
126
- : undefined;
127
- const meta = {
128
- blockNumber,
129
- chainId,
130
- error,
131
- hash,
132
- id,
133
- isTransfer: isIncomingTokenTransfer,
134
- // Populated by TransactionController when added to state
135
- networkClientId: '',
136
- status,
137
- time,
138
- toSmartContract: false,
139
- transferInformation,
140
- txParams: {
141
- chainId,
142
- data,
143
- from,
144
- gas,
145
- gasPrice,
146
- gasUsed,
147
- nonce,
148
- to,
149
- value,
150
- },
151
- type,
152
- verifiedOnBlockchain,
153
- };
154
- if (isOutgoing) {
155
- meta.type = (await (0, transaction_type_1.determineTransactionType)(meta.txParams)).type;
156
- }
157
- return meta;
158
- };
159
- //# sourceMappingURL=AccountsApiRemoteTransactionSource.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AccountsApiRemoteTransactionSource.cjs","sourceRoot":"","sources":["../../src/helpers/AccountsApiRemoteTransactionSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport type {\n GetAccountTransactionsResponse,\n TransactionResponse,\n} from '../api/accounts-api';\nimport { getAccountTransactions } from '../api/accounts-api';\nimport { CHAIN_IDS } from '../constants';\nimport { createModuleLogger, incomingTransactionsLogger } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionError,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\nimport { determineTransactionType } from '../utils/transaction-type';\n\nexport const SUPPORTED_CHAIN_IDS: Hex[] = [\n CHAIN_IDS.MAINNET,\n CHAIN_IDS.POLYGON,\n CHAIN_IDS.BSC,\n CHAIN_IDS.LINEA_MAINNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.ARBITRUM,\n CHAIN_IDS.SCROLL,\n CHAIN_IDS.SEI,\n CHAIN_IDS.MONAD,\n CHAIN_IDS.HYPEREVM,\n];\n\nconst log = createModuleLogger(\n incomingTransactionsLogger,\n 'accounts-api-source',\n);\n\n/**\n * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.\n */\nexport class AccountsApiRemoteTransactionSource implements RemoteTransactionSource {\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address, chainIds } = request;\n\n const responseTransactions = await this.#queryTransactions(\n request,\n chainIds ?? SUPPORTED_CHAIN_IDS,\n );\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = await Promise.all(\n responseTransactions.map((tx) => this.#normalizeTransaction(address, tx)),\n );\n\n log('Normalized transactions', normalizedTransactions);\n\n const filteredTransactions = this.#filterTransactions(\n request,\n normalizedTransactions,\n );\n\n log(\n 'Filtered transactions',\n filteredTransactions.length,\n filteredTransactions,\n );\n\n return filteredTransactions;\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n ): Promise<TransactionResponse[]> {\n const { address, tags } = request;\n const transactions: TransactionResponse[] = [];\n\n try {\n const response = await getAccountTransactions({\n address,\n chainIds,\n sortDirection: 'DESC',\n tags,\n });\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n } catch (error) {\n log('Error while fetching transactions', error);\n }\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ): TransactionMeta[] {\n const { address, includeTokenTransfers, updateTransactions } = request;\n\n let filteredTransactions = transactions;\n\n if (!updateTransactions) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => tx.txParams.to === address,\n );\n }\n\n if (!includeTokenTransfers) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => !tx.isTransfer,\n );\n }\n\n return filteredTransactions;\n }\n\n async #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): Promise<TransactionMeta> {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as const;\n const { hash } = responseTransaction;\n const time = new Date(responseTransaction.timestamp).getTime();\n const id = random({ msecs: time });\n const { from } = responseTransaction;\n const gas = BNToHex(new BN(responseTransaction.gas));\n const gasPrice = BNToHex(new BN(responseTransaction.gasPrice));\n const gasUsed = BNToHex(new BN(responseTransaction.gasUsed));\n const nonce = BNToHex(new BN(responseTransaction.nonce));\n const data = responseTransaction.methodId;\n const type = TransactionType.incoming;\n const verifiedOnBlockchain = false;\n\n const status = responseTransaction.isError\n ? TransactionStatus.failed\n : TransactionStatus.confirmed;\n\n const valueTransfer = responseTransaction.valueTransfers.find(\n (vt) =>\n (vt.to.toLowerCase() === address.toLowerCase() ||\n vt.from.toLowerCase() === address.toLowerCase()) &&\n vt.contractAddress,\n );\n\n const isIncomingTokenTransfer =\n valueTransfer?.to.toLowerCase() === address.toLowerCase() &&\n from.toLowerCase() !== address.toLowerCase();\n\n const isOutgoing = from.toLowerCase() === address.toLowerCase();\n const amount = valueTransfer?.amount;\n const contractAddress = valueTransfer?.contractAddress as string;\n const decimals = valueTransfer?.decimal as number;\n const symbol = valueTransfer?.symbol as string;\n\n const value = BNToHex(\n new BN(\n isIncomingTokenTransfer\n ? (valueTransfer?.amount ?? responseTransaction.value)\n : responseTransaction.value,\n ),\n );\n\n const to = isIncomingTokenTransfer ? address : responseTransaction.to;\n\n const error =\n status === TransactionStatus.failed\n ? new Error('Transaction failed')\n : (undefined as unknown as TransactionError);\n\n const transferInformation = valueTransfer\n ? {\n amount,\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n const meta: TransactionMeta = {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer: isIncomingTokenTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n data,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n\n if (isOutgoing) {\n meta.type = (await determineTransactionType(meta.txParams)).type;\n }\n\n return meta;\n }\n}\n"]}
@@ -1,12 +0,0 @@
1
- import type { Hex } from "@metamask/utils";
2
- import type { RemoteTransactionSource, RemoteTransactionSourceRequest, TransactionMeta } from "../types.cjs";
3
- export declare const SUPPORTED_CHAIN_IDS: Hex[];
4
- /**
5
- * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.
6
- */
7
- export declare class AccountsApiRemoteTransactionSource implements RemoteTransactionSource {
8
- #private;
9
- getSupportedChains(): Hex[];
10
- fetchTransactions(request: RemoteTransactionSourceRequest): Promise<TransactionMeta[]>;
11
- }
12
- //# sourceMappingURL=AccountsApiRemoteTransactionSource.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AccountsApiRemoteTransactionSource.d.cts","sourceRoot":"","sources":["../../src/helpers/AccountsApiRemoteTransactionSource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAW3C,OAAO,KAAK,EACV,uBAAuB,EACvB,8BAA8B,EAE9B,eAAe,EAChB,qBAAiB;AAIlB,eAAO,MAAM,mBAAmB,EAAE,GAAG,EAYpC,CAAC;AAOF;;GAEG;AACH,qBAAa,kCAAmC,YAAW,uBAAuB;;IAChF,kBAAkB,IAAI,GAAG,EAAE;IAIrB,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CAmL9B"}
@@ -1,12 +0,0 @@
1
- import type { Hex } from "@metamask/utils";
2
- import type { RemoteTransactionSource, RemoteTransactionSourceRequest, TransactionMeta } from "../types.mjs";
3
- export declare const SUPPORTED_CHAIN_IDS: Hex[];
4
- /**
5
- * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.
6
- */
7
- export declare class AccountsApiRemoteTransactionSource implements RemoteTransactionSource {
8
- #private;
9
- getSupportedChains(): Hex[];
10
- fetchTransactions(request: RemoteTransactionSourceRequest): Promise<TransactionMeta[]>;
11
- }
12
- //# sourceMappingURL=AccountsApiRemoteTransactionSource.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AccountsApiRemoteTransactionSource.d.mts","sourceRoot":"","sources":["../../src/helpers/AccountsApiRemoteTransactionSource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAW3C,OAAO,KAAK,EACV,uBAAuB,EACvB,8BAA8B,EAE9B,eAAe,EAChB,qBAAiB;AAIlB,eAAO,MAAM,mBAAmB,EAAE,GAAG,EAYpC,CAAC;AAOF;;GAEG;AACH,qBAAa,kCAAmC,YAAW,uBAAuB;;IAChF,kBAAkB,IAAI,GAAG,EAAE;IAIrB,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CAmL9B"}
@@ -1,159 +0,0 @@
1
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
- };
6
- var _AccountsApiRemoteTransactionSource_instances, _AccountsApiRemoteTransactionSource_queryTransactions, _AccountsApiRemoteTransactionSource_filterTransactions, _AccountsApiRemoteTransactionSource_normalizeTransaction;
7
- function $importDefault(module) {
8
- if (module?.__esModule) {
9
- return module.default;
10
- }
11
- return module;
12
- }
13
- import { BNToHex } from "@metamask/controller-utils";
14
- import $BN from "bn.js";
15
- const BN = $importDefault($BN);
16
- import { v1 as random } from "uuid";
17
- import { getAccountTransactions } from "../api/accounts-api.mjs";
18
- import { CHAIN_IDS } from "../constants.mjs";
19
- import { createModuleLogger, incomingTransactionsLogger } from "../logger.mjs";
20
- import { TransactionStatus, TransactionType } from "../types.mjs";
21
- import { determineTransactionType } from "../utils/transaction-type.mjs";
22
- export const SUPPORTED_CHAIN_IDS = [
23
- CHAIN_IDS.MAINNET,
24
- CHAIN_IDS.POLYGON,
25
- CHAIN_IDS.BSC,
26
- CHAIN_IDS.LINEA_MAINNET,
27
- CHAIN_IDS.BASE,
28
- CHAIN_IDS.OPTIMISM,
29
- CHAIN_IDS.ARBITRUM,
30
- CHAIN_IDS.SCROLL,
31
- CHAIN_IDS.SEI,
32
- CHAIN_IDS.MONAD,
33
- CHAIN_IDS.HYPEREVM,
34
- ];
35
- const log = createModuleLogger(incomingTransactionsLogger, 'accounts-api-source');
36
- /**
37
- * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.
38
- */
39
- export class AccountsApiRemoteTransactionSource {
40
- constructor() {
41
- _AccountsApiRemoteTransactionSource_instances.add(this);
42
- }
43
- getSupportedChains() {
44
- return SUPPORTED_CHAIN_IDS;
45
- }
46
- async fetchTransactions(request) {
47
- const { address, chainIds } = request;
48
- const responseTransactions = await __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_queryTransactions).call(this, request, chainIds ?? SUPPORTED_CHAIN_IDS);
49
- log('Fetched transactions', responseTransactions.length, responseTransactions);
50
- const normalizedTransactions = await Promise.all(responseTransactions.map((tx) => __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_normalizeTransaction).call(this, address, tx)));
51
- log('Normalized transactions', normalizedTransactions);
52
- const filteredTransactions = __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_filterTransactions).call(this, request, normalizedTransactions);
53
- log('Filtered transactions', filteredTransactions.length, filteredTransactions);
54
- return filteredTransactions;
55
- }
56
- }
57
- _AccountsApiRemoteTransactionSource_instances = new WeakSet(), _AccountsApiRemoteTransactionSource_queryTransactions = async function _AccountsApiRemoteTransactionSource_queryTransactions(request, chainIds) {
58
- const { address, tags } = request;
59
- const transactions = [];
60
- try {
61
- const response = await getAccountTransactions({
62
- address,
63
- chainIds,
64
- sortDirection: 'DESC',
65
- tags,
66
- });
67
- if (response?.data) {
68
- transactions.push(...response.data);
69
- }
70
- }
71
- catch (error) {
72
- log('Error while fetching transactions', error);
73
- }
74
- return transactions;
75
- }, _AccountsApiRemoteTransactionSource_filterTransactions = function _AccountsApiRemoteTransactionSource_filterTransactions(request, transactions) {
76
- const { address, includeTokenTransfers, updateTransactions } = request;
77
- let filteredTransactions = transactions;
78
- if (!updateTransactions) {
79
- filteredTransactions = filteredTransactions.filter((tx) => tx.txParams.to === address);
80
- }
81
- if (!includeTokenTransfers) {
82
- filteredTransactions = filteredTransactions.filter((tx) => !tx.isTransfer);
83
- }
84
- return filteredTransactions;
85
- }, _AccountsApiRemoteTransactionSource_normalizeTransaction = async function _AccountsApiRemoteTransactionSource_normalizeTransaction(address, responseTransaction) {
86
- const blockNumber = String(responseTransaction.blockNumber);
87
- const chainId = `0x${responseTransaction.chainId.toString(16)}`;
88
- const { hash } = responseTransaction;
89
- const time = new Date(responseTransaction.timestamp).getTime();
90
- const id = random({ msecs: time });
91
- const { from } = responseTransaction;
92
- const gas = BNToHex(new BN(responseTransaction.gas));
93
- const gasPrice = BNToHex(new BN(responseTransaction.gasPrice));
94
- const gasUsed = BNToHex(new BN(responseTransaction.gasUsed));
95
- const nonce = BNToHex(new BN(responseTransaction.nonce));
96
- const data = responseTransaction.methodId;
97
- const type = TransactionType.incoming;
98
- const verifiedOnBlockchain = false;
99
- const status = responseTransaction.isError
100
- ? TransactionStatus.failed
101
- : TransactionStatus.confirmed;
102
- const valueTransfer = responseTransaction.valueTransfers.find((vt) => (vt.to.toLowerCase() === address.toLowerCase() ||
103
- vt.from.toLowerCase() === address.toLowerCase()) &&
104
- vt.contractAddress);
105
- const isIncomingTokenTransfer = valueTransfer?.to.toLowerCase() === address.toLowerCase() &&
106
- from.toLowerCase() !== address.toLowerCase();
107
- const isOutgoing = from.toLowerCase() === address.toLowerCase();
108
- const amount = valueTransfer?.amount;
109
- const contractAddress = valueTransfer?.contractAddress;
110
- const decimals = valueTransfer?.decimal;
111
- const symbol = valueTransfer?.symbol;
112
- const value = BNToHex(new BN(isIncomingTokenTransfer
113
- ? (valueTransfer?.amount ?? responseTransaction.value)
114
- : responseTransaction.value));
115
- const to = isIncomingTokenTransfer ? address : responseTransaction.to;
116
- const error = status === TransactionStatus.failed
117
- ? new Error('Transaction failed')
118
- : undefined;
119
- const transferInformation = valueTransfer
120
- ? {
121
- amount,
122
- contractAddress,
123
- decimals,
124
- symbol,
125
- }
126
- : undefined;
127
- const meta = {
128
- blockNumber,
129
- chainId,
130
- error,
131
- hash,
132
- id,
133
- isTransfer: isIncomingTokenTransfer,
134
- // Populated by TransactionController when added to state
135
- networkClientId: '',
136
- status,
137
- time,
138
- toSmartContract: false,
139
- transferInformation,
140
- txParams: {
141
- chainId,
142
- data,
143
- from,
144
- gas,
145
- gasPrice,
146
- gasUsed,
147
- nonce,
148
- to,
149
- value,
150
- },
151
- type,
152
- verifiedOnBlockchain,
153
- };
154
- if (isOutgoing) {
155
- meta.type = (await determineTransactionType(meta.txParams)).type;
156
- }
157
- return meta;
158
- };
159
- //# sourceMappingURL=AccountsApiRemoteTransactionSource.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AccountsApiRemoteTransactionSource.mjs","sourceRoot":"","sources":["../../src/helpers/AccountsApiRemoteTransactionSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport type {\n GetAccountTransactionsResponse,\n TransactionResponse,\n} from '../api/accounts-api';\nimport { getAccountTransactions } from '../api/accounts-api';\nimport { CHAIN_IDS } from '../constants';\nimport { createModuleLogger, incomingTransactionsLogger } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionError,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\nimport { determineTransactionType } from '../utils/transaction-type';\n\nexport const SUPPORTED_CHAIN_IDS: Hex[] = [\n CHAIN_IDS.MAINNET,\n CHAIN_IDS.POLYGON,\n CHAIN_IDS.BSC,\n CHAIN_IDS.LINEA_MAINNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.ARBITRUM,\n CHAIN_IDS.SCROLL,\n CHAIN_IDS.SEI,\n CHAIN_IDS.MONAD,\n CHAIN_IDS.HYPEREVM,\n];\n\nconst log = createModuleLogger(\n incomingTransactionsLogger,\n 'accounts-api-source',\n);\n\n/**\n * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.\n */\nexport class AccountsApiRemoteTransactionSource implements RemoteTransactionSource {\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address, chainIds } = request;\n\n const responseTransactions = await this.#queryTransactions(\n request,\n chainIds ?? SUPPORTED_CHAIN_IDS,\n );\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = await Promise.all(\n responseTransactions.map((tx) => this.#normalizeTransaction(address, tx)),\n );\n\n log('Normalized transactions', normalizedTransactions);\n\n const filteredTransactions = this.#filterTransactions(\n request,\n normalizedTransactions,\n );\n\n log(\n 'Filtered transactions',\n filteredTransactions.length,\n filteredTransactions,\n );\n\n return filteredTransactions;\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n ): Promise<TransactionResponse[]> {\n const { address, tags } = request;\n const transactions: TransactionResponse[] = [];\n\n try {\n const response = await getAccountTransactions({\n address,\n chainIds,\n sortDirection: 'DESC',\n tags,\n });\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n } catch (error) {\n log('Error while fetching transactions', error);\n }\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ): TransactionMeta[] {\n const { address, includeTokenTransfers, updateTransactions } = request;\n\n let filteredTransactions = transactions;\n\n if (!updateTransactions) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => tx.txParams.to === address,\n );\n }\n\n if (!includeTokenTransfers) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => !tx.isTransfer,\n );\n }\n\n return filteredTransactions;\n }\n\n async #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): Promise<TransactionMeta> {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as const;\n const { hash } = responseTransaction;\n const time = new Date(responseTransaction.timestamp).getTime();\n const id = random({ msecs: time });\n const { from } = responseTransaction;\n const gas = BNToHex(new BN(responseTransaction.gas));\n const gasPrice = BNToHex(new BN(responseTransaction.gasPrice));\n const gasUsed = BNToHex(new BN(responseTransaction.gasUsed));\n const nonce = BNToHex(new BN(responseTransaction.nonce));\n const data = responseTransaction.methodId;\n const type = TransactionType.incoming;\n const verifiedOnBlockchain = false;\n\n const status = responseTransaction.isError\n ? TransactionStatus.failed\n : TransactionStatus.confirmed;\n\n const valueTransfer = responseTransaction.valueTransfers.find(\n (vt) =>\n (vt.to.toLowerCase() === address.toLowerCase() ||\n vt.from.toLowerCase() === address.toLowerCase()) &&\n vt.contractAddress,\n );\n\n const isIncomingTokenTransfer =\n valueTransfer?.to.toLowerCase() === address.toLowerCase() &&\n from.toLowerCase() !== address.toLowerCase();\n\n const isOutgoing = from.toLowerCase() === address.toLowerCase();\n const amount = valueTransfer?.amount;\n const contractAddress = valueTransfer?.contractAddress as string;\n const decimals = valueTransfer?.decimal as number;\n const symbol = valueTransfer?.symbol as string;\n\n const value = BNToHex(\n new BN(\n isIncomingTokenTransfer\n ? (valueTransfer?.amount ?? responseTransaction.value)\n : responseTransaction.value,\n ),\n );\n\n const to = isIncomingTokenTransfer ? address : responseTransaction.to;\n\n const error =\n status === TransactionStatus.failed\n ? new Error('Transaction failed')\n : (undefined as unknown as TransactionError);\n\n const transferInformation = valueTransfer\n ? {\n amount,\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n const meta: TransactionMeta = {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer: isIncomingTokenTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n data,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n\n if (isOutgoing) {\n meta.type = (await determineTransactionType(meta.txParams)).type;\n }\n\n return meta;\n }\n}\n"]}