@metamask-previews/multichain-transactions-controller 7.1.2-preview-b13d916 → 7.1.2-preview-4f4c98e

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 (43) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/{MultichainTransactionsController-method-action-types.d.mts → MultichainTransactionsController-method-action-types.d.ts} +2 -2
  3. package/dist/MultichainTransactionsController-method-action-types.d.ts.map +1 -0
  4. package/dist/{MultichainTransactionsController-method-action-types.mjs → MultichainTransactionsController-method-action-types.js} +1 -1
  5. package/dist/MultichainTransactionsController-method-action-types.js.map +1 -0
  6. package/dist/{MultichainTransactionsController.d.cts → MultichainTransactionsController.d.ts} +10 -10
  7. package/dist/MultichainTransactionsController.d.ts.map +1 -0
  8. package/dist/{MultichainTransactionsController.mjs → MultichainTransactionsController.js} +7 -5
  9. package/dist/MultichainTransactionsController.js.map +1 -0
  10. package/dist/{constants.d.mts → constants.d.ts} +1 -1
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/{constants.mjs → constants.js} +1 -1
  13. package/dist/constants.js.map +1 -0
  14. package/dist/{index.d.cts → index.d.ts} +5 -5
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +3 -0
  17. package/dist/index.js.map +1 -0
  18. package/package.json +12 -16
  19. package/dist/MultichainTransactionsController-method-action-types.cjs +0 -7
  20. package/dist/MultichainTransactionsController-method-action-types.cjs.map +0 -1
  21. package/dist/MultichainTransactionsController-method-action-types.d.cts +0 -20
  22. package/dist/MultichainTransactionsController-method-action-types.d.cts.map +0 -1
  23. package/dist/MultichainTransactionsController-method-action-types.d.mts.map +0 -1
  24. package/dist/MultichainTransactionsController-method-action-types.mjs.map +0 -1
  25. package/dist/MultichainTransactionsController.cjs +0 -229
  26. package/dist/MultichainTransactionsController.cjs.map +0 -1
  27. package/dist/MultichainTransactionsController.d.cts.map +0 -1
  28. package/dist/MultichainTransactionsController.d.mts +0 -107
  29. package/dist/MultichainTransactionsController.d.mts.map +0 -1
  30. package/dist/MultichainTransactionsController.mjs.map +0 -1
  31. package/dist/constants.cjs +0 -25
  32. package/dist/constants.cjs.map +0 -1
  33. package/dist/constants.d.cts +0 -20
  34. package/dist/constants.d.cts.map +0 -1
  35. package/dist/constants.d.mts.map +0 -1
  36. package/dist/constants.mjs.map +0 -1
  37. package/dist/index.cjs +0 -9
  38. package/dist/index.cjs.map +0 -1
  39. package/dist/index.d.cts.map +0 -1
  40. package/dist/index.d.mts +0 -5
  41. package/dist/index.d.mts.map +0 -1
  42. package/dist/index.mjs +0 -3
  43. package/dist/index.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Changed
11
11
 
12
+ - **BREAKING:** Bump minimum Node.js version to 22 ([#9168](https://github.com/MetaMask/core/pull/9168))
12
13
  - Bump `@metamask/accounts-controller` from `^39.0.7` to `^39.1.1` ([#9807](https://github.com/MetaMask/core/pull/9807), [#9969](https://github.com/MetaMask/core/pull/9969))
13
14
 
14
15
  ## [7.1.2]
@@ -2,7 +2,7 @@
2
2
  * This file is auto generated.
3
3
  * Do not edit manually.
4
4
  */
5
- import type { MultichainTransactionsController } from "./MultichainTransactionsController.mjs";
5
+ import type { MultichainTransactionsController } from './MultichainTransactionsController.js';
6
6
  /**
7
7
  * Updates transactions for a specific account. This is used for the initial fetch
8
8
  * when an account is first added.
@@ -17,4 +17,4 @@ export type MultichainTransactionsControllerUpdateTransactionsForAccountAction =
17
17
  * Union of all MultichainTransactionsController action types.
18
18
  */
19
19
  export type MultichainTransactionsControllerMethodActions = MultichainTransactionsControllerUpdateTransactionsForAccountAction;
20
- //# sourceMappingURL=MultichainTransactionsController-method-action-types.d.mts.map
20
+ //# sourceMappingURL=MultichainTransactionsController-method-action-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultichainTransactionsController-method-action-types.d.ts","sourceRoot":"","sources":["../src/MultichainTransactionsController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AAE9F;;;;;GAKG;AACH,MAAM,MAAM,kEAAkE,GAC5E;IACE,IAAI,EAAE,+DAA+D,CAAC;IACtE,OAAO,EAAE,gCAAgC,CAAC,8BAA8B,CAAC,CAAC;CAC3E,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,6CAA6C,GACvD,kEAAkE,CAAC"}
@@ -3,4 +3,4 @@
3
3
  * Do not edit manually.
4
4
  */
5
5
  export {};
6
- //# sourceMappingURL=MultichainTransactionsController-method-action-types.mjs.map
6
+ //# sourceMappingURL=MultichainTransactionsController-method-action-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultichainTransactionsController-method-action-types.js","sourceRoot":"","sources":["../src/MultichainTransactionsController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { MultichainTransactionsController } from './MultichainTransactionsController.js';\n\n/**\n * Updates transactions for a specific account. This is used for the initial fetch\n * when an account is first added.\n *\n * @param accountId - The ID of the account to get transactions for.\n */\nexport type MultichainTransactionsControllerUpdateTransactionsForAccountAction =\n {\n type: `MultichainTransactionsController:updateTransactionsForAccount`;\n handler: MultichainTransactionsController['updateTransactionsForAccount'];\n };\n\n/**\n * Union of all MultichainTransactionsController action types.\n */\nexport type MultichainTransactionsControllerMethodActions =\n MultichainTransactionsControllerUpdateTransactionsForAccountAction;\n"]}
@@ -1,12 +1,12 @@
1
- import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction, AccountsControllerAccountTransactionsUpdatedEvent } from "@metamask/accounts-controller";
2
- import { BaseController } from "@metamask/base-controller";
3
- import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
4
- import type { Transaction } from "@metamask/keyring-api";
5
- import type { KeyringControllerGetStateAction } from "@metamask/keyring-controller";
6
- import type { Messenger } from "@metamask/messenger";
7
- import type { SnapControllerHandleRequestAction } from "@metamask/snaps-controllers";
8
- import type { CaipChainId } from "@metamask/utils";
9
- import type { MultichainTransactionsControllerMethodActions } from "./MultichainTransactionsController-method-action-types.cjs";
1
+ import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction, AccountsControllerAccountTransactionsUpdatedEvent } from '@metamask/accounts-controller';
2
+ import { BaseController } from '@metamask/base-controller';
3
+ import type { ControllerGetStateAction, ControllerStateChangeEvent } from '@metamask/base-controller';
4
+ import type { Transaction } from '@metamask/keyring-api';
5
+ import type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';
6
+ import type { Messenger } from '@metamask/messenger';
7
+ import type { SnapControllerHandleRequestAction } from '@metamask/snaps-controllers';
8
+ import type { CaipChainId } from '@metamask/utils';
9
+ import type { MultichainTransactionsControllerMethodActions } from './MultichainTransactionsController-method-action-types.js';
10
10
  declare const controllerName = "MultichainTransactionsController";
11
11
  /**
12
12
  * PaginationOptions
@@ -104,4 +104,4 @@ export declare class MultichainTransactionsController extends BaseController<typ
104
104
  updateTransactionsForAccount(accountId: string): Promise<void>;
105
105
  }
106
106
  export {};
107
- //# sourceMappingURL=MultichainTransactionsController.d.cts.map
107
+ //# sourceMappingURL=MultichainTransactionsController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultichainTransactionsController.d.ts","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,10 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
6
  var _MultichainTransactionsController_instances, _MultichainTransactionsController_listMultichainAccounts, _MultichainTransactionsController_listAccounts, _MultichainTransactionsController_getTransactions, _MultichainTransactionsController_isNonEvmAccount, _MultichainTransactionsController_handleOnAccountAdded, _MultichainTransactionsController_handleOnAccountRemoved, _MultichainTransactionsController_publishTransactionUpdateEvent, _MultichainTransactionsController_handleOnAccountTransactionsUpdated, _MultichainTransactionsController_getClient;
7
- import { BaseController } from "@metamask/base-controller";
8
- import { isEvmAccountType, TransactionStatus } from "@metamask/keyring-api";
9
- import { KeyringClient } from "@metamask/keyring-snap-client";
10
- import { HandlerType } from "@metamask/snaps-utils";
7
+ import { BaseController } from '@metamask/base-controller';
8
+ import { isEvmAccountType, TransactionStatus } from '@metamask/keyring-api';
9
+ import { KeyringClient } from '@metamask/keyring-snap-client';
10
+ import { HandlerType } from '@metamask/snaps-utils';
11
11
  const controllerName = 'MultichainTransactionsController';
12
12
  const MESSENGER_EXPOSED_METHODS = ['updateTransactionsForAccount'];
13
13
  /**
@@ -98,6 +98,8 @@ export class MultichainTransactionsController extends BaseController {
98
98
  state.nonEvmTransactions[account.id] = {};
99
99
  }
100
100
  chainUpdates.forEach(({ chain, entry }) => {
101
+ // This error appeared when upgrading to TypeScript 7.
102
+ // @ts-expect-error: TS2589: Type instantiation is excessively deep and possibly infinite.
101
103
  state.nonEvmTransactions[account.id][chain] = entry;
102
104
  });
103
105
  });
@@ -221,4 +223,4 @@ async function _MultichainTransactionsController_handleOnAccountRemoved(accountI
221
223
  })),
222
224
  });
223
225
  };
224
- //# sourceMappingURL=MultichainTransactionsController.mjs.map
226
+ //# sourceMappingURL=MultichainTransactionsController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultichainTransactionsController.js","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n AccountsControllerAccountTransactionsUpdatedEvent,\n} from '@metamask/accounts-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { isEvmAccountType, TransactionStatus } from '@metamask/keyring-api';\nimport type {\n Transaction,\n AccountTransactionsUpdatedEventPayload,\n} from '@metamask/keyring-api';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type { Messenger } from '@metamask/messenger';\nimport type { SnapControllerHandleRequestAction } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport type { CaipChainId, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Draft } from 'immer';\n\nimport type { MultichainTransactionsControllerMethodActions } from './MultichainTransactionsController-method-action-types.js';\n\nconst controllerName = 'MultichainTransactionsController';\n\nconst MESSENGER_EXPOSED_METHODS = ['updateTransactionsForAccount'] as const;\n\n/**\n * PaginationOptions\n *\n * Represents options for paginating transaction results\n * limit - The maximum number of transactions to return\n * next - The cursor for the next page of transactions, or null if there is no next page\n */\nexport type PaginationOptions = {\n limit: number;\n next?: string | null;\n};\n\n/**\n * State used by the {@link MultichainTransactionsController} to cache account transactions.\n */\nexport type MultichainTransactionsControllerState = {\n nonEvmTransactions: {\n [accountId: string]: {\n [chain: CaipChainId]: TransactionStateEntry;\n };\n };\n};\n\n/**\n * Constructs the default {@link MultichainTransactionsController} state.\n *\n * @returns The default {@link MultichainTransactionsController} state.\n */\nexport function getDefaultMultichainTransactionsControllerState(): MultichainTransactionsControllerState {\n return {\n nonEvmTransactions: {},\n };\n}\n\n/**\n * Event emitted when a transaction is finalized.\n */\nexport type MultichainTransactionsControllerTransactionConfirmedEvent = {\n type: `${typeof controllerName}:transactionConfirmed`;\n payload: [Transaction];\n};\n\n/**\n * Event emitted when a transaction is submitted.\n */\nexport type MultichainTransactionsControllerTransactionSubmittedEvent = {\n type: `${typeof controllerName}:transactionSubmitted`;\n payload: [Transaction];\n};\n\n/**\n * Returns the state of the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Event emitted when the state of the {@link MultichainTransactionsController} changes.\n */\nexport type MultichainTransactionsControllerStateChange =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Actions exposed by the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerActions =\n | MultichainTransactionsControllerGetStateAction\n | MultichainTransactionsControllerMethodActions;\n\n/**\n * Events emitted by {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerEvents =\n | MultichainTransactionsControllerStateChange\n | MultichainTransactionsControllerTransactionConfirmedEvent\n | MultichainTransactionsControllerTransactionSubmittedEvent;\n\n/**\n * Messenger type for the MultichainTransactionsController.\n */\nexport type MultichainTransactionsControllerMessenger = Messenger<\n typeof controllerName,\n MultichainTransactionsControllerActions | AllowedActions,\n MultichainTransactionsControllerEvents | AllowedEvents\n>;\n\n/**\n * Actions that this controller is allowed to call.\n */\ntype AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerHandleRequestAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountTransactionsUpdatedEvent;\n\n/**\n * {@link MultichainTransactionsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst multichainTransactionsControllerMetadata = {\n nonEvmTransactions: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * The state of transactions for a specific chain.\n */\nexport type TransactionStateEntry = {\n transactions: Transaction[];\n next: string | null;\n lastUpdated: number;\n};\n\n/**\n * The MultichainTransactionsController is responsible for fetching and caching account\n * transactions for non-EVM accounts.\n */\nexport class MultichainTransactionsController extends BaseController<\n typeof controllerName,\n MultichainTransactionsControllerState,\n MultichainTransactionsControllerMessenger\n> {\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainTransactionsControllerMessenger;\n state?: Partial<MultichainTransactionsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: multichainTransactionsControllerMetadata,\n state: {\n ...getDefaultMultichainTransactionsControllerState(),\n ...state,\n },\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n // Fetch initial transactions for all non-EVM accounts\n for (const account of this.#listAccounts()) {\n this.updateTransactionsForAccount(account.id).catch((error) => {\n console.error(\n `Failed to fetch initial transactions for account ${account.id}:`,\n error,\n );\n });\n }\n\n this.messenger.subscribe(\n 'AccountsController:accountAdded',\n (account: InternalAccount) => this.#handleOnAccountAdded(account),\n );\n this.messenger.subscribe(\n 'AccountsController:accountRemoved',\n (accountId: string) => this.#handleOnAccountRemoved(accountId),\n );\n this.messenger.subscribe(\n 'AccountsController:accountTransactionsUpdated',\n (transactionsUpdate: AccountTransactionsUpdatedEventPayload) =>\n this.#handleOnAccountTransactionsUpdated(transactionsUpdate),\n );\n }\n\n /**\n * Lists the multichain accounts coming from the `AccountsController`.\n *\n * @returns A list of multichain accounts.\n */\n #listMultichainAccounts(): InternalAccount[] {\n return this.messenger.call('AccountsController:listMultichainAccounts');\n }\n\n /**\n * Lists the accounts that we should get transactions for.\n *\n * @returns A list of accounts that we should get transactions for.\n */\n #listAccounts(): InternalAccount[] {\n const accounts = this.#listMultichainAccounts();\n return accounts.filter((account) => this.#isNonEvmAccount(account));\n }\n\n /**\n * Gets transactions for an account.\n *\n * @param accountId - The ID of the account to get transactions for.\n * @param snapId - The ID of the snap that manages the account.\n * @param pagination - Options for paginating transaction results.\n * @returns A promise that resolves to the transaction data and pagination info.\n */\n async #getTransactions(\n accountId: string,\n snapId: string,\n pagination: PaginationOptions,\n ): Promise<{\n data: Transaction[];\n next: string | null;\n }> {\n return await this.#getClient(snapId).listAccountTransactions(\n accountId,\n pagination,\n );\n }\n\n /**\n * Updates transactions for a specific account. This is used for the initial fetch\n * when an account is first added.\n *\n * @param accountId - The ID of the account to get transactions for.\n */\n async updateTransactionsForAccount(accountId: string) {\n const { isUnlocked } = this.messenger.call('KeyringController:getState');\n\n if (!isUnlocked) {\n return;\n }\n\n try {\n const account = this.#listAccounts().find(\n (accountItem) => accountItem.id === accountId,\n );\n\n if (account?.metadata.snap) {\n const response = await this.#getTransactions(\n account.id,\n account.metadata.snap.id,\n { limit: 10 },\n );\n\n const transactionsByChain: Record<CaipChainId, Transaction[]> = {};\n\n response.data.forEach((transaction) => {\n const { chain } = transaction;\n\n if (!transactionsByChain[chain]) {\n transactionsByChain[chain] = [];\n }\n transactionsByChain[chain].push(transaction);\n });\n\n const chainUpdates = Object.entries(transactionsByChain).map(\n ([chain, transactions]) => ({\n chain,\n entry: {\n transactions,\n next: response.next,\n lastUpdated: Date.now(),\n },\n }),\n );\n\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n if (!state.nonEvmTransactions[account.id]) {\n state.nonEvmTransactions[account.id] = {};\n }\n\n chainUpdates.forEach(({ chain, entry }) => {\n // This error appeared when upgrading to TypeScript 7.\n // @ts-expect-error: TS2589: Type instantiation is excessively deep and possibly infinite.\n state.nonEvmTransactions[account.id][chain as CaipChainId] = entry;\n });\n });\n }\n } catch (error) {\n console.error(\n `Failed to fetch transactions for account ${accountId}:`,\n error,\n );\n }\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount) {\n if (!this.#isNonEvmAccount(account)) {\n return;\n }\n\n await this.updateTransactionsForAccount(account.id);\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The account ID being removed.\n */\n async #handleOnAccountRemoved(accountId: string) {\n if (accountId in this.state.nonEvmTransactions) {\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n delete state.nonEvmTransactions[accountId];\n });\n }\n }\n\n /**\n * Publishes transaction update events.\n *\n * @param updatedTransaction - The updated transaction.\n */\n #publishTransactionUpdateEvent(updatedTransaction: Transaction) {\n if (updatedTransaction.status === TransactionStatus.Confirmed) {\n this.messenger.publish(\n 'MultichainTransactionsController:transactionConfirmed',\n updatedTransaction,\n );\n }\n\n if (updatedTransaction.status === TransactionStatus.Submitted) {\n this.messenger.publish(\n 'MultichainTransactionsController:transactionSubmitted',\n updatedTransaction,\n );\n }\n }\n\n /**\n * Handles transaction updates received from the AccountsController.\n *\n * @param transactionsUpdate - The transaction update event containing new transactions.\n */\n #handleOnAccountTransactionsUpdated(\n transactionsUpdate: AccountTransactionsUpdatedEventPayload,\n ): void {\n const updatedTransactions: Record<\n string,\n Record<CaipChainId, Transaction[]>\n > = {};\n const transactionsToPublish: Transaction[] = [];\n\n if (!transactionsUpdate?.transactions) {\n return;\n }\n\n Object.entries(transactionsUpdate.transactions).forEach(\n ([accountId, newTransactions]) => {\n updatedTransactions[accountId] = {};\n\n newTransactions.forEach((tx) => {\n const { chain } = tx;\n\n if (!updatedTransactions[accountId][chain]) {\n updatedTransactions[accountId][chain] = [];\n }\n\n updatedTransactions[accountId][chain].push(tx);\n transactionsToPublish.push(tx);\n });\n\n Object.entries(updatedTransactions[accountId]).forEach(\n ([chain, chainTransactions]) => {\n // Account might not have any transactions yet, so use `[]` in that case.\n const oldTransactions =\n this.state.nonEvmTransactions[accountId]?.[chain as CaipChainId]\n ?.transactions ?? [];\n\n // Uses a `Map` to deduplicate transactions by ID, ensuring we keep the latest version\n // of each transaction while preserving older transactions and transactions from other accounts.\n // Transactions are sorted by timestamp (newest first).\n const transactions = new Map();\n\n oldTransactions.forEach((tx) => {\n transactions.set(tx.id, tx);\n });\n\n chainTransactions.forEach((tx) => {\n transactions.set(tx.id, tx);\n });\n\n // Sorted by timestamp (newest first). If the timestamp is not provided, those\n // transactions will be put in the end of this list.\n updatedTransactions[accountId][chain as CaipChainId] = Array.from(\n transactions.values(),\n ).sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));\n },\n );\n },\n );\n\n this.update((state) => {\n Object.entries(updatedTransactions).forEach(([accountId, chainsData]) => {\n if (!state.nonEvmTransactions[accountId]) {\n state.nonEvmTransactions[accountId] = {};\n }\n\n Object.entries(chainsData).forEach(([chain, transactions]) => {\n state.nonEvmTransactions[accountId][chain as CaipChainId] = {\n transactions,\n next: null,\n lastUpdated: Date.now(),\n };\n });\n });\n });\n\n // After we update the state, publish the events for new/updated transactions\n transactionsToPublish.forEach((tx) => {\n this.#publishTransactionUpdateEvent(tx);\n });\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messenger.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n}\n"]}
@@ -17,4 +17,4 @@ export declare enum MultichainNativeAsset {
17
17
  SolanaDevnet = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501",
18
18
  SolanaTestnet = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z/slip44:501"
19
19
  }
20
- //# sourceMappingURL=constants.d.mts.map
20
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,iBAAiB;IAC3B,OAAO,4CAA4C;IACnD,cAAc,4CAA4C;IAC1D,MAAM,4CAA4C;IAClD,YAAY,4CAA4C;IACxD,aAAa,4CAA4C;CAC1D;AAED,oBAAY,qBAAqB;IAC/B,OAAO,qDAA0C;IACjD,cAAc,qDAAiD;IAC/D,MAAM,uDAA2C;IACjD,YAAY,uDAAiD;IAC7D,aAAa,uDAAkD;CAChE"}
@@ -19,4 +19,4 @@ export var MultichainNativeAsset;
19
19
  MultichainNativeAsset["SolanaDevnet"] = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501";
20
20
  MultichainNativeAsset["SolanaTestnet"] = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z/slip44:501";
21
21
  })(MultichainNativeAsset || (MultichainNativeAsset = {}));
22
- //# sourceMappingURL=constants.mjs.map
22
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,iBAMX;AAND,WAAY,iBAAiB;IAC3B,wEAAmD,CAAA;IACnD,+EAA0D,CAAA;IAC1D,uEAAkD,CAAA;IAClD,6EAAwD,CAAA;IACxD,8EAAyD,CAAA;AAC3D,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,QAM5B;AAED,MAAM,CAAN,IAAY,qBAMX;AAND,WAAY,qBAAqB;IAC/B,qFAAiD,CAAA;IACjD,4FAA+D,CAAA;IAC/D,sFAAiD,CAAA;IACjD,4FAA6D,CAAA;IAC7D,6FAA+D,CAAA;AACjE,CAAC,EANW,qBAAqB,KAArB,qBAAqB,QAMhC","sourcesContent":["/**\n * The network identifiers for supported networks in CAIP-2 format.\n * Note: This is a temporary workaround until we have a more robust\n * solution for network identifiers.\n */\nexport enum MultichainNetwork {\n Bitcoin = 'bip122:000000000019d6689c085ae165831e93',\n BitcoinTestnet = 'bip122:000000000933ea01ad0ee984209779ba',\n Solana = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n SolanaDevnet = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n SolanaTestnet = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n}\n\nexport enum MultichainNativeAsset {\n Bitcoin = `${MultichainNetwork.Bitcoin}/slip44:0`,\n BitcoinTestnet = `${MultichainNetwork.BitcoinTestnet}/slip44:0`,\n Solana = `${MultichainNetwork.Solana}/slip44:501`,\n SolanaDevnet = `${MultichainNetwork.SolanaDevnet}/slip44:501`,\n SolanaTestnet = `${MultichainNetwork.SolanaTestnet}/slip44:501`,\n}\n"]}
@@ -1,5 +1,5 @@
1
- export { MultichainTransactionsController } from "./MultichainTransactionsController.cjs";
2
- export type { MultichainTransactionsControllerState, PaginationOptions, TransactionStateEntry, MultichainTransactionsControllerStateChange, MultichainTransactionsControllerGetStateAction, MultichainTransactionsControllerActions, MultichainTransactionsControllerEvents, MultichainTransactionsControllerMessenger, MultichainTransactionsControllerTransactionSubmittedEvent, MultichainTransactionsControllerTransactionConfirmedEvent, } from "./MultichainTransactionsController.cjs";
3
- export type { MultichainTransactionsControllerUpdateTransactionsForAccountAction } from "./MultichainTransactionsController-method-action-types.cjs";
4
- export { MultichainNetwork, MultichainNativeAsset } from "./constants.cjs";
5
- //# sourceMappingURL=index.d.cts.map
1
+ export { MultichainTransactionsController } from './MultichainTransactionsController.js';
2
+ export type { MultichainTransactionsControllerState, PaginationOptions, TransactionStateEntry, MultichainTransactionsControllerStateChange, MultichainTransactionsControllerGetStateAction, MultichainTransactionsControllerActions, MultichainTransactionsControllerEvents, MultichainTransactionsControllerMessenger, MultichainTransactionsControllerTransactionSubmittedEvent, MultichainTransactionsControllerTransactionConfirmedEvent, } from './MultichainTransactionsController.js';
3
+ export type { MultichainTransactionsControllerUpdateTransactionsForAccountAction } from './MultichainTransactionsController-method-action-types.js';
4
+ export { MultichainNetwork, MultichainNativeAsset } from './constants.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACzF,YAAY,EACV,qCAAqC,EACrC,iBAAiB,EACjB,qBAAqB,EACrB,2CAA2C,EAC3C,8CAA8C,EAC9C,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,yDAAyD,EACzD,yDAAyD,GAC1D,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EAAE,kEAAkE,EAAE,MAAM,2DAA2D,CAAC;AACpJ,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { MultichainTransactionsController } from './MultichainTransactionsController.js';
2
+ export { MultichainNetwork, MultichainNativeAsset } from './constants.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AAczF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { MultichainTransactionsController } from './MultichainTransactionsController.js';\nexport type {\n MultichainTransactionsControllerState,\n PaginationOptions,\n TransactionStateEntry,\n MultichainTransactionsControllerStateChange,\n MultichainTransactionsControllerGetStateAction,\n MultichainTransactionsControllerActions,\n MultichainTransactionsControllerEvents,\n MultichainTransactionsControllerMessenger,\n MultichainTransactionsControllerTransactionSubmittedEvent,\n MultichainTransactionsControllerTransactionConfirmedEvent,\n} from './MultichainTransactionsController.js';\nexport type { MultichainTransactionsControllerUpdateTransactionsForAccountAction } from './MultichainTransactionsController-method-action-types.js';\nexport { MultichainNetwork, MultichainNativeAsset } from './constants.js';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/multichain-transactions-controller",
3
- "version": "7.1.2-preview-b13d916",
3
+ "version": "7.1.2-preview-4f4c98e",
4
4
  "description": "This package is responsible for getting transactions from our Bitcoin and Solana snaps",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -18,19 +18,12 @@
18
18
  "files": [
19
19
  "dist/"
20
20
  ],
21
+ "type": "module",
21
22
  "sideEffects": false,
22
- "main": "./dist/index.cjs",
23
- "types": "./dist/index.d.cts",
24
23
  "exports": {
25
24
  ".": {
26
- "import": {
27
- "types": "./dist/index.d.mts",
28
- "default": "./dist/index.mjs"
29
- },
30
- "require": {
31
- "types": "./dist/index.d.cts",
32
- "default": "./dist/index.cjs"
33
- }
25
+ "types": "./dist/index.d.ts",
26
+ "default": "./dist/index.js"
34
27
  },
35
28
  "./package.json": "./package.json"
36
29
  },
@@ -39,9 +32,11 @@
39
32
  "registry": "https://registry.npmjs.org/"
40
33
  },
41
34
  "scripts": {
42
- "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references",
43
- "build:all": "ts-bridge --project tsconfig.build.json --verbose --clean",
35
+ "build": "tsc --project tsconfig.build.json",
36
+ "build:all": "tsc --build tsconfig.build.json --verbose",
37
+ "build:clean": "yarn build:only-clean && yarn build",
44
38
  "build:docs": "typedoc",
39
+ "build:only-clean": "rimraf './dist' './tsconfig.build.tsbuildinfo'",
45
40
  "changelog:update": "../../scripts/update-changelog.sh @metamask/multichain-transactions-controller",
46
41
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/multichain-transactions-controller",
47
42
  "lint:tsconfigs": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts",
@@ -73,17 +68,18 @@
73
68
  "devDependencies": {
74
69
  "@metamask/auto-changelog": "^6.1.0",
75
70
  "@metamask/keyring-controller": "^27.1.1",
76
- "@ts-bridge/cli": "^0.6.4",
77
71
  "@types/jest": "^30.0.0",
72
+ "@typescript/native": "npm:typescript@^7.0.2",
78
73
  "deepmerge": "^4.2.2",
79
74
  "jest": "^30.4.2",
75
+ "rimraf": "^5.0.5",
80
76
  "ts-jest": "^29.4.11",
81
77
  "tsx": "^4.20.5",
82
78
  "typedoc": "^0.25.13",
83
79
  "typedoc-plugin-missing-exports": "^2.0.0",
84
- "typescript": "~5.3.3"
80
+ "typescript": "npm:@typescript/typescript6@^6.0.2"
85
81
  },
86
82
  "engines": {
87
- "node": "^18.18 || >=20"
83
+ "node": "^22.14.0 || ^24"
88
84
  }
89
85
  }
@@ -1,7 +0,0 @@
1
- "use strict";
2
- /**
3
- * This file is auto generated.
4
- * Do not edit manually.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- //# sourceMappingURL=MultichainTransactionsController-method-action-types.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController-method-action-types.cjs","sourceRoot":"","sources":["../src/MultichainTransactionsController-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { MultichainTransactionsController } from './MultichainTransactionsController.js';\n\n/**\n * Updates transactions for a specific account. This is used for the initial fetch\n * when an account is first added.\n *\n * @param accountId - The ID of the account to get transactions for.\n */\nexport type MultichainTransactionsControllerUpdateTransactionsForAccountAction =\n {\n type: `MultichainTransactionsController:updateTransactionsForAccount`;\n handler: MultichainTransactionsController['updateTransactionsForAccount'];\n };\n\n/**\n * Union of all MultichainTransactionsController action types.\n */\nexport type MultichainTransactionsControllerMethodActions =\n MultichainTransactionsControllerUpdateTransactionsForAccountAction;\n"]}
@@ -1,20 +0,0 @@
1
- /**
2
- * This file is auto generated.
3
- * Do not edit manually.
4
- */
5
- import type { MultichainTransactionsController } from "./MultichainTransactionsController.cjs";
6
- /**
7
- * Updates transactions for a specific account. This is used for the initial fetch
8
- * when an account is first added.
9
- *
10
- * @param accountId - The ID of the account to get transactions for.
11
- */
12
- export type MultichainTransactionsControllerUpdateTransactionsForAccountAction = {
13
- type: `MultichainTransactionsController:updateTransactionsForAccount`;
14
- handler: MultichainTransactionsController['updateTransactionsForAccount'];
15
- };
16
- /**
17
- * Union of all MultichainTransactionsController action types.
18
- */
19
- export type MultichainTransactionsControllerMethodActions = MultichainTransactionsControllerUpdateTransactionsForAccountAction;
20
- //# sourceMappingURL=MultichainTransactionsController-method-action-types.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController-method-action-types.d.cts","sourceRoot":"","sources":["../src/MultichainTransactionsController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gCAAgC,EAAE,+CAA8C;AAE9F;;;;;GAKG;AACH,MAAM,MAAM,kEAAkE,GAC5E;IACE,IAAI,EAAE,+DAA+D,CAAC;IACtE,OAAO,EAAE,gCAAgC,CAAC,8BAA8B,CAAC,CAAC;CAC3E,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,6CAA6C,GACvD,kEAAkE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController-method-action-types.d.mts","sourceRoot":"","sources":["../src/MultichainTransactionsController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gCAAgC,EAAE,+CAA8C;AAE9F;;;;;GAKG;AACH,MAAM,MAAM,kEAAkE,GAC5E;IACE,IAAI,EAAE,+DAA+D,CAAC;IACtE,OAAO,EAAE,gCAAgC,CAAC,8BAA8B,CAAC,CAAC;CAC3E,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,6CAA6C,GACvD,kEAAkE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController-method-action-types.mjs","sourceRoot":"","sources":["../src/MultichainTransactionsController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { MultichainTransactionsController } from './MultichainTransactionsController.js';\n\n/**\n * Updates transactions for a specific account. This is used for the initial fetch\n * when an account is first added.\n *\n * @param accountId - The ID of the account to get transactions for.\n */\nexport type MultichainTransactionsControllerUpdateTransactionsForAccountAction =\n {\n type: `MultichainTransactionsController:updateTransactionsForAccount`;\n handler: MultichainTransactionsController['updateTransactionsForAccount'];\n };\n\n/**\n * Union of all MultichainTransactionsController action types.\n */\nexport type MultichainTransactionsControllerMethodActions =\n MultichainTransactionsControllerUpdateTransactionsForAccountAction;\n"]}
@@ -1,229 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
- var _MultichainTransactionsController_instances, _MultichainTransactionsController_listMultichainAccounts, _MultichainTransactionsController_listAccounts, _MultichainTransactionsController_getTransactions, _MultichainTransactionsController_isNonEvmAccount, _MultichainTransactionsController_handleOnAccountAdded, _MultichainTransactionsController_handleOnAccountRemoved, _MultichainTransactionsController_publishTransactionUpdateEvent, _MultichainTransactionsController_handleOnAccountTransactionsUpdated, _MultichainTransactionsController_getClient;
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.MultichainTransactionsController = exports.getDefaultMultichainTransactionsControllerState = void 0;
10
- const base_controller_1 = require("@metamask/base-controller");
11
- const keyring_api_1 = require("@metamask/keyring-api");
12
- const keyring_snap_client_1 = require("@metamask/keyring-snap-client");
13
- const snaps_utils_1 = require("@metamask/snaps-utils");
14
- const controllerName = 'MultichainTransactionsController';
15
- const MESSENGER_EXPOSED_METHODS = ['updateTransactionsForAccount'];
16
- /**
17
- * Constructs the default {@link MultichainTransactionsController} state.
18
- *
19
- * @returns The default {@link MultichainTransactionsController} state.
20
- */
21
- function getDefaultMultichainTransactionsControllerState() {
22
- return {
23
- nonEvmTransactions: {},
24
- };
25
- }
26
- exports.getDefaultMultichainTransactionsControllerState = getDefaultMultichainTransactionsControllerState;
27
- /**
28
- * {@link MultichainTransactionsController}'s metadata.
29
- *
30
- * This allows us to choose if fields of the state should be persisted or not
31
- * using the `persist` flag; and if they can be sent to Sentry or not, using
32
- * the `anonymous` flag.
33
- */
34
- const multichainTransactionsControllerMetadata = {
35
- nonEvmTransactions: {
36
- includeInStateLogs: true,
37
- persist: true,
38
- includeInDebugSnapshot: false,
39
- usedInUi: true,
40
- },
41
- };
42
- /**
43
- * The MultichainTransactionsController is responsible for fetching and caching account
44
- * transactions for non-EVM accounts.
45
- */
46
- class MultichainTransactionsController extends base_controller_1.BaseController {
47
- constructor({ messenger, state, }) {
48
- super({
49
- messenger,
50
- name: controllerName,
51
- metadata: multichainTransactionsControllerMetadata,
52
- state: {
53
- ...getDefaultMultichainTransactionsControllerState(),
54
- ...state,
55
- },
56
- });
57
- _MultichainTransactionsController_instances.add(this);
58
- this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
59
- // Fetch initial transactions for all non-EVM accounts
60
- for (const account of __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_listAccounts).call(this)) {
61
- this.updateTransactionsForAccount(account.id).catch((error) => {
62
- console.error(`Failed to fetch initial transactions for account ${account.id}:`, error);
63
- });
64
- }
65
- this.messenger.subscribe('AccountsController:accountAdded', (account) => __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_handleOnAccountAdded).call(this, account));
66
- this.messenger.subscribe('AccountsController:accountRemoved', (accountId) => __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_handleOnAccountRemoved).call(this, accountId));
67
- this.messenger.subscribe('AccountsController:accountTransactionsUpdated', (transactionsUpdate) => __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_handleOnAccountTransactionsUpdated).call(this, transactionsUpdate));
68
- }
69
- /**
70
- * Updates transactions for a specific account. This is used for the initial fetch
71
- * when an account is first added.
72
- *
73
- * @param accountId - The ID of the account to get transactions for.
74
- */
75
- async updateTransactionsForAccount(accountId) {
76
- const { isUnlocked } = this.messenger.call('KeyringController:getState');
77
- if (!isUnlocked) {
78
- return;
79
- }
80
- try {
81
- const account = __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_listAccounts).call(this).find((accountItem) => accountItem.id === accountId);
82
- if (account?.metadata.snap) {
83
- const response = await __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_getTransactions).call(this, account.id, account.metadata.snap.id, { limit: 10 });
84
- const transactionsByChain = {};
85
- response.data.forEach((transaction) => {
86
- const { chain } = transaction;
87
- if (!transactionsByChain[chain]) {
88
- transactionsByChain[chain] = [];
89
- }
90
- transactionsByChain[chain].push(transaction);
91
- });
92
- const chainUpdates = Object.entries(transactionsByChain).map(([chain, transactions]) => ({
93
- chain,
94
- entry: {
95
- transactions,
96
- next: response.next,
97
- lastUpdated: Date.now(),
98
- },
99
- }));
100
- this.update((state) => {
101
- if (!state.nonEvmTransactions[account.id]) {
102
- state.nonEvmTransactions[account.id] = {};
103
- }
104
- chainUpdates.forEach(({ chain, entry }) => {
105
- state.nonEvmTransactions[account.id][chain] = entry;
106
- });
107
- });
108
- }
109
- }
110
- catch (error) {
111
- console.error(`Failed to fetch transactions for account ${accountId}:`, error);
112
- }
113
- }
114
- }
115
- exports.MultichainTransactionsController = MultichainTransactionsController;
116
- _MultichainTransactionsController_instances = new WeakSet(), _MultichainTransactionsController_listMultichainAccounts = function _MultichainTransactionsController_listMultichainAccounts() {
117
- return this.messenger.call('AccountsController:listMultichainAccounts');
118
- }, _MultichainTransactionsController_listAccounts = function _MultichainTransactionsController_listAccounts() {
119
- const accounts = __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_listMultichainAccounts).call(this);
120
- return accounts.filter((account) => __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_isNonEvmAccount).call(this, account));
121
- }, _MultichainTransactionsController_getTransactions =
122
- /**
123
- * Gets transactions for an account.
124
- *
125
- * @param accountId - The ID of the account to get transactions for.
126
- * @param snapId - The ID of the snap that manages the account.
127
- * @param pagination - Options for paginating transaction results.
128
- * @returns A promise that resolves to the transaction data and pagination info.
129
- */
130
- async function _MultichainTransactionsController_getTransactions(accountId, snapId, pagination) {
131
- return await __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_getClient).call(this, snapId).listAccountTransactions(accountId, pagination);
132
- }, _MultichainTransactionsController_isNonEvmAccount = function _MultichainTransactionsController_isNonEvmAccount(account) {
133
- return (!(0, keyring_api_1.isEvmAccountType)(account.type) &&
134
- // Non-EVM accounts are backed by a Snap for now
135
- account.metadata.snap !== undefined);
136
- }, _MultichainTransactionsController_handleOnAccountAdded =
137
- /**
138
- * Handles changes when a new account has been added.
139
- *
140
- * @param account - The new account being added.
141
- */
142
- async function _MultichainTransactionsController_handleOnAccountAdded(account) {
143
- if (!__classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_isNonEvmAccount).call(this, account)) {
144
- return;
145
- }
146
- await this.updateTransactionsForAccount(account.id);
147
- }, _MultichainTransactionsController_handleOnAccountRemoved =
148
- /**
149
- * Handles changes when a new account has been removed.
150
- *
151
- * @param accountId - The account ID being removed.
152
- */
153
- async function _MultichainTransactionsController_handleOnAccountRemoved(accountId) {
154
- if (accountId in this.state.nonEvmTransactions) {
155
- this.update((state) => {
156
- delete state.nonEvmTransactions[accountId];
157
- });
158
- }
159
- }, _MultichainTransactionsController_publishTransactionUpdateEvent = function _MultichainTransactionsController_publishTransactionUpdateEvent(updatedTransaction) {
160
- if (updatedTransaction.status === keyring_api_1.TransactionStatus.Confirmed) {
161
- this.messenger.publish('MultichainTransactionsController:transactionConfirmed', updatedTransaction);
162
- }
163
- if (updatedTransaction.status === keyring_api_1.TransactionStatus.Submitted) {
164
- this.messenger.publish('MultichainTransactionsController:transactionSubmitted', updatedTransaction);
165
- }
166
- }, _MultichainTransactionsController_handleOnAccountTransactionsUpdated = function _MultichainTransactionsController_handleOnAccountTransactionsUpdated(transactionsUpdate) {
167
- const updatedTransactions = {};
168
- const transactionsToPublish = [];
169
- if (!transactionsUpdate?.transactions) {
170
- return;
171
- }
172
- Object.entries(transactionsUpdate.transactions).forEach(([accountId, newTransactions]) => {
173
- updatedTransactions[accountId] = {};
174
- newTransactions.forEach((tx) => {
175
- const { chain } = tx;
176
- if (!updatedTransactions[accountId][chain]) {
177
- updatedTransactions[accountId][chain] = [];
178
- }
179
- updatedTransactions[accountId][chain].push(tx);
180
- transactionsToPublish.push(tx);
181
- });
182
- Object.entries(updatedTransactions[accountId]).forEach(([chain, chainTransactions]) => {
183
- // Account might not have any transactions yet, so use `[]` in that case.
184
- const oldTransactions = this.state.nonEvmTransactions[accountId]?.[chain]
185
- ?.transactions ?? [];
186
- // Uses a `Map` to deduplicate transactions by ID, ensuring we keep the latest version
187
- // of each transaction while preserving older transactions and transactions from other accounts.
188
- // Transactions are sorted by timestamp (newest first).
189
- const transactions = new Map();
190
- oldTransactions.forEach((tx) => {
191
- transactions.set(tx.id, tx);
192
- });
193
- chainTransactions.forEach((tx) => {
194
- transactions.set(tx.id, tx);
195
- });
196
- // Sorted by timestamp (newest first). If the timestamp is not provided, those
197
- // transactions will be put in the end of this list.
198
- updatedTransactions[accountId][chain] = Array.from(transactions.values()).sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));
199
- });
200
- });
201
- this.update((state) => {
202
- Object.entries(updatedTransactions).forEach(([accountId, chainsData]) => {
203
- if (!state.nonEvmTransactions[accountId]) {
204
- state.nonEvmTransactions[accountId] = {};
205
- }
206
- Object.entries(chainsData).forEach(([chain, transactions]) => {
207
- state.nonEvmTransactions[accountId][chain] = {
208
- transactions,
209
- next: null,
210
- lastUpdated: Date.now(),
211
- };
212
- });
213
- });
214
- });
215
- // After we update the state, publish the events for new/updated transactions
216
- transactionsToPublish.forEach((tx) => {
217
- __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_publishTransactionUpdateEvent).call(this, tx);
218
- });
219
- }, _MultichainTransactionsController_getClient = function _MultichainTransactionsController_getClient(snapId) {
220
- return new keyring_snap_client_1.KeyringClient({
221
- send: async (request) => (await this.messenger.call('SnapController:handleRequest', {
222
- snapId: snapId,
223
- origin: 'metamask',
224
- handler: snaps_utils_1.HandlerType.OnKeyringRequest,
225
- request,
226
- })),
227
- });
228
- };
229
- //# sourceMappingURL=MultichainTransactionsController.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController.cjs","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":";;;;;;;;;AAMA,+DAA2D;AAK3D,uDAA4E;AAO5E,uEAA8D;AAI9D,uDAAoD;AAMpD,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAE1D,MAAM,yBAAyB,GAAG,CAAC,8BAA8B,CAAU,CAAC;AAyB5E;;;;GAIG;AACH,SAAgB,+CAA+C;IAC7D,OAAO;QACL,kBAAkB,EAAE,EAAE;KACvB,CAAC;AACJ,CAAC;AAJD,0GAIC;AA4ED;;;;;;GAMG;AACH,MAAM,wCAAwC,GAAG;IAC/C,kBAAkB,EAAE;QAClB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAWF;;;GAGG;AACH,MAAa,gCAAiC,SAAQ,gCAIrD;IACC,YAAY,EACV,SAAS,EACT,KAAK,GAIN;QACC,KAAK,CAAC;YACJ,SAAS;YACT,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,wCAAwC;YAClD,KAAK,EAAE;gBACL,GAAG,+CAA+C,EAAE;gBACpD,GAAG,KAAK;aACT;SACF,CAAC,CAAC;;QAEH,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;QAEF,sDAAsD;QACtD,KAAK,MAAM,OAAO,IAAI,uBAAA,IAAI,mGAAc,MAAlB,IAAI,CAAgB,EAAE,CAAC;YAC3C,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC5D,OAAO,CAAC,KAAK,CACX,oDAAoD,OAAO,CAAC,EAAE,GAAG,EACjE,KAAK,CACN,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,iCAAiC,EACjC,CAAC,OAAwB,EAAE,EAAE,CAAC,uBAAA,IAAI,2GAAsB,MAA1B,IAAI,EAAuB,OAAO,CAAC,CAClE,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,mCAAmC,EACnC,CAAC,SAAiB,EAAE,EAAE,CAAC,uBAAA,IAAI,6GAAwB,MAA5B,IAAI,EAAyB,SAAS,CAAC,CAC/D,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,+CAA+C,EAC/C,CAAC,kBAA0D,EAAE,EAAE,CAC7D,uBAAA,IAAI,yHAAoC,MAAxC,IAAI,EAAqC,kBAAkB,CAAC,CAC/D,CAAC;IACJ,CAAC;IA2CD;;;;;OAKG;IACH,KAAK,CAAC,4BAA4B,CAAC,SAAiB;QAClD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAEzE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,uBAAA,IAAI,mGAAc,MAAlB,IAAI,CAAgB,CAAC,IAAI,CACvC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,SAAS,CAC9C,CAAC;YAEF,IAAI,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,sGAAiB,MAArB,IAAI,EACzB,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EACxB,EAAE,KAAK,EAAE,EAAE,EAAE,CACd,CAAC;gBAEF,MAAM,mBAAmB,GAAuC,EAAE,CAAC;gBAEnE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;oBACpC,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;oBAE9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAChC,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBAClC,CAAC;oBACD,mBAAmB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;gBAEH,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAC1D,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1B,KAAK;oBACL,KAAK,EAAE;wBACL,YAAY;wBACZ,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;qBACxB;iBACF,CAAC,CACH,CAAC;gBAEF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAmD,EAAE,EAAE;oBAClE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC1C,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;oBAC5C,CAAC;oBAED,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;wBACxC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAoB,CAAC,GAAG,KAAK,CAAC;oBACrE,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,4CAA4C,SAAS,GAAG,EACxD,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;CAqKF;AAjUD,4EAiUC;;IAvQG,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;AAC1E,CAAC;IAQC,MAAM,QAAQ,GAAG,uBAAA,IAAI,6GAAwB,MAA5B,IAAI,CAA0B,CAAC;IAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAA,IAAI,sGAAiB,MAArB,IAAI,EAAkB,OAAO,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,4DACH,SAAiB,EACjB,MAAc,EACd,UAA6B;IAK7B,OAAO,MAAM,uBAAA,IAAI,gGAAW,MAAf,IAAI,EAAY,MAAM,CAAC,CAAC,uBAAuB,CAC1D,SAAS,EACT,UAAU,CACX,CAAC;AACJ,CAAC,iHAyEgB,OAAwB;IACvC,OAAO,CACL,CAAC,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,gDAAgD;QAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CACpC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,iEAAuB,OAAwB;IAClD,IAAI,CAAC,uBAAA,IAAI,sGAAiB,MAArB,IAAI,EAAkB,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,KAAK,mEAAyB,SAAiB;IAC7C,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAmD,EAAE,EAAE;YAClE,OAAO,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,6IAO8B,kBAA+B;IAC5D,IAAI,kBAAkB,CAAC,MAAM,KAAK,+BAAiB,CAAC,SAAS,EAAE,CAAC;QAC9D,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,uDAAuD,EACvD,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,CAAC,MAAM,KAAK,+BAAiB,CAAC,SAAS,EAAE,CAAC;QAC9D,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,uDAAuD,EACvD,kBAAkB,CACnB,CAAC;IACJ,CAAC;AACH,CAAC,uJAQC,kBAA0D;IAE1D,MAAM,mBAAmB,GAGrB,EAAE,CAAC;IACP,MAAM,qBAAqB,GAAkB,EAAE,CAAC;IAEhD,IAAI,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,OAAO,CACrD,CAAC,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,EAAE;QAC/B,mBAAmB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAEpC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAErB,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,mBAAmB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7C,CAAC;YAED,mBAAmB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/C,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CACpD,CAAC,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,EAAE;YAC7B,yEAAyE;YACzE,MAAM,eAAe,GACnB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,KAAoB,CAAC;gBAC9D,EAAE,YAAY,IAAI,EAAE,CAAC;YAEzB,sFAAsF;YACtF,gGAAgG;YAChG,uDAAuD;YACvD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;YAE/B,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC7B,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,iBAAiB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC/B,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,8EAA8E;YAC9E,oDAAoD;YACpD,mBAAmB,CAAC,SAAS,CAAC,CAAC,KAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,CAC/D,YAAY,CAAC,MAAM,EAAE,CACtB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE;YACtE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YAC3C,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE;gBAC3D,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,KAAoB,CAAC,GAAG;oBAC1D,YAAY;oBACZ,IAAI,EAAE,IAAI;oBACV,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;iBACxB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACnC,uBAAA,IAAI,oHAA+B,MAAnC,IAAI,EAAgC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,qGAQU,MAAc;IACvB,OAAO,IAAI,mCAAa,CAAC;QACvB,IAAI,EAAE,KAAK,EAAE,OAAuB,EAAE,EAAE,CACtC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,8BAA8B,EAAE;YACzD,MAAM,EAAE,MAAgB;YACxB,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,yBAAW,CAAC,gBAAgB;YACrC,OAAO;SACR,CAAC,CAAkB;KACvB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n AccountsControllerAccountTransactionsUpdatedEvent,\n} from '@metamask/accounts-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { isEvmAccountType, TransactionStatus } from '@metamask/keyring-api';\nimport type {\n Transaction,\n AccountTransactionsUpdatedEventPayload,\n} from '@metamask/keyring-api';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type { Messenger } from '@metamask/messenger';\nimport type { SnapControllerHandleRequestAction } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport type { CaipChainId, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Draft } from 'immer';\n\nimport type { MultichainTransactionsControllerMethodActions } from './MultichainTransactionsController-method-action-types.js';\n\nconst controllerName = 'MultichainTransactionsController';\n\nconst MESSENGER_EXPOSED_METHODS = ['updateTransactionsForAccount'] as const;\n\n/**\n * PaginationOptions\n *\n * Represents options for paginating transaction results\n * limit - The maximum number of transactions to return\n * next - The cursor for the next page of transactions, or null if there is no next page\n */\nexport type PaginationOptions = {\n limit: number;\n next?: string | null;\n};\n\n/**\n * State used by the {@link MultichainTransactionsController} to cache account transactions.\n */\nexport type MultichainTransactionsControllerState = {\n nonEvmTransactions: {\n [accountId: string]: {\n [chain: CaipChainId]: TransactionStateEntry;\n };\n };\n};\n\n/**\n * Constructs the default {@link MultichainTransactionsController} state.\n *\n * @returns The default {@link MultichainTransactionsController} state.\n */\nexport function getDefaultMultichainTransactionsControllerState(): MultichainTransactionsControllerState {\n return {\n nonEvmTransactions: {},\n };\n}\n\n/**\n * Event emitted when a transaction is finalized.\n */\nexport type MultichainTransactionsControllerTransactionConfirmedEvent = {\n type: `${typeof controllerName}:transactionConfirmed`;\n payload: [Transaction];\n};\n\n/**\n * Event emitted when a transaction is submitted.\n */\nexport type MultichainTransactionsControllerTransactionSubmittedEvent = {\n type: `${typeof controllerName}:transactionSubmitted`;\n payload: [Transaction];\n};\n\n/**\n * Returns the state of the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Event emitted when the state of the {@link MultichainTransactionsController} changes.\n */\nexport type MultichainTransactionsControllerStateChange =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Actions exposed by the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerActions =\n | MultichainTransactionsControllerGetStateAction\n | MultichainTransactionsControllerMethodActions;\n\n/**\n * Events emitted by {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerEvents =\n | MultichainTransactionsControllerStateChange\n | MultichainTransactionsControllerTransactionConfirmedEvent\n | MultichainTransactionsControllerTransactionSubmittedEvent;\n\n/**\n * Messenger type for the MultichainTransactionsController.\n */\nexport type MultichainTransactionsControllerMessenger = Messenger<\n typeof controllerName,\n MultichainTransactionsControllerActions | AllowedActions,\n MultichainTransactionsControllerEvents | AllowedEvents\n>;\n\n/**\n * Actions that this controller is allowed to call.\n */\ntype AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerHandleRequestAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountTransactionsUpdatedEvent;\n\n/**\n * {@link MultichainTransactionsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst multichainTransactionsControllerMetadata = {\n nonEvmTransactions: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * The state of transactions for a specific chain.\n */\nexport type TransactionStateEntry = {\n transactions: Transaction[];\n next: string | null;\n lastUpdated: number;\n};\n\n/**\n * The MultichainTransactionsController is responsible for fetching and caching account\n * transactions for non-EVM accounts.\n */\nexport class MultichainTransactionsController extends BaseController<\n typeof controllerName,\n MultichainTransactionsControllerState,\n MultichainTransactionsControllerMessenger\n> {\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainTransactionsControllerMessenger;\n state?: Partial<MultichainTransactionsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: multichainTransactionsControllerMetadata,\n state: {\n ...getDefaultMultichainTransactionsControllerState(),\n ...state,\n },\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n // Fetch initial transactions for all non-EVM accounts\n for (const account of this.#listAccounts()) {\n this.updateTransactionsForAccount(account.id).catch((error) => {\n console.error(\n `Failed to fetch initial transactions for account ${account.id}:`,\n error,\n );\n });\n }\n\n this.messenger.subscribe(\n 'AccountsController:accountAdded',\n (account: InternalAccount) => this.#handleOnAccountAdded(account),\n );\n this.messenger.subscribe(\n 'AccountsController:accountRemoved',\n (accountId: string) => this.#handleOnAccountRemoved(accountId),\n );\n this.messenger.subscribe(\n 'AccountsController:accountTransactionsUpdated',\n (transactionsUpdate: AccountTransactionsUpdatedEventPayload) =>\n this.#handleOnAccountTransactionsUpdated(transactionsUpdate),\n );\n }\n\n /**\n * Lists the multichain accounts coming from the `AccountsController`.\n *\n * @returns A list of multichain accounts.\n */\n #listMultichainAccounts(): InternalAccount[] {\n return this.messenger.call('AccountsController:listMultichainAccounts');\n }\n\n /**\n * Lists the accounts that we should get transactions for.\n *\n * @returns A list of accounts that we should get transactions for.\n */\n #listAccounts(): InternalAccount[] {\n const accounts = this.#listMultichainAccounts();\n return accounts.filter((account) => this.#isNonEvmAccount(account));\n }\n\n /**\n * Gets transactions for an account.\n *\n * @param accountId - The ID of the account to get transactions for.\n * @param snapId - The ID of the snap that manages the account.\n * @param pagination - Options for paginating transaction results.\n * @returns A promise that resolves to the transaction data and pagination info.\n */\n async #getTransactions(\n accountId: string,\n snapId: string,\n pagination: PaginationOptions,\n ): Promise<{\n data: Transaction[];\n next: string | null;\n }> {\n return await this.#getClient(snapId).listAccountTransactions(\n accountId,\n pagination,\n );\n }\n\n /**\n * Updates transactions for a specific account. This is used for the initial fetch\n * when an account is first added.\n *\n * @param accountId - The ID of the account to get transactions for.\n */\n async updateTransactionsForAccount(accountId: string) {\n const { isUnlocked } = this.messenger.call('KeyringController:getState');\n\n if (!isUnlocked) {\n return;\n }\n\n try {\n const account = this.#listAccounts().find(\n (accountItem) => accountItem.id === accountId,\n );\n\n if (account?.metadata.snap) {\n const response = await this.#getTransactions(\n account.id,\n account.metadata.snap.id,\n { limit: 10 },\n );\n\n const transactionsByChain: Record<CaipChainId, Transaction[]> = {};\n\n response.data.forEach((transaction) => {\n const { chain } = transaction;\n\n if (!transactionsByChain[chain]) {\n transactionsByChain[chain] = [];\n }\n transactionsByChain[chain].push(transaction);\n });\n\n const chainUpdates = Object.entries(transactionsByChain).map(\n ([chain, transactions]) => ({\n chain,\n entry: {\n transactions,\n next: response.next,\n lastUpdated: Date.now(),\n },\n }),\n );\n\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n if (!state.nonEvmTransactions[account.id]) {\n state.nonEvmTransactions[account.id] = {};\n }\n\n chainUpdates.forEach(({ chain, entry }) => {\n state.nonEvmTransactions[account.id][chain as CaipChainId] = entry;\n });\n });\n }\n } catch (error) {\n console.error(\n `Failed to fetch transactions for account ${accountId}:`,\n error,\n );\n }\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount) {\n if (!this.#isNonEvmAccount(account)) {\n return;\n }\n\n await this.updateTransactionsForAccount(account.id);\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The account ID being removed.\n */\n async #handleOnAccountRemoved(accountId: string) {\n if (accountId in this.state.nonEvmTransactions) {\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n delete state.nonEvmTransactions[accountId];\n });\n }\n }\n\n /**\n * Publishes transaction update events.\n *\n * @param updatedTransaction - The updated transaction.\n */\n #publishTransactionUpdateEvent(updatedTransaction: Transaction) {\n if (updatedTransaction.status === TransactionStatus.Confirmed) {\n this.messenger.publish(\n 'MultichainTransactionsController:transactionConfirmed',\n updatedTransaction,\n );\n }\n\n if (updatedTransaction.status === TransactionStatus.Submitted) {\n this.messenger.publish(\n 'MultichainTransactionsController:transactionSubmitted',\n updatedTransaction,\n );\n }\n }\n\n /**\n * Handles transaction updates received from the AccountsController.\n *\n * @param transactionsUpdate - The transaction update event containing new transactions.\n */\n #handleOnAccountTransactionsUpdated(\n transactionsUpdate: AccountTransactionsUpdatedEventPayload,\n ): void {\n const updatedTransactions: Record<\n string,\n Record<CaipChainId, Transaction[]>\n > = {};\n const transactionsToPublish: Transaction[] = [];\n\n if (!transactionsUpdate?.transactions) {\n return;\n }\n\n Object.entries(transactionsUpdate.transactions).forEach(\n ([accountId, newTransactions]) => {\n updatedTransactions[accountId] = {};\n\n newTransactions.forEach((tx) => {\n const { chain } = tx;\n\n if (!updatedTransactions[accountId][chain]) {\n updatedTransactions[accountId][chain] = [];\n }\n\n updatedTransactions[accountId][chain].push(tx);\n transactionsToPublish.push(tx);\n });\n\n Object.entries(updatedTransactions[accountId]).forEach(\n ([chain, chainTransactions]) => {\n // Account might not have any transactions yet, so use `[]` in that case.\n const oldTransactions =\n this.state.nonEvmTransactions[accountId]?.[chain as CaipChainId]\n ?.transactions ?? [];\n\n // Uses a `Map` to deduplicate transactions by ID, ensuring we keep the latest version\n // of each transaction while preserving older transactions and transactions from other accounts.\n // Transactions are sorted by timestamp (newest first).\n const transactions = new Map();\n\n oldTransactions.forEach((tx) => {\n transactions.set(tx.id, tx);\n });\n\n chainTransactions.forEach((tx) => {\n transactions.set(tx.id, tx);\n });\n\n // Sorted by timestamp (newest first). If the timestamp is not provided, those\n // transactions will be put in the end of this list.\n updatedTransactions[accountId][chain as CaipChainId] = Array.from(\n transactions.values(),\n ).sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));\n },\n );\n },\n );\n\n this.update((state) => {\n Object.entries(updatedTransactions).forEach(([accountId, chainsData]) => {\n if (!state.nonEvmTransactions[accountId]) {\n state.nonEvmTransactions[accountId] = {};\n }\n\n Object.entries(chainsData).forEach(([chain, transactions]) => {\n state.nonEvmTransactions[accountId][chain as CaipChainId] = {\n transactions,\n next: null,\n lastUpdated: Date.now(),\n };\n });\n });\n });\n\n // After we update the state, publish the events for new/updated transactions\n transactionsToPublish.forEach((tx) => {\n this.#publishTransactionUpdateEvent(tx);\n });\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messenger.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController.d.cts","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,8CAA8C,EAC9C,iDAAiD,EAClD,sCAAsC;AACvC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;AAEnC,OAAO,KAAK,EACV,WAAW,EAEZ,8BAA8B;AAC/B,OAAO,KAAK,EAAE,+BAA+B,EAAE,qCAAqC;AAGpF,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,iCAAiC,EAAE,oCAAoC;AAGrF,OAAO,KAAK,EAAE,WAAW,EAAwB,wBAAwB;AAGzE,OAAO,KAAK,EAAE,6CAA6C,EAAE,mEAAkE;AAE/H,QAAA,MAAM,cAAc,qCAAqC,CAAC;AAI1D;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,kBAAkB,EAAE;QAClB,CAAC,SAAS,EAAE,MAAM,GAAG;YACnB,CAAC,KAAK,EAAE,WAAW,GAAG,qBAAqB,CAAC;SAC7C,CAAC;KACH,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,+CAA+C,IAAI,qCAAqC,CAIvG;AAED;;GAEG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,GAAG,OAAO,cAAc,uBAAuB,CAAC;IACtD,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,GAAG,OAAO,cAAc,uBAAuB,CAAC;IACtD,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACxD,wBAAwB,CACtB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACrD,0BAA0B,CACxB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,8CAA8C,GAC9C,6CAA6C,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAC9C,2CAA2C,GAC3C,yDAAyD,GACzD,yDAAyD,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,yCAAyC,GAAG,SAAS,CAC/D,OAAO,cAAc,EACrB,uCAAuC,GAAG,cAAc,EACxD,sCAAsC,GAAG,aAAa,CACvD,CAAC;AAEF;;GAEG;AACH,KAAK,cAAc,GACf,8CAA8C,GAC9C,+BAA+B,GAC/B,iCAAiC,CAAC;AAEtC;;GAEG;AACH,KAAK,aAAa,GACd,mCAAmC,GACnC,qCAAqC,GACrC,iDAAiD,CAAC;AAkBtD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,cAAc,CAClE,OAAO,cAAc,EACrB,qCAAqC,EACrC,yCAAyC,CAC1C;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,yCAAyC,CAAC;QACrD,KAAK,CAAC,EAAE,OAAO,CAAC,qCAAqC,CAAC,CAAC;KACxD;IAkFD;;;;;OAKG;IACG,4BAA4B,CAAC,SAAS,EAAE,MAAM;CA8NrD"}
@@ -1,107 +0,0 @@
1
- import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction, AccountsControllerAccountTransactionsUpdatedEvent } from "@metamask/accounts-controller";
2
- import { BaseController } from "@metamask/base-controller";
3
- import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
4
- import type { Transaction } from "@metamask/keyring-api";
5
- import type { KeyringControllerGetStateAction } from "@metamask/keyring-controller";
6
- import type { Messenger } from "@metamask/messenger";
7
- import type { SnapControllerHandleRequestAction } from "@metamask/snaps-controllers";
8
- import type { CaipChainId } from "@metamask/utils";
9
- import type { MultichainTransactionsControllerMethodActions } from "./MultichainTransactionsController-method-action-types.mjs";
10
- declare const controllerName = "MultichainTransactionsController";
11
- /**
12
- * PaginationOptions
13
- *
14
- * Represents options for paginating transaction results
15
- * limit - The maximum number of transactions to return
16
- * next - The cursor for the next page of transactions, or null if there is no next page
17
- */
18
- export type PaginationOptions = {
19
- limit: number;
20
- next?: string | null;
21
- };
22
- /**
23
- * State used by the {@link MultichainTransactionsController} to cache account transactions.
24
- */
25
- export type MultichainTransactionsControllerState = {
26
- nonEvmTransactions: {
27
- [accountId: string]: {
28
- [chain: CaipChainId]: TransactionStateEntry;
29
- };
30
- };
31
- };
32
- /**
33
- * Constructs the default {@link MultichainTransactionsController} state.
34
- *
35
- * @returns The default {@link MultichainTransactionsController} state.
36
- */
37
- export declare function getDefaultMultichainTransactionsControllerState(): MultichainTransactionsControllerState;
38
- /**
39
- * Event emitted when a transaction is finalized.
40
- */
41
- export type MultichainTransactionsControllerTransactionConfirmedEvent = {
42
- type: `${typeof controllerName}:transactionConfirmed`;
43
- payload: [Transaction];
44
- };
45
- /**
46
- * Event emitted when a transaction is submitted.
47
- */
48
- export type MultichainTransactionsControllerTransactionSubmittedEvent = {
49
- type: `${typeof controllerName}:transactionSubmitted`;
50
- payload: [Transaction];
51
- };
52
- /**
53
- * Returns the state of the {@link MultichainTransactionsController}.
54
- */
55
- export type MultichainTransactionsControllerGetStateAction = ControllerGetStateAction<typeof controllerName, MultichainTransactionsControllerState>;
56
- /**
57
- * Event emitted when the state of the {@link MultichainTransactionsController} changes.
58
- */
59
- export type MultichainTransactionsControllerStateChange = ControllerStateChangeEvent<typeof controllerName, MultichainTransactionsControllerState>;
60
- /**
61
- * Actions exposed by the {@link MultichainTransactionsController}.
62
- */
63
- export type MultichainTransactionsControllerActions = MultichainTransactionsControllerGetStateAction | MultichainTransactionsControllerMethodActions;
64
- /**
65
- * Events emitted by {@link MultichainTransactionsController}.
66
- */
67
- export type MultichainTransactionsControllerEvents = MultichainTransactionsControllerStateChange | MultichainTransactionsControllerTransactionConfirmedEvent | MultichainTransactionsControllerTransactionSubmittedEvent;
68
- /**
69
- * Messenger type for the MultichainTransactionsController.
70
- */
71
- export type MultichainTransactionsControllerMessenger = Messenger<typeof controllerName, MultichainTransactionsControllerActions | AllowedActions, MultichainTransactionsControllerEvents | AllowedEvents>;
72
- /**
73
- * Actions that this controller is allowed to call.
74
- */
75
- type AllowedActions = AccountsControllerListMultichainAccountsAction | KeyringControllerGetStateAction | SnapControllerHandleRequestAction;
76
- /**
77
- * Events that this controller is allowed to subscribe.
78
- */
79
- type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent | AccountsControllerAccountTransactionsUpdatedEvent;
80
- /**
81
- * The state of transactions for a specific chain.
82
- */
83
- export type TransactionStateEntry = {
84
- transactions: Transaction[];
85
- next: string | null;
86
- lastUpdated: number;
87
- };
88
- /**
89
- * The MultichainTransactionsController is responsible for fetching and caching account
90
- * transactions for non-EVM accounts.
91
- */
92
- export declare class MultichainTransactionsController extends BaseController<typeof controllerName, MultichainTransactionsControllerState, MultichainTransactionsControllerMessenger> {
93
- #private;
94
- constructor({ messenger, state, }: {
95
- messenger: MultichainTransactionsControllerMessenger;
96
- state?: Partial<MultichainTransactionsControllerState>;
97
- });
98
- /**
99
- * Updates transactions for a specific account. This is used for the initial fetch
100
- * when an account is first added.
101
- *
102
- * @param accountId - The ID of the account to get transactions for.
103
- */
104
- updateTransactionsForAccount(accountId: string): Promise<void>;
105
- }
106
- export {};
107
- //# sourceMappingURL=MultichainTransactionsController.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController.d.mts","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,8CAA8C,EAC9C,iDAAiD,EAClD,sCAAsC;AACvC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;AAEnC,OAAO,KAAK,EACV,WAAW,EAEZ,8BAA8B;AAC/B,OAAO,KAAK,EAAE,+BAA+B,EAAE,qCAAqC;AAGpF,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,iCAAiC,EAAE,oCAAoC;AAGrF,OAAO,KAAK,EAAE,WAAW,EAAwB,wBAAwB;AAGzE,OAAO,KAAK,EAAE,6CAA6C,EAAE,mEAAkE;AAE/H,QAAA,MAAM,cAAc,qCAAqC,CAAC;AAI1D;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,kBAAkB,EAAE;QAClB,CAAC,SAAS,EAAE,MAAM,GAAG;YACnB,CAAC,KAAK,EAAE,WAAW,GAAG,qBAAqB,CAAC;SAC7C,CAAC;KACH,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,+CAA+C,IAAI,qCAAqC,CAIvG;AAED;;GAEG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,GAAG,OAAO,cAAc,uBAAuB,CAAC;IACtD,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,GAAG,OAAO,cAAc,uBAAuB,CAAC;IACtD,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACxD,wBAAwB,CACtB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACrD,0BAA0B,CACxB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,8CAA8C,GAC9C,6CAA6C,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAC9C,2CAA2C,GAC3C,yDAAyD,GACzD,yDAAyD,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,yCAAyC,GAAG,SAAS,CAC/D,OAAO,cAAc,EACrB,uCAAuC,GAAG,cAAc,EACxD,sCAAsC,GAAG,aAAa,CACvD,CAAC;AAEF;;GAEG;AACH,KAAK,cAAc,GACf,8CAA8C,GAC9C,+BAA+B,GAC/B,iCAAiC,CAAC;AAEtC;;GAEG;AACH,KAAK,aAAa,GACd,mCAAmC,GACnC,qCAAqC,GACrC,iDAAiD,CAAC;AAkBtD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,cAAc,CAClE,OAAO,cAAc,EACrB,qCAAqC,EACrC,yCAAyC,CAC1C;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,yCAAyC,CAAC;QACrD,KAAK,CAAC,EAAE,OAAO,CAAC,qCAAqC,CAAC,CAAC;KACxD;IAkFD;;;;;OAKG;IACG,4BAA4B,CAAC,SAAS,EAAE,MAAM;CA8NrD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainTransactionsController.mjs","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n AccountsControllerAccountTransactionsUpdatedEvent,\n} from '@metamask/accounts-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { isEvmAccountType, TransactionStatus } from '@metamask/keyring-api';\nimport type {\n Transaction,\n AccountTransactionsUpdatedEventPayload,\n} from '@metamask/keyring-api';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type { Messenger } from '@metamask/messenger';\nimport type { SnapControllerHandleRequestAction } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport type { CaipChainId, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Draft } from 'immer';\n\nimport type { MultichainTransactionsControllerMethodActions } from './MultichainTransactionsController-method-action-types.js';\n\nconst controllerName = 'MultichainTransactionsController';\n\nconst MESSENGER_EXPOSED_METHODS = ['updateTransactionsForAccount'] as const;\n\n/**\n * PaginationOptions\n *\n * Represents options for paginating transaction results\n * limit - The maximum number of transactions to return\n * next - The cursor for the next page of transactions, or null if there is no next page\n */\nexport type PaginationOptions = {\n limit: number;\n next?: string | null;\n};\n\n/**\n * State used by the {@link MultichainTransactionsController} to cache account transactions.\n */\nexport type MultichainTransactionsControllerState = {\n nonEvmTransactions: {\n [accountId: string]: {\n [chain: CaipChainId]: TransactionStateEntry;\n };\n };\n};\n\n/**\n * Constructs the default {@link MultichainTransactionsController} state.\n *\n * @returns The default {@link MultichainTransactionsController} state.\n */\nexport function getDefaultMultichainTransactionsControllerState(): MultichainTransactionsControllerState {\n return {\n nonEvmTransactions: {},\n };\n}\n\n/**\n * Event emitted when a transaction is finalized.\n */\nexport type MultichainTransactionsControllerTransactionConfirmedEvent = {\n type: `${typeof controllerName}:transactionConfirmed`;\n payload: [Transaction];\n};\n\n/**\n * Event emitted when a transaction is submitted.\n */\nexport type MultichainTransactionsControllerTransactionSubmittedEvent = {\n type: `${typeof controllerName}:transactionSubmitted`;\n payload: [Transaction];\n};\n\n/**\n * Returns the state of the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Event emitted when the state of the {@link MultichainTransactionsController} changes.\n */\nexport type MultichainTransactionsControllerStateChange =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Actions exposed by the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerActions =\n | MultichainTransactionsControllerGetStateAction\n | MultichainTransactionsControllerMethodActions;\n\n/**\n * Events emitted by {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerEvents =\n | MultichainTransactionsControllerStateChange\n | MultichainTransactionsControllerTransactionConfirmedEvent\n | MultichainTransactionsControllerTransactionSubmittedEvent;\n\n/**\n * Messenger type for the MultichainTransactionsController.\n */\nexport type MultichainTransactionsControllerMessenger = Messenger<\n typeof controllerName,\n MultichainTransactionsControllerActions | AllowedActions,\n MultichainTransactionsControllerEvents | AllowedEvents\n>;\n\n/**\n * Actions that this controller is allowed to call.\n */\ntype AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerHandleRequestAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountTransactionsUpdatedEvent;\n\n/**\n * {@link MultichainTransactionsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst multichainTransactionsControllerMetadata = {\n nonEvmTransactions: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * The state of transactions for a specific chain.\n */\nexport type TransactionStateEntry = {\n transactions: Transaction[];\n next: string | null;\n lastUpdated: number;\n};\n\n/**\n * The MultichainTransactionsController is responsible for fetching and caching account\n * transactions for non-EVM accounts.\n */\nexport class MultichainTransactionsController extends BaseController<\n typeof controllerName,\n MultichainTransactionsControllerState,\n MultichainTransactionsControllerMessenger\n> {\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainTransactionsControllerMessenger;\n state?: Partial<MultichainTransactionsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: multichainTransactionsControllerMetadata,\n state: {\n ...getDefaultMultichainTransactionsControllerState(),\n ...state,\n },\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n // Fetch initial transactions for all non-EVM accounts\n for (const account of this.#listAccounts()) {\n this.updateTransactionsForAccount(account.id).catch((error) => {\n console.error(\n `Failed to fetch initial transactions for account ${account.id}:`,\n error,\n );\n });\n }\n\n this.messenger.subscribe(\n 'AccountsController:accountAdded',\n (account: InternalAccount) => this.#handleOnAccountAdded(account),\n );\n this.messenger.subscribe(\n 'AccountsController:accountRemoved',\n (accountId: string) => this.#handleOnAccountRemoved(accountId),\n );\n this.messenger.subscribe(\n 'AccountsController:accountTransactionsUpdated',\n (transactionsUpdate: AccountTransactionsUpdatedEventPayload) =>\n this.#handleOnAccountTransactionsUpdated(transactionsUpdate),\n );\n }\n\n /**\n * Lists the multichain accounts coming from the `AccountsController`.\n *\n * @returns A list of multichain accounts.\n */\n #listMultichainAccounts(): InternalAccount[] {\n return this.messenger.call('AccountsController:listMultichainAccounts');\n }\n\n /**\n * Lists the accounts that we should get transactions for.\n *\n * @returns A list of accounts that we should get transactions for.\n */\n #listAccounts(): InternalAccount[] {\n const accounts = this.#listMultichainAccounts();\n return accounts.filter((account) => this.#isNonEvmAccount(account));\n }\n\n /**\n * Gets transactions for an account.\n *\n * @param accountId - The ID of the account to get transactions for.\n * @param snapId - The ID of the snap that manages the account.\n * @param pagination - Options for paginating transaction results.\n * @returns A promise that resolves to the transaction data and pagination info.\n */\n async #getTransactions(\n accountId: string,\n snapId: string,\n pagination: PaginationOptions,\n ): Promise<{\n data: Transaction[];\n next: string | null;\n }> {\n return await this.#getClient(snapId).listAccountTransactions(\n accountId,\n pagination,\n );\n }\n\n /**\n * Updates transactions for a specific account. This is used for the initial fetch\n * when an account is first added.\n *\n * @param accountId - The ID of the account to get transactions for.\n */\n async updateTransactionsForAccount(accountId: string) {\n const { isUnlocked } = this.messenger.call('KeyringController:getState');\n\n if (!isUnlocked) {\n return;\n }\n\n try {\n const account = this.#listAccounts().find(\n (accountItem) => accountItem.id === accountId,\n );\n\n if (account?.metadata.snap) {\n const response = await this.#getTransactions(\n account.id,\n account.metadata.snap.id,\n { limit: 10 },\n );\n\n const transactionsByChain: Record<CaipChainId, Transaction[]> = {};\n\n response.data.forEach((transaction) => {\n const { chain } = transaction;\n\n if (!transactionsByChain[chain]) {\n transactionsByChain[chain] = [];\n }\n transactionsByChain[chain].push(transaction);\n });\n\n const chainUpdates = Object.entries(transactionsByChain).map(\n ([chain, transactions]) => ({\n chain,\n entry: {\n transactions,\n next: response.next,\n lastUpdated: Date.now(),\n },\n }),\n );\n\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n if (!state.nonEvmTransactions[account.id]) {\n state.nonEvmTransactions[account.id] = {};\n }\n\n chainUpdates.forEach(({ chain, entry }) => {\n state.nonEvmTransactions[account.id][chain as CaipChainId] = entry;\n });\n });\n }\n } catch (error) {\n console.error(\n `Failed to fetch transactions for account ${accountId}:`,\n error,\n );\n }\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount) {\n if (!this.#isNonEvmAccount(account)) {\n return;\n }\n\n await this.updateTransactionsForAccount(account.id);\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The account ID being removed.\n */\n async #handleOnAccountRemoved(accountId: string) {\n if (accountId in this.state.nonEvmTransactions) {\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n delete state.nonEvmTransactions[accountId];\n });\n }\n }\n\n /**\n * Publishes transaction update events.\n *\n * @param updatedTransaction - The updated transaction.\n */\n #publishTransactionUpdateEvent(updatedTransaction: Transaction) {\n if (updatedTransaction.status === TransactionStatus.Confirmed) {\n this.messenger.publish(\n 'MultichainTransactionsController:transactionConfirmed',\n updatedTransaction,\n );\n }\n\n if (updatedTransaction.status === TransactionStatus.Submitted) {\n this.messenger.publish(\n 'MultichainTransactionsController:transactionSubmitted',\n updatedTransaction,\n );\n }\n }\n\n /**\n * Handles transaction updates received from the AccountsController.\n *\n * @param transactionsUpdate - The transaction update event containing new transactions.\n */\n #handleOnAccountTransactionsUpdated(\n transactionsUpdate: AccountTransactionsUpdatedEventPayload,\n ): void {\n const updatedTransactions: Record<\n string,\n Record<CaipChainId, Transaction[]>\n > = {};\n const transactionsToPublish: Transaction[] = [];\n\n if (!transactionsUpdate?.transactions) {\n return;\n }\n\n Object.entries(transactionsUpdate.transactions).forEach(\n ([accountId, newTransactions]) => {\n updatedTransactions[accountId] = {};\n\n newTransactions.forEach((tx) => {\n const { chain } = tx;\n\n if (!updatedTransactions[accountId][chain]) {\n updatedTransactions[accountId][chain] = [];\n }\n\n updatedTransactions[accountId][chain].push(tx);\n transactionsToPublish.push(tx);\n });\n\n Object.entries(updatedTransactions[accountId]).forEach(\n ([chain, chainTransactions]) => {\n // Account might not have any transactions yet, so use `[]` in that case.\n const oldTransactions =\n this.state.nonEvmTransactions[accountId]?.[chain as CaipChainId]\n ?.transactions ?? [];\n\n // Uses a `Map` to deduplicate transactions by ID, ensuring we keep the latest version\n // of each transaction while preserving older transactions and transactions from other accounts.\n // Transactions are sorted by timestamp (newest first).\n const transactions = new Map();\n\n oldTransactions.forEach((tx) => {\n transactions.set(tx.id, tx);\n });\n\n chainTransactions.forEach((tx) => {\n transactions.set(tx.id, tx);\n });\n\n // Sorted by timestamp (newest first). If the timestamp is not provided, those\n // transactions will be put in the end of this list.\n updatedTransactions[accountId][chain as CaipChainId] = Array.from(\n transactions.values(),\n ).sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));\n },\n );\n },\n );\n\n this.update((state) => {\n Object.entries(updatedTransactions).forEach(([accountId, chainsData]) => {\n if (!state.nonEvmTransactions[accountId]) {\n state.nonEvmTransactions[accountId] = {};\n }\n\n Object.entries(chainsData).forEach(([chain, transactions]) => {\n state.nonEvmTransactions[accountId][chain as CaipChainId] = {\n transactions,\n next: null,\n lastUpdated: Date.now(),\n };\n });\n });\n });\n\n // After we update the state, publish the events for new/updated transactions\n transactionsToPublish.forEach((tx) => {\n this.#publishTransactionUpdateEvent(tx);\n });\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messenger.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n}\n"]}
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MultichainNativeAsset = exports.MultichainNetwork = void 0;
4
- /**
5
- * The network identifiers for supported networks in CAIP-2 format.
6
- * Note: This is a temporary workaround until we have a more robust
7
- * solution for network identifiers.
8
- */
9
- var MultichainNetwork;
10
- (function (MultichainNetwork) {
11
- MultichainNetwork["Bitcoin"] = "bip122:000000000019d6689c085ae165831e93";
12
- MultichainNetwork["BitcoinTestnet"] = "bip122:000000000933ea01ad0ee984209779ba";
13
- MultichainNetwork["Solana"] = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
14
- MultichainNetwork["SolanaDevnet"] = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
15
- MultichainNetwork["SolanaTestnet"] = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";
16
- })(MultichainNetwork || (exports.MultichainNetwork = MultichainNetwork = {}));
17
- var MultichainNativeAsset;
18
- (function (MultichainNativeAsset) {
19
- MultichainNativeAsset["Bitcoin"] = "bip122:000000000019d6689c085ae165831e93/slip44:0";
20
- MultichainNativeAsset["BitcoinTestnet"] = "bip122:000000000933ea01ad0ee984209779ba/slip44:0";
21
- MultichainNativeAsset["Solana"] = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501";
22
- MultichainNativeAsset["SolanaDevnet"] = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501";
23
- MultichainNativeAsset["SolanaTestnet"] = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z/slip44:501";
24
- })(MultichainNativeAsset || (exports.MultichainNativeAsset = MultichainNativeAsset = {}));
25
- //# sourceMappingURL=constants.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,IAAY,iBAMX;AAND,WAAY,iBAAiB;IAC3B,wEAAmD,CAAA;IACnD,+EAA0D,CAAA;IAC1D,uEAAkD,CAAA;IAClD,6EAAwD,CAAA;IACxD,8EAAyD,CAAA;AAC3D,CAAC,EANW,iBAAiB,iCAAjB,iBAAiB,QAM5B;AAED,IAAY,qBAMX;AAND,WAAY,qBAAqB;IAC/B,qFAAiD,CAAA;IACjD,4FAA+D,CAAA;IAC/D,sFAAiD,CAAA;IACjD,4FAA6D,CAAA;IAC7D,6FAA+D,CAAA;AACjE,CAAC,EANW,qBAAqB,qCAArB,qBAAqB,QAMhC","sourcesContent":["/**\n * The network identifiers for supported networks in CAIP-2 format.\n * Note: This is a temporary workaround until we have a more robust\n * solution for network identifiers.\n */\nexport enum MultichainNetwork {\n Bitcoin = 'bip122:000000000019d6689c085ae165831e93',\n BitcoinTestnet = 'bip122:000000000933ea01ad0ee984209779ba',\n Solana = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n SolanaDevnet = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n SolanaTestnet = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n}\n\nexport enum MultichainNativeAsset {\n Bitcoin = `${MultichainNetwork.Bitcoin}/slip44:0`,\n BitcoinTestnet = `${MultichainNetwork.BitcoinTestnet}/slip44:0`,\n Solana = `${MultichainNetwork.Solana}/slip44:501`,\n SolanaDevnet = `${MultichainNetwork.SolanaDevnet}/slip44:501`,\n SolanaTestnet = `${MultichainNetwork.SolanaTestnet}/slip44:501`,\n}\n"]}
@@ -1,20 +0,0 @@
1
- /**
2
- * The network identifiers for supported networks in CAIP-2 format.
3
- * Note: This is a temporary workaround until we have a more robust
4
- * solution for network identifiers.
5
- */
6
- export declare enum MultichainNetwork {
7
- Bitcoin = "bip122:000000000019d6689c085ae165831e93",
8
- BitcoinTestnet = "bip122:000000000933ea01ad0ee984209779ba",
9
- Solana = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
10
- SolanaDevnet = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
11
- SolanaTestnet = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"
12
- }
13
- export declare enum MultichainNativeAsset {
14
- Bitcoin = "bip122:000000000019d6689c085ae165831e93/slip44:0",
15
- BitcoinTestnet = "bip122:000000000933ea01ad0ee984209779ba/slip44:0",
16
- Solana = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501",
17
- SolanaDevnet = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501",
18
- SolanaTestnet = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z/slip44:501"
19
- }
20
- //# sourceMappingURL=constants.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,iBAAiB;IAC3B,OAAO,4CAA4C;IACnD,cAAc,4CAA4C;IAC1D,MAAM,4CAA4C;IAClD,YAAY,4CAA4C;IACxD,aAAa,4CAA4C;CAC1D;AAED,oBAAY,qBAAqB;IAC/B,OAAO,qDAA0C;IACjD,cAAc,qDAAiD;IAC/D,MAAM,uDAA2C;IACjD,YAAY,uDAAiD;IAC7D,aAAa,uDAAkD;CAChE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,iBAAiB;IAC3B,OAAO,4CAA4C;IACnD,cAAc,4CAA4C;IAC1D,MAAM,4CAA4C;IAClD,YAAY,4CAA4C;IACxD,aAAa,4CAA4C;CAC1D;AAED,oBAAY,qBAAqB;IAC/B,OAAO,qDAA0C;IACjD,cAAc,qDAAiD;IAC/D,MAAM,uDAA2C;IACjD,YAAY,uDAAiD;IAC7D,aAAa,uDAAkD;CAChE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,iBAMX;AAND,WAAY,iBAAiB;IAC3B,wEAAmD,CAAA;IACnD,+EAA0D,CAAA;IAC1D,uEAAkD,CAAA;IAClD,6EAAwD,CAAA;IACxD,8EAAyD,CAAA;AAC3D,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,QAM5B;AAED,MAAM,CAAN,IAAY,qBAMX;AAND,WAAY,qBAAqB;IAC/B,qFAAiD,CAAA;IACjD,4FAA+D,CAAA;IAC/D,sFAAiD,CAAA;IACjD,4FAA6D,CAAA;IAC7D,6FAA+D,CAAA;AACjE,CAAC,EANW,qBAAqB,KAArB,qBAAqB,QAMhC","sourcesContent":["/**\n * The network identifiers for supported networks in CAIP-2 format.\n * Note: This is a temporary workaround until we have a more robust\n * solution for network identifiers.\n */\nexport enum MultichainNetwork {\n Bitcoin = 'bip122:000000000019d6689c085ae165831e93',\n BitcoinTestnet = 'bip122:000000000933ea01ad0ee984209779ba',\n Solana = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n SolanaDevnet = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n SolanaTestnet = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n}\n\nexport enum MultichainNativeAsset {\n Bitcoin = `${MultichainNetwork.Bitcoin}/slip44:0`,\n BitcoinTestnet = `${MultichainNetwork.BitcoinTestnet}/slip44:0`,\n Solana = `${MultichainNetwork.Solana}/slip44:501`,\n SolanaDevnet = `${MultichainNetwork.SolanaDevnet}/slip44:501`,\n SolanaTestnet = `${MultichainNetwork.SolanaTestnet}/slip44:501`,\n}\n"]}
package/dist/index.cjs DELETED
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MultichainNativeAsset = exports.MultichainNetwork = exports.MultichainTransactionsController = void 0;
4
- var MultichainTransactionsController_js_1 = require("./MultichainTransactionsController.cjs");
5
- Object.defineProperty(exports, "MultichainTransactionsController", { enumerable: true, get: function () { return MultichainTransactionsController_js_1.MultichainTransactionsController; } });
6
- var constants_js_1 = require("./constants.cjs");
7
- Object.defineProperty(exports, "MultichainNetwork", { enumerable: true, get: function () { return constants_js_1.MultichainNetwork; } });
8
- Object.defineProperty(exports, "MultichainNativeAsset", { enumerable: true, get: function () { return constants_js_1.MultichainNativeAsset; } });
9
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,8FAAyF;AAAhF,uJAAA,gCAAgC,OAAA;AAczC,gDAA0E;AAAjE,iHAAA,iBAAiB,OAAA;AAAE,qHAAA,qBAAqB,OAAA","sourcesContent":["export { MultichainTransactionsController } from './MultichainTransactionsController.js';\nexport type {\n MultichainTransactionsControllerState,\n PaginationOptions,\n TransactionStateEntry,\n MultichainTransactionsControllerStateChange,\n MultichainTransactionsControllerGetStateAction,\n MultichainTransactionsControllerActions,\n MultichainTransactionsControllerEvents,\n MultichainTransactionsControllerMessenger,\n MultichainTransactionsControllerTransactionSubmittedEvent,\n MultichainTransactionsControllerTransactionConfirmedEvent,\n} from './MultichainTransactionsController.js';\nexport type { MultichainTransactionsControllerUpdateTransactionsForAccountAction } from './MultichainTransactionsController-method-action-types.js';\nexport { MultichainNetwork, MultichainNativeAsset } from './constants.js';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,+CAA8C;AACzF,YAAY,EACV,qCAAqC,EACrC,iBAAiB,EACjB,qBAAqB,EACrB,2CAA2C,EAC3C,8CAA8C,EAC9C,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,yDAAyD,EACzD,yDAAyD,GAC1D,+CAA8C;AAC/C,YAAY,EAAE,kEAAkE,EAAE,mEAAkE;AACpJ,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,wBAAuB"}
package/dist/index.d.mts DELETED
@@ -1,5 +0,0 @@
1
- export { MultichainTransactionsController } from "./MultichainTransactionsController.mjs";
2
- export type { MultichainTransactionsControllerState, PaginationOptions, TransactionStateEntry, MultichainTransactionsControllerStateChange, MultichainTransactionsControllerGetStateAction, MultichainTransactionsControllerActions, MultichainTransactionsControllerEvents, MultichainTransactionsControllerMessenger, MultichainTransactionsControllerTransactionSubmittedEvent, MultichainTransactionsControllerTransactionConfirmedEvent, } from "./MultichainTransactionsController.mjs";
3
- export type { MultichainTransactionsControllerUpdateTransactionsForAccountAction } from "./MultichainTransactionsController-method-action-types.mjs";
4
- export { MultichainNetwork, MultichainNativeAsset } from "./constants.mjs";
5
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,+CAA8C;AACzF,YAAY,EACV,qCAAqC,EACrC,iBAAiB,EACjB,qBAAqB,EACrB,2CAA2C,EAC3C,8CAA8C,EAC9C,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,yDAAyD,EACzD,yDAAyD,GAC1D,+CAA8C;AAC/C,YAAY,EAAE,kEAAkE,EAAE,mEAAkE;AACpJ,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,wBAAuB"}
package/dist/index.mjs DELETED
@@ -1,3 +0,0 @@
1
- export { MultichainTransactionsController } from "./MultichainTransactionsController.mjs";
2
- export { MultichainNetwork, MultichainNativeAsset } from "./constants.mjs";
3
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,+CAA8C;AAczF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,wBAAuB","sourcesContent":["export { MultichainTransactionsController } from './MultichainTransactionsController.js';\nexport type {\n MultichainTransactionsControllerState,\n PaginationOptions,\n TransactionStateEntry,\n MultichainTransactionsControllerStateChange,\n MultichainTransactionsControllerGetStateAction,\n MultichainTransactionsControllerActions,\n MultichainTransactionsControllerEvents,\n MultichainTransactionsControllerMessenger,\n MultichainTransactionsControllerTransactionSubmittedEvent,\n MultichainTransactionsControllerTransactionConfirmedEvent,\n} from './MultichainTransactionsController.js';\nexport type { MultichainTransactionsControllerUpdateTransactionsForAccountAction } from './MultichainTransactionsController-method-action-types.js';\nexport { MultichainNetwork, MultichainNativeAsset } from './constants.js';\n"]}