@metamask-previews/bridge-status-controller 72.3.0-preview-31eae6ba5 → 73.0.0-preview-0e62f8959
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/dist/strategy/index.cjs +2 -0
- package/dist/strategy/index.cjs.map +1 -1
- package/dist/strategy/index.d.cts.map +1 -1
- package/dist/strategy/index.d.mts.map +1 -1
- package/dist/strategy/index.mjs +3 -1
- package/dist/strategy/index.mjs.map +1 -1
- package/dist/strategy/non-evm-strategy.cjs.map +1 -1
- package/dist/strategy/non-evm-strategy.d.cts +2 -2
- package/dist/strategy/non-evm-strategy.d.cts.map +1 -1
- package/dist/strategy/non-evm-strategy.d.mts +2 -2
- package/dist/strategy/non-evm-strategy.d.mts.map +1 -1
- package/dist/strategy/non-evm-strategy.mjs.map +1 -1
- package/dist/utils/snaps.cjs +20 -7
- package/dist/utils/snaps.cjs.map +1 -1
- package/dist/utils/snaps.d.cts +4 -2
- package/dist/utils/snaps.d.cts.map +1 -1
- package/dist/utils/snaps.d.mts +4 -2
- package/dist/utils/snaps.d.mts.map +1 -1
- package/dist/utils/snaps.mjs +20 -7
- package/dist/utils/snaps.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,9 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [73.0.0]
|
|
11
|
+
|
|
10
12
|
### Changed
|
|
11
13
|
|
|
12
14
|
- **BREAKING:** Default `location` fallback for post-submit Unified SwapBridge events now uses `Unknown` instead of `Main View` ([#9243](https://github.com/MetaMask/core/pull/9243))
|
|
15
|
+
- Bump `@metamask/bridge-controller` from `^76.1.0` to `^77.0.0` ([#9256](https://github.com/MetaMask/core/pull/9256))
|
|
16
|
+
- Bump `@metamask/transaction-controller` from `^68.1.1` to `^68.2.0` ([#9253](https://github.com/MetaMask/core/pull/9253))
|
|
13
17
|
|
|
14
18
|
### Fixed
|
|
15
19
|
|
|
@@ -31,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
31
35
|
### Added
|
|
32
36
|
|
|
33
37
|
- Add input primary denomination to submitted bridge history and post-submit analytics ([#9147](https://github.com/MetaMask/core/pull/9147))
|
|
38
|
+
- Add Stellar support to bridge transaction submission and status tracking: thread `StellarTradeData` through the non-EVM submit strategies and include source and destination asset IDs in the snap client transaction request ([#8829](https://github.com/MetaMask/core/pull/8829))
|
|
34
39
|
|
|
35
40
|
### Changed
|
|
36
41
|
|
|
@@ -1326,7 +1331,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
1326
1331
|
|
|
1327
1332
|
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
|
|
1328
1333
|
|
|
1329
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@
|
|
1334
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@73.0.0...HEAD
|
|
1335
|
+
[73.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.3.0...@metamask/bridge-status-controller@73.0.0
|
|
1330
1336
|
[72.3.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.2.0...@metamask/bridge-status-controller@72.3.0
|
|
1331
1337
|
[72.2.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.1.1...@metamask/bridge-status-controller@72.2.0
|
|
1332
1338
|
[72.1.1]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.1.0...@metamask/bridge-status-controller@72.1.1
|
package/dist/strategy/index.cjs
CHANGED
|
@@ -21,6 +21,8 @@ const validateParams = (params) => {
|
|
|
21
21
|
return txs.every((tx) => typeof tx === 'string');
|
|
22
22
|
case bridge_controller_1.ChainId.BTC:
|
|
23
23
|
return txs.every(bridge_controller_1.isBitcoinTrade);
|
|
24
|
+
case bridge_controller_1.ChainId.STELLAR:
|
|
25
|
+
return txs.every((tx) => typeof tx === 'string' || (0, bridge_controller_1.isStellarTrade)(tx));
|
|
24
26
|
case bridge_controller_1.ChainId.TRON:
|
|
25
27
|
return txs.every(bridge_controller_1.isTronTrade);
|
|
26
28
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":";;AAAA,iEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\nimport {\n BatchSellTradesResponse,\n BitcoinTradeData,\n ChainId,\n isBitcoinTrade,\n isEvmTxData,\n isNonEvmChainId,\n isStellarTrade,\n isTronTrade,\n StellarTradeData,\n Trade,\n TronTradeData,\n TxData,\n} from '@metamask/bridge-controller';\n\nimport { submitBatchSellHandler } from './batch-sell-strategy';\nimport { submitBatchHandler } from './batch-strategy';\nimport { submitEvmHandler as defaultSubmitHandler } from './evm-strategy';\nimport { submitIntentHandler } from './intent-strategy';\nimport { submitNonEvmHandler } from './non-evm-strategy';\nimport type { SubmitStrategyParams, SubmitStepResult } from './types';\n\nconst validateParams = <\n TxDataType extends\n | BitcoinTradeData\n | StellarTradeData\n | TronTradeData\n | string\n | TxData,\n>(\n params: SubmitStrategyParams<Trade>,\n): params is SubmitStrategyParams<TxDataType> => {\n const txs = params.quoteResponses\n .flatMap((quoteResponse) => [\n quoteResponse.trade,\n quoteResponse.approval,\n quoteResponse.resetApproval,\n ])\n .filter((tx): tx is TxDataType => tx !== undefined);\n\n // Assumes all quotes are for the same chain\n switch (params.quoteResponses[0].quote.srcChainId) {\n case ChainId.SOLANA:\n return txs.every((tx) => typeof tx === 'string');\n case ChainId.BTC:\n return txs.every(isBitcoinTrade);\n case ChainId.STELLAR:\n return txs.every((tx) => typeof tx === 'string' || isStellarTrade(tx));\n case ChainId.TRON:\n return txs.every(isTronTrade);\n default:\n return txs.every(isEvmTxData);\n }\n};\n\nconst validateBatchSellParams = (\n params: SubmitStrategyParams,\n): params is SubmitStrategyParams<TxData, BatchSellTradesResponse> =>\n // A BatchSell payload containing at least 1 trade is considered valid\n Boolean(params.batchSellTrades) && params.quoteResponses.length >= 1;\n\n/**\n * Selects the appropriate submit strategy based on the quote parameters then executes it\n *\n * @param params - The parameters for the transaction\n * @returns An async generator that yields results from each step of the submit flow. The yielded\n * results are used to update the BridgeStatusController state and emit events.\n */\nconst executeSubmitStrategy = (\n params: SubmitStrategyParams<Trade>,\n): AsyncGenerator<SubmitStepResult, void, void> => {\n const {\n quoteResponses: [quoteResponse],\n isStxEnabled,\n isDelegatedAccount,\n } = params;\n\n // Non-EVM transactions\n if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {\n if (!validateParams(params)) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: trade is not a non-EVM transaction',\n );\n }\n return submitNonEvmHandler(params);\n }\n\n // EVM transactions\n if (!validateParams<TxData>(params)) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: trade is not an EVM transaction',\n );\n }\n\n // Intent transactions\n if (quoteResponse.quote.intent) {\n return submitIntentHandler(params);\n }\n\n // Batch sell transactions\n if (validateBatchSellParams(params)) {\n return submitBatchSellHandler(params);\n }\n\n // Batched transactions\n const shouldBatchTxs =\n isStxEnabled || quoteResponse.quote.gasIncluded7702 || isDelegatedAccount;\n if (shouldBatchTxs) {\n return submitBatchHandler(params);\n }\n\n // Non-stx/gasless EVM transactions\n return defaultSubmitHandler(params);\n};\n\nexport default executeSubmitStrategy;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AACA,OAAO,EAUL,KAAK,EAGN,oCAAoC;AAOrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAgB;AAyCtE;;;;;;GAMG;AACH,QAAA,MAAM,qBAAqB,WACjB,qBAAqB,KAAK,CAAC,KAClC,eAAe,gBAAgB,EAAE,IAAI,EAAE,IAAI,CA2C7C,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AACA,OAAO,EAUL,KAAK,EAGN,oCAAoC;AAOrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAgB;AAyCtE;;;;;;GAMG;AACH,QAAA,MAAM,qBAAqB,WACjB,qBAAqB,KAAK,CAAC,KAClC,eAAe,gBAAgB,EAAE,IAAI,EAAE,IAAI,CA2C7C,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
package/dist/strategy/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
|
|
2
|
-
import { ChainId, isBitcoinTrade, isEvmTxData, isNonEvmChainId, isTronTrade } from "@metamask/bridge-controller";
|
|
2
|
+
import { ChainId, isBitcoinTrade, isEvmTxData, isNonEvmChainId, isStellarTrade, isTronTrade } from "@metamask/bridge-controller";
|
|
3
3
|
import { submitBatchSellHandler } from "./batch-sell-strategy.mjs";
|
|
4
4
|
import { submitBatchHandler } from "./batch-strategy.mjs";
|
|
5
5
|
import { submitEvmHandler as defaultSubmitHandler } from "./evm-strategy.mjs";
|
|
@@ -19,6 +19,8 @@ const validateParams = (params) => {
|
|
|
19
19
|
return txs.every((tx) => typeof tx === 'string');
|
|
20
20
|
case ChainId.BTC:
|
|
21
21
|
return txs.every(isBitcoinTrade);
|
|
22
|
+
case ChainId.STELLAR:
|
|
23
|
+
return txs.every((tx) => typeof tx === 'string' || isStellarTrade(tx));
|
|
22
24
|
case ChainId.TRON:
|
|
23
25
|
return txs.every(isTronTrade);
|
|
24
26
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAGL,OAAO,EACP,cAAc,EACd,WAAW,EACX,eAAe,EACf,WAAW,
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\nimport {\n BatchSellTradesResponse,\n BitcoinTradeData,\n ChainId,\n isBitcoinTrade,\n isEvmTxData,\n isNonEvmChainId,\n isStellarTrade,\n isTronTrade,\n StellarTradeData,\n Trade,\n TronTradeData,\n TxData,\n} from '@metamask/bridge-controller';\n\nimport { submitBatchSellHandler } from './batch-sell-strategy';\nimport { submitBatchHandler } from './batch-strategy';\nimport { submitEvmHandler as defaultSubmitHandler } from './evm-strategy';\nimport { submitIntentHandler } from './intent-strategy';\nimport { submitNonEvmHandler } from './non-evm-strategy';\nimport type { SubmitStrategyParams, SubmitStepResult } from './types';\n\nconst validateParams = <\n TxDataType extends\n | BitcoinTradeData\n | StellarTradeData\n | TronTradeData\n | string\n | TxData,\n>(\n params: SubmitStrategyParams<Trade>,\n): params is SubmitStrategyParams<TxDataType> => {\n const txs = params.quoteResponses\n .flatMap((quoteResponse) => [\n quoteResponse.trade,\n quoteResponse.approval,\n quoteResponse.resetApproval,\n ])\n .filter((tx): tx is TxDataType => tx !== undefined);\n\n // Assumes all quotes are for the same chain\n switch (params.quoteResponses[0].quote.srcChainId) {\n case ChainId.SOLANA:\n return txs.every((tx) => typeof tx === 'string');\n case ChainId.BTC:\n return txs.every(isBitcoinTrade);\n case ChainId.STELLAR:\n return txs.every((tx) => typeof tx === 'string' || isStellarTrade(tx));\n case ChainId.TRON:\n return txs.every(isTronTrade);\n default:\n return txs.every(isEvmTxData);\n }\n};\n\nconst validateBatchSellParams = (\n params: SubmitStrategyParams,\n): params is SubmitStrategyParams<TxData, BatchSellTradesResponse> =>\n // A BatchSell payload containing at least 1 trade is considered valid\n Boolean(params.batchSellTrades) && params.quoteResponses.length >= 1;\n\n/**\n * Selects the appropriate submit strategy based on the quote parameters then executes it\n *\n * @param params - The parameters for the transaction\n * @returns An async generator that yields results from each step of the submit flow. The yielded\n * results are used to update the BridgeStatusController state and emit events.\n */\nconst executeSubmitStrategy = (\n params: SubmitStrategyParams<Trade>,\n): AsyncGenerator<SubmitStepResult, void, void> => {\n const {\n quoteResponses: [quoteResponse],\n isStxEnabled,\n isDelegatedAccount,\n } = params;\n\n // Non-EVM transactions\n if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {\n if (!validateParams(params)) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: trade is not a non-EVM transaction',\n );\n }\n return submitNonEvmHandler(params);\n }\n\n // EVM transactions\n if (!validateParams<TxData>(params)) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: trade is not an EVM transaction',\n );\n }\n\n // Intent transactions\n if (quoteResponse.quote.intent) {\n return submitIntentHandler(params);\n }\n\n // Batch sell transactions\n if (validateBatchSellParams(params)) {\n return submitBatchSellHandler(params);\n }\n\n // Batched transactions\n const shouldBatchTxs =\n isStxEnabled || quoteResponse.quote.gasIncluded7702 || isDelegatedAccount;\n if (shouldBatchTxs) {\n return submitBatchHandler(params);\n }\n\n // Non-stx/gasless EVM transactions\n return defaultSubmitHandler(params);\n};\n\nexport default executeSubmitStrategy;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"non-evm-strategy.cjs","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":";;;AAAA,qEAAqE;AACrE,mEAA4D;
|
|
1
|
+
{"version":3,"file":"non-evm-strategy.cjs","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":";;;AAAA,qEAAqE;AACrE,mEAA4D;AAQ5D,8CAAgD;AAChD,8CAAwD;AACxD,0DAA2D;AAC3D,uCAAqC;AAGrC;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAC9B,IAEC,EACD,EAAE;IACF,MAAM,EACJ,cAAc,EAAE,CAAC,aAAa,CAAC,EAC/B,OAAO,GACR,GAAG,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,IAAA,8BAAsB,EAAC,aAAa,EAAE,KAAK,CAAC,EAC5C,KAAK,IAAI,EAAE;QACT,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EACjC,IAAI,CAAC,SAAS,EACd,aAAa,CAAC,QAAQ,EACtB,aAAa,EACb,IAAI,CAAC,eAAe,CACrB,CAAC;YACF,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CACF,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,+CAA+C;QAC/C,MAAM,IAAA,iCAAmB,EAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACI,KAAK,SAAS,CAAC,CAAC,mBAAmB,CACxC,IAEC;IAED,MAAM,EACJ,cAAc,EAAE,CAAC,aAAa,CAAC,EAC/B,UAAU,GACX,GAAG,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEpD,oFAAoF;IAEpF,MAAM,SAAS,GAAG,MAAM,IAAA,sBAAc,EACpC,IAAI,CAAC,SAAS,EACd,aAAa,CAAC,KAAK,EACnB,aAAa,EACb,IAAI,CAAC,eAAe,CACrB,CAAC;IAEF,MAAM;QACJ,IAAI,EAAE,kBAAU,CAAC,YAAY;QAC7B,OAAO,EAAE,EAAE,SAAS,EAAE;KACvB,CAAC;IAEF,MAAM;QACJ,IAAI,EAAE,kBAAU,CAAC,cAAc;QAC/B,OAAO,EAAE;YACP,UAAU,EAAE,SAAS,CAAC,EAAE;YACxB,YAAY;YACZ,YAAY,EAAE;gBACZ,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB;YACD,aAAa;SACd;KACF,CAAC;IAEF,MAAM;QACJ,IAAI,EAAE,kBAAU,CAAC,YAAY;QAC7B,OAAO,EAAE;YACP,UAAU,EAAE,SAAS,CAAC,EAAE;SACzB;KACF,CAAC;IAEF,IAAI,CAAC,IAAA,iCAAa,EAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClE,MAAM;YACJ,IAAI,EAAE,kBAAU,CAAC,qBAAqB;YACtC,OAAO,EAAE;gBACP,UAAU,EAAE,SAAS,CAAC,EAAE;aACzB;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAtDD,kDAsDC","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { isTronChainId } from '@metamask/bridge-controller';\nimport type {\n BitcoinTradeData,\n StellarTradeData,\n TronTradeData,\n TxData,\n} from '@metamask/bridge-controller';\n\nimport { handleNonEvmTx } from '../utils/snaps';\nimport { getApprovalTraceParams } from '../utils/trace';\nimport { handleApprovalDelay } from '../utils/transaction';\nimport { SubmitStep } from './types';\nimport type { SubmitStrategyParams, SubmitStepResult } from './types';\n\n/**\n * Submits the approval transaction for a non-EVM transaction if present\n *\n * @param args - The parameters for the transaction\n * @returns The tx id of the approval transaction\n */\nconst handleTronApproval = async (\n args: SubmitStrategyParams<\n TronTradeData | BitcoinTradeData | StellarTradeData | string | TxData\n >,\n) => {\n const {\n quoteResponses: [quoteResponse],\n traceFn,\n } = args;\n\n const approvalTxId = await traceFn(\n getApprovalTraceParams(quoteResponse, false),\n async () => {\n if (quoteResponse.approval) {\n const txMeta = await handleNonEvmTx(\n args.messenger,\n quoteResponse.approval,\n quoteResponse,\n args.selectedAccount,\n );\n return txMeta.id;\n }\n return undefined;\n },\n );\n\n if (approvalTxId) {\n // Add delay after approval similar to EVM flow\n await handleApprovalDelay(quoteResponse.quote.srcChainId);\n return approvalTxId;\n }\n return undefined;\n};\n\n/**\n * Submits Solana, Bitcoin, or Tron transactions to the snap controller\n *\n * @param args - The parameters for the transaction\n * @param args.quoteResponse - The quote response\n * @param args.messenger - The messenger\n * @param args.selectedAccount - The selected account\n * @param args.traceFn - The trace function\n * @param args.isBridgeTx - Whether the transaction is a bridge transaction\n * @yields The approvalTxId and tradeMeta for the non-EVM transaction\n */\nexport async function* submitNonEvmHandler(\n args: SubmitStrategyParams<\n BitcoinTradeData | StellarTradeData | TronTradeData | string | TxData\n >,\n): AsyncGenerator<SubmitStepResult, void, void> {\n const {\n quoteResponses: [quoteResponse],\n isBridgeTx,\n } = args;\n\n const approvalTxId = await handleTronApproval(args);\n\n // TODO bridge-status should update history with actionId if approvalTxId is present\n\n const tradeMeta = await handleNonEvmTx(\n args.messenger,\n quoteResponse.trade,\n quoteResponse,\n args.selectedAccount,\n );\n\n yield {\n type: SubmitStep.SetTradeMeta,\n payload: { tradeMeta },\n };\n\n yield {\n type: SubmitStep.AddHistoryItem,\n payload: {\n historyKey: tradeMeta.id,\n approvalTxId,\n bridgeTxMeta: {\n id: tradeMeta.id,\n hash: tradeMeta.hash,\n },\n quoteResponse,\n },\n };\n\n yield {\n type: SubmitStep.StartPolling,\n payload: {\n historyKey: tradeMeta.id,\n },\n };\n\n if (!isTronChainId(quoteResponse.quote.srcChainId) && !isBridgeTx) {\n yield {\n type: SubmitStep.PublishCompletedEvent,\n payload: {\n historyKey: tradeMeta.id,\n },\n };\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BitcoinTradeData, TronTradeData, TxData } from "@metamask/bridge-controller";
|
|
1
|
+
import type { BitcoinTradeData, StellarTradeData, TronTradeData, TxData } from "@metamask/bridge-controller";
|
|
2
2
|
import type { SubmitStrategyParams, SubmitStepResult } from "./types.cjs";
|
|
3
3
|
/**
|
|
4
4
|
* Submits Solana, Bitcoin, or Tron transactions to the snap controller
|
|
@@ -11,5 +11,5 @@ import type { SubmitStrategyParams, SubmitStepResult } from "./types.cjs";
|
|
|
11
11
|
* @param args.isBridgeTx - Whether the transaction is a bridge transaction
|
|
12
12
|
* @yields The approvalTxId and tradeMeta for the non-EVM transaction
|
|
13
13
|
*/
|
|
14
|
-
export declare function submitNonEvmHandler(args: SubmitStrategyParams<BitcoinTradeData | TronTradeData | string | TxData>): AsyncGenerator<SubmitStepResult, void, void>;
|
|
14
|
+
export declare function submitNonEvmHandler(args: SubmitStrategyParams<BitcoinTradeData | StellarTradeData | TronTradeData | string | TxData>): AsyncGenerator<SubmitStepResult, void, void>;
|
|
15
15
|
//# sourceMappingURL=non-evm-strategy.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"non-evm-strategy.d.cts","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,MAAM,EACP,oCAAoC;AAMrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAgB;AA0CtE;;;;;;;;;;GAUG;AACH,wBAAuB,mBAAmB,CACxC,IAAI,EAAE,oBAAoB,CACxB,gBAAgB,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"non-evm-strategy.d.cts","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,MAAM,EACP,oCAAoC;AAMrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAgB;AA0CtE;;;;;;;;;;GAUG;AACH,wBAAuB,mBAAmB,CACxC,IAAI,EAAE,oBAAoB,CACxB,gBAAgB,GAAG,gBAAgB,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CACtE,GACA,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CAkD9C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BitcoinTradeData, TronTradeData, TxData } from "@metamask/bridge-controller";
|
|
1
|
+
import type { BitcoinTradeData, StellarTradeData, TronTradeData, TxData } from "@metamask/bridge-controller";
|
|
2
2
|
import type { SubmitStrategyParams, SubmitStepResult } from "./types.mjs";
|
|
3
3
|
/**
|
|
4
4
|
* Submits Solana, Bitcoin, or Tron transactions to the snap controller
|
|
@@ -11,5 +11,5 @@ import type { SubmitStrategyParams, SubmitStepResult } from "./types.mjs";
|
|
|
11
11
|
* @param args.isBridgeTx - Whether the transaction is a bridge transaction
|
|
12
12
|
* @yields The approvalTxId and tradeMeta for the non-EVM transaction
|
|
13
13
|
*/
|
|
14
|
-
export declare function submitNonEvmHandler(args: SubmitStrategyParams<BitcoinTradeData | TronTradeData | string | TxData>): AsyncGenerator<SubmitStepResult, void, void>;
|
|
14
|
+
export declare function submitNonEvmHandler(args: SubmitStrategyParams<BitcoinTradeData | StellarTradeData | TronTradeData | string | TxData>): AsyncGenerator<SubmitStepResult, void, void>;
|
|
15
15
|
//# sourceMappingURL=non-evm-strategy.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"non-evm-strategy.d.mts","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,MAAM,EACP,oCAAoC;AAMrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAgB;AA0CtE;;;;;;;;;;GAUG;AACH,wBAAuB,mBAAmB,CACxC,IAAI,EAAE,oBAAoB,CACxB,gBAAgB,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"non-evm-strategy.d.mts","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,MAAM,EACP,oCAAoC;AAMrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAgB;AA0CtE;;;;;;;;;;GAUG;AACH,wBAAuB,mBAAmB,CACxC,IAAI,EAAE,oBAAoB,CACxB,gBAAgB,GAAG,gBAAgB,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CACtE,GACA,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CAkD9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"non-evm-strategy.mjs","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,aAAa,EAAE,oCAAoC;
|
|
1
|
+
{"version":3,"file":"non-evm-strategy.mjs","sourceRoot":"","sources":["../../src/strategy/non-evm-strategy.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,aAAa,EAAE,oCAAoC;AAQ5D,OAAO,EAAE,cAAc,EAAE,2BAAuB;AAChD,OAAO,EAAE,sBAAsB,EAAE,2BAAuB;AACxD,OAAO,EAAE,mBAAmB,EAAE,iCAA6B;AAC3D,OAAO,EAAE,UAAU,EAAE,oBAAgB;AAGrC;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAC9B,IAEC,EACD,EAAE;IACF,MAAM,EACJ,cAAc,EAAE,CAAC,aAAa,CAAC,EAC/B,OAAO,GACR,GAAG,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,EAC5C,KAAK,IAAI,EAAE;QACT,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,IAAI,CAAC,SAAS,EACd,aAAa,CAAC,QAAQ,EACtB,aAAa,EACb,IAAI,CAAC,eAAe,CACrB,CAAC;YACF,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CACF,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,+CAA+C;QAC/C,MAAM,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,mBAAmB,CACxC,IAEC;IAED,MAAM,EACJ,cAAc,EAAE,CAAC,aAAa,CAAC,EAC/B,UAAU,GACX,GAAG,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEpD,oFAAoF;IAEpF,MAAM,SAAS,GAAG,MAAM,cAAc,CACpC,IAAI,CAAC,SAAS,EACd,aAAa,CAAC,KAAK,EACnB,aAAa,EACb,IAAI,CAAC,eAAe,CACrB,CAAC;IAEF,MAAM;QACJ,IAAI,EAAE,UAAU,CAAC,YAAY;QAC7B,OAAO,EAAE,EAAE,SAAS,EAAE;KACvB,CAAC;IAEF,MAAM;QACJ,IAAI,EAAE,UAAU,CAAC,cAAc;QAC/B,OAAO,EAAE;YACP,UAAU,EAAE,SAAS,CAAC,EAAE;YACxB,YAAY;YACZ,YAAY,EAAE;gBACZ,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB;YACD,aAAa;SACd;KACF,CAAC;IAEF,MAAM;QACJ,IAAI,EAAE,UAAU,CAAC,YAAY;QAC7B,OAAO,EAAE;YACP,UAAU,EAAE,SAAS,CAAC,EAAE;SACzB;KACF,CAAC;IAEF,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClE,MAAM;YACJ,IAAI,EAAE,UAAU,CAAC,qBAAqB;YACtC,OAAO,EAAE;gBACP,UAAU,EAAE,SAAS,CAAC,EAAE;aACzB;SACF,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { isTronChainId } from '@metamask/bridge-controller';\nimport type {\n BitcoinTradeData,\n StellarTradeData,\n TronTradeData,\n TxData,\n} from '@metamask/bridge-controller';\n\nimport { handleNonEvmTx } from '../utils/snaps';\nimport { getApprovalTraceParams } from '../utils/trace';\nimport { handleApprovalDelay } from '../utils/transaction';\nimport { SubmitStep } from './types';\nimport type { SubmitStrategyParams, SubmitStepResult } from './types';\n\n/**\n * Submits the approval transaction for a non-EVM transaction if present\n *\n * @param args - The parameters for the transaction\n * @returns The tx id of the approval transaction\n */\nconst handleTronApproval = async (\n args: SubmitStrategyParams<\n TronTradeData | BitcoinTradeData | StellarTradeData | string | TxData\n >,\n) => {\n const {\n quoteResponses: [quoteResponse],\n traceFn,\n } = args;\n\n const approvalTxId = await traceFn(\n getApprovalTraceParams(quoteResponse, false),\n async () => {\n if (quoteResponse.approval) {\n const txMeta = await handleNonEvmTx(\n args.messenger,\n quoteResponse.approval,\n quoteResponse,\n args.selectedAccount,\n );\n return txMeta.id;\n }\n return undefined;\n },\n );\n\n if (approvalTxId) {\n // Add delay after approval similar to EVM flow\n await handleApprovalDelay(quoteResponse.quote.srcChainId);\n return approvalTxId;\n }\n return undefined;\n};\n\n/**\n * Submits Solana, Bitcoin, or Tron transactions to the snap controller\n *\n * @param args - The parameters for the transaction\n * @param args.quoteResponse - The quote response\n * @param args.messenger - The messenger\n * @param args.selectedAccount - The selected account\n * @param args.traceFn - The trace function\n * @param args.isBridgeTx - Whether the transaction is a bridge transaction\n * @yields The approvalTxId and tradeMeta for the non-EVM transaction\n */\nexport async function* submitNonEvmHandler(\n args: SubmitStrategyParams<\n BitcoinTradeData | StellarTradeData | TronTradeData | string | TxData\n >,\n): AsyncGenerator<SubmitStepResult, void, void> {\n const {\n quoteResponses: [quoteResponse],\n isBridgeTx,\n } = args;\n\n const approvalTxId = await handleTronApproval(args);\n\n // TODO bridge-status should update history with actionId if approvalTxId is present\n\n const tradeMeta = await handleNonEvmTx(\n args.messenger,\n quoteResponse.trade,\n quoteResponse,\n args.selectedAccount,\n );\n\n yield {\n type: SubmitStep.SetTradeMeta,\n payload: { tradeMeta },\n };\n\n yield {\n type: SubmitStep.AddHistoryItem,\n payload: {\n historyKey: tradeMeta.id,\n approvalTxId,\n bridgeTxMeta: {\n id: tradeMeta.id,\n hash: tradeMeta.hash,\n },\n quoteResponse,\n },\n };\n\n yield {\n type: SubmitStep.StartPolling,\n payload: {\n historyKey: tradeMeta.id,\n },\n };\n\n if (!isTronChainId(quoteResponse.quote.srcChainId) && !isBridgeTx) {\n yield {\n type: SubmitStep.PublishCompletedEvent,\n payload: {\n historyKey: tradeMeta.id,\n },\n };\n }\n}\n"]}
|
package/dist/utils/snaps.cjs
CHANGED
|
@@ -44,18 +44,31 @@ exports.createClientTransactionRequest = createClientTransactionRequest;
|
|
|
44
44
|
* @param srcChainId - The source chain ID
|
|
45
45
|
* @param accountId - The account ID
|
|
46
46
|
* @param snapId - The snap ID
|
|
47
|
+
* @param sourceAssetId - The source asset ID
|
|
48
|
+
* @param destAssetId - The destination asset ID
|
|
47
49
|
* @returns The snap request object for signing and sending transaction
|
|
48
50
|
*/
|
|
49
|
-
const getClientRequest = (trade, srcChainId, accountId, snapId) => {
|
|
51
|
+
const getClientRequest = (trade, srcChainId, accountId, snapId, sourceAssetId, destAssetId) => {
|
|
50
52
|
const scope = (0, bridge_controller_1.formatChainIdToCaip)(srcChainId);
|
|
51
53
|
const transaction = (0, bridge_controller_1.extractTradeData)(trade);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
let options;
|
|
55
|
+
if (sourceAssetId !== undefined || destAssetId !== undefined) {
|
|
56
|
+
options = {
|
|
57
|
+
...(sourceAssetId !== undefined && {
|
|
58
|
+
sourceAssetId,
|
|
59
|
+
}),
|
|
60
|
+
...(destAssetId !== undefined && {
|
|
61
|
+
destAssetId,
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if ((0, bridge_controller_1.isTronTrade)(trade)) {
|
|
66
|
+
// Tron trades need the visible flag and contract type to be included in the request options
|
|
67
|
+
options = {
|
|
55
68
|
visible: trade.visible,
|
|
56
69
|
type: trade.raw_data?.contract?.[0]?.type,
|
|
57
|
-
}
|
|
58
|
-
|
|
70
|
+
};
|
|
71
|
+
}
|
|
59
72
|
return (0, exports.createClientTransactionRequest)(snapId, transaction, scope, accountId, options);
|
|
60
73
|
};
|
|
61
74
|
exports.getClientRequest = getClientRequest;
|
|
@@ -170,7 +183,7 @@ const handleNonEvmTx = async (messenger, trade, quoteResponse, selectedAccount)
|
|
|
170
183
|
if (!selectedAccount.metadata?.snap?.id) {
|
|
171
184
|
throw new Error('Failed to submit cross-chain swap transaction: undefined snap id');
|
|
172
185
|
}
|
|
173
|
-
const request = (0, exports.getClientRequest)(trade, quoteResponse.quote.srcChainId, selectedAccount.id, selectedAccount.metadata?.snap?.id);
|
|
186
|
+
const request = (0, exports.getClientRequest)(trade, quoteResponse.quote.srcChainId, selectedAccount.id, selectedAccount.metadata?.snap?.id, quoteResponse.quote.srcAsset.assetId, quoteResponse.quote.destAsset.assetId);
|
|
174
187
|
const requestResponse = (await messenger.call('SnapController:handleRequest', request));
|
|
175
188
|
const txMeta = (0, exports.handleNonEvmTxResponse)(requestResponse, trade, quoteResponse, selectedAccount);
|
|
176
189
|
// TODO remove this eventually, just returning it now to match extension behavior
|
package/dist/utils/snaps.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snaps.cjs","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type {\n QuoteMetadata,\n QuoteResponse,\n Trade,\n} from '@metamask/bridge-controller';\nimport {\n extractTradeData,\n formatChainIdToCaip,\n formatChainIdToHex,\n isCrossChain,\n isTronTrade,\n} from '@metamask/bridge-controller';\nimport { SnapController } from '@metamask/snaps-controllers';\nimport {\n CHAIN_IDS,\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport { v4 as uuid } from 'uuid';\n\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\n/**\n * Creates a client request object for signing and sending a transaction\n * Works for Solana, BTC, Tron, and other non-EVM networks\n *\n * @param snapId - The snap ID to send the request to\n * @param transaction - The base64 encoded transaction string\n * @param scope - The CAIP-2 chain scope\n * @param accountId - The account ID\n * @param options - Optional network-specific options\n * @returns The snap request object\n */\nexport const createClientTransactionRequest = (\n snapId: string,\n transaction: string,\n scope: CaipChainId,\n accountId: string,\n options?: Record<string, unknown>,\n) => {\n return {\n // TODO: remove 'as never' typing.\n snapId: snapId as never,\n origin: 'metamask',\n handler: 'onClientRequest' as never,\n request: {\n id: uuid(),\n jsonrpc: '2.0',\n method: 'signAndSendTransaction',\n params: {\n transaction,\n scope,\n accountId,\n ...(options && { options }),\n },\n },\n };\n};\n\n/**\n * Creates a request to sign and send a transaction for non-EVM chains\n * Uses the new unified ClientRequest:signAndSendTransaction interface\n *\n * @param trade - The trade data\n * @param srcChainId - The source chain ID\n * @param accountId - The account ID\n * @param snapId - The snap ID\n * @returns The snap request object for signing and sending transaction\n */\nexport const getClientRequest = (\n trade: Trade,\n srcChainId: number,\n accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'],\n snapId: string,\n): Parameters<SnapController['handleRequest']>[0] => {\n const scope = formatChainIdToCaip(srcChainId);\n\n const transaction = extractTradeData(trade);\n\n // Tron trades need the visible flag and contract type to be included in the request options\n const options = isTronTrade(trade)\n ? {\n visible: trade.visible,\n type: trade.raw_data?.contract?.[0]?.type,\n }\n : undefined;\n\n return createClientTransactionRequest(\n snapId,\n transaction,\n scope,\n accountId,\n options,\n );\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'\n> => {\n // Handle destination chain ID - should always be convertible for EVM destinations\n let destinationChainId;\n try {\n destinationChainId = formatChainIdToHex(quoteResponse.quote.destChainId);\n } catch {\n // Fallback for non-EVM destination (shouldn't happen for BTC->EVM)\n destinationChainId = CHAIN_IDS.MAINNET; // Default to mainnet\n }\n\n return {\n destinationChainId,\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 is now excluded from this function and handled by the caller\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\n/**\n * Handles the response from non-EVM transaction submission\n * Works with the new unified ClientRequest:signAndSendTransaction interface\n * Supports Solana, Bitcoin, and other non-EVM chains\n *\n * @param snapResponse - The response from the snap after transaction submission\n * @param trade - The non-evm trade or approval data\n * @param quoteResponse - The quote response containing trade details and metadata\n * @param selectedAccount - The selected account information\n * @returns The transaction metadata including non-EVM specific fields\n */\nexport const handleNonEvmTxResponse = (\n snapResponse:\n | string\n | { transactionId: string } // New unified interface response\n | { result: Record<string, string> }\n | { signature: string },\n trade: Trade,\n quoteResponse: Omit<QuoteResponse<Trade>, 'trade' | 'approval'> &\n 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 // Check for new unified interface response format first\n if ('transactionId' in snapResponse && snapResponse.transactionId) {\n hash = snapResponse.transactionId;\n } else if (\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\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 } else if (\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n let hexChainId: Hex;\n try {\n hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n } catch {\n hexChainId = '0x1';\n }\n // Extract the transaction data for storage\n const tradeData = extractTradeData(trade);\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? 'mainnet',\n txParams: { from: selectedAccountAddress, data: tradeData },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit flag to mark this as a non-EVM transaction\n isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains\n isBridgeTx,\n };\n};\n\n/**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param messenger - The BridgeStatusControllerMessenger instance\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\nexport const handleNonEvmTx = async (\n messenger: BridgeStatusControllerMessenger,\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): Promise<TransactionMeta> => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount.id,\n selectedAccount.metadata?.snap?.id,\n );\n const requestResponse = (await messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n trade,\n quoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"snaps.cjs","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type {\n QuoteMetadata,\n QuoteResponse,\n Trade,\n} from '@metamask/bridge-controller';\nimport {\n extractTradeData,\n formatChainIdToCaip,\n formatChainIdToHex,\n isCrossChain,\n isTronTrade,\n} from '@metamask/bridge-controller';\nimport { SnapController } from '@metamask/snaps-controllers';\nimport {\n CHAIN_IDS,\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\nimport { v4 as uuid } from 'uuid';\n\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\n/**\n * Creates a client request object for signing and sending a transaction\n * Works for Solana, BTC, Tron, and other non-EVM networks\n *\n * @param snapId - The snap ID to send the request to\n * @param transaction - The base64 encoded transaction string\n * @param scope - The CAIP-2 chain scope\n * @param accountId - The account ID\n * @param options - Optional network-specific options\n * @returns The snap request object\n */\nexport const createClientTransactionRequest = (\n snapId: string,\n transaction: string,\n scope: CaipChainId,\n accountId: string,\n options?: Record<string, unknown>,\n) => {\n return {\n // TODO: remove 'as never' typing.\n snapId: snapId as never,\n origin: 'metamask',\n handler: 'onClientRequest' as never,\n request: {\n id: uuid(),\n jsonrpc: '2.0',\n method: 'signAndSendTransaction',\n params: {\n transaction,\n scope,\n accountId,\n ...(options && { options }),\n },\n },\n };\n};\n\n/**\n * Creates a request to sign and send a transaction for non-EVM chains\n * Uses the new unified ClientRequest:signAndSendTransaction interface\n *\n * @param trade - The trade data\n * @param srcChainId - The source chain ID\n * @param accountId - The account ID\n * @param snapId - The snap ID\n * @param sourceAssetId - The source asset ID\n * @param destAssetId - The destination asset ID\n * @returns The snap request object for signing and sending transaction\n */\nexport const getClientRequest = (\n trade: Trade,\n srcChainId: number,\n accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'],\n snapId: string,\n sourceAssetId?: CaipAssetType,\n destAssetId?: CaipAssetType,\n): Parameters<SnapController['handleRequest']>[0] => {\n const scope = formatChainIdToCaip(srcChainId);\n\n const transaction = extractTradeData(trade);\n\n let options: Record<string, unknown> | undefined;\n\n if (sourceAssetId !== undefined || destAssetId !== undefined) {\n options = {\n ...(sourceAssetId !== undefined && {\n sourceAssetId,\n }),\n ...(destAssetId !== undefined && {\n destAssetId,\n }),\n };\n }\n\n if (isTronTrade(trade)) {\n // Tron trades need the visible flag and contract type to be included in the request options\n options = {\n visible: trade.visible,\n type: trade.raw_data?.contract?.[0]?.type,\n };\n }\n\n return createClientTransactionRequest(\n snapId,\n transaction,\n scope,\n accountId,\n options,\n );\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'\n> => {\n // Handle destination chain ID - should always be convertible for EVM destinations\n let destinationChainId;\n try {\n destinationChainId = formatChainIdToHex(quoteResponse.quote.destChainId);\n } catch {\n // Fallback for non-EVM destination (shouldn't happen for BTC->EVM)\n destinationChainId = CHAIN_IDS.MAINNET; // Default to mainnet\n }\n\n return {\n destinationChainId,\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 is now excluded from this function and handled by the caller\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\n/**\n * Handles the response from non-EVM transaction submission\n * Works with the new unified ClientRequest:signAndSendTransaction interface\n * Supports Solana, Bitcoin, and other non-EVM chains\n *\n * @param snapResponse - The response from the snap after transaction submission\n * @param trade - The non-evm trade or approval data\n * @param quoteResponse - The quote response containing trade details and metadata\n * @param selectedAccount - The selected account information\n * @returns The transaction metadata including non-EVM specific fields\n */\nexport const handleNonEvmTxResponse = (\n snapResponse:\n | string\n | { transactionId: string } // New unified interface response\n | { result: Record<string, string> }\n | { signature: string },\n trade: Trade,\n quoteResponse: Omit<QuoteResponse<Trade>, 'trade' | 'approval'> &\n 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 // Check for new unified interface response format first\n if ('transactionId' in snapResponse && snapResponse.transactionId) {\n hash = snapResponse.transactionId;\n } else if (\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\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 } else if (\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n let hexChainId: Hex;\n try {\n hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n } catch {\n hexChainId = '0x1';\n }\n // Extract the transaction data for storage\n const tradeData = extractTradeData(trade);\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? 'mainnet',\n txParams: { from: selectedAccountAddress, data: tradeData },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit flag to mark this as a non-EVM transaction\n isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains\n isBridgeTx,\n };\n};\n\n/**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param messenger - The BridgeStatusControllerMessenger instance\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\nexport const handleNonEvmTx = async (\n messenger: BridgeStatusControllerMessenger,\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): Promise<TransactionMeta> => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount.id,\n selectedAccount.metadata?.snap?.id,\n quoteResponse.quote.srcAsset.assetId,\n quoteResponse.quote.destAsset.assetId,\n );\n const requestResponse = (await messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n trade,\n quoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n};\n"]}
|
package/dist/utils/snaps.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import type { AccountsControllerState } from "@metamask/accounts-controller";
|
|
|
2
2
|
import type { QuoteMetadata, QuoteResponse, Trade } from "@metamask/bridge-controller";
|
|
3
3
|
import { SnapController } from "@metamask/snaps-controllers";
|
|
4
4
|
import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
5
|
-
import type { CaipChainId } from "@metamask/utils";
|
|
5
|
+
import type { CaipAssetType, CaipChainId } from "@metamask/utils";
|
|
6
6
|
import type { BridgeStatusControllerMessenger, SolanaTransactionMeta } from "../types.cjs";
|
|
7
7
|
/**
|
|
8
8
|
* Creates a client request object for signing and sending a transaction
|
|
@@ -39,9 +39,11 @@ export declare const createClientTransactionRequest: (snapId: string, transactio
|
|
|
39
39
|
* @param srcChainId - The source chain ID
|
|
40
40
|
* @param accountId - The account ID
|
|
41
41
|
* @param snapId - The snap ID
|
|
42
|
+
* @param sourceAssetId - The source asset ID
|
|
43
|
+
* @param destAssetId - The destination asset ID
|
|
42
44
|
* @returns The snap request object for signing and sending transaction
|
|
43
45
|
*/
|
|
44
|
-
export declare const getClientRequest: (trade: Trade, srcChainId: number, accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'], snapId: string) => Parameters<SnapController['handleRequest']>[0];
|
|
46
|
+
export declare const getClientRequest: (trade: Trade, srcChainId: number, accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'], snapId: string, sourceAssetId?: CaipAssetType, destAssetId?: CaipAssetType) => Parameters<SnapController['handleRequest']>[0];
|
|
45
47
|
export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
|
|
46
48
|
/**
|
|
47
49
|
* Handles the response from non-EVM transaction submission
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snaps.d.cts","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,KAAK,EACN,oCAAoC;AAQrC,OAAO,EAAE,cAAc,EAAE,oCAAoC;AAM7D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"snaps.d.cts","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,KAAK,EACN,oCAAoC;AAQrC,OAAO,EAAE,cAAc,EAAE,oCAAoC;AAM7D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAO,wBAAwB;AAGvE,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,8BAA8B,WACjC,MAAM,eACD,MAAM,SACZ,WAAW,aACP,MAAM,YACP,OAAO,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;CAmBlC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,UACpB,KAAK,cACA,MAAM,aACP,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UACxE,MAAM,kBACE,aAAa,gBACf,aAAa,KAC1B,WAAW,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAiC/C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,KAAK,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACpE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CA4BtE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,SAClB,KAAK,iBACG,KAAK,cAAc,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAC7D,aAAa,mBACE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBA6DpB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,sDAElB,KAAK,iBACG,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,mBACzC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,QAAQ,eAAe,CAkCzB,CAAC"}
|
package/dist/utils/snaps.d.mts
CHANGED
|
@@ -2,7 +2,7 @@ import type { AccountsControllerState } from "@metamask/accounts-controller";
|
|
|
2
2
|
import type { QuoteMetadata, QuoteResponse, Trade } from "@metamask/bridge-controller";
|
|
3
3
|
import { SnapController } from "@metamask/snaps-controllers";
|
|
4
4
|
import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
5
|
-
import type { CaipChainId } from "@metamask/utils";
|
|
5
|
+
import type { CaipAssetType, CaipChainId } from "@metamask/utils";
|
|
6
6
|
import type { BridgeStatusControllerMessenger, SolanaTransactionMeta } from "../types.mjs";
|
|
7
7
|
/**
|
|
8
8
|
* Creates a client request object for signing and sending a transaction
|
|
@@ -39,9 +39,11 @@ export declare const createClientTransactionRequest: (snapId: string, transactio
|
|
|
39
39
|
* @param srcChainId - The source chain ID
|
|
40
40
|
* @param accountId - The account ID
|
|
41
41
|
* @param snapId - The snap ID
|
|
42
|
+
* @param sourceAssetId - The source asset ID
|
|
43
|
+
* @param destAssetId - The destination asset ID
|
|
42
44
|
* @returns The snap request object for signing and sending transaction
|
|
43
45
|
*/
|
|
44
|
-
export declare const getClientRequest: (trade: Trade, srcChainId: number, accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'], snapId: string) => Parameters<SnapController['handleRequest']>[0];
|
|
46
|
+
export declare const getClientRequest: (trade: Trade, srcChainId: number, accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'], snapId: string, sourceAssetId?: CaipAssetType, destAssetId?: CaipAssetType) => Parameters<SnapController['handleRequest']>[0];
|
|
45
47
|
export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
|
|
46
48
|
/**
|
|
47
49
|
* Handles the response from non-EVM transaction submission
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snaps.d.mts","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,KAAK,EACN,oCAAoC;AAQrC,OAAO,EAAE,cAAc,EAAE,oCAAoC;AAM7D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"snaps.d.mts","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,KAAK,EACN,oCAAoC;AAQrC,OAAO,EAAE,cAAc,EAAE,oCAAoC;AAM7D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAO,wBAAwB;AAGvE,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,8BAA8B,WACjC,MAAM,eACD,MAAM,SACZ,WAAW,aACP,MAAM,YACP,OAAO,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;CAmBlC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,UACpB,KAAK,cACA,MAAM,aACP,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UACxE,MAAM,kBACE,aAAa,gBACf,aAAa,KAC1B,WAAW,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAiC/C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,KAAK,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACpE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CA4BtE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,SAClB,KAAK,iBACG,KAAK,cAAc,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAC7D,aAAa,mBACE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBA6DpB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,sDAElB,KAAK,iBACG,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,mBACzC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,QAAQ,eAAe,CAkCzB,CAAC"}
|
package/dist/utils/snaps.mjs
CHANGED
|
@@ -40,18 +40,31 @@ export const createClientTransactionRequest = (snapId, transaction, scope, accou
|
|
|
40
40
|
* @param srcChainId - The source chain ID
|
|
41
41
|
* @param accountId - The account ID
|
|
42
42
|
* @param snapId - The snap ID
|
|
43
|
+
* @param sourceAssetId - The source asset ID
|
|
44
|
+
* @param destAssetId - The destination asset ID
|
|
43
45
|
* @returns The snap request object for signing and sending transaction
|
|
44
46
|
*/
|
|
45
|
-
export const getClientRequest = (trade, srcChainId, accountId, snapId) => {
|
|
47
|
+
export const getClientRequest = (trade, srcChainId, accountId, snapId, sourceAssetId, destAssetId) => {
|
|
46
48
|
const scope = formatChainIdToCaip(srcChainId);
|
|
47
49
|
const transaction = extractTradeData(trade);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
let options;
|
|
51
|
+
if (sourceAssetId !== undefined || destAssetId !== undefined) {
|
|
52
|
+
options = {
|
|
53
|
+
...(sourceAssetId !== undefined && {
|
|
54
|
+
sourceAssetId,
|
|
55
|
+
}),
|
|
56
|
+
...(destAssetId !== undefined && {
|
|
57
|
+
destAssetId,
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (isTronTrade(trade)) {
|
|
62
|
+
// Tron trades need the visible flag and contract type to be included in the request options
|
|
63
|
+
options = {
|
|
51
64
|
visible: trade.visible,
|
|
52
65
|
type: trade.raw_data?.contract?.[0]?.type,
|
|
53
|
-
}
|
|
54
|
-
|
|
66
|
+
};
|
|
67
|
+
}
|
|
55
68
|
return createClientTransactionRequest(snapId, transaction, scope, accountId, options);
|
|
56
69
|
};
|
|
57
70
|
export const getTxMetaFields = (quoteResponse, approvalTxId) => {
|
|
@@ -163,7 +176,7 @@ export const handleNonEvmTx = async (messenger, trade, quoteResponse, selectedAc
|
|
|
163
176
|
if (!selectedAccount.metadata?.snap?.id) {
|
|
164
177
|
throw new Error('Failed to submit cross-chain swap transaction: undefined snap id');
|
|
165
178
|
}
|
|
166
|
-
const request = getClientRequest(trade, quoteResponse.quote.srcChainId, selectedAccount.id, selectedAccount.metadata?.snap?.id);
|
|
179
|
+
const request = getClientRequest(trade, quoteResponse.quote.srcChainId, selectedAccount.id, selectedAccount.metadata?.snap?.id, quoteResponse.quote.srcAsset.assetId, quoteResponse.quote.destAsset.assetId);
|
|
167
180
|
const requestResponse = (await messenger.call('SnapController:handleRequest', request));
|
|
168
181
|
const txMeta = handleNonEvmTxResponse(requestResponse, trade, quoteResponse, selectedAccount);
|
|
169
182
|
// TODO remove this eventually, just returning it now to match extension behavior
|
package/dist/utils/snaps.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snaps.mjs","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type {\n QuoteMetadata,\n QuoteResponse,\n Trade,\n} from '@metamask/bridge-controller';\nimport {\n extractTradeData,\n formatChainIdToCaip,\n formatChainIdToHex,\n isCrossChain,\n isTronTrade,\n} from '@metamask/bridge-controller';\nimport { SnapController } from '@metamask/snaps-controllers';\nimport {\n CHAIN_IDS,\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport { v4 as uuid } from 'uuid';\n\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\n/**\n * Creates a client request object for signing and sending a transaction\n * Works for Solana, BTC, Tron, and other non-EVM networks\n *\n * @param snapId - The snap ID to send the request to\n * @param transaction - The base64 encoded transaction string\n * @param scope - The CAIP-2 chain scope\n * @param accountId - The account ID\n * @param options - Optional network-specific options\n * @returns The snap request object\n */\nexport const createClientTransactionRequest = (\n snapId: string,\n transaction: string,\n scope: CaipChainId,\n accountId: string,\n options?: Record<string, unknown>,\n) => {\n return {\n // TODO: remove 'as never' typing.\n snapId: snapId as never,\n origin: 'metamask',\n handler: 'onClientRequest' as never,\n request: {\n id: uuid(),\n jsonrpc: '2.0',\n method: 'signAndSendTransaction',\n params: {\n transaction,\n scope,\n accountId,\n ...(options && { options }),\n },\n },\n };\n};\n\n/**\n * Creates a request to sign and send a transaction for non-EVM chains\n * Uses the new unified ClientRequest:signAndSendTransaction interface\n *\n * @param trade - The trade data\n * @param srcChainId - The source chain ID\n * @param accountId - The account ID\n * @param snapId - The snap ID\n * @returns The snap request object for signing and sending transaction\n */\nexport const getClientRequest = (\n trade: Trade,\n srcChainId: number,\n accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'],\n snapId: string,\n): Parameters<SnapController['handleRequest']>[0] => {\n const scope = formatChainIdToCaip(srcChainId);\n\n const transaction = extractTradeData(trade);\n\n // Tron trades need the visible flag and contract type to be included in the request options\n const options = isTronTrade(trade)\n ? {\n visible: trade.visible,\n type: trade.raw_data?.contract?.[0]?.type,\n }\n : undefined;\n\n return createClientTransactionRequest(\n snapId,\n transaction,\n scope,\n accountId,\n options,\n );\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'\n> => {\n // Handle destination chain ID - should always be convertible for EVM destinations\n let destinationChainId;\n try {\n destinationChainId = formatChainIdToHex(quoteResponse.quote.destChainId);\n } catch {\n // Fallback for non-EVM destination (shouldn't happen for BTC->EVM)\n destinationChainId = CHAIN_IDS.MAINNET; // Default to mainnet\n }\n\n return {\n destinationChainId,\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 is now excluded from this function and handled by the caller\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\n/**\n * Handles the response from non-EVM transaction submission\n * Works with the new unified ClientRequest:signAndSendTransaction interface\n * Supports Solana, Bitcoin, and other non-EVM chains\n *\n * @param snapResponse - The response from the snap after transaction submission\n * @param trade - The non-evm trade or approval data\n * @param quoteResponse - The quote response containing trade details and metadata\n * @param selectedAccount - The selected account information\n * @returns The transaction metadata including non-EVM specific fields\n */\nexport const handleNonEvmTxResponse = (\n snapResponse:\n | string\n | { transactionId: string } // New unified interface response\n | { result: Record<string, string> }\n | { signature: string },\n trade: Trade,\n quoteResponse: Omit<QuoteResponse<Trade>, 'trade' | 'approval'> &\n 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 // Check for new unified interface response format first\n if ('transactionId' in snapResponse && snapResponse.transactionId) {\n hash = snapResponse.transactionId;\n } else if (\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\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 } else if (\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n let hexChainId: Hex;\n try {\n hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n } catch {\n hexChainId = '0x1';\n }\n // Extract the transaction data for storage\n const tradeData = extractTradeData(trade);\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? 'mainnet',\n txParams: { from: selectedAccountAddress, data: tradeData },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit flag to mark this as a non-EVM transaction\n isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains\n isBridgeTx,\n };\n};\n\n/**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param messenger - The BridgeStatusControllerMessenger instance\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\nexport const handleNonEvmTx = async (\n messenger: BridgeStatusControllerMessenger,\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): Promise<TransactionMeta> => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount.id,\n selectedAccount.metadata?.snap?.id,\n );\n const requestResponse = (await messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n trade,\n quoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"snaps.mjs","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type {\n QuoteMetadata,\n QuoteResponse,\n Trade,\n} from '@metamask/bridge-controller';\nimport {\n extractTradeData,\n formatChainIdToCaip,\n formatChainIdToHex,\n isCrossChain,\n isTronTrade,\n} from '@metamask/bridge-controller';\nimport { SnapController } from '@metamask/snaps-controllers';\nimport {\n CHAIN_IDS,\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\nimport { v4 as uuid } from 'uuid';\n\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\n/**\n * Creates a client request object for signing and sending a transaction\n * Works for Solana, BTC, Tron, and other non-EVM networks\n *\n * @param snapId - The snap ID to send the request to\n * @param transaction - The base64 encoded transaction string\n * @param scope - The CAIP-2 chain scope\n * @param accountId - The account ID\n * @param options - Optional network-specific options\n * @returns The snap request object\n */\nexport const createClientTransactionRequest = (\n snapId: string,\n transaction: string,\n scope: CaipChainId,\n accountId: string,\n options?: Record<string, unknown>,\n) => {\n return {\n // TODO: remove 'as never' typing.\n snapId: snapId as never,\n origin: 'metamask',\n handler: 'onClientRequest' as never,\n request: {\n id: uuid(),\n jsonrpc: '2.0',\n method: 'signAndSendTransaction',\n params: {\n transaction,\n scope,\n accountId,\n ...(options && { options }),\n },\n },\n };\n};\n\n/**\n * Creates a request to sign and send a transaction for non-EVM chains\n * Uses the new unified ClientRequest:signAndSendTransaction interface\n *\n * @param trade - The trade data\n * @param srcChainId - The source chain ID\n * @param accountId - The account ID\n * @param snapId - The snap ID\n * @param sourceAssetId - The source asset ID\n * @param destAssetId - The destination asset ID\n * @returns The snap request object for signing and sending transaction\n */\nexport const getClientRequest = (\n trade: Trade,\n srcChainId: number,\n accountId: AccountsControllerState['internalAccounts']['accounts'][string]['id'],\n snapId: string,\n sourceAssetId?: CaipAssetType,\n destAssetId?: CaipAssetType,\n): Parameters<SnapController['handleRequest']>[0] => {\n const scope = formatChainIdToCaip(srcChainId);\n\n const transaction = extractTradeData(trade);\n\n let options: Record<string, unknown> | undefined;\n\n if (sourceAssetId !== undefined || destAssetId !== undefined) {\n options = {\n ...(sourceAssetId !== undefined && {\n sourceAssetId,\n }),\n ...(destAssetId !== undefined && {\n destAssetId,\n }),\n };\n }\n\n if (isTronTrade(trade)) {\n // Tron trades need the visible flag and contract type to be included in the request options\n options = {\n visible: trade.visible,\n type: trade.raw_data?.contract?.[0]?.type,\n };\n }\n\n return createClientTransactionRequest(\n snapId,\n transaction,\n scope,\n accountId,\n options,\n );\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'\n> => {\n // Handle destination chain ID - should always be convertible for EVM destinations\n let destinationChainId;\n try {\n destinationChainId = formatChainIdToHex(quoteResponse.quote.destChainId);\n } catch {\n // Fallback for non-EVM destination (shouldn't happen for BTC->EVM)\n destinationChainId = CHAIN_IDS.MAINNET; // Default to mainnet\n }\n\n return {\n destinationChainId,\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 is now excluded from this function and handled by the caller\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\n/**\n * Handles the response from non-EVM transaction submission\n * Works with the new unified ClientRequest:signAndSendTransaction interface\n * Supports Solana, Bitcoin, and other non-EVM chains\n *\n * @param snapResponse - The response from the snap after transaction submission\n * @param trade - The non-evm trade or approval data\n * @param quoteResponse - The quote response containing trade details and metadata\n * @param selectedAccount - The selected account information\n * @returns The transaction metadata including non-EVM specific fields\n */\nexport const handleNonEvmTxResponse = (\n snapResponse:\n | string\n | { transactionId: string } // New unified interface response\n | { result: Record<string, string> }\n | { signature: string },\n trade: Trade,\n quoteResponse: Omit<QuoteResponse<Trade>, 'trade' | 'approval'> &\n 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 // Check for new unified interface response format first\n if ('transactionId' in snapResponse && snapResponse.transactionId) {\n hash = snapResponse.transactionId;\n } else if (\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\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 } else if (\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n let hexChainId: Hex;\n try {\n hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n } catch {\n hexChainId = '0x1';\n }\n // Extract the transaction data for storage\n const tradeData = extractTradeData(trade);\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? 'mainnet',\n txParams: { from: selectedAccountAddress, data: tradeData },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit flag to mark this as a non-EVM transaction\n isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains\n isBridgeTx,\n };\n};\n\n/**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param messenger - The BridgeStatusControllerMessenger instance\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\nexport const handleNonEvmTx = async (\n messenger: BridgeStatusControllerMessenger,\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): Promise<TransactionMeta> => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount.id,\n selectedAccount.metadata?.snap?.id,\n quoteResponse.quote.srcAsset.assetId,\n quoteResponse.quote.destAsset.assetId,\n );\n const requestResponse = (await messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n trade,\n quoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/bridge-status-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "73.0.0-preview-0e62f8959",
|
|
4
4
|
"description": "Manages bridge-related status fetching functionality for MetaMask",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@metamask/accounts-controller": "^39.0.3",
|
|
56
56
|
"@metamask/base-controller": "^9.1.0",
|
|
57
|
-
"@metamask/bridge-controller": "^
|
|
57
|
+
"@metamask/bridge-controller": "^77.0.0",
|
|
58
58
|
"@metamask/controller-utils": "^12.3.0",
|
|
59
59
|
"@metamask/gas-fee-controller": "^26.2.3",
|
|
60
60
|
"@metamask/keyring-controller": "^27.1.0",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@metamask/profile-sync-controller": "^28.2.0",
|
|
65
65
|
"@metamask/snaps-controllers": "^19.0.0",
|
|
66
66
|
"@metamask/superstruct": "^3.1.0",
|
|
67
|
-
"@metamask/transaction-controller": "^68.
|
|
67
|
+
"@metamask/transaction-controller": "^68.2.0",
|
|
68
68
|
"@metamask/utils": "^11.11.0",
|
|
69
69
|
"bignumber.js": "^9.1.2",
|
|
70
70
|
"uuid": "^8.3.2"
|