@metamask-previews/transaction-controller 55.0.2-preview-698a7cc → 55.0.2-preview-5cc6dab9

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 (46) hide show
  1. package/CHANGELOG.md +0 -10
  2. package/dist/TransactionController.cjs +2 -10
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +1 -9
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +1 -9
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +2 -10
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/api/accounts-api.cjs +2 -3
  11. package/dist/api/accounts-api.cjs.map +1 -1
  12. package/dist/api/accounts-api.d.cts +0 -1
  13. package/dist/api/accounts-api.d.cts.map +1 -1
  14. package/dist/api/accounts-api.d.mts +0 -1
  15. package/dist/api/accounts-api.d.mts.map +1 -1
  16. package/dist/api/accounts-api.mjs +2 -3
  17. package/dist/api/accounts-api.mjs.map +1 -1
  18. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +1 -2
  19. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -1
  20. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +1 -1
  21. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +1 -1
  22. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +1 -2
  23. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -1
  24. package/dist/helpers/IncomingTransactionHelper.cjs +8 -32
  25. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  26. package/dist/helpers/IncomingTransactionHelper.d.cts +2 -7
  27. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  28. package/dist/helpers/IncomingTransactionHelper.d.mts +2 -7
  29. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  30. package/dist/helpers/IncomingTransactionHelper.mjs +8 -32
  31. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  32. package/dist/types.cjs.map +1 -1
  33. package/dist/types.d.cts +0 -4
  34. package/dist/types.d.cts.map +1 -1
  35. package/dist/types.d.mts +0 -4
  36. package/dist/types.d.mts.map +1 -1
  37. package/dist/types.mjs.map +1 -1
  38. package/dist/utils/feature-flags.cjs +1 -16
  39. package/dist/utils/feature-flags.cjs.map +1 -1
  40. package/dist/utils/feature-flags.d.cts +0 -14
  41. package/dist/utils/feature-flags.d.cts.map +1 -1
  42. package/dist/utils/feature-flags.d.mts +0 -14
  43. package/dist/utils/feature-flags.d.mts.map +1 -1
  44. package/dist/utils/feature-flags.mjs +0 -14
  45. package/dist/utils/feature-flags.mjs.map +1 -1
  46. package/package.json +1 -1
@@ -59,7 +59,7 @@ exports.getAccountAddressRelationship = getAccountAddressRelationship;
59
59
  * @returns The response object.
60
60
  */
61
61
  async function getAccountTransactions(request) {
62
- const { address, chainIds, cursor, endTimestamp, sortDirection, startTimestamp, tags, } = request;
62
+ const { address, chainIds, cursor, endTimestamp, sortDirection, startTimestamp, } = request;
63
63
  let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;
64
64
  const params = [];
65
65
  if (chainIds) {
@@ -82,9 +82,8 @@ async function getAccountTransactions(request) {
82
82
  url += `?${params.join('&')}`;
83
83
  }
84
84
  log('Getting account transactions', { request, url });
85
- const clientId = [CLIENT_ID, ...(tags || [])].join('__');
86
85
  const headers = {
87
- [CLIENT_HEADER]: clientId,
86
+ [CLIENT_HEADER]: CLIENT_ID,
88
87
  };
89
88
  const response = await (0, controller_utils_1.successfulFetch)(url, { headers });
90
89
  const responseJson = await response.json();
@@ -1 +1 @@
1
- {"version":3,"file":"accounts-api.cjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { FirstTimeInteractionError } from '../errors';\nimport { projectLogger } from '../logger';\n\nexport type AccountAddressRelationshipResponse = {\n chainId?: number;\n count?: number;\n data?: {\n hash: string;\n timestamp: string;\n chainId: number;\n blockNumber: string;\n blockHash: string;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: number;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: string;\n value: string;\n to: string;\n from: string;\n };\n txHash?: string;\n};\n\nexport type AccountAddressRelationshipResult =\n AccountAddressRelationshipResponse & {\n error?: {\n code: string;\n message: string;\n };\n };\n\nexport type GetAccountAddressRelationshipRequest = {\n /** Chain ID of account relationship to check. */\n chainId: number;\n\n /** Recipient of the transaction. */\n to: string;\n\n /** Sender of the transaction. */\n from: string;\n};\n\nexport type TransactionResponse = {\n hash: Hex;\n timestamp: string;\n chainId: number;\n blockNumber: number;\n blockHash: Hex;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: string;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: null;\n value: string;\n to: string;\n from: string;\n isError: boolean;\n valueTransfers: {\n contractAddress: string;\n decimal: number;\n symbol: string;\n from: string;\n to: string;\n amount: string;\n }[];\n};\n\nexport type GetAccountTransactionsRequest = {\n address: Hex;\n chainIds?: Hex[];\n cursor?: string;\n endTimestamp?: number;\n sortDirection?: 'ASC' | 'DESC';\n startTimestamp?: number;\n tags?: string[];\n};\n\nexport type GetAccountTransactionsResponse = {\n data: TransactionResponse[];\n pageInfo: {\n count: number;\n hasNextPage: boolean;\n cursor?: string;\n };\n};\n\nconst BASE_URL = `https://accounts.api.cx.metamask.io`;\nconst BASE_URL_ACCOUNTS = `${BASE_URL}/v1/accounts/`;\nconst CLIENT_HEADER = 'x-metamask-clientproduct';\nconst CLIENT_ID = 'metamask-transaction-controller';\n\nconst SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [\n 1, // Ethereum Mainnet\n 10, // Optimism\n 56, // BSC\n 137, // Polygon\n 8453, // Base\n 42161, // Arbitrum\n 59144, // Linea\n 534352, // Scroll\n];\n\nconst log = createModuleLogger(projectLogger, 'accounts-api');\n\n/**\n * Fetch account address relationship from the accounts API.\n *\n * @param request - The request object.\n * @returns The raw response object from the API.\n */\nexport async function getAccountAddressRelationship(\n request: GetAccountAddressRelationshipRequest,\n): Promise<AccountAddressRelationshipResult> {\n const { chainId, from, to } = request;\n\n if (!SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API.includes(chainId)) {\n log('Unsupported chain ID for account relationship API', chainId);\n throw new FirstTimeInteractionError('Unsupported chain ID');\n }\n\n const url = `${BASE_URL}/v1/networks/${chainId}/accounts/${from}/relationships/${to}`;\n\n log('Getting account address relationship', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n\n if (response.status === 204) {\n // The accounts API returns a 204 status code when there are no transactions with empty body\n // imitating a count of 0\n return { count: 0 };\n }\n\n const responseJson: AccountAddressRelationshipResult = await response.json();\n\n log('Retrieved account address relationship', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new FirstTimeInteractionError(message, code);\n }\n\n return responseJson;\n}\n\n/**\n * Fetch account transactions from the accounts API.\n *\n * @param request - The request object.\n * @returns The response object.\n */\nexport async function getAccountTransactions(\n request: GetAccountTransactionsRequest,\n): Promise<GetAccountTransactionsResponse> {\n const {\n address,\n chainIds,\n cursor,\n endTimestamp,\n sortDirection,\n startTimestamp,\n tags,\n } = request;\n\n let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;\n const params = [];\n\n if (chainIds) {\n const network = chainIds.join(',');\n params.push(`networks=${network}`);\n }\n\n if (startTimestamp) {\n params.push(`startTimestamp=${startTimestamp}`);\n }\n\n if (endTimestamp) {\n params.push(`endTimestamp=${endTimestamp}`);\n }\n\n if (cursor) {\n params.push(`cursor=${cursor}`);\n }\n\n if (sortDirection) {\n params.push(`sortDirection=${sortDirection}`);\n }\n\n if (params.length) {\n url += `?${params.join('&')}`;\n }\n\n log('Getting account transactions', { request, url });\n\n const clientId = [CLIENT_ID, ...(tags || [])].join('__');\n\n const headers = {\n [CLIENT_HEADER]: clientId,\n };\n\n const response = await successfulFetch(url, { headers });\n const responseJson = await response.json();\n\n log('Retrieved account transactions', responseJson);\n\n return responseJson;\n}\n"]}
1
+ {"version":3,"file":"accounts-api.cjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { FirstTimeInteractionError } from '../errors';\nimport { projectLogger } from '../logger';\n\nexport type AccountAddressRelationshipResponse = {\n chainId?: number;\n count?: number;\n data?: {\n hash: string;\n timestamp: string;\n chainId: number;\n blockNumber: string;\n blockHash: string;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: number;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: string;\n value: string;\n to: string;\n from: string;\n };\n txHash?: string;\n};\n\nexport type AccountAddressRelationshipResult =\n AccountAddressRelationshipResponse & {\n error?: {\n code: string;\n message: string;\n };\n };\n\nexport type GetAccountAddressRelationshipRequest = {\n /** Chain ID of account relationship to check. */\n chainId: number;\n\n /** Recipient of the transaction. */\n to: string;\n\n /** Sender of the transaction. */\n from: string;\n};\n\nexport type TransactionResponse = {\n hash: Hex;\n timestamp: string;\n chainId: number;\n blockNumber: number;\n blockHash: Hex;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: string;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: null;\n value: string;\n to: string;\n from: string;\n isError: boolean;\n valueTransfers: {\n contractAddress: string;\n decimal: number;\n symbol: string;\n from: string;\n to: string;\n amount: string;\n }[];\n};\n\nexport type GetAccountTransactionsRequest = {\n address: Hex;\n chainIds?: Hex[];\n cursor?: string;\n endTimestamp?: number;\n sortDirection?: 'ASC' | 'DESC';\n startTimestamp?: number;\n};\n\nexport type GetAccountTransactionsResponse = {\n data: TransactionResponse[];\n pageInfo: {\n count: number;\n hasNextPage: boolean;\n cursor?: string;\n };\n};\n\nconst BASE_URL = `https://accounts.api.cx.metamask.io`;\nconst BASE_URL_ACCOUNTS = `${BASE_URL}/v1/accounts/`;\nconst CLIENT_HEADER = 'x-metamask-clientproduct';\nconst CLIENT_ID = 'metamask-transaction-controller';\n\nconst SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [\n 1, // Ethereum Mainnet\n 10, // Optimism\n 56, // BSC\n 137, // Polygon\n 8453, // Base\n 42161, // Arbitrum\n 59144, // Linea\n 534352, // Scroll\n];\n\nconst log = createModuleLogger(projectLogger, 'accounts-api');\n\n/**\n * Fetch account address relationship from the accounts API.\n *\n * @param request - The request object.\n * @returns The raw response object from the API.\n */\nexport async function getAccountAddressRelationship(\n request: GetAccountAddressRelationshipRequest,\n): Promise<AccountAddressRelationshipResult> {\n const { chainId, from, to } = request;\n\n if (!SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API.includes(chainId)) {\n log('Unsupported chain ID for account relationship API', chainId);\n throw new FirstTimeInteractionError('Unsupported chain ID');\n }\n\n const url = `${BASE_URL}/v1/networks/${chainId}/accounts/${from}/relationships/${to}`;\n\n log('Getting account address relationship', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n\n if (response.status === 204) {\n // The accounts API returns a 204 status code when there are no transactions with empty body\n // imitating a count of 0\n return { count: 0 };\n }\n\n const responseJson: AccountAddressRelationshipResult = await response.json();\n\n log('Retrieved account address relationship', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new FirstTimeInteractionError(message, code);\n }\n\n return responseJson;\n}\n\n/**\n * Fetch account transactions from the accounts API.\n *\n * @param request - The request object.\n * @returns The response object.\n */\nexport async function getAccountTransactions(\n request: GetAccountTransactionsRequest,\n): Promise<GetAccountTransactionsResponse> {\n const {\n address,\n chainIds,\n cursor,\n endTimestamp,\n sortDirection,\n startTimestamp,\n } = request;\n\n let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;\n const params = [];\n\n if (chainIds) {\n const network = chainIds.join(',');\n params.push(`networks=${network}`);\n }\n\n if (startTimestamp) {\n params.push(`startTimestamp=${startTimestamp}`);\n }\n\n if (endTimestamp) {\n params.push(`endTimestamp=${endTimestamp}`);\n }\n\n if (cursor) {\n params.push(`cursor=${cursor}`);\n }\n\n if (sortDirection) {\n params.push(`sortDirection=${sortDirection}`);\n }\n\n if (params.length) {\n url += `?${params.join('&')}`;\n }\n\n log('Getting account transactions', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n const responseJson = await response.json();\n\n log('Retrieved account transactions', responseJson);\n\n return responseJson;\n}\n"]}
@@ -68,7 +68,6 @@ export type GetAccountTransactionsRequest = {
68
68
  endTimestamp?: number;
69
69
  sortDirection?: 'ASC' | 'DESC';
70
70
  startTimestamp?: number;
71
- tags?: string[];
72
71
  };
73
72
  export type GetAccountTransactionsResponse = {
74
73
  data: TransactionResponse[];
@@ -1 +1 @@
1
- {"version":3,"file":"accounts-api.d.cts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAM3C,MAAM,MAAM,kCAAkC,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAC1C,kCAAkC,GAAG;IACnC,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEJ,MAAM,MAAM,oCAAoC,GAAG;IACjD,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAEhB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IAEX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,GAAG,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE;QACd,eAAe,EAAE,MAAM,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,OAAO,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAoBF;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,gCAAgC,CAAC,CAkC3C;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,8BAA8B,CAAC,CAqDzC"}
1
+ {"version":3,"file":"accounts-api.d.cts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"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"}
@@ -68,7 +68,6 @@ export type GetAccountTransactionsRequest = {
68
68
  endTimestamp?: number;
69
69
  sortDirection?: 'ASC' | 'DESC';
70
70
  startTimestamp?: number;
71
- tags?: string[];
72
71
  };
73
72
  export type GetAccountTransactionsResponse = {
74
73
  data: TransactionResponse[];
@@ -1 +1 @@
1
- {"version":3,"file":"accounts-api.d.mts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accounts-api.d.mts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"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"}
@@ -55,7 +55,7 @@ export async function getAccountAddressRelationship(request) {
55
55
  * @returns The response object.
56
56
  */
57
57
  export async function getAccountTransactions(request) {
58
- const { address, chainIds, cursor, endTimestamp, sortDirection, startTimestamp, tags, } = request;
58
+ const { address, chainIds, cursor, endTimestamp, sortDirection, startTimestamp, } = request;
59
59
  let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;
60
60
  const params = [];
61
61
  if (chainIds) {
@@ -78,9 +78,8 @@ export async function getAccountTransactions(request) {
78
78
  url += `?${params.join('&')}`;
79
79
  }
80
80
  log('Getting account transactions', { request, url });
81
- const clientId = [CLIENT_ID, ...(tags || [])].join('__');
82
81
  const headers = {
83
- [CLIENT_HEADER]: clientId,
82
+ [CLIENT_HEADER]: CLIENT_ID,
84
83
  };
85
84
  const response = await successfulFetch(url, { headers });
86
85
  const responseJson = await response.json();
@@ -1 +1 @@
1
- {"version":3,"file":"accounts-api.mjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { FirstTimeInteractionError } from '../errors';\nimport { projectLogger } from '../logger';\n\nexport type AccountAddressRelationshipResponse = {\n chainId?: number;\n count?: number;\n data?: {\n hash: string;\n timestamp: string;\n chainId: number;\n blockNumber: string;\n blockHash: string;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: number;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: string;\n value: string;\n to: string;\n from: string;\n };\n txHash?: string;\n};\n\nexport type AccountAddressRelationshipResult =\n AccountAddressRelationshipResponse & {\n error?: {\n code: string;\n message: string;\n };\n };\n\nexport type GetAccountAddressRelationshipRequest = {\n /** Chain ID of account relationship to check. */\n chainId: number;\n\n /** Recipient of the transaction. */\n to: string;\n\n /** Sender of the transaction. */\n from: string;\n};\n\nexport type TransactionResponse = {\n hash: Hex;\n timestamp: string;\n chainId: number;\n blockNumber: number;\n blockHash: Hex;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: string;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: null;\n value: string;\n to: string;\n from: string;\n isError: boolean;\n valueTransfers: {\n contractAddress: string;\n decimal: number;\n symbol: string;\n from: string;\n to: string;\n amount: string;\n }[];\n};\n\nexport type GetAccountTransactionsRequest = {\n address: Hex;\n chainIds?: Hex[];\n cursor?: string;\n endTimestamp?: number;\n sortDirection?: 'ASC' | 'DESC';\n startTimestamp?: number;\n tags?: string[];\n};\n\nexport type GetAccountTransactionsResponse = {\n data: TransactionResponse[];\n pageInfo: {\n count: number;\n hasNextPage: boolean;\n cursor?: string;\n };\n};\n\nconst BASE_URL = `https://accounts.api.cx.metamask.io`;\nconst BASE_URL_ACCOUNTS = `${BASE_URL}/v1/accounts/`;\nconst CLIENT_HEADER = 'x-metamask-clientproduct';\nconst CLIENT_ID = 'metamask-transaction-controller';\n\nconst SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [\n 1, // Ethereum Mainnet\n 10, // Optimism\n 56, // BSC\n 137, // Polygon\n 8453, // Base\n 42161, // Arbitrum\n 59144, // Linea\n 534352, // Scroll\n];\n\nconst log = createModuleLogger(projectLogger, 'accounts-api');\n\n/**\n * Fetch account address relationship from the accounts API.\n *\n * @param request - The request object.\n * @returns The raw response object from the API.\n */\nexport async function getAccountAddressRelationship(\n request: GetAccountAddressRelationshipRequest,\n): Promise<AccountAddressRelationshipResult> {\n const { chainId, from, to } = request;\n\n if (!SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API.includes(chainId)) {\n log('Unsupported chain ID for account relationship API', chainId);\n throw new FirstTimeInteractionError('Unsupported chain ID');\n }\n\n const url = `${BASE_URL}/v1/networks/${chainId}/accounts/${from}/relationships/${to}`;\n\n log('Getting account address relationship', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n\n if (response.status === 204) {\n // The accounts API returns a 204 status code when there are no transactions with empty body\n // imitating a count of 0\n return { count: 0 };\n }\n\n const responseJson: AccountAddressRelationshipResult = await response.json();\n\n log('Retrieved account address relationship', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new FirstTimeInteractionError(message, code);\n }\n\n return responseJson;\n}\n\n/**\n * Fetch account transactions from the accounts API.\n *\n * @param request - The request object.\n * @returns The response object.\n */\nexport async function getAccountTransactions(\n request: GetAccountTransactionsRequest,\n): Promise<GetAccountTransactionsResponse> {\n const {\n address,\n chainIds,\n cursor,\n endTimestamp,\n sortDirection,\n startTimestamp,\n tags,\n } = request;\n\n let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;\n const params = [];\n\n if (chainIds) {\n const network = chainIds.join(',');\n params.push(`networks=${network}`);\n }\n\n if (startTimestamp) {\n params.push(`startTimestamp=${startTimestamp}`);\n }\n\n if (endTimestamp) {\n params.push(`endTimestamp=${endTimestamp}`);\n }\n\n if (cursor) {\n params.push(`cursor=${cursor}`);\n }\n\n if (sortDirection) {\n params.push(`sortDirection=${sortDirection}`);\n }\n\n if (params.length) {\n url += `?${params.join('&')}`;\n }\n\n log('Getting account transactions', { request, url });\n\n const clientId = [CLIENT_ID, ...(tags || [])].join('__');\n\n const headers = {\n [CLIENT_HEADER]: clientId,\n };\n\n const response = await successfulFetch(url, { headers });\n const responseJson = await response.json();\n\n log('Retrieved account transactions', responseJson);\n\n return responseJson;\n}\n"]}
1
+ {"version":3,"file":"accounts-api.mjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { FirstTimeInteractionError } from '../errors';\nimport { projectLogger } from '../logger';\n\nexport type AccountAddressRelationshipResponse = {\n chainId?: number;\n count?: number;\n data?: {\n hash: string;\n timestamp: string;\n chainId: number;\n blockNumber: string;\n blockHash: string;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: number;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: string;\n value: string;\n to: string;\n from: string;\n };\n txHash?: string;\n};\n\nexport type AccountAddressRelationshipResult =\n AccountAddressRelationshipResponse & {\n error?: {\n code: string;\n message: string;\n };\n };\n\nexport type GetAccountAddressRelationshipRequest = {\n /** Chain ID of account relationship to check. */\n chainId: number;\n\n /** Recipient of the transaction. */\n to: string;\n\n /** Sender of the transaction. */\n from: string;\n};\n\nexport type TransactionResponse = {\n hash: Hex;\n timestamp: string;\n chainId: number;\n blockNumber: number;\n blockHash: Hex;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: string;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: null;\n value: string;\n to: string;\n from: string;\n isError: boolean;\n valueTransfers: {\n contractAddress: string;\n decimal: number;\n symbol: string;\n from: string;\n to: string;\n amount: string;\n }[];\n};\n\nexport type GetAccountTransactionsRequest = {\n address: Hex;\n chainIds?: Hex[];\n cursor?: string;\n endTimestamp?: number;\n sortDirection?: 'ASC' | 'DESC';\n startTimestamp?: number;\n};\n\nexport type GetAccountTransactionsResponse = {\n data: TransactionResponse[];\n pageInfo: {\n count: number;\n hasNextPage: boolean;\n cursor?: string;\n };\n};\n\nconst BASE_URL = `https://accounts.api.cx.metamask.io`;\nconst BASE_URL_ACCOUNTS = `${BASE_URL}/v1/accounts/`;\nconst CLIENT_HEADER = 'x-metamask-clientproduct';\nconst CLIENT_ID = 'metamask-transaction-controller';\n\nconst SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [\n 1, // Ethereum Mainnet\n 10, // Optimism\n 56, // BSC\n 137, // Polygon\n 8453, // Base\n 42161, // Arbitrum\n 59144, // Linea\n 534352, // Scroll\n];\n\nconst log = createModuleLogger(projectLogger, 'accounts-api');\n\n/**\n * Fetch account address relationship from the accounts API.\n *\n * @param request - The request object.\n * @returns The raw response object from the API.\n */\nexport async function getAccountAddressRelationship(\n request: GetAccountAddressRelationshipRequest,\n): Promise<AccountAddressRelationshipResult> {\n const { chainId, from, to } = request;\n\n if (!SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API.includes(chainId)) {\n log('Unsupported chain ID for account relationship API', chainId);\n throw new FirstTimeInteractionError('Unsupported chain ID');\n }\n\n const url = `${BASE_URL}/v1/networks/${chainId}/accounts/${from}/relationships/${to}`;\n\n log('Getting account address relationship', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n\n if (response.status === 204) {\n // The accounts API returns a 204 status code when there are no transactions with empty body\n // imitating a count of 0\n return { count: 0 };\n }\n\n const responseJson: AccountAddressRelationshipResult = await response.json();\n\n log('Retrieved account address relationship', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new FirstTimeInteractionError(message, code);\n }\n\n return responseJson;\n}\n\n/**\n * Fetch account transactions from the accounts API.\n *\n * @param request - The request object.\n * @returns The response object.\n */\nexport async function getAccountTransactions(\n request: GetAccountTransactionsRequest,\n): Promise<GetAccountTransactionsResponse> {\n const {\n address,\n chainIds,\n cursor,\n endTimestamp,\n sortDirection,\n startTimestamp,\n } = request;\n\n let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;\n const params = [];\n\n if (chainIds) {\n const network = chainIds.join(',');\n params.push(`networks=${network}`);\n }\n\n if (startTimestamp) {\n params.push(`startTimestamp=${startTimestamp}`);\n }\n\n if (endTimestamp) {\n params.push(`endTimestamp=${endTimestamp}`);\n }\n\n if (cursor) {\n params.push(`cursor=${cursor}`);\n }\n\n if (sortDirection) {\n params.push(`sortDirection=${sortDirection}`);\n }\n\n if (params.length) {\n url += `?${params.join('&')}`;\n }\n\n log('Getting account transactions', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n const responseJson = await response.json();\n\n log('Retrieved account transactions', responseJson);\n\n return responseJson;\n}\n"]}
@@ -67,7 +67,7 @@ _AccountsApiRemoteTransactionSource_instances = new WeakSet(), _AccountsApiRemot
67
67
  }
68
68
  return await __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_queryTransactions).call(this, request, exports.SUPPORTED_CHAIN_IDS, cursor, timestamp);
69
69
  }, _AccountsApiRemoteTransactionSource_queryTransactions = async function _AccountsApiRemoteTransactionSource_queryTransactions(request, chainIds, cursor, timestamp) {
70
- const { address, queryEntireHistory, tags } = request;
70
+ const { address, queryEntireHistory } = request;
71
71
  const transactions = [];
72
72
  let hasNextPage = true;
73
73
  let currentCursor = cursor;
@@ -85,7 +85,6 @@ _AccountsApiRemoteTransactionSource_instances = new WeakSet(), _AccountsApiRemot
85
85
  cursor: currentCursor,
86
86
  sortDirection: 'ASC',
87
87
  startTimestamp,
88
- tags,
89
88
  });
90
89
  pageCount += 1;
91
90
  if (response?.data) {
@@ -1 +1 @@
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';\n\nconst RECENT_HISTORY_DURATION_MS = 1000 * 60 * 60 * 24; // 1 Day\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];\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\n implements RemoteTransactionSource\n{\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address } = request;\n\n const responseTransactions = await this.#getTransactions(request);\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = responseTransactions.map((tx) =>\n 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 #getTransactions(request: RemoteTransactionSourceRequest) {\n log('Getting transactions', request);\n\n const { address, cache } = request;\n\n const cursor = this.#getCacheCursor(cache, SUPPORTED_CHAIN_IDS, address);\n\n const timestamp = this.#getCacheTimestamp(\n cache,\n SUPPORTED_CHAIN_IDS,\n address,\n );\n\n if (cursor) {\n log('Using cached cursor', cursor);\n } else if (timestamp) {\n log('Using cached timestamp', timestamp);\n } else {\n log('No cached cursor or timestamp found');\n }\n\n return await this.#queryTransactions(\n request,\n SUPPORTED_CHAIN_IDS,\n cursor,\n timestamp,\n );\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n cursor?: string,\n timestamp?: number,\n ): Promise<TransactionResponse[]> {\n const { address, queryEntireHistory, tags } = request;\n const transactions: TransactionResponse[] = [];\n\n let hasNextPage = true;\n let currentCursor = cursor;\n let pageCount = 0;\n\n while (hasNextPage) {\n try {\n const startTimestamp = this.#getStartTimestamp({\n cursor: currentCursor,\n queryEntireHistory,\n timestamp,\n });\n\n const response = await getAccountTransactions({\n address,\n chainIds,\n cursor: currentCursor,\n sortDirection: 'ASC',\n startTimestamp,\n tags,\n });\n\n pageCount += 1;\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n\n hasNextPage = response?.pageInfo?.hasNextPage;\n currentCursor = response?.pageInfo?.cursor;\n\n this.#updateCache({\n chainIds,\n cursor: currentCursor,\n request,\n startTimestamp,\n });\n } catch (error) {\n log('Error while fetching transactions', error);\n break;\n }\n }\n\n log('Queried transactions', { pageCount });\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ) {\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 #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): TransactionMeta {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as Hex;\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 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() && vt.contractAddress,\n );\n\n const isTransfer = Boolean(valueTransfer);\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(valueTransfer?.amount ?? responseTransaction.value),\n );\n\n const to = valueTransfer ? 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 = isTransfer\n ? {\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n return {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n }\n\n #updateCache({\n chainIds,\n cursor,\n request,\n startTimestamp,\n }: {\n chainIds: Hex[];\n cursor?: string;\n request: RemoteTransactionSourceRequest;\n startTimestamp?: number;\n }) {\n if (!cursor && !startTimestamp) {\n log('Cache not updated');\n return;\n }\n\n const { address, updateCache } = request;\n const cursorCacheKey = this.#getCursorCacheKey(chainIds, address);\n const timestampCacheKey = this.#getTimestampCacheKey(chainIds, address);\n\n updateCache((cache) => {\n if (cursor) {\n cache[cursorCacheKey] = cursor;\n delete cache[timestampCacheKey];\n\n log('Updated cursor in cache', { cursorCacheKey, newCursor: cursor });\n } else {\n cache[timestampCacheKey] = startTimestamp;\n\n log('Updated timestamp in cache', {\n timestampCacheKey,\n newTimestamp: startTimestamp,\n });\n }\n });\n }\n\n #getStartTimestamp({\n cursor,\n queryEntireHistory,\n timestamp,\n }: {\n cursor?: string;\n queryEntireHistory: boolean;\n timestamp?: number;\n }): number | undefined {\n if (queryEntireHistory || cursor) {\n return undefined;\n }\n\n if (timestamp) {\n return timestamp;\n }\n\n return this.#getTimestampSeconds(Date.now() - RECENT_HISTORY_DURATION_MS);\n }\n\n #getCursorCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheCursor(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): string | undefined {\n const key = this.#getCursorCacheKey(chainIds, address);\n return cache[key] as string | undefined;\n }\n\n #getTimestampCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#timestamp#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheTimestamp(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): number | undefined {\n const key = this.#getTimestampCacheKey(chainIds, address);\n return cache[key] as number | undefined;\n }\n\n #getTimestampSeconds(timestampMs: number): number {\n return Math.floor(timestampMs / 1000);\n }\n}\n"]}
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';\n\nconst RECENT_HISTORY_DURATION_MS = 1000 * 60 * 60 * 24; // 1 Day\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];\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\n implements RemoteTransactionSource\n{\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address } = request;\n\n const responseTransactions = await this.#getTransactions(request);\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = responseTransactions.map((tx) =>\n 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 #getTransactions(request: RemoteTransactionSourceRequest) {\n log('Getting transactions', request);\n\n const { address, cache } = request;\n\n const cursor = this.#getCacheCursor(cache, SUPPORTED_CHAIN_IDS, address);\n\n const timestamp = this.#getCacheTimestamp(\n cache,\n SUPPORTED_CHAIN_IDS,\n address,\n );\n\n if (cursor) {\n log('Using cached cursor', cursor);\n } else if (timestamp) {\n log('Using cached timestamp', timestamp);\n } else {\n log('No cached cursor or timestamp found');\n }\n\n return await this.#queryTransactions(\n request,\n SUPPORTED_CHAIN_IDS,\n cursor,\n timestamp,\n );\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n cursor?: string,\n timestamp?: number,\n ): Promise<TransactionResponse[]> {\n const { address, queryEntireHistory } = request;\n const transactions: TransactionResponse[] = [];\n\n let hasNextPage = true;\n let currentCursor = cursor;\n let pageCount = 0;\n\n while (hasNextPage) {\n try {\n const startTimestamp = this.#getStartTimestamp({\n cursor: currentCursor,\n queryEntireHistory,\n timestamp,\n });\n\n const response = await getAccountTransactions({\n address,\n chainIds,\n cursor: currentCursor,\n sortDirection: 'ASC',\n startTimestamp,\n });\n\n pageCount += 1;\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n\n hasNextPage = response?.pageInfo?.hasNextPage;\n currentCursor = response?.pageInfo?.cursor;\n\n this.#updateCache({\n chainIds,\n cursor: currentCursor,\n request,\n startTimestamp,\n });\n } catch (error) {\n log('Error while fetching transactions', error);\n break;\n }\n }\n\n log('Queried transactions', { pageCount });\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ) {\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 #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): TransactionMeta {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as Hex;\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 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() && vt.contractAddress,\n );\n\n const isTransfer = Boolean(valueTransfer);\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(valueTransfer?.amount ?? responseTransaction.value),\n );\n\n const to = valueTransfer ? 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 = isTransfer\n ? {\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n return {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n }\n\n #updateCache({\n chainIds,\n cursor,\n request,\n startTimestamp,\n }: {\n chainIds: Hex[];\n cursor?: string;\n request: RemoteTransactionSourceRequest;\n startTimestamp?: number;\n }) {\n if (!cursor && !startTimestamp) {\n log('Cache not updated');\n return;\n }\n\n const { address, updateCache } = request;\n const cursorCacheKey = this.#getCursorCacheKey(chainIds, address);\n const timestampCacheKey = this.#getTimestampCacheKey(chainIds, address);\n\n updateCache((cache) => {\n if (cursor) {\n cache[cursorCacheKey] = cursor;\n delete cache[timestampCacheKey];\n\n log('Updated cursor in cache', { cursorCacheKey, newCursor: cursor });\n } else {\n cache[timestampCacheKey] = startTimestamp;\n\n log('Updated timestamp in cache', {\n timestampCacheKey,\n newTimestamp: startTimestamp,\n });\n }\n });\n }\n\n #getStartTimestamp({\n cursor,\n queryEntireHistory,\n timestamp,\n }: {\n cursor?: string;\n queryEntireHistory: boolean;\n timestamp?: number;\n }): number | undefined {\n if (queryEntireHistory || cursor) {\n return undefined;\n }\n\n if (timestamp) {\n return timestamp;\n }\n\n return this.#getTimestampSeconds(Date.now() - RECENT_HISTORY_DURATION_MS);\n }\n\n #getCursorCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheCursor(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): string | undefined {\n const key = this.#getCursorCacheKey(chainIds, address);\n return cache[key] as string | undefined;\n }\n\n #getTimestampCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#timestamp#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheTimestamp(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): number | undefined {\n const key = this.#getTimestampCacheKey(chainIds, address);\n return cache[key] as number | undefined;\n }\n\n #getTimestampSeconds(timestampMs: number): number {\n return Math.floor(timestampMs / 1000);\n }\n}\n"]}
@@ -1 +1 @@
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;AAKlB,eAAO,MAAM,mBAAmB,EAAE,GAAG,EASpC,CAAC;AAOF;;GAEG;AACH,qBAAa,kCACX,YAAW,uBAAuB;;IAElC,kBAAkB,IAAI,GAAG,EAAE;IAIrB,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CA+S9B"}
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;AAKlB,eAAO,MAAM,mBAAmB,EAAE,GAAG,EASpC,CAAC;AAOF;;GAEG;AACH,qBAAa,kCACX,YAAW,uBAAuB;;IAElC,kBAAkB,IAAI,GAAG,EAAE;IAIrB,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CA8S9B"}
@@ -1 +1 @@
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;AAKlB,eAAO,MAAM,mBAAmB,EAAE,GAAG,EASpC,CAAC;AAOF;;GAEG;AACH,qBAAa,kCACX,YAAW,uBAAuB;;IAElC,kBAAkB,IAAI,GAAG,EAAE;IAIrB,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CA+S9B"}
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;AAKlB,eAAO,MAAM,mBAAmB,EAAE,GAAG,EASpC,CAAC;AAOF;;GAEG;AACH,qBAAa,kCACX,YAAW,uBAAuB;;IAElC,kBAAkB,IAAI,GAAG,EAAE;IAIrB,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CA8S9B"}
@@ -67,7 +67,7 @@ _AccountsApiRemoteTransactionSource_instances = new WeakSet(), _AccountsApiRemot
67
67
  }
68
68
  return await __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_queryTransactions).call(this, request, SUPPORTED_CHAIN_IDS, cursor, timestamp);
69
69
  }, _AccountsApiRemoteTransactionSource_queryTransactions = async function _AccountsApiRemoteTransactionSource_queryTransactions(request, chainIds, cursor, timestamp) {
70
- const { address, queryEntireHistory, tags } = request;
70
+ const { address, queryEntireHistory } = request;
71
71
  const transactions = [];
72
72
  let hasNextPage = true;
73
73
  let currentCursor = cursor;
@@ -85,7 +85,6 @@ _AccountsApiRemoteTransactionSource_instances = new WeakSet(), _AccountsApiRemot
85
85
  cursor: currentCursor,
86
86
  sortDirection: 'ASC',
87
87
  startTimestamp,
88
- tags,
89
88
  });
90
89
  pageCount += 1;
91
90
  if (response?.data) {
@@ -1 +1 @@
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';\n\nconst RECENT_HISTORY_DURATION_MS = 1000 * 60 * 60 * 24; // 1 Day\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];\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\n implements RemoteTransactionSource\n{\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address } = request;\n\n const responseTransactions = await this.#getTransactions(request);\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = responseTransactions.map((tx) =>\n 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 #getTransactions(request: RemoteTransactionSourceRequest) {\n log('Getting transactions', request);\n\n const { address, cache } = request;\n\n const cursor = this.#getCacheCursor(cache, SUPPORTED_CHAIN_IDS, address);\n\n const timestamp = this.#getCacheTimestamp(\n cache,\n SUPPORTED_CHAIN_IDS,\n address,\n );\n\n if (cursor) {\n log('Using cached cursor', cursor);\n } else if (timestamp) {\n log('Using cached timestamp', timestamp);\n } else {\n log('No cached cursor or timestamp found');\n }\n\n return await this.#queryTransactions(\n request,\n SUPPORTED_CHAIN_IDS,\n cursor,\n timestamp,\n );\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n cursor?: string,\n timestamp?: number,\n ): Promise<TransactionResponse[]> {\n const { address, queryEntireHistory, tags } = request;\n const transactions: TransactionResponse[] = [];\n\n let hasNextPage = true;\n let currentCursor = cursor;\n let pageCount = 0;\n\n while (hasNextPage) {\n try {\n const startTimestamp = this.#getStartTimestamp({\n cursor: currentCursor,\n queryEntireHistory,\n timestamp,\n });\n\n const response = await getAccountTransactions({\n address,\n chainIds,\n cursor: currentCursor,\n sortDirection: 'ASC',\n startTimestamp,\n tags,\n });\n\n pageCount += 1;\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n\n hasNextPage = response?.pageInfo?.hasNextPage;\n currentCursor = response?.pageInfo?.cursor;\n\n this.#updateCache({\n chainIds,\n cursor: currentCursor,\n request,\n startTimestamp,\n });\n } catch (error) {\n log('Error while fetching transactions', error);\n break;\n }\n }\n\n log('Queried transactions', { pageCount });\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ) {\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 #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): TransactionMeta {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as Hex;\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 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() && vt.contractAddress,\n );\n\n const isTransfer = Boolean(valueTransfer);\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(valueTransfer?.amount ?? responseTransaction.value),\n );\n\n const to = valueTransfer ? 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 = isTransfer\n ? {\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n return {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n }\n\n #updateCache({\n chainIds,\n cursor,\n request,\n startTimestamp,\n }: {\n chainIds: Hex[];\n cursor?: string;\n request: RemoteTransactionSourceRequest;\n startTimestamp?: number;\n }) {\n if (!cursor && !startTimestamp) {\n log('Cache not updated');\n return;\n }\n\n const { address, updateCache } = request;\n const cursorCacheKey = this.#getCursorCacheKey(chainIds, address);\n const timestampCacheKey = this.#getTimestampCacheKey(chainIds, address);\n\n updateCache((cache) => {\n if (cursor) {\n cache[cursorCacheKey] = cursor;\n delete cache[timestampCacheKey];\n\n log('Updated cursor in cache', { cursorCacheKey, newCursor: cursor });\n } else {\n cache[timestampCacheKey] = startTimestamp;\n\n log('Updated timestamp in cache', {\n timestampCacheKey,\n newTimestamp: startTimestamp,\n });\n }\n });\n }\n\n #getStartTimestamp({\n cursor,\n queryEntireHistory,\n timestamp,\n }: {\n cursor?: string;\n queryEntireHistory: boolean;\n timestamp?: number;\n }): number | undefined {\n if (queryEntireHistory || cursor) {\n return undefined;\n }\n\n if (timestamp) {\n return timestamp;\n }\n\n return this.#getTimestampSeconds(Date.now() - RECENT_HISTORY_DURATION_MS);\n }\n\n #getCursorCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheCursor(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): string | undefined {\n const key = this.#getCursorCacheKey(chainIds, address);\n return cache[key] as string | undefined;\n }\n\n #getTimestampCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#timestamp#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheTimestamp(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): number | undefined {\n const key = this.#getTimestampCacheKey(chainIds, address);\n return cache[key] as number | undefined;\n }\n\n #getTimestampSeconds(timestampMs: number): number {\n return Math.floor(timestampMs / 1000);\n }\n}\n"]}
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';\n\nconst RECENT_HISTORY_DURATION_MS = 1000 * 60 * 60 * 24; // 1 Day\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];\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\n implements RemoteTransactionSource\n{\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address } = request;\n\n const responseTransactions = await this.#getTransactions(request);\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = responseTransactions.map((tx) =>\n 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 #getTransactions(request: RemoteTransactionSourceRequest) {\n log('Getting transactions', request);\n\n const { address, cache } = request;\n\n const cursor = this.#getCacheCursor(cache, SUPPORTED_CHAIN_IDS, address);\n\n const timestamp = this.#getCacheTimestamp(\n cache,\n SUPPORTED_CHAIN_IDS,\n address,\n );\n\n if (cursor) {\n log('Using cached cursor', cursor);\n } else if (timestamp) {\n log('Using cached timestamp', timestamp);\n } else {\n log('No cached cursor or timestamp found');\n }\n\n return await this.#queryTransactions(\n request,\n SUPPORTED_CHAIN_IDS,\n cursor,\n timestamp,\n );\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n cursor?: string,\n timestamp?: number,\n ): Promise<TransactionResponse[]> {\n const { address, queryEntireHistory } = request;\n const transactions: TransactionResponse[] = [];\n\n let hasNextPage = true;\n let currentCursor = cursor;\n let pageCount = 0;\n\n while (hasNextPage) {\n try {\n const startTimestamp = this.#getStartTimestamp({\n cursor: currentCursor,\n queryEntireHistory,\n timestamp,\n });\n\n const response = await getAccountTransactions({\n address,\n chainIds,\n cursor: currentCursor,\n sortDirection: 'ASC',\n startTimestamp,\n });\n\n pageCount += 1;\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n\n hasNextPage = response?.pageInfo?.hasNextPage;\n currentCursor = response?.pageInfo?.cursor;\n\n this.#updateCache({\n chainIds,\n cursor: currentCursor,\n request,\n startTimestamp,\n });\n } catch (error) {\n log('Error while fetching transactions', error);\n break;\n }\n }\n\n log('Queried transactions', { pageCount });\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ) {\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 #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): TransactionMeta {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as Hex;\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 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() && vt.contractAddress,\n );\n\n const isTransfer = Boolean(valueTransfer);\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(valueTransfer?.amount ?? responseTransaction.value),\n );\n\n const to = valueTransfer ? 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 = isTransfer\n ? {\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n return {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n }\n\n #updateCache({\n chainIds,\n cursor,\n request,\n startTimestamp,\n }: {\n chainIds: Hex[];\n cursor?: string;\n request: RemoteTransactionSourceRequest;\n startTimestamp?: number;\n }) {\n if (!cursor && !startTimestamp) {\n log('Cache not updated');\n return;\n }\n\n const { address, updateCache } = request;\n const cursorCacheKey = this.#getCursorCacheKey(chainIds, address);\n const timestampCacheKey = this.#getTimestampCacheKey(chainIds, address);\n\n updateCache((cache) => {\n if (cursor) {\n cache[cursorCacheKey] = cursor;\n delete cache[timestampCacheKey];\n\n log('Updated cursor in cache', { cursorCacheKey, newCursor: cursor });\n } else {\n cache[timestampCacheKey] = startTimestamp;\n\n log('Updated timestamp in cache', {\n timestampCacheKey,\n newTimestamp: startTimestamp,\n });\n }\n });\n }\n\n #getStartTimestamp({\n cursor,\n queryEntireHistory,\n timestamp,\n }: {\n cursor?: string;\n queryEntireHistory: boolean;\n timestamp?: number;\n }): number | undefined {\n if (queryEntireHistory || cursor) {\n return undefined;\n }\n\n if (timestamp) {\n return timestamp;\n }\n\n return this.#getTimestampSeconds(Date.now() - RECENT_HISTORY_DURATION_MS);\n }\n\n #getCursorCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheCursor(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): string | undefined {\n const key = this.#getCursorCacheKey(chainIds, address);\n return cache[key] as string | undefined;\n }\n\n #getTimestampCacheKey(chainIds: Hex[], address: Hex): string {\n return `accounts-api#timestamp#${chainIds.join(',')}#${address}`;\n }\n\n #getCacheTimestamp(\n cache: Record<string, unknown>,\n chainIds: Hex[],\n address: Hex,\n ): number | undefined {\n const key = this.#getTimestampCacheKey(chainIds, address);\n return cache[key] as number | undefined;\n }\n\n #getTimestampSeconds(timestampMs: number): number {\n return Math.floor(timestampMs / 1000);\n }\n}\n"]}
@@ -13,26 +13,23 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _IncomingTransactionHelper_instances, _IncomingTransactionHelper_client, _IncomingTransactionHelper_getCache, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLocalTransactions, _IncomingTransactionHelper_includeTokenTransfers, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_messenger, _IncomingTransactionHelper_queryEntireHistory, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_timeoutId, _IncomingTransactionHelper_trimTransactions, _IncomingTransactionHelper_updateCache, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_canStart, _IncomingTransactionHelper_getInterval, _IncomingTransactionHelper_getTags;
16
+ var _IncomingTransactionHelper_instances, _IncomingTransactionHelper_getCache, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLocalTransactions, _IncomingTransactionHelper_includeTokenTransfers, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_queryEntireHistory, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_timeoutId, _IncomingTransactionHelper_trimTransactions, _IncomingTransactionHelper_updateCache, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_canStart;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.IncomingTransactionHelper = void 0;
19
19
  // This package purposefully relies on Node's EventEmitter module.
20
20
  // eslint-disable-next-line import-x/no-nodejs-modules
21
21
  const events_1 = __importDefault(require("events"));
22
22
  const logger_1 = require("../logger.cjs");
23
- const feature_flags_1 = require("../utils/feature-flags.cjs");
24
- const TAG_POLLING = 'automatic-polling';
23
+ const INTERVAL = 1000 * 30; // 30 Seconds
25
24
  class IncomingTransactionHelper {
26
- constructor({ client, getCache, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, queryEntireHistory, remoteTransactionSource, trimTransactions, updateCache, updateTransactions, }) {
25
+ constructor({ getCache, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, queryEntireHistory, remoteTransactionSource, trimTransactions, updateCache, updateTransactions, }) {
27
26
  _IncomingTransactionHelper_instances.add(this);
28
- _IncomingTransactionHelper_client.set(this, void 0);
29
27
  _IncomingTransactionHelper_getCache.set(this, void 0);
30
28
  _IncomingTransactionHelper_getCurrentAccount.set(this, void 0);
31
29
  _IncomingTransactionHelper_getLocalTransactions.set(this, void 0);
32
30
  _IncomingTransactionHelper_includeTokenTransfers.set(this, void 0);
33
31
  _IncomingTransactionHelper_isEnabled.set(this, void 0);
34
32
  _IncomingTransactionHelper_isRunning.set(this, void 0);
35
- _IncomingTransactionHelper_messenger.set(this, void 0);
36
33
  _IncomingTransactionHelper_queryEntireHistory.set(this, void 0);
37
34
  _IncomingTransactionHelper_remoteTransactionSource.set(this, void 0);
38
35
  _IncomingTransactionHelper_timeoutId.set(this, void 0);
@@ -40,14 +37,12 @@ class IncomingTransactionHelper {
40
37
  _IncomingTransactionHelper_updateCache.set(this, void 0);
41
38
  _IncomingTransactionHelper_updateTransactions.set(this, void 0);
42
39
  this.hub = new events_1.default();
43
- __classPrivateFieldSet(this, _IncomingTransactionHelper_client, client, "f");
44
40
  __classPrivateFieldSet(this, _IncomingTransactionHelper_getCache, getCache, "f");
45
41
  __classPrivateFieldSet(this, _IncomingTransactionHelper_getCurrentAccount, getCurrentAccount, "f");
46
42
  __classPrivateFieldSet(this, _IncomingTransactionHelper_getLocalTransactions, getLocalTransactions, "f");
47
43
  __classPrivateFieldSet(this, _IncomingTransactionHelper_includeTokenTransfers, includeTokenTransfers, "f");
48
44
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isEnabled, isEnabled ?? (() => true), "f");
49
45
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
50
- __classPrivateFieldSet(this, _IncomingTransactionHelper_messenger, messenger, "f");
51
46
  __classPrivateFieldSet(this, _IncomingTransactionHelper_queryEntireHistory, queryEntireHistory, "f");
52
47
  __classPrivateFieldSet(this, _IncomingTransactionHelper_remoteTransactionSource, remoteTransactionSource, "f");
53
48
  __classPrivateFieldSet(this, _IncomingTransactionHelper_trimTransactions, trimTransactions, "f");
@@ -61,10 +56,9 @@ class IncomingTransactionHelper {
61
56
  if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
62
57
  return;
63
58
  }
64
- const interval = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getInterval).call(this);
65
- (0, logger_1.incomingTransactionsLogger)('Starting polling', { interval });
59
+ (0, logger_1.incomingTransactionsLogger)('Starting polling');
66
60
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
67
- __classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(() => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), interval), "f");
61
+ __classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(() => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), INTERVAL), "f");
68
62
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, true, "f");
69
63
  (0, logger_1.incomingTransactionsLogger)('Started polling');
70
64
  }
@@ -78,11 +72,9 @@ class IncomingTransactionHelper {
78
72
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
79
73
  (0, logger_1.incomingTransactionsLogger)('Stopped polling');
80
74
  }
81
- async update({ isInterval, tags, } = {}) {
82
- const finalTags = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getTags).call(this, tags, isInterval);
75
+ async update({ isInterval } = {}) {
83
76
  (0, logger_1.incomingTransactionsLogger)('Checking for incoming transactions', {
84
77
  isInterval: Boolean(isInterval),
85
- tags: finalTags,
86
78
  });
87
79
  if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
88
80
  return;
@@ -100,7 +92,6 @@ class IncomingTransactionHelper {
100
92
  cache,
101
93
  includeTokenTransfers,
102
94
  queryEntireHistory,
103
- tags: finalTags,
104
95
  updateCache: __classPrivateFieldGet(this, _IncomingTransactionHelper_updateCache, "f"),
105
96
  updateTransactions,
106
97
  });
@@ -139,7 +130,7 @@ class IncomingTransactionHelper {
139
130
  }
140
131
  }
141
132
  exports.IncomingTransactionHelper = IncomingTransactionHelper;
142
- _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_getCache = new WeakMap(), _IncomingTransactionHelper_getCurrentAccount = new WeakMap(), _IncomingTransactionHelper_getLocalTransactions = new WeakMap(), _IncomingTransactionHelper_includeTokenTransfers = new WeakMap(), _IncomingTransactionHelper_isEnabled = new WeakMap(), _IncomingTransactionHelper_isRunning = new WeakMap(), _IncomingTransactionHelper_messenger = new WeakMap(), _IncomingTransactionHelper_queryEntireHistory = new WeakMap(), _IncomingTransactionHelper_remoteTransactionSource = new WeakMap(), _IncomingTransactionHelper_timeoutId = new WeakMap(), _IncomingTransactionHelper_trimTransactions = new WeakMap(), _IncomingTransactionHelper_updateCache = new WeakMap(), _IncomingTransactionHelper_updateTransactions = new WeakMap(), _IncomingTransactionHelper_instances = new WeakSet(), _IncomingTransactionHelper_onInterval = async function _IncomingTransactionHelper_onInterval() {
133
+ _IncomingTransactionHelper_getCache = new WeakMap(), _IncomingTransactionHelper_getCurrentAccount = new WeakMap(), _IncomingTransactionHelper_getLocalTransactions = new WeakMap(), _IncomingTransactionHelper_includeTokenTransfers = new WeakMap(), _IncomingTransactionHelper_isEnabled = new WeakMap(), _IncomingTransactionHelper_isRunning = new WeakMap(), _IncomingTransactionHelper_queryEntireHistory = new WeakMap(), _IncomingTransactionHelper_remoteTransactionSource = new WeakMap(), _IncomingTransactionHelper_timeoutId = new WeakMap(), _IncomingTransactionHelper_trimTransactions = new WeakMap(), _IncomingTransactionHelper_updateCache = new WeakMap(), _IncomingTransactionHelper_updateTransactions = new WeakMap(), _IncomingTransactionHelper_instances = new WeakSet(), _IncomingTransactionHelper_onInterval = async function _IncomingTransactionHelper_onInterval() {
143
134
  try {
144
135
  await this.update({ isInterval: true });
145
136
  }
@@ -147,27 +138,12 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
147
138
  console.error('Error while checking incoming transactions', error);
148
139
  }
149
140
  if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
150
- __classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(
151
141
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
152
- () => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getInterval).call(this)), "f");
142
+ __classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(() => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), INTERVAL), "f");
153
143
  }
154
144
  }, _IncomingTransactionHelper_sortTransactionsByTime = function _IncomingTransactionHelper_sortTransactionsByTime(transactions) {
155
145
  transactions.sort((a, b) => (a.time < b.time ? -1 : 1));
156
146
  }, _IncomingTransactionHelper_canStart = function _IncomingTransactionHelper_canStart() {
157
147
  return __classPrivateFieldGet(this, _IncomingTransactionHelper_isEnabled, "f").call(this);
158
- }, _IncomingTransactionHelper_getInterval = function _IncomingTransactionHelper_getInterval() {
159
- return (0, feature_flags_1.getIncomingTransactionsPollingInterval)(__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f"));
160
- }, _IncomingTransactionHelper_getTags = function _IncomingTransactionHelper_getTags(requestTags, isInterval) {
161
- const tags = [];
162
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_client, "f")) {
163
- tags.push(__classPrivateFieldGet(this, _IncomingTransactionHelper_client, "f"));
164
- }
165
- if (requestTags?.length) {
166
- tags.push(...requestTags);
167
- }
168
- else if (isInterval) {
169
- tags.push(TAG_POLLING);
170
- }
171
- return tags?.length ? tags : undefined;
172
148
  };
173
149
  //# sourceMappingURL=IncomingTransactionHelper.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"IncomingTransactionHelper.cjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type { Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport type { TransactionControllerMessenger } from '..';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\nimport { getIncomingTransactionsPollingInterval } from '../utils/feature-flags';\n\nexport type IncomingTransactionOptions = {\n client?: string;\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\nconst TAG_POLLING = 'automatic-polling';\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n readonly #client?: string;\n\n readonly #getCache: () => Record<string, unknown>;\n\n readonly #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n readonly #getLocalTransactions: () => TransactionMeta[];\n\n readonly #includeTokenTransfers?: boolean;\n\n readonly #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n readonly #messenger: TransactionControllerMessenger;\n\n readonly #queryEntireHistory?: boolean;\n\n readonly #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n readonly #trimTransactions: (\n transactions: TransactionMeta[],\n ) => TransactionMeta[];\n\n readonly #updateCache: (fn: (cache: Record<string, unknown>) => void) => void;\n\n readonly #updateTransactions?: boolean;\n\n constructor({\n client,\n getCache,\n getCurrentAccount,\n getLocalTransactions,\n includeTokenTransfers,\n isEnabled,\n messenger,\n queryEntireHistory,\n remoteTransactionSource,\n trimTransactions,\n updateCache,\n updateTransactions,\n }: {\n client?: string;\n getCache: () => Record<string, unknown>;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLocalTransactions: () => TransactionMeta[];\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n messenger: TransactionControllerMessenger;\n queryEntireHistory?: boolean;\n remoteTransactionSource: RemoteTransactionSource;\n trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];\n updateCache: (fn: (cache: Record<string, unknown>) => void) => void;\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#client = client;\n this.#getCache = getCache;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLocalTransactions = getLocalTransactions;\n this.#includeTokenTransfers = includeTokenTransfers;\n this.#isEnabled = isEnabled ?? (() => true);\n this.#isRunning = false;\n this.#messenger = messenger;\n this.#queryEntireHistory = queryEntireHistory;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#trimTransactions = trimTransactions;\n this.#updateCache = updateCache;\n this.#updateTransactions = updateTransactions;\n }\n\n start() {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n const interval = this.#getInterval();\n\n log('Starting polling', { interval });\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeoutId = setTimeout(() => this.#onInterval(), interval);\n this.#isRunning = true;\n\n log('Started polling');\n }\n\n stop() {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n if (!this.#isRunning) {\n return;\n }\n\n this.#isRunning = false;\n\n log('Stopped polling');\n }\n\n async #onInterval() {\n try {\n await this.update({ isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n if (this.#isRunning) {\n this.#timeoutId = setTimeout(\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n () => this.#onInterval(),\n this.#getInterval(),\n );\n }\n }\n\n async update({\n isInterval,\n tags,\n }: { isInterval?: boolean; tags?: string[] } = {}): Promise<void> {\n const finalTags = this.#getTags(tags, isInterval);\n\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n tags: finalTags,\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const cache = this.#getCache();\n const includeTokenTransfers = this.#includeTokenTransfers ?? true;\n const queryEntireHistory = this.#queryEntireHistory ?? true;\n const updateTransactions = this.#updateTransactions ?? false;\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n cache,\n includeTokenTransfers,\n queryEntireHistory,\n tags: finalTags,\n updateCache: this.#updateCache,\n updateTransactions,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!remoteTransactions.length) {\n return;\n }\n\n this.#sortTransactionsByTime(remoteTransactions);\n\n log(\n 'Found potential transactions',\n remoteTransactions.length,\n remoteTransactions,\n );\n\n const localTransactions = this.#getLocalTransactions();\n\n const uniqueTransactions = remoteTransactions.filter(\n (tx) =>\n !localTransactions.some(\n (currentTx) =>\n currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&\n currentTx.txParams.from?.toLowerCase() ===\n tx.txParams.from?.toLowerCase() &&\n currentTx.type === tx.type,\n ),\n );\n\n if (!uniqueTransactions.length) {\n log('All transactions are already known');\n return;\n }\n\n log(\n 'Found unique transactions',\n uniqueTransactions.length,\n uniqueTransactions,\n );\n\n const trimmedTransactions = this.#trimTransactions([\n ...uniqueTransactions,\n ...localTransactions,\n ]);\n\n const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);\n\n const newTransactions = trimmedTransactions.filter((tx) =>\n uniqueTransactionIds.includes(tx.id),\n );\n\n if (!newTransactions.length) {\n log('All unique transactions truncated due to limit');\n return;\n }\n\n log('Adding new transactions', newTransactions.length, newTransactions);\n\n this.hub.emit('transactions', newTransactions);\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]) {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #canStart(): boolean {\n return this.#isEnabled();\n }\n\n #getInterval(): number {\n return getIncomingTransactionsPollingInterval(this.#messenger);\n }\n\n #getTags(\n requestTags: string[] | undefined,\n isInterval: boolean | undefined,\n ): string[] | undefined {\n const tags = [];\n\n if (this.#client) {\n tags.push(this.#client);\n }\n\n if (requestTags?.length) {\n tags.push(...requestTags);\n } else if (isInterval) {\n tags.push(TAG_POLLING);\n }\n\n return tags?.length ? tags : undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"IncomingTransactionHelper.cjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type { Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\n\nexport type IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\nconst INTERVAL = 1000 * 30; // 30 Seconds\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n readonly #getCache: () => Record<string, unknown>;\n\n readonly #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n readonly #getLocalTransactions: () => TransactionMeta[];\n\n readonly #includeTokenTransfers?: boolean;\n\n readonly #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n readonly #queryEntireHistory?: boolean;\n\n readonly #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n readonly #trimTransactions: (\n transactions: TransactionMeta[],\n ) => TransactionMeta[];\n\n readonly #updateCache: (fn: (cache: Record<string, unknown>) => void) => void;\n\n readonly #updateTransactions?: boolean;\n\n constructor({\n getCache,\n getCurrentAccount,\n getLocalTransactions,\n includeTokenTransfers,\n isEnabled,\n queryEntireHistory,\n remoteTransactionSource,\n trimTransactions,\n updateCache,\n updateTransactions,\n }: {\n getCache: () => Record<string, unknown>;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLocalTransactions: () => TransactionMeta[];\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n remoteTransactionSource: RemoteTransactionSource;\n trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];\n updateCache: (fn: (cache: Record<string, unknown>) => void) => void;\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#getCache = getCache;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLocalTransactions = getLocalTransactions;\n this.#includeTokenTransfers = includeTokenTransfers;\n this.#isEnabled = isEnabled ?? (() => true);\n this.#isRunning = false;\n this.#queryEntireHistory = queryEntireHistory;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#trimTransactions = trimTransactions;\n this.#updateCache = updateCache;\n this.#updateTransactions = updateTransactions;\n }\n\n start() {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n log('Starting polling');\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeoutId = setTimeout(() => this.#onInterval(), INTERVAL);\n this.#isRunning = true;\n\n log('Started polling');\n }\n\n stop() {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n if (!this.#isRunning) {\n return;\n }\n\n this.#isRunning = false;\n\n log('Stopped polling');\n }\n\n async #onInterval() {\n try {\n await this.update({ isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n if (this.#isRunning) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeoutId = setTimeout(() => this.#onInterval(), INTERVAL);\n }\n }\n\n async update({ isInterval }: { isInterval?: boolean } = {}): Promise<void> {\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const cache = this.#getCache();\n const includeTokenTransfers = this.#includeTokenTransfers ?? true;\n const queryEntireHistory = this.#queryEntireHistory ?? true;\n const updateTransactions = this.#updateTransactions ?? false;\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n cache,\n includeTokenTransfers,\n queryEntireHistory,\n updateCache: this.#updateCache,\n updateTransactions,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!remoteTransactions.length) {\n return;\n }\n\n this.#sortTransactionsByTime(remoteTransactions);\n\n log(\n 'Found potential transactions',\n remoteTransactions.length,\n remoteTransactions,\n );\n\n const localTransactions = this.#getLocalTransactions();\n\n const uniqueTransactions = remoteTransactions.filter(\n (tx) =>\n !localTransactions.some(\n (currentTx) =>\n currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&\n currentTx.txParams.from?.toLowerCase() ===\n tx.txParams.from?.toLowerCase() &&\n currentTx.type === tx.type,\n ),\n );\n\n if (!uniqueTransactions.length) {\n log('All transactions are already known');\n return;\n }\n\n log(\n 'Found unique transactions',\n uniqueTransactions.length,\n uniqueTransactions,\n );\n\n const trimmedTransactions = this.#trimTransactions([\n ...uniqueTransactions,\n ...localTransactions,\n ]);\n\n const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);\n\n const newTransactions = trimmedTransactions.filter((tx) =>\n uniqueTransactionIds.includes(tx.id),\n );\n\n if (!newTransactions.length) {\n log('All unique transactions truncated due to limit');\n return;\n }\n\n log('Adding new transactions', newTransactions.length, newTransactions);\n\n this.hub.emit('transactions', newTransactions);\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]) {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #canStart(): boolean {\n return this.#isEnabled();\n }\n}\n"]}
@@ -1,10 +1,8 @@
1
1
  /// <reference types="node" />
2
2
  import type { AccountsController } from "@metamask/accounts-controller";
3
3
  import EventEmitter from "events";
4
- import type { TransactionControllerMessenger } from "../index.cjs";
5
4
  import type { RemoteTransactionSource, TransactionMeta } from "../types.cjs";
6
5
  export type IncomingTransactionOptions = {
7
- client?: string;
8
6
  includeTokenTransfers?: boolean;
9
7
  isEnabled?: () => boolean;
10
8
  queryEntireHistory?: boolean;
@@ -13,14 +11,12 @@ export type IncomingTransactionOptions = {
13
11
  export declare class IncomingTransactionHelper {
14
12
  #private;
15
13
  hub: EventEmitter;
16
- constructor({ client, getCache, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, queryEntireHistory, remoteTransactionSource, trimTransactions, updateCache, updateTransactions, }: {
17
- client?: string;
14
+ constructor({ getCache, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, queryEntireHistory, remoteTransactionSource, trimTransactions, updateCache, updateTransactions, }: {
18
15
  getCache: () => Record<string, unknown>;
19
16
  getCurrentAccount: () => ReturnType<AccountsController['getSelectedAccount']>;
20
17
  getLocalTransactions: () => TransactionMeta[];
21
18
  includeTokenTransfers?: boolean;
22
19
  isEnabled?: () => boolean;
23
- messenger: TransactionControllerMessenger;
24
20
  queryEntireHistory?: boolean;
25
21
  remoteTransactionSource: RemoteTransactionSource;
26
22
  trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];
@@ -29,9 +25,8 @@ export declare class IncomingTransactionHelper {
29
25
  });
30
26
  start(): void;
31
27
  stop(): void;
32
- update({ isInterval, tags, }?: {
28
+ update({ isInterval }?: {
33
29
  isInterval?: boolean;
34
- tags?: string[];
35
30
  }): Promise<void>;
36
31
  }
37
32
  //# sourceMappingURL=IncomingTransactionHelper.d.cts.map