@metamask-previews/bridge-status-controller 12.0.1-preview-bb41e02a → 12.0.1-preview-a9741b3a

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 (40) hide show
  1. package/CHANGELOG.md +12 -2
  2. package/dist/bridge-status-controller.cjs +185 -22
  3. package/dist/bridge-status-controller.cjs.map +1 -1
  4. package/dist/bridge-status-controller.d.cts +10 -7
  5. package/dist/bridge-status-controller.d.cts.map +1 -1
  6. package/dist/bridge-status-controller.d.mts +10 -7
  7. package/dist/bridge-status-controller.d.mts.map +1 -1
  8. package/dist/bridge-status-controller.mjs +187 -24
  9. package/dist/bridge-status-controller.mjs.map +1 -1
  10. package/dist/constants.cjs +2 -1
  11. package/dist/constants.cjs.map +1 -1
  12. package/dist/constants.d.cts +1 -0
  13. package/dist/constants.d.cts.map +1 -1
  14. package/dist/constants.d.mts +1 -0
  15. package/dist/constants.d.mts.map +1 -1
  16. package/dist/constants.mjs +1 -0
  17. package/dist/constants.mjs.map +1 -1
  18. package/dist/types.cjs.map +1 -1
  19. package/dist/types.d.cts +16 -3
  20. package/dist/types.d.cts.map +1 -1
  21. package/dist/types.d.mts +16 -3
  22. package/dist/types.d.mts.map +1 -1
  23. package/dist/types.mjs.map +1 -1
  24. package/dist/utils/gas.cjs +31 -0
  25. package/dist/utils/gas.cjs.map +1 -0
  26. package/dist/utils/gas.d.cts +20 -0
  27. package/dist/utils/gas.d.cts.map +1 -0
  28. package/dist/utils/gas.d.mts +20 -0
  29. package/dist/utils/gas.d.mts.map +1 -0
  30. package/dist/utils/gas.mjs +27 -0
  31. package/dist/utils/gas.mjs.map +1 -0
  32. package/dist/utils/transaction.cjs +28 -16
  33. package/dist/utils/transaction.cjs.map +1 -1
  34. package/dist/utils/transaction.d.cts +8 -18
  35. package/dist/utils/transaction.d.cts.map +1 -1
  36. package/dist/utils/transaction.d.mts +8 -18
  37. package/dist/utils/transaction.d.mts.map +1 -1
  38. package/dist/utils/transaction.mjs +26 -16
  39. package/dist/utils/transaction.mjs.map +1 -1
  40. package/package.json +12 -4
@@ -1,32 +1,22 @@
1
1
  import type { AccountsControllerState } from "@metamask/accounts-controller";
2
2
  import type { TxData } from "@metamask/bridge-controller";
3
- import { type QuoteMetadata, type QuoteResponse } from "@metamask/bridge-controller";
3
+ import { ChainId, type QuoteMetadata, type QuoteResponse } from "@metamask/bridge-controller";
4
4
  import { type TransactionMeta } from "@metamask/transaction-controller";
5
+ import type { SolanaTransactionMeta } from "../types.mjs";
6
+ export declare const generateActionId: () => string;
5
7
  export declare const getStatusRequestParams: (quoteResponse: QuoteResponse<string | TxData>) => {
6
8
  bridgeId: string;
7
9
  bridge: string;
8
- srcChainId: import("@metamask/bridge-controller").ChainId;
9
- destChainId: import("@metamask/bridge-controller").ChainId;
10
+ srcChainId: ChainId;
11
+ destChainId: ChainId;
10
12
  quote: import("@metamask/bridge-controller").Quote;
11
13
  refuel: boolean;
12
14
  };
13
- export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => {
14
- destinationChainId: `0x${string}`;
15
- sourceTokenAmount: string;
16
- sourceTokenSymbol: string;
17
- sourceTokenDecimals: number;
18
- sourceTokenAddress: string;
19
- destinationTokenAmount: string;
20
- destinationTokenSymbol: string;
21
- destinationTokenDecimals: number;
22
- destinationTokenAddress: string;
23
- approvalTxId: string | undefined;
24
- swapTokenValue: string;
25
- isBridgeTx: boolean;
26
- };
15
+ export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id'>;
27
16
  export declare const handleSolanaTxResponse: (snapResponse: string | {
28
17
  result: Record<string, string>;
29
- }, quoteResponse: Omit<QuoteResponse<string>, 'approval' | 'trade'> & QuoteMetadata, snapId: string, selectedAccountAddress: string) => TransactionMeta;
18
+ }, quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
19
+ export declare const handleLineaDelay: (quoteResponse: QuoteResponse<TxData | string>) => Promise<void>;
30
20
  export declare const getKeyringRequest: (quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => {
31
21
  origin: string;
32
22
  snapId: never;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AACrC,OAAO,EAGL,KAAK,eAAe,EACrB,yCAAyC;AAG1C,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;CAU9C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM;;;;;;;;;;;;;CAoBtB,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBACnB,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,iBAC1C,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAC9D,aAAa,UACP,MAAM,0BACU,MAAM,oBAqC/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,kBACb,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CA4BjF,CAAC"}
1
+ {"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EACL,OAAO,EAEP,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AACrC,OAAO,EAGL,KAAK,eAAe,EACrB,yCAAyC;AAK1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAiB;AAEtD,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;CAU9C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBACnB,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,iBAC1C,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAoCpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,cAAc,MAAM,GAAG,MAAM,CAAC,kBAY9C,CAAC;AAEF,eAAO,MAAM,iBAAiB,kBACb,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CA4BjF,CAAC"}
@@ -1,6 +1,9 @@
1
- import { formatChainIdToHex } from "@metamask/bridge-controller";
1
+ import { ChainId, formatChainIdToHex } from "@metamask/bridge-controller";
2
2
  import { TransactionStatus, TransactionType } from "@metamask/transaction-controller";
3
+ import { createProjectLogger } from "@metamask/utils";
3
4
  import { v4 as uuid } from "uuid";
5
+ import { LINEA_DELAY_MS } from "../constants.mjs";
6
+ export const generateActionId = () => (Date.now() + Math.random()).toString();
4
7
  export const getStatusRequestParams = (quoteResponse) => {
5
8
  return {
6
9
  bridgeId: quoteResponse.quote.bridgeId,
@@ -22,15 +25,15 @@ export const getTxMetaFields = (quoteResponse, approvalTxId) => {
22
25
  destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,
23
26
  destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,
24
27
  destinationTokenAddress: quoteResponse.quote.destAsset.address,
28
+ chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),
25
29
  approvalTxId,
26
30
  // this is the decimal (non atomic) amount (not USD value) of source token to swap
27
31
  swapTokenValue: quoteResponse.sentAmount.amount,
28
- // Ensure it's marked as a bridge transaction for UI detection
29
- isBridgeTx: true, // TODO deprecate this and use tx type
30
32
  };
31
33
  };
32
- export const handleSolanaTxResponse = (snapResponse, quoteResponse, snapId, // TODO use SnapId type
33
- selectedAccountAddress) => {
34
+ export const handleSolanaTxResponse = (snapResponse, quoteResponse, selectedAccount) => {
35
+ const selectedAccountAddress = selectedAccount.address;
36
+ const snapId = selectedAccount.metadata.snap?.id;
34
37
  let hash;
35
38
  // Handle different response formats
36
39
  if (typeof snapResponse === 'string') {
@@ -47,24 +50,31 @@ selectedAccountAddress) => {
47
50
  snapResponse.result.txHash;
48
51
  }
49
52
  }
53
+ const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);
50
54
  // Create a transaction meta object with bridge-specific fields
51
- const txMeta = {
55
+ return {
52
56
  ...getTxMetaFields(quoteResponse),
57
+ time: Date.now(),
53
58
  id: uuid(),
54
- chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),
55
- // networkClientId: selectedAccount.id, //TODO optional for solana or no?
56
- txParams: { from: selectedAccountAddress },
59
+ chainId: hexChainId,
60
+ networkClientId: snapId ?? hexChainId,
61
+ txParams: { from: selectedAccountAddress, data: quoteResponse.trade },
57
62
  type: TransactionType.bridge,
58
63
  status: TransactionStatus.submitted,
59
64
  hash,
60
- // Add an explicit flag to mark this as a Solana transaction
61
- isSolana: true,
62
- isBridgeTx: true,
63
- // Add key bridge-specific fields for proper categorization
64
- // actionId: txType,
65
65
  origin: snapId,
66
- }; // TODO remove this override once deprecated fields are removed
67
- return txMeta;
66
+ // Add an explicit bridge flag to mark this as a Solana transaction
67
+ isSolana: true,
68
+ isBridgeTx: true, // TODO deprecate this and use type
69
+ };
70
+ };
71
+ export const handleLineaDelay = async (quoteResponse) => {
72
+ if (ChainId.LINEA === quoteResponse.quote.srcChainId) {
73
+ const debugLog = createProjectLogger('bridge');
74
+ debugLog('Delaying submitting bridge tx to make Linea confirmation more likely');
75
+ const waitPromise = new Promise((resolve) => setTimeout(resolve, LINEA_DELAY_MS));
76
+ await waitPromise;
77
+ }
68
78
  };
69
79
  export const getKeyringRequest = (quoteResponse, selectedAccount) => {
70
80
  const keyringReqId = uuid();
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.mjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { v4 as uuid } from 'uuid';\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n) => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n // Ensure it's marked as a bridge transaction for UI detection\n isBridgeTx: true, // TODO deprecate this and use tx type\n };\n};\n\nexport const handleSolanaTxResponse = (\n snapResponse: string | { result: Record<string, string> },\n quoteResponse: Omit<QuoteResponse<string>, 'approval' | 'trade'> &\n QuoteMetadata,\n snapId: string, // TODO use SnapId type\n selectedAccountAddress: string,\n) => {\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // If it's an object with result property, try to get the signature\n if (snapResponse.result && typeof snapResponse.result === 'object') {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n }\n }\n\n // Create a transaction meta object with bridge-specific fields\n const txMeta: TransactionMeta = {\n ...getTxMetaFields(quoteResponse),\n id: uuid(),\n chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),\n // networkClientId: selectedAccount.id, //TODO optional for solana or no?\n txParams: { from: selectedAccountAddress }, // { data: quoteResponse.trade }, // TODO not reading this for solana\n type: TransactionType.bridge,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n // Add an explicit flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx: true, // TODO deprecate this and use type\n // Add key bridge-specific fields for proper categorization\n // actionId: txType,\n origin: snapId,\n } as never; // TODO remove this override once deprecated fields are removed\n\n return txMeta;\n};\n\nexport const getKeyringRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const keyringReqId = uuid();\n const snapRequestId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onKeyringRequest' as never,\n request: {\n id: keyringReqId,\n jsonrpc: '2.0',\n method: 'keyring_submitRequest',\n params: {\n request: {\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: selectedAccount.options.scope,\n },\n method: 'signAndSendTransaction',\n },\n id: snapRequestId,\n account: selectedAccount.id,\n scope: selectedAccount.options.scope,\n },\n },\n };\n};\n"]}
1
+ {"version":3,"file":"transaction.mjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n ChainId,\n formatChainIdToHex,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createProjectLogger } from '@metamask/utils';\nimport { v4 as uuid } from 'uuid';\n\nimport { LINEA_DELAY_MS } from '../constants';\nimport type { SolanaTransactionMeta } from '../types';\n\nexport const generateActionId = () => (Date.now() + Math.random()).toString();\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n };\n};\n\nexport const handleSolanaTxResponse = (\n snapResponse: string | { result: Record<string, string> },\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): TransactionMeta & SolanaTransactionMeta => {\n const selectedAccountAddress = selectedAccount.address;\n const snapId = selectedAccount.metadata.snap?.id;\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // If it's an object with result property, try to get the signature\n if (snapResponse.result && typeof snapResponse.result === 'object') {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\n type: TransactionType.bridge,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx: true, // TODO deprecate this and use type\n };\n};\n\nexport const handleLineaDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if (ChainId.LINEA === quoteResponse.quote.srcChainId) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, LINEA_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\nexport const getKeyringRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const keyringReqId = uuid();\n const snapRequestId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onKeyringRequest' as never,\n request: {\n id: keyringReqId,\n jsonrpc: '2.0',\n method: 'keyring_submitRequest',\n params: {\n request: {\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: selectedAccount.options.scope,\n },\n method: 'signAndSendTransaction',\n },\n id: snapRequestId,\n account: selectedAccount.id,\n scope: selectedAccount.options.scope,\n },\n },\n };\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/bridge-status-controller",
3
- "version": "12.0.1-preview-bb41e02a",
3
+ "version": "12.0.1-preview-a9741b3a",
4
4
  "description": "Manages bridge-related status fetching functionality for MetaMask",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -48,18 +48,23 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@metamask/base-controller": "^8.0.0",
51
- "@metamask/bridge-controller": "^15.0.0",
52
51
  "@metamask/controller-utils": "^11.7.0",
52
+ "@metamask/keyring-api": "^17.4.0",
53
53
  "@metamask/polling-controller": "^13.0.0",
54
54
  "@metamask/superstruct": "^3.1.0",
55
+ "@metamask/user-operation-controller": "^33.0.0",
55
56
  "@metamask/utils": "^11.2.0",
57
+ "bignumber.js": "^9.1.2",
56
58
  "uuid": "^8.3.2"
57
59
  },
58
60
  "devDependencies": {
59
61
  "@metamask/accounts-controller": "^27.0.0",
62
+ "@metamask/assets-controllers": "^57.0.0",
60
63
  "@metamask/auto-changelog": "^3.4.4",
64
+ "@metamask/bridge-controller": "^15.0.0",
65
+ "@metamask/gas-fee-controller": "^23.0.0",
61
66
  "@metamask/network-controller": "^23.2.0",
62
- "@metamask/snaps-controllers": "^11.2.1",
67
+ "@metamask/snaps-controllers": "^9.19.0",
63
68
  "@metamask/transaction-controller": "^54.1.0",
64
69
  "@types/jest": "^27.4.1",
65
70
  "deepmerge": "^4.2.2",
@@ -74,8 +79,11 @@
74
79
  },
75
80
  "peerDependencies": {
76
81
  "@metamask/accounts-controller": "^27.0.0",
82
+ "@metamask/assets-controllers": "^57.0.0",
83
+ "@metamask/bridge-controller": "^15.0.0",
84
+ "@metamask/gas-fee-controller": "^23.0.0",
77
85
  "@metamask/network-controller": "^23.0.0",
78
- "@metamask/snaps-controllers": "^11.0.0",
86
+ "@metamask/snaps-controllers": "^9.19.0",
79
87
  "@metamask/transaction-controller": "^54.0.0"
80
88
  },
81
89
  "engines": {