@metamask/bridge-status-controller 68.1.0 → 70.0.0

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 (134) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/dist/bridge-status-controller.cjs +123 -221
  3. package/dist/bridge-status-controller.cjs.map +1 -1
  4. package/dist/bridge-status-controller.d.cts +1 -4
  5. package/dist/bridge-status-controller.d.cts.map +1 -1
  6. package/dist/bridge-status-controller.d.mts +1 -4
  7. package/dist/bridge-status-controller.d.mts.map +1 -1
  8. package/dist/bridge-status-controller.intent.cjs +9 -13
  9. package/dist/bridge-status-controller.intent.cjs.map +1 -1
  10. package/dist/bridge-status-controller.intent.d.cts +6 -8
  11. package/dist/bridge-status-controller.intent.d.cts.map +1 -1
  12. package/dist/bridge-status-controller.intent.d.mts +6 -8
  13. package/dist/bridge-status-controller.intent.d.mts.map +1 -1
  14. package/dist/bridge-status-controller.intent.mjs +10 -14
  15. package/dist/bridge-status-controller.intent.mjs.map +1 -1
  16. package/dist/bridge-status-controller.mjs +125 -223
  17. package/dist/bridge-status-controller.mjs.map +1 -1
  18. package/dist/index.cjs +1 -3
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +0 -1
  21. package/dist/index.d.cts.map +1 -1
  22. package/dist/index.d.mts +0 -1
  23. package/dist/index.d.mts.map +1 -1
  24. package/dist/index.mjs +0 -1
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/types.cjs.map +1 -1
  27. package/dist/types.d.cts +2 -2
  28. package/dist/types.d.cts.map +1 -1
  29. package/dist/types.d.mts +2 -2
  30. package/dist/types.d.mts.map +1 -1
  31. package/dist/types.mjs.map +1 -1
  32. package/dist/utils/accounts.cjs +8 -0
  33. package/dist/utils/accounts.cjs.map +1 -0
  34. package/dist/utils/accounts.d.cts +36 -0
  35. package/dist/utils/accounts.d.cts.map +1 -0
  36. package/dist/utils/accounts.d.mts +36 -0
  37. package/dist/utils/accounts.d.mts.map +1 -0
  38. package/dist/utils/accounts.mjs +4 -0
  39. package/dist/utils/accounts.mjs.map +1 -0
  40. package/dist/utils/authentication.cjs +15 -0
  41. package/dist/utils/authentication.cjs.map +1 -0
  42. package/dist/utils/authentication.d.cts +3 -0
  43. package/dist/utils/authentication.d.cts.map +1 -0
  44. package/dist/utils/authentication.d.mts +3 -0
  45. package/dist/utils/authentication.d.mts.map +1 -0
  46. package/dist/utils/authentication.mjs +11 -0
  47. package/dist/utils/authentication.mjs.map +1 -0
  48. package/dist/utils/bridge-status.cjs +2 -4
  49. package/dist/utils/bridge-status.cjs.map +1 -1
  50. package/dist/utils/bridge-status.d.cts.map +1 -1
  51. package/dist/utils/bridge-status.d.mts.map +1 -1
  52. package/dist/utils/bridge-status.mjs +2 -4
  53. package/dist/utils/bridge-status.mjs.map +1 -1
  54. package/dist/utils/bridge.cjs +16 -0
  55. package/dist/utils/bridge.cjs.map +1 -0
  56. package/dist/utils/bridge.d.cts +10 -0
  57. package/dist/utils/bridge.d.cts.map +1 -0
  58. package/dist/utils/bridge.d.mts +10 -0
  59. package/dist/utils/bridge.d.mts.map +1 -0
  60. package/dist/utils/bridge.mjs +11 -0
  61. package/dist/utils/bridge.mjs.map +1 -0
  62. package/dist/utils/gas.cjs +4 -7
  63. package/dist/utils/gas.cjs.map +1 -1
  64. package/dist/utils/gas.d.cts +1 -1
  65. package/dist/utils/gas.d.cts.map +1 -1
  66. package/dist/utils/gas.d.mts +1 -1
  67. package/dist/utils/gas.d.mts.map +1 -1
  68. package/dist/utils/gas.mjs +4 -7
  69. package/dist/utils/gas.mjs.map +1 -1
  70. package/dist/utils/history.cjs +97 -0
  71. package/dist/utils/history.cjs.map +1 -0
  72. package/dist/utils/history.d.cts +21 -0
  73. package/dist/utils/history.d.cts.map +1 -0
  74. package/dist/utils/history.d.mts +21 -0
  75. package/dist/utils/history.d.mts.map +1 -0
  76. package/dist/utils/history.mjs +90 -0
  77. package/dist/utils/history.mjs.map +1 -0
  78. package/dist/utils/intent-api.cjs +18 -3
  79. package/dist/utils/intent-api.cjs.map +1 -1
  80. package/dist/utils/intent-api.d.cts +16 -7
  81. package/dist/utils/intent-api.d.cts.map +1 -1
  82. package/dist/utils/intent-api.d.mts +16 -7
  83. package/dist/utils/intent-api.d.mts.map +1 -1
  84. package/dist/utils/intent-api.mjs +18 -4
  85. package/dist/utils/intent-api.mjs.map +1 -1
  86. package/dist/utils/keyring.cjs +12 -0
  87. package/dist/utils/keyring.cjs.map +1 -0
  88. package/dist/utils/keyring.d.cts +8 -0
  89. package/dist/utils/keyring.d.cts.map +1 -0
  90. package/dist/utils/keyring.d.mts +8 -0
  91. package/dist/utils/keyring.d.mts.map +1 -0
  92. package/dist/utils/keyring.mjs +8 -0
  93. package/dist/utils/keyring.mjs.map +1 -0
  94. package/dist/utils/network.cjs +17 -0
  95. package/dist/utils/network.cjs.map +1 -0
  96. package/dist/utils/network.d.cts +5 -0
  97. package/dist/utils/network.d.cts.map +1 -0
  98. package/dist/utils/network.d.mts +5 -0
  99. package/dist/utils/network.d.mts.map +1 -0
  100. package/dist/utils/network.mjs +12 -0
  101. package/dist/utils/network.mjs.map +1 -0
  102. package/dist/utils/snaps.cjs +146 -1
  103. package/dist/utils/snaps.cjs.map +1 -1
  104. package/dist/utils/snaps.d.cts +62 -0
  105. package/dist/utils/snaps.d.cts.map +1 -1
  106. package/dist/utils/snaps.d.mts +62 -0
  107. package/dist/utils/snaps.d.mts.map +1 -1
  108. package/dist/utils/snaps.mjs +141 -0
  109. package/dist/utils/snaps.mjs.map +1 -1
  110. package/dist/utils/trace.cjs +31 -0
  111. package/dist/utils/trace.cjs.map +1 -0
  112. package/dist/utils/trace.d.cts +17 -0
  113. package/dist/utils/trace.d.cts.map +1 -0
  114. package/dist/utils/trace.d.mts +17 -0
  115. package/dist/utils/trace.d.mts.map +1 -0
  116. package/dist/utils/trace.mjs +26 -0
  117. package/dist/utils/trace.mjs.map +1 -0
  118. package/dist/utils/transaction.cjs +31 -193
  119. package/dist/utils/transaction.cjs.map +1 -1
  120. package/dist/utils/transaction.d.cts +8 -79
  121. package/dist/utils/transaction.d.cts.map +1 -1
  122. package/dist/utils/transaction.d.mts +8 -79
  123. package/dist/utils/transaction.d.mts.map +1 -1
  124. package/dist/utils/transaction.mjs +31 -187
  125. package/dist/utils/transaction.mjs.map +1 -1
  126. package/dist/utils/validators.cjs +5 -5
  127. package/dist/utils/validators.cjs.map +1 -1
  128. package/dist/utils/validators.d.cts +6 -11
  129. package/dist/utils/validators.d.cts.map +1 -1
  130. package/dist/utils/validators.d.mts +6 -11
  131. package/dist/utils/validators.d.mts.map +1 -1
  132. package/dist/utils/validators.mjs +3 -3
  133. package/dist/utils/validators.mjs.map +1 -1
  134. package/package.json +4 -4
@@ -1,8 +1,9 @@
1
+ import { BridgeClientId, ChainId, Intent, QuoteResponse } from "@metamask/bridge-controller";
1
2
  import { TransactionStatus } from "@metamask/transaction-controller";
2
- import { IntentOrder, IntentOrderStatus } from "./validators.mjs";
3
+ import { IntentStatusResponse, IntentOrderStatus } from "./validators.mjs";
3
4
  import type { FetchFunction, StatusResponse } from "../types.mjs";
4
5
  export type IntentSubmissionParams = {
5
- srcChainId: string;
6
+ srcChainId: ChainId;
6
7
  quoteId: string;
7
8
  signature: string;
8
9
  order: unknown;
@@ -10,21 +11,29 @@ export type IntentSubmissionParams = {
10
11
  aggregatorId: string;
11
12
  };
12
13
  export type IntentApi = {
13
- submitIntent(params: IntentSubmissionParams, clientId: string): Promise<IntentOrder>;
14
- getOrderStatus(orderId: string, aggregatorId: string, srcChainId: string, clientId: string): Promise<IntentOrder>;
14
+ submitIntent(params: IntentSubmissionParams, clientId: BridgeClientId): Promise<IntentStatusResponse>;
15
+ getOrderStatus(orderId: string, aggregatorId: string, srcChainId: ChainId, clientId: BridgeClientId): Promise<IntentStatusResponse>;
15
16
  };
16
17
  export type GetJwtFn = () => Promise<string | undefined>;
17
18
  export declare class IntentApiImpl implements IntentApi {
18
19
  #private;
19
20
  constructor(baseUrl: string, fetchFn: FetchFunction, getJwt: GetJwtFn);
20
- submitIntent(params: IntentSubmissionParams, clientId: string): Promise<IntentOrder>;
21
- getOrderStatus(orderId: string, aggregatorId: string, srcChainId: string, clientId: string): Promise<IntentOrder>;
21
+ submitIntent(params: IntentSubmissionParams, clientId: BridgeClientId): Promise<IntentStatusResponse>;
22
+ getOrderStatus(orderId: string, aggregatorId: string, srcChainId: ChainId, clientId: BridgeClientId): Promise<IntentStatusResponse>;
22
23
  }
23
24
  export type IntentBridgeStatus = {
24
25
  status: StatusResponse;
25
26
  txHash?: string;
26
27
  transactionStatus: TransactionStatus;
27
28
  };
28
- export declare const translateIntentOrderToBridgeStatus: (intentOrder: IntentOrder, srcChainId: number, fallbackTxHash?: string) => IntentBridgeStatus;
29
+ export declare const translateIntentOrderToBridgeStatus: (intentOrder: IntentStatusResponse, srcChainId: number, fallbackTxHash?: string) => IntentBridgeStatus;
29
30
  export declare function mapIntentOrderStatusToTransactionStatus(intentStatus: IntentOrderStatus): TransactionStatus;
31
+ /**
32
+ * Extracts and validates the intent data from a quote response.
33
+ *
34
+ * @param quoteResponse - The quote response that may contain intent data
35
+ * @returns The intent data from the quote
36
+ * @throws Error if the quote does not contain intent data
37
+ */
38
+ export declare function getIntentFromQuote(quoteResponse: QuoteResponse): Intent;
30
39
  //# sourceMappingURL=intent-api.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-api.d.mts","sourceRoot":"","sources":["../../src/utils/intent-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,yCAAyC;AAErE,OAAO,EACL,WAAW,EACX,iBAAiB,EAElB,yBAAqB;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAiB;AAE9D,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,CACV,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEzD,qBAAa,aAAc,YAAW,SAAS;;gBAOjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ;IAM/D,YAAY,CAChB,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC;IAwBjB,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC;CAmBxB;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,kCAAkC,gBAChC,WAAW,cACZ,MAAM,mBACD,MAAM,KACtB,kBAsCF,CAAC;AAEF,wBAAgB,uCAAuC,CACrD,YAAY,EAAE,iBAAiB,GAC9B,iBAAiB,CAenB"}
1
+ {"version":3,"file":"intent-api.d.mts","sourceRoot":"","sources":["../../src/utils/intent-api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,OAAO,EAEP,MAAM,EACN,aAAa,EAEd,oCAAoC;AACrC,OAAO,EAAE,iBAAiB,EAAE,yCAAyC;AAErE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EAElB,yBAAqB;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAiB;AAE9D,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,CACV,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEzD,qBAAa,aAAc,YAAW,SAAS;;gBAOjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ;IAM/D,YAAY,CAChB,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,oBAAoB,CAAC;IAwB1B,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,oBAAoB,CAAC;CAmBjC;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,kCAAkC,gBAChC,oBAAoB,cACrB,MAAM,mBACD,MAAM,KACtB,kBAsCF,CAAC;AAEF,wBAAgB,uCAAuC,CACrD,YAAY,EAAE,iBAAiB,GAC9B,iBAAiB,CAenB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAMvE"}
@@ -10,9 +10,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
12
  var _IntentApiImpl_baseUrl, _IntentApiImpl_fetchFn, _IntentApiImpl_getJwt;
13
- import { getClientHeaders, StatusTypes } from "@metamask/bridge-controller";
13
+ import { BridgeClientId, ChainId, getClientHeaders, StatusTypes } from "@metamask/bridge-controller";
14
14
  import { TransactionStatus } from "@metamask/transaction-controller";
15
- import { IntentOrderStatus, validateIntentOrderResponse } from "./validators.mjs";
15
+ import { IntentOrderStatus, validateIntentStatusResponse } from "./validators.mjs";
16
16
  export class IntentApiImpl {
17
17
  constructor(baseUrl, fetchFn, getJwt) {
18
18
  _IntentApiImpl_baseUrl.set(this, void 0);
@@ -34,7 +34,7 @@ export class IntentApiImpl {
34
34
  },
35
35
  body: JSON.stringify(params),
36
36
  });
37
- if (!validateIntentOrderResponse(response)) {
37
+ if (!validateIntentStatusResponse(response)) {
38
38
  throw new Error('Invalid submitOrder response');
39
39
  }
40
40
  return response;
@@ -54,7 +54,7 @@ export class IntentApiImpl {
54
54
  method: 'GET',
55
55
  headers: getClientHeaders({ clientId, jwt }),
56
56
  });
57
- if (!validateIntentOrderResponse(response)) {
57
+ if (!validateIntentStatusResponse(response)) {
58
58
  throw new Error('Invalid getOrderStatus response');
59
59
  }
60
60
  return response;
@@ -119,4 +119,18 @@ export function mapIntentOrderStatusToTransactionStatus(intentStatus) {
119
119
  return TransactionStatus.submitted;
120
120
  }
121
121
  }
122
+ /**
123
+ * Extracts and validates the intent data from a quote response.
124
+ *
125
+ * @param quoteResponse - The quote response that may contain intent data
126
+ * @returns The intent data from the quote
127
+ * @throws Error if the quote does not contain intent data
128
+ */
129
+ export function getIntentFromQuote(quoteResponse) {
130
+ const { intent } = quoteResponse.quote;
131
+ if (!intent) {
132
+ throw new Error('submitIntent: missing intent data');
133
+ }
134
+ return intent;
135
+ }
122
136
  //# sourceMappingURL=intent-api.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-api.mjs","sourceRoot":"","sources":["../../src/utils/intent-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { getClientHeaders, StatusTypes } from '@metamask/bridge-controller';\nimport { TransactionStatus } from '@metamask/transaction-controller';\n\nimport {\n IntentOrder,\n IntentOrderStatus,\n validateIntentOrderResponse,\n} from './validators';\nimport type { FetchFunction, StatusResponse } from '../types';\n\nexport type IntentSubmissionParams = {\n srcChainId: string;\n quoteId: string;\n signature: string;\n order: unknown;\n userAddress: string;\n aggregatorId: string;\n};\n\nexport type IntentApi = {\n submitIntent(\n params: IntentSubmissionParams,\n clientId: string,\n ): Promise<IntentOrder>;\n getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: string,\n clientId: string,\n ): Promise<IntentOrder>;\n};\n\nexport type GetJwtFn = () => Promise<string | undefined>;\n\nexport class IntentApiImpl implements IntentApi {\n readonly #baseUrl: string;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #getJwt: GetJwtFn;\n\n constructor(baseUrl: string, fetchFn: FetchFunction, getJwt: GetJwtFn) {\n this.#baseUrl = baseUrl;\n this.#fetchFn = fetchFn;\n this.#getJwt = getJwt;\n }\n\n async submitIntent(\n params: IntentSubmissionParams,\n clientId: string,\n ): Promise<IntentOrder> {\n const endpoint = `${this.#baseUrl}/submitOrder`;\n try {\n const jwt = await this.#getJwt();\n const response = await this.#fetchFn(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...getClientHeaders({ clientId, jwt }),\n },\n body: JSON.stringify(params),\n });\n if (!validateIntentOrderResponse(response)) {\n throw new Error('Invalid submitOrder response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to submit intent: ${error.message}`);\n }\n throw new Error('Failed to submit intent');\n }\n }\n\n async getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: string,\n clientId: string,\n ): Promise<IntentOrder> {\n const endpoint = `${this.#baseUrl}/getOrderStatus?orderId=${orderId}&aggregatorId=${encodeURIComponent(aggregatorId)}&srcChainId=${srcChainId}`;\n try {\n const jwt = await this.#getJwt();\n const response = await this.#fetchFn(endpoint, {\n method: 'GET',\n headers: getClientHeaders({ clientId, jwt }),\n });\n if (!validateIntentOrderResponse(response)) {\n throw new Error('Invalid getOrderStatus response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to get order status: ${error.message}`);\n }\n throw new Error('Failed to get order status');\n }\n }\n}\n\nexport type IntentBridgeStatus = {\n status: StatusResponse;\n txHash?: string;\n transactionStatus: TransactionStatus;\n};\n\nexport const translateIntentOrderToBridgeStatus = (\n intentOrder: IntentOrder,\n srcChainId: number,\n fallbackTxHash?: string,\n): IntentBridgeStatus => {\n let statusType: StatusTypes;\n switch (intentOrder.status) {\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n statusType = StatusTypes.COMPLETE;\n break;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n statusType = StatusTypes.FAILED;\n break;\n case IntentOrderStatus.PENDING:\n statusType = StatusTypes.PENDING;\n break;\n case IntentOrderStatus.SUBMITTED:\n statusType = StatusTypes.SUBMITTED;\n break;\n default:\n statusType = StatusTypes.UNKNOWN;\n }\n\n const txHash = intentOrder.txHash ?? fallbackTxHash ?? '';\n const status: StatusResponse = {\n status: statusType,\n srcChain: {\n chainId: srcChainId,\n txHash,\n },\n };\n\n return {\n status,\n txHash,\n transactionStatus: mapIntentOrderStatusToTransactionStatus(\n intentOrder.status,\n ),\n };\n};\n\nexport function mapIntentOrderStatusToTransactionStatus(\n intentStatus: IntentOrderStatus,\n): TransactionStatus {\n switch (intentStatus) {\n case IntentOrderStatus.PENDING:\n case IntentOrderStatus.SUBMITTED:\n return TransactionStatus.submitted;\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n return TransactionStatus.confirmed;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n return TransactionStatus.failed;\n default:\n return TransactionStatus.submitted;\n }\n}\n"]}
1
+ {"version":3,"file":"intent-api.mjs","sourceRoot":"","sources":["../../src/utils/intent-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BridgeClientId,\n ChainId,\n getClientHeaders,\n Intent,\n QuoteResponse,\n StatusTypes,\n} from '@metamask/bridge-controller';\nimport { TransactionStatus } from '@metamask/transaction-controller';\n\nimport {\n IntentStatusResponse,\n IntentOrderStatus,\n validateIntentStatusResponse,\n} from './validators';\nimport type { FetchFunction, StatusResponse } from '../types';\n\nexport type IntentSubmissionParams = {\n srcChainId: ChainId;\n quoteId: string;\n signature: string;\n order: unknown;\n userAddress: string;\n aggregatorId: string;\n};\n\nexport type IntentApi = {\n submitIntent(\n params: IntentSubmissionParams,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse>;\n getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: ChainId,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse>;\n};\n\nexport type GetJwtFn = () => Promise<string | undefined>;\n\nexport class IntentApiImpl implements IntentApi {\n readonly #baseUrl: string;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #getJwt: GetJwtFn;\n\n constructor(baseUrl: string, fetchFn: FetchFunction, getJwt: GetJwtFn) {\n this.#baseUrl = baseUrl;\n this.#fetchFn = fetchFn;\n this.#getJwt = getJwt;\n }\n\n async submitIntent(\n params: IntentSubmissionParams,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse> {\n const endpoint = `${this.#baseUrl}/submitOrder`;\n try {\n const jwt = await this.#getJwt();\n const response = await this.#fetchFn(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...getClientHeaders({ clientId, jwt }),\n },\n body: JSON.stringify(params),\n });\n if (!validateIntentStatusResponse(response)) {\n throw new Error('Invalid submitOrder response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to submit intent: ${error.message}`);\n }\n throw new Error('Failed to submit intent');\n }\n }\n\n async getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: ChainId,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse> {\n const endpoint = `${this.#baseUrl}/getOrderStatus?orderId=${orderId}&aggregatorId=${encodeURIComponent(aggregatorId)}&srcChainId=${srcChainId}`;\n try {\n const jwt = await this.#getJwt();\n const response = await this.#fetchFn(endpoint, {\n method: 'GET',\n headers: getClientHeaders({ clientId, jwt }),\n });\n if (!validateIntentStatusResponse(response)) {\n throw new Error('Invalid getOrderStatus response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to get order status: ${error.message}`);\n }\n throw new Error('Failed to get order status');\n }\n }\n}\n\nexport type IntentBridgeStatus = {\n status: StatusResponse;\n txHash?: string;\n transactionStatus: TransactionStatus;\n};\n\nexport const translateIntentOrderToBridgeStatus = (\n intentOrder: IntentStatusResponse,\n srcChainId: number,\n fallbackTxHash?: string,\n): IntentBridgeStatus => {\n let statusType: StatusTypes;\n switch (intentOrder.status) {\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n statusType = StatusTypes.COMPLETE;\n break;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n statusType = StatusTypes.FAILED;\n break;\n case IntentOrderStatus.PENDING:\n statusType = StatusTypes.PENDING;\n break;\n case IntentOrderStatus.SUBMITTED:\n statusType = StatusTypes.SUBMITTED;\n break;\n default:\n statusType = StatusTypes.UNKNOWN;\n }\n\n const txHash = intentOrder.txHash ?? fallbackTxHash ?? '';\n const status: StatusResponse = {\n status: statusType,\n srcChain: {\n chainId: srcChainId,\n txHash,\n },\n };\n\n return {\n status,\n txHash,\n transactionStatus: mapIntentOrderStatusToTransactionStatus(\n intentOrder.status,\n ),\n };\n};\n\nexport function mapIntentOrderStatusToTransactionStatus(\n intentStatus: IntentOrderStatus,\n): TransactionStatus {\n switch (intentStatus) {\n case IntentOrderStatus.PENDING:\n case IntentOrderStatus.SUBMITTED:\n return TransactionStatus.submitted;\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n return TransactionStatus.confirmed;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n return TransactionStatus.failed;\n default:\n return TransactionStatus.submitted;\n }\n}\n\n/**\n * Extracts and validates the intent data from a quote response.\n *\n * @param quoteResponse - The quote response that may contain intent data\n * @returns The intent data from the quote\n * @throws Error if the quote does not contain intent data\n */\nexport function getIntentFromQuote(quoteResponse: QuoteResponse): Intent {\n const { intent } = quoteResponse.quote;\n if (!intent) {\n throw new Error('submitIntent: missing intent data');\n }\n return intent;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.signTypedMessage = void 0;
4
+ const keyring_controller_1 = require("@metamask/keyring-controller");
5
+ const signTypedMessage = async ({ messenger, accountAddress, typedData, }) => {
6
+ return await messenger.call('KeyringController:signTypedMessage', {
7
+ from: accountAddress,
8
+ data: typedData,
9
+ }, keyring_controller_1.SignTypedDataVersion.V4);
10
+ };
11
+ exports.signTypedMessage = signTypedMessage;
12
+ //# sourceMappingURL=keyring.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.cjs","sourceRoot":"","sources":["../../src/utils/keyring.ts"],"names":[],"mappings":";;;AACA,qEAAoE;AAI7D,MAAM,gBAAgB,GAAG,KAAK,EAAE,EACrC,SAAS,EACT,cAAc,EACd,SAAS,GAKV,EAAmB,EAAE;IACpB,OAAO,MAAM,SAAS,CAAC,IAAI,CACzB,oCAAoC,EACpC;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS;KAChB,EACD,yCAAoB,CAAC,EAAE,CACxB,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,gBAAgB,oBAiB3B","sourcesContent":["import type { Intent } from '@metamask/bridge-controller';\nimport { SignTypedDataVersion } from '@metamask/keyring-controller';\n\nimport type { BridgeStatusControllerMessenger } from '../types';\n\nexport const signTypedMessage = async ({\n messenger,\n accountAddress,\n typedData,\n}: {\n messenger: BridgeStatusControllerMessenger;\n accountAddress: string;\n typedData: Intent['typedData'];\n}): Promise<string> => {\n return await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from: accountAddress,\n data: typedData,\n },\n SignTypedDataVersion.V4,\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import type { Intent } from "@metamask/bridge-controller";
2
+ import type { BridgeStatusControllerMessenger } from "../types.cjs";
3
+ export declare const signTypedMessage: ({ messenger, accountAddress, typedData, }: {
4
+ messenger: BridgeStatusControllerMessenger;
5
+ accountAddress: string;
6
+ typedData: Intent['typedData'];
7
+ }) => Promise<string>;
8
+ //# sourceMappingURL=keyring.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.d.cts","sourceRoot":"","sources":["../../src/utils/keyring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAG1D,OAAO,KAAK,EAAE,+BAA+B,EAAE,qBAAiB;AAEhE,eAAO,MAAM,gBAAgB;;oBAMX,MAAM;eACX,MAAM,CAAC,WAAW,CAAC;MAC5B,QAAQ,MAAM,CASjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Intent } from "@metamask/bridge-controller";
2
+ import type { BridgeStatusControllerMessenger } from "../types.mjs";
3
+ export declare const signTypedMessage: ({ messenger, accountAddress, typedData, }: {
4
+ messenger: BridgeStatusControllerMessenger;
5
+ accountAddress: string;
6
+ typedData: Intent['typedData'];
7
+ }) => Promise<string>;
8
+ //# sourceMappingURL=keyring.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.d.mts","sourceRoot":"","sources":["../../src/utils/keyring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAG1D,OAAO,KAAK,EAAE,+BAA+B,EAAE,qBAAiB;AAEhE,eAAO,MAAM,gBAAgB;;oBAMX,MAAM;eACX,MAAM,CAAC,WAAW,CAAC;MAC5B,QAAQ,MAAM,CASjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { SignTypedDataVersion } from "@metamask/keyring-controller";
2
+ export const signTypedMessage = async ({ messenger, accountAddress, typedData, }) => {
3
+ return await messenger.call('KeyringController:signTypedMessage', {
4
+ from: accountAddress,
5
+ data: typedData,
6
+ }, SignTypedDataVersion.V4);
7
+ };
8
+ //# sourceMappingURL=keyring.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.mjs","sourceRoot":"","sources":["../../src/utils/keyring.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qCAAqC;AAIpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,EACrC,SAAS,EACT,cAAc,EACd,SAAS,GAKV,EAAmB,EAAE;IACpB,OAAO,MAAM,SAAS,CAAC,IAAI,CACzB,oCAAoC,EACpC;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS;KAChB,EACD,oBAAoB,CAAC,EAAE,CACxB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { Intent } from '@metamask/bridge-controller';\nimport { SignTypedDataVersion } from '@metamask/keyring-controller';\n\nimport type { BridgeStatusControllerMessenger } from '../types';\n\nexport const signTypedMessage = async ({\n messenger,\n accountAddress,\n typedData,\n}: {\n messenger: BridgeStatusControllerMessenger;\n accountAddress: string;\n typedData: Intent['typedData'];\n}): Promise<string> => {\n return await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from: accountAddress,\n data: typedData,\n },\n SignTypedDataVersion.V4,\n );\n};\n"]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNetworkClientIdByChainId = exports.getSelectedChainId = void 0;
4
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
5
+ const bridge_controller_1 = require("@metamask/bridge-controller");
6
+ const getSelectedChainId = (messenger) => {
7
+ const { selectedNetworkClientId } = messenger.call('NetworkController:getState');
8
+ const networkClient = messenger.call('NetworkController:getNetworkClientById', selectedNetworkClientId);
9
+ return networkClient.configuration.chainId;
10
+ };
11
+ exports.getSelectedChainId = getSelectedChainId;
12
+ const getNetworkClientIdByChainId = (messenger, chainId) => {
13
+ const hexChainId = (0, bridge_controller_1.formatChainIdToHex)(chainId);
14
+ return messenger.call('NetworkController:findNetworkClientIdByChainId', hexChainId);
15
+ };
16
+ exports.getNetworkClientIdByChainId = getNetworkClientIdByChainId;
17
+ //# sourceMappingURL=network.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.cjs","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":";;;AAAA,qEAAqE;AACrE,mEAGqC;AAI9B,MAAM,kBAAkB,GAAG,CAChC,SAA0C,EAC1C,EAAE;IACF,MAAM,EAAE,uBAAuB,EAAE,GAAG,SAAS,CAAC,IAAI,CAChD,4BAA4B,CAC7B,CAAC;IACF,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAClC,wCAAwC,EACxC,uBAAuB,CACxB,CAAC;IACF,OAAO,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B;AAEK,MAAM,2BAA2B,GAAG,CACzC,SAA0C,EAC1C,OAA0C,EAC1C,EAAE;IACF,MAAM,UAAU,GAAG,IAAA,sCAAkB,EAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC,IAAI,CACnB,gDAAgD,EAChD,UAAU,CACX,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,2BAA2B,+BAStC","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport {\n formatChainIdToHex,\n GenericQuoteRequest,\n} from '@metamask/bridge-controller';\n\nimport { BridgeStatusControllerMessenger } from '../types';\n\nexport const getSelectedChainId = (\n messenger: BridgeStatusControllerMessenger,\n) => {\n const { selectedNetworkClientId } = messenger.call(\n 'NetworkController:getState',\n );\n const networkClient = messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return networkClient.configuration.chainId;\n};\n\nexport const getNetworkClientIdByChainId = (\n messenger: BridgeStatusControllerMessenger,\n chainId: GenericQuoteRequest['srcChainId'],\n) => {\n const hexChainId = formatChainIdToHex(chainId);\n return messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import { GenericQuoteRequest } from "@metamask/bridge-controller";
2
+ import { BridgeStatusControllerMessenger } from "../types.cjs";
3
+ export declare const getSelectedChainId: (messenger: BridgeStatusControllerMessenger) => `0x${string}`;
4
+ export declare const getNetworkClientIdByChainId: (messenger: BridgeStatusControllerMessenger, chainId: GenericQuoteRequest['srcChainId']) => string;
5
+ //# sourceMappingURL=network.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.cts","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,mBAAmB,EACpB,oCAAoC;AAErC,OAAO,EAAE,+BAA+B,EAAE,qBAAiB;AAE3D,eAAO,MAAM,kBAAkB,+DAW9B,CAAC;AAEF,eAAO,MAAM,2BAA2B,wDAE7B,mBAAmB,CAAC,YAAY,CAAC,WAO3C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { GenericQuoteRequest } from "@metamask/bridge-controller";
2
+ import { BridgeStatusControllerMessenger } from "../types.mjs";
3
+ export declare const getSelectedChainId: (messenger: BridgeStatusControllerMessenger) => `0x${string}`;
4
+ export declare const getNetworkClientIdByChainId: (messenger: BridgeStatusControllerMessenger, chainId: GenericQuoteRequest['srcChainId']) => string;
5
+ //# sourceMappingURL=network.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.mts","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,mBAAmB,EACpB,oCAAoC;AAErC,OAAO,EAAE,+BAA+B,EAAE,qBAAiB;AAE3D,eAAO,MAAM,kBAAkB,+DAW9B,CAAC;AAEF,eAAO,MAAM,2BAA2B,wDAE7B,mBAAmB,CAAC,YAAY,CAAC,WAO3C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
2
+ import { formatChainIdToHex } from "@metamask/bridge-controller";
3
+ export const getSelectedChainId = (messenger) => {
4
+ const { selectedNetworkClientId } = messenger.call('NetworkController:getState');
5
+ const networkClient = messenger.call('NetworkController:getNetworkClientById', selectedNetworkClientId);
6
+ return networkClient.configuration.chainId;
7
+ };
8
+ export const getNetworkClientIdByChainId = (messenger, chainId) => {
9
+ const hexChainId = formatChainIdToHex(chainId);
10
+ return messenger.call('NetworkController:findNetworkClientIdByChainId', hexChainId);
11
+ };
12
+ //# sourceMappingURL=network.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.mjs","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EACL,kBAAkB,EAEnB,oCAAoC;AAIrC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,SAA0C,EAC1C,EAAE;IACF,MAAM,EAAE,uBAAuB,EAAE,GAAG,SAAS,CAAC,IAAI,CAChD,4BAA4B,CAC7B,CAAC;IACF,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAClC,wCAAwC,EACxC,uBAAuB,CACxB,CAAC;IACF,OAAO,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,SAA0C,EAC1C,OAA0C,EAC1C,EAAE;IACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC,IAAI,CACnB,gDAAgD,EAChD,UAAU,CACX,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport {\n formatChainIdToHex,\n GenericQuoteRequest,\n} from '@metamask/bridge-controller';\n\nimport { BridgeStatusControllerMessenger } from '../types';\n\nexport const getSelectedChainId = (\n messenger: BridgeStatusControllerMessenger,\n) => {\n const { selectedNetworkClientId } = messenger.call(\n 'NetworkController:getState',\n );\n const networkClient = messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return networkClient.configuration.chainId;\n};\n\nexport const getNetworkClientIdByChainId = (\n messenger: BridgeStatusControllerMessenger,\n chainId: GenericQuoteRequest['srcChainId'],\n) => {\n const hexChainId = formatChainIdToHex(chainId);\n return messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n};\n"]}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createClientTransactionRequest = void 0;
3
+ exports.handleNonEvmTx = exports.handleNonEvmTxResponse = exports.getTxMetaFields = exports.getClientRequest = exports.createClientTransactionRequest = void 0;
4
+ const bridge_controller_1 = require("@metamask/bridge-controller");
5
+ const transaction_controller_1 = require("@metamask/transaction-controller");
4
6
  const uuid_1 = require("uuid");
5
7
  /**
6
8
  * Creates a client request object for signing and sending a transaction
@@ -33,4 +35,147 @@ const createClientTransactionRequest = (snapId, transaction, scope, accountId, o
33
35
  };
34
36
  };
35
37
  exports.createClientTransactionRequest = createClientTransactionRequest;
38
+ /**
39
+ * Creates a request to sign and send a transaction for non-EVM chains
40
+ * Uses the new unified ClientRequest:signAndSendTransaction interface
41
+ *
42
+ * @param trade - The trade data
43
+ * @param srcChainId - The source chain ID
44
+ * @param accountId - The selected account ID
45
+ * @param snapId - The snap ID
46
+ * @returns The snap request object for signing and sending transaction
47
+ */
48
+ const getClientRequest = (trade, srcChainId, accountId, snapId) => {
49
+ const scope = (0, bridge_controller_1.formatChainIdToCaip)(srcChainId);
50
+ const transactionData = (0, bridge_controller_1.extractTradeData)(trade);
51
+ // Tron trades need the visible flag and contract type to be included in the request options
52
+ const options = (0, bridge_controller_1.isTronTrade)(trade)
53
+ ? {
54
+ visible: trade.visible,
55
+ type: trade.raw_data?.contract?.[0]?.type,
56
+ }
57
+ : undefined;
58
+ // Use the new unified interface
59
+ return (0, exports.createClientTransactionRequest)(snapId, transactionData, scope, accountId, options);
60
+ };
61
+ exports.getClientRequest = getClientRequest;
62
+ const getTxMetaFields = (quoteResponse, approvalTxId) => {
63
+ // Handle destination chain ID - should always be convertible for EVM destinations
64
+ let destinationChainId;
65
+ try {
66
+ destinationChainId = (0, bridge_controller_1.formatChainIdToHex)(quoteResponse.quote.destChainId);
67
+ }
68
+ catch {
69
+ // Fallback for non-EVM destination (shouldn't happen for BTC->EVM)
70
+ destinationChainId = '0x1'; // Default to mainnet
71
+ }
72
+ return {
73
+ destinationChainId,
74
+ sourceTokenAmount: quoteResponse.quote.srcTokenAmount,
75
+ sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,
76
+ sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,
77
+ sourceTokenAddress: quoteResponse.quote.srcAsset.address,
78
+ destinationTokenAmount: quoteResponse.quote.destTokenAmount,
79
+ destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,
80
+ destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,
81
+ destinationTokenAddress: quoteResponse.quote.destAsset.address,
82
+ // chainId is now excluded from this function and handled by the caller
83
+ approvalTxId,
84
+ // this is the decimal (non atomic) amount (not USD value) of source token to swap
85
+ swapTokenValue: quoteResponse.sentAmount.amount,
86
+ };
87
+ };
88
+ exports.getTxMetaFields = getTxMetaFields;
89
+ /**
90
+ * Handles the response from non-EVM transaction submission
91
+ * Works with the new unified ClientRequest:signAndSendTransaction interface
92
+ * Supports Solana, Bitcoin, and other non-EVM chains
93
+ *
94
+ * @param snapResponse - The response from the snap after transaction submission
95
+ * @param trade - The non-evm trade or approval data
96
+ * @param quoteResponse - The quote response containing trade details and metadata
97
+ * @param selectedAccount - The selected account information
98
+ * @returns The transaction metadata including non-EVM specific fields
99
+ */
100
+ const handleNonEvmTxResponse = (snapResponse, trade, quoteResponse, selectedAccount) => {
101
+ const selectedAccountAddress = selectedAccount.address;
102
+ const snapId = selectedAccount.metadata.snap?.id;
103
+ let hash;
104
+ // Handle different response formats
105
+ if (typeof snapResponse === 'string') {
106
+ hash = snapResponse;
107
+ }
108
+ else if (snapResponse && typeof snapResponse === 'object') {
109
+ // Check for new unified interface response format first
110
+ if ('transactionId' in snapResponse && snapResponse.transactionId) {
111
+ hash = snapResponse.transactionId;
112
+ }
113
+ else if ('result' in snapResponse &&
114
+ snapResponse.result &&
115
+ typeof snapResponse.result === 'object') {
116
+ // Try to extract signature from common locations in response object
117
+ hash =
118
+ snapResponse.result.signature ||
119
+ snapResponse.result.txid ||
120
+ snapResponse.result.hash ||
121
+ snapResponse.result.txHash;
122
+ }
123
+ else if ('signature' in snapResponse &&
124
+ snapResponse.signature &&
125
+ typeof snapResponse.signature === 'string') {
126
+ hash = snapResponse.signature;
127
+ }
128
+ }
129
+ const isBridgeTx = (0, bridge_controller_1.isCrossChain)(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId);
130
+ let hexChainId;
131
+ try {
132
+ hexChainId = (0, bridge_controller_1.formatChainIdToHex)(quoteResponse.quote.srcChainId);
133
+ }
134
+ catch {
135
+ hexChainId = '0x1';
136
+ }
137
+ // Extract the transaction data for storage
138
+ const tradeData = (0, bridge_controller_1.extractTradeData)(trade);
139
+ // Create a transaction meta object with bridge-specific fields
140
+ return {
141
+ ...(0, exports.getTxMetaFields)(quoteResponse),
142
+ time: Date.now(),
143
+ id: hash ?? (0, uuid_1.v4)(),
144
+ chainId: hexChainId,
145
+ networkClientId: snapId ?? 'mainnet',
146
+ txParams: { from: selectedAccountAddress, data: tradeData },
147
+ type: isBridgeTx ? transaction_controller_1.TransactionType.bridge : transaction_controller_1.TransactionType.swap,
148
+ status: transaction_controller_1.TransactionStatus.submitted,
149
+ hash, // Add the transaction signature as hash
150
+ origin: snapId,
151
+ // Add an explicit flag to mark this as a non-EVM transaction
152
+ isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains
153
+ isBridgeTx,
154
+ };
155
+ };
156
+ exports.handleNonEvmTxResponse = handleNonEvmTxResponse;
157
+ /**
158
+ * Submits the transaction to the snap using the new unified ClientRequest interface
159
+ * Works for all non-EVM chains (Solana, BTC, Tron)
160
+ * This adds an approval tx to the ApprovalsController in the background
161
+ * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL
162
+ *
163
+ * @param messenger - The BridgeStatusControllerMessenger instance
164
+ * @param trade - The trade data (can be approval or main trade)
165
+ * @param quoteResponse - The quote response containing metadata
166
+ * @param selectedAccount - The account to submit the transaction for
167
+ * @returns The transaction meta
168
+ */
169
+ const handleNonEvmTx = async (messenger, trade, quoteResponse, selectedAccount) => {
170
+ if (!selectedAccount.metadata?.snap?.id) {
171
+ throw new Error('Failed to submit cross-chain swap transaction: undefined snap id');
172
+ }
173
+ const request = (0, exports.getClientRequest)(trade, quoteResponse.quote.srcChainId, selectedAccount.id, selectedAccount.metadata?.snap?.id);
174
+ const requestResponse = (await messenger.call('SnapController:handleRequest', request));
175
+ const txMeta = (0, exports.handleNonEvmTxResponse)(requestResponse, trade, quoteResponse, selectedAccount);
176
+ // TODO remove this eventually, just returning it now to match extension behavior
177
+ // 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
178
+ return txMeta;
179
+ };
180
+ exports.handleNonEvmTx = handleNonEvmTx;
36
181
  //# sourceMappingURL=snaps.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"snaps.cjs","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":";;;AACA,+BAAkC;AAElC;;;;;;;;;;GAUG;AACI,MAAM,8BAA8B,GAAG,CAC5C,MAAc,EACd,WAAmB,EACnB,KAAkB,EAClB,SAAiB,EACjB,OAAiC,EACjC,EAAE;IACF,OAAO;QACL,kCAAkC;QAClC,MAAM,EAAE,MAAe;QACvB,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,iBAA0B;QACnC,OAAO,EAAE;YACP,EAAE,EAAE,IAAA,SAAI,GAAE;YACV,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,wBAAwB;YAChC,MAAM,EAAE;gBACN,WAAW;gBACX,KAAK;gBACL,SAAS;gBACT,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;aAC5B;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,8BAA8B,kCAwBzC","sourcesContent":["import type { CaipChainId } from '@metamask/utils';\nimport { v4 as uuid } from 'uuid';\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"]}
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 {\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 selected 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: string,\n snapId: string,\n) => {\n const scope = formatChainIdToCaip(srcChainId);\n\n const transactionData = 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 // Use the new unified interface\n return createClientTransactionRequest(\n snapId,\n transactionData,\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 = '0x1' as `0x${string}`; // 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,4 +1,8 @@
1
+ import type { AccountsControllerState } from "@metamask/accounts-controller";
2
+ import type { QuoteMetadata, QuoteResponse, Trade } from "@metamask/bridge-controller";
3
+ import type { TransactionMeta } from "@metamask/transaction-controller";
1
4
  import type { CaipChainId } from "@metamask/utils";
5
+ import type { BridgeStatusControllerMessenger, SolanaTransactionMeta } from "../types.cjs";
2
6
  /**
3
7
  * Creates a client request object for signing and sending a transaction
4
8
  * Works for Solana, BTC, Tron, and other non-EVM networks
@@ -26,4 +30,62 @@ export declare const createClientTransactionRequest: (snapId: string, transactio
26
30
  };
27
31
  };
28
32
  };
33
+ /**
34
+ * Creates a request to sign and send a transaction for non-EVM chains
35
+ * Uses the new unified ClientRequest:signAndSendTransaction interface
36
+ *
37
+ * @param trade - The trade data
38
+ * @param srcChainId - The source chain ID
39
+ * @param accountId - The selected account ID
40
+ * @param snapId - The snap ID
41
+ * @returns The snap request object for signing and sending transaction
42
+ */
43
+ export declare const getClientRequest: (trade: Trade, srcChainId: number, accountId: string, snapId: string) => {
44
+ snapId: never;
45
+ origin: string;
46
+ handler: never;
47
+ request: {
48
+ id: string;
49
+ jsonrpc: string;
50
+ method: string;
51
+ params: {
52
+ options?: Record<string, unknown> | undefined;
53
+ transaction: string;
54
+ scope: `${string}:${string}`;
55
+ accountId: string;
56
+ };
57
+ };
58
+ };
59
+ export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
60
+ /**
61
+ * Handles the response from non-EVM transaction submission
62
+ * Works with the new unified ClientRequest:signAndSendTransaction interface
63
+ * Supports Solana, Bitcoin, and other non-EVM chains
64
+ *
65
+ * @param snapResponse - The response from the snap after transaction submission
66
+ * @param trade - The non-evm trade or approval data
67
+ * @param quoteResponse - The quote response containing trade details and metadata
68
+ * @param selectedAccount - The selected account information
69
+ * @returns The transaction metadata including non-EVM specific fields
70
+ */
71
+ export declare const handleNonEvmTxResponse: (snapResponse: string | {
72
+ transactionId: string;
73
+ } | {
74
+ result: Record<string, string>;
75
+ } | {
76
+ signature: string;
77
+ }, trade: Trade, quoteResponse: Omit<QuoteResponse<Trade>, 'trade' | 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
78
+ /**
79
+ * Submits the transaction to the snap using the new unified ClientRequest interface
80
+ * Works for all non-EVM chains (Solana, BTC, Tron)
81
+ * This adds an approval tx to the ApprovalsController in the background
82
+ * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL
83
+ *
84
+ * @param messenger - The BridgeStatusControllerMessenger instance
85
+ * @param trade - The trade data (can be approval or main trade)
86
+ * @param quoteResponse - The quote response containing metadata
87
+ * @param selectedAccount - The account to submit the transaction for
88
+ * @returns The transaction meta
89
+ */
90
+ export declare const handleNonEvmTx: (messenger: BridgeStatusControllerMessenger, trade: Trade, quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => Promise<TransactionMeta>;
29
91
  //# sourceMappingURL=snaps.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snaps.d.cts","sourceRoot":"","sources":["../../src/utils/snaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB;AAGnD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,8BAA8B,WACjC,MAAM,eACD,MAAM,SACZ,WAAW,aACP,MAAM,YACP,OAAO,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;CAmBlC,CAAC"}
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;AAYrC,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAO,wBAAwB;AAGxD,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;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,UACpB,KAAK,cACA,MAAM,aACP,MAAM,UACT,MAAM;;;;;;;;;;;;;;;CAsBf,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,CAgCzB,CAAC"}
@@ -1,4 +1,8 @@
1
+ import type { AccountsControllerState } from "@metamask/accounts-controller";
2
+ import type { QuoteMetadata, QuoteResponse, Trade } from "@metamask/bridge-controller";
3
+ import type { TransactionMeta } from "@metamask/transaction-controller";
1
4
  import type { CaipChainId } from "@metamask/utils";
5
+ import type { BridgeStatusControllerMessenger, SolanaTransactionMeta } from "../types.mjs";
2
6
  /**
3
7
  * Creates a client request object for signing and sending a transaction
4
8
  * Works for Solana, BTC, Tron, and other non-EVM networks
@@ -26,4 +30,62 @@ export declare const createClientTransactionRequest: (snapId: string, transactio
26
30
  };
27
31
  };
28
32
  };
33
+ /**
34
+ * Creates a request to sign and send a transaction for non-EVM chains
35
+ * Uses the new unified ClientRequest:signAndSendTransaction interface
36
+ *
37
+ * @param trade - The trade data
38
+ * @param srcChainId - The source chain ID
39
+ * @param accountId - The selected account ID
40
+ * @param snapId - The snap ID
41
+ * @returns The snap request object for signing and sending transaction
42
+ */
43
+ export declare const getClientRequest: (trade: Trade, srcChainId: number, accountId: string, snapId: string) => {
44
+ snapId: never;
45
+ origin: string;
46
+ handler: never;
47
+ request: {
48
+ id: string;
49
+ jsonrpc: string;
50
+ method: string;
51
+ params: {
52
+ options?: Record<string, unknown> | undefined;
53
+ transaction: string;
54
+ scope: `${string}:${string}`;
55
+ accountId: string;
56
+ };
57
+ };
58
+ };
59
+ export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
60
+ /**
61
+ * Handles the response from non-EVM transaction submission
62
+ * Works with the new unified ClientRequest:signAndSendTransaction interface
63
+ * Supports Solana, Bitcoin, and other non-EVM chains
64
+ *
65
+ * @param snapResponse - The response from the snap after transaction submission
66
+ * @param trade - The non-evm trade or approval data
67
+ * @param quoteResponse - The quote response containing trade details and metadata
68
+ * @param selectedAccount - The selected account information
69
+ * @returns The transaction metadata including non-EVM specific fields
70
+ */
71
+ export declare const handleNonEvmTxResponse: (snapResponse: string | {
72
+ transactionId: string;
73
+ } | {
74
+ result: Record<string, string>;
75
+ } | {
76
+ signature: string;
77
+ }, trade: Trade, quoteResponse: Omit<QuoteResponse<Trade>, 'trade' | 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
78
+ /**
79
+ * Submits the transaction to the snap using the new unified ClientRequest interface
80
+ * Works for all non-EVM chains (Solana, BTC, Tron)
81
+ * This adds an approval tx to the ApprovalsController in the background
82
+ * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL
83
+ *
84
+ * @param messenger - The BridgeStatusControllerMessenger instance
85
+ * @param trade - The trade data (can be approval or main trade)
86
+ * @param quoteResponse - The quote response containing metadata
87
+ * @param selectedAccount - The account to submit the transaction for
88
+ * @returns The transaction meta
89
+ */
90
+ export declare const handleNonEvmTx: (messenger: BridgeStatusControllerMessenger, trade: Trade, quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => Promise<TransactionMeta>;
29
91
  //# sourceMappingURL=snaps.d.mts.map