@metamask/transaction-pay-controller 19.1.0 → 19.1.1

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 (170) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/dist/helpers/TransactionPayPublishHook.cjs +8 -0
  3. package/dist/helpers/TransactionPayPublishHook.cjs.map +1 -1
  4. package/dist/helpers/TransactionPayPublishHook.d.cts.map +1 -1
  5. package/dist/helpers/TransactionPayPublishHook.d.mts.map +1 -1
  6. package/dist/helpers/TransactionPayPublishHook.mjs +8 -0
  7. package/dist/helpers/TransactionPayPublishHook.mjs.map +1 -1
  8. package/dist/strategy/across/AcrossStrategy.cjs +1 -1
  9. package/dist/strategy/across/AcrossStrategy.cjs.map +1 -1
  10. package/dist/strategy/across/AcrossStrategy.d.cts +1 -1
  11. package/dist/strategy/across/AcrossStrategy.d.cts.map +1 -1
  12. package/dist/strategy/across/AcrossStrategy.d.mts +1 -1
  13. package/dist/strategy/across/AcrossStrategy.d.mts.map +1 -1
  14. package/dist/strategy/across/AcrossStrategy.mjs +1 -1
  15. package/dist/strategy/across/AcrossStrategy.mjs.map +1 -1
  16. package/dist/strategy/across/across-actions.cjs.map +1 -1
  17. package/dist/strategy/across/across-actions.d.cts +1 -1
  18. package/dist/strategy/across/across-actions.d.cts.map +1 -1
  19. package/dist/strategy/across/across-actions.d.mts +1 -1
  20. package/dist/strategy/across/across-actions.d.mts.map +1 -1
  21. package/dist/strategy/across/across-actions.mjs.map +1 -1
  22. package/dist/strategy/across/across-quotes.cjs +3 -3
  23. package/dist/strategy/across/across-quotes.cjs.map +1 -1
  24. package/dist/strategy/across/across-quotes.d.cts +1 -1
  25. package/dist/strategy/across/across-quotes.d.cts.map +1 -1
  26. package/dist/strategy/across/across-quotes.d.mts +1 -1
  27. package/dist/strategy/across/across-quotes.d.mts.map +1 -1
  28. package/dist/strategy/across/across-quotes.mjs +3 -3
  29. package/dist/strategy/across/across-quotes.mjs.map +1 -1
  30. package/dist/strategy/across/across-submit.cjs +1 -1
  31. package/dist/strategy/across/across-submit.cjs.map +1 -1
  32. package/dist/strategy/across/across-submit.d.cts +1 -1
  33. package/dist/strategy/across/across-submit.d.cts.map +1 -1
  34. package/dist/strategy/across/across-submit.d.mts +1 -1
  35. package/dist/strategy/across/across-submit.d.mts.map +1 -1
  36. package/dist/strategy/across/across-submit.mjs +1 -1
  37. package/dist/strategy/across/across-submit.mjs.map +1 -1
  38. package/dist/strategy/bridge/BridgeStrategy.cjs.map +1 -1
  39. package/dist/strategy/bridge/BridgeStrategy.d.cts +1 -1
  40. package/dist/strategy/bridge/BridgeStrategy.d.cts.map +1 -1
  41. package/dist/strategy/bridge/BridgeStrategy.d.mts +1 -1
  42. package/dist/strategy/bridge/BridgeStrategy.d.mts.map +1 -1
  43. package/dist/strategy/bridge/BridgeStrategy.mjs.map +1 -1
  44. package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
  45. package/dist/strategy/bridge/bridge-quotes.d.cts +1 -1
  46. package/dist/strategy/bridge/bridge-quotes.d.cts.map +1 -1
  47. package/dist/strategy/bridge/bridge-quotes.d.mts +1 -1
  48. package/dist/strategy/bridge/bridge-quotes.d.mts.map +1 -1
  49. package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
  50. package/dist/strategy/bridge/bridge-submit.cjs +1 -1
  51. package/dist/strategy/bridge/bridge-submit.cjs.map +1 -1
  52. package/dist/strategy/bridge/bridge-submit.d.cts +1 -1
  53. package/dist/strategy/bridge/bridge-submit.d.cts.map +1 -1
  54. package/dist/strategy/bridge/bridge-submit.d.mts +1 -1
  55. package/dist/strategy/bridge/bridge-submit.d.mts.map +1 -1
  56. package/dist/strategy/bridge/bridge-submit.mjs +1 -1
  57. package/dist/strategy/bridge/bridge-submit.mjs.map +1 -1
  58. package/dist/strategy/fiat/FiatStrategy.cjs.map +1 -1
  59. package/dist/strategy/fiat/FiatStrategy.d.cts +1 -1
  60. package/dist/strategy/fiat/FiatStrategy.d.cts.map +1 -1
  61. package/dist/strategy/fiat/FiatStrategy.d.mts +1 -1
  62. package/dist/strategy/fiat/FiatStrategy.d.mts.map +1 -1
  63. package/dist/strategy/fiat/FiatStrategy.mjs.map +1 -1
  64. package/dist/strategy/fiat/fiat-quotes.cjs +1 -1
  65. package/dist/strategy/fiat/fiat-quotes.cjs.map +1 -1
  66. package/dist/strategy/fiat/fiat-quotes.d.cts +1 -1
  67. package/dist/strategy/fiat/fiat-quotes.d.cts.map +1 -1
  68. package/dist/strategy/fiat/fiat-quotes.d.mts +1 -1
  69. package/dist/strategy/fiat/fiat-quotes.d.mts.map +1 -1
  70. package/dist/strategy/fiat/fiat-quotes.mjs +1 -1
  71. package/dist/strategy/fiat/fiat-quotes.mjs.map +1 -1
  72. package/dist/strategy/fiat/fiat-submit.cjs.map +1 -1
  73. package/dist/strategy/fiat/fiat-submit.d.cts +1 -1
  74. package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -1
  75. package/dist/strategy/fiat/fiat-submit.d.mts +1 -1
  76. package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -1
  77. package/dist/strategy/fiat/fiat-submit.mjs.map +1 -1
  78. package/dist/strategy/relay/RelayStrategy.cjs +1 -1
  79. package/dist/strategy/relay/RelayStrategy.cjs.map +1 -1
  80. package/dist/strategy/relay/RelayStrategy.d.cts +1 -1
  81. package/dist/strategy/relay/RelayStrategy.d.cts.map +1 -1
  82. package/dist/strategy/relay/RelayStrategy.d.mts +1 -1
  83. package/dist/strategy/relay/RelayStrategy.d.mts.map +1 -1
  84. package/dist/strategy/relay/RelayStrategy.mjs +1 -1
  85. package/dist/strategy/relay/RelayStrategy.mjs.map +1 -1
  86. package/dist/strategy/relay/hyperliquid-withdraw.cjs +5 -5
  87. package/dist/strategy/relay/hyperliquid-withdraw.cjs.map +1 -1
  88. package/dist/strategy/relay/hyperliquid-withdraw.d.cts +1 -1
  89. package/dist/strategy/relay/hyperliquid-withdraw.d.cts.map +1 -1
  90. package/dist/strategy/relay/hyperliquid-withdraw.d.mts +1 -1
  91. package/dist/strategy/relay/hyperliquid-withdraw.d.mts.map +1 -1
  92. package/dist/strategy/relay/hyperliquid-withdraw.mjs +1 -1
  93. package/dist/strategy/relay/hyperliquid-withdraw.mjs.map +1 -1
  94. package/dist/strategy/relay/relay-api.cjs +1 -1
  95. package/dist/strategy/relay/relay-api.cjs.map +1 -1
  96. package/dist/strategy/relay/relay-api.d.cts +1 -1
  97. package/dist/strategy/relay/relay-api.d.cts.map +1 -1
  98. package/dist/strategy/relay/relay-api.d.mts +1 -1
  99. package/dist/strategy/relay/relay-api.d.mts.map +1 -1
  100. package/dist/strategy/relay/relay-api.mjs +1 -1
  101. package/dist/strategy/relay/relay-api.mjs.map +1 -1
  102. package/dist/strategy/relay/relay-max-gas-station.cjs +1 -1
  103. package/dist/strategy/relay/relay-max-gas-station.cjs.map +1 -1
  104. package/dist/strategy/relay/relay-max-gas-station.d.cts +1 -1
  105. package/dist/strategy/relay/relay-max-gas-station.d.cts.map +1 -1
  106. package/dist/strategy/relay/relay-max-gas-station.d.mts +1 -1
  107. package/dist/strategy/relay/relay-max-gas-station.d.mts.map +1 -1
  108. package/dist/strategy/relay/relay-max-gas-station.mjs +1 -1
  109. package/dist/strategy/relay/relay-max-gas-station.mjs.map +1 -1
  110. package/dist/strategy/relay/relay-quotes.cjs +21 -21
  111. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  112. package/dist/strategy/relay/relay-quotes.d.cts +1 -1
  113. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  114. package/dist/strategy/relay/relay-quotes.d.mts +1 -1
  115. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  116. package/dist/strategy/relay/relay-quotes.mjs +4 -4
  117. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  118. package/dist/strategy/relay/relay-submit.cjs +3 -3
  119. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  120. package/dist/strategy/relay/relay-submit.d.cts +1 -1
  121. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  122. package/dist/strategy/relay/relay-submit.d.mts +1 -1
  123. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  124. package/dist/strategy/relay/relay-submit.mjs +3 -3
  125. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  126. package/dist/utils/gas.cjs +1 -1
  127. package/dist/utils/gas.cjs.map +1 -1
  128. package/dist/utils/gas.d.cts.map +1 -1
  129. package/dist/utils/gas.d.mts.map +1 -1
  130. package/dist/utils/gas.mjs +1 -1
  131. package/dist/utils/gas.mjs.map +1 -1
  132. package/dist/utils/quote-gas.cjs +1 -1
  133. package/dist/utils/quote-gas.cjs.map +1 -1
  134. package/dist/utils/quote-gas.d.cts.map +1 -1
  135. package/dist/utils/quote-gas.d.mts.map +1 -1
  136. package/dist/utils/quote-gas.mjs +1 -1
  137. package/dist/utils/quote-gas.mjs.map +1 -1
  138. package/dist/utils/quotes.cjs +2 -2
  139. package/dist/utils/quotes.cjs.map +1 -1
  140. package/dist/utils/quotes.d.cts.map +1 -1
  141. package/dist/utils/quotes.d.mts.map +1 -1
  142. package/dist/utils/quotes.mjs +2 -2
  143. package/dist/utils/quotes.mjs.map +1 -1
  144. package/dist/utils/required-tokens.cjs.map +1 -1
  145. package/dist/utils/required-tokens.d.cts.map +1 -1
  146. package/dist/utils/required-tokens.d.mts.map +1 -1
  147. package/dist/utils/required-tokens.mjs.map +1 -1
  148. package/dist/utils/source-amounts.cjs +2 -2
  149. package/dist/utils/source-amounts.cjs.map +1 -1
  150. package/dist/utils/source-amounts.d.cts.map +1 -1
  151. package/dist/utils/source-amounts.d.mts.map +1 -1
  152. package/dist/utils/source-amounts.mjs +2 -2
  153. package/dist/utils/source-amounts.mjs.map +1 -1
  154. package/dist/utils/token.cjs +1 -1
  155. package/dist/utils/token.cjs.map +1 -1
  156. package/dist/utils/token.d.cts.map +1 -1
  157. package/dist/utils/token.d.mts.map +1 -1
  158. package/dist/utils/token.mjs +1 -1
  159. package/dist/utils/token.mjs.map +1 -1
  160. package/dist/utils/totals.cjs.map +1 -1
  161. package/dist/utils/totals.d.cts.map +1 -1
  162. package/dist/utils/totals.d.mts.map +1 -1
  163. package/dist/utils/totals.mjs.map +1 -1
  164. package/dist/utils/transaction.cjs +1 -1
  165. package/dist/utils/transaction.cjs.map +1 -1
  166. package/dist/utils/transaction.d.cts.map +1 -1
  167. package/dist/utils/transaction.d.mts.map +1 -1
  168. package/dist/utils/transaction.mjs +1 -1
  169. package/dist/utils/transaction.mjs.map +1 -1
  170. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"fiat-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Quote as RampsQuote } from '@metamask/ramps-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { FiatQuote } from './types';\nimport { deriveFiatAssetForFiatPayment, pickBestFiatQuote } from './utils';\nimport { TransactionPayStrategy } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayRequiredToken,\n TransactionPayQuote,\n} from '../../types';\nimport { computeRawFromFiatAmount, getTokenFiatRate } from '../../utils/token';\nimport { getRelayQuotes } from '../relay/relay-quotes';\nimport type { RelayQuote } from '../relay/types';\n\nconst log = createModuleLogger(projectLogger, 'fiat-strategy');\n\n/**\n * Fetches MM Pay fiat strategy quotes using a relay-first estimation flow.\n *\n * @param request - Strategy quotes request.\n * @returns A single combined fiat strategy quote, or an empty array when inputs/quotes are unavailable.\n * @remarks\n * Flow summary:\n * 1. Read `amountFiat` and selected payment method from transaction pay state.\n * 2. Build a synthetic relay request from `amountFiat` using source token USD rate.\n * 3. Fetch relay quote and compute total relay fee (`provider + source network + target network + MetaMask`).\n * 4. Call ramps quotes with `adjustedAmountFiat = amountFiat + relayTotalFeeUsd`.\n * 5. Pick the configured ramps provider quote and combine it with relay quote into one fiat strategy quote.\n */\nexport async function getFiatQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<FiatQuote>[]> {\n const { fiatPaymentMethod, messenger, transaction } = request;\n const transactionId = transaction.id;\n\n const state = messenger.call('TransactionPayController:getState');\n const transactionData = state.transactionData[transactionId];\n const amountFiat = transactionData?.fiatPayment?.amountFiat;\n const walletAddress = transaction.txParams.from as Hex;\n const requiredTokens = getRequiredTokens(transactionData?.tokens);\n const fiatAsset = deriveFiatAssetForFiatPayment(transaction);\n\n if (\n !amountFiat ||\n !fiatPaymentMethod ||\n !requiredTokens.length ||\n !fiatAsset\n ) {\n return [];\n }\n\n try {\n if (requiredTokens.length > 1) {\n throw new Error(\n 'Multiple required tokens not supported for fiat strategy',\n );\n }\n\n const requiredToken = requiredTokens[0];\n\n const relayRequest = buildRelayRequestFromAmountFiat({\n amountFiat,\n fiatAsset,\n messenger,\n requiredToken,\n walletAddress,\n });\n\n if (!relayRequest) {\n throw new Error('Failed to build relay request from fiat amount');\n }\n\n const relayQuotes = await getRelayQuotes({\n messenger,\n requests: [relayRequest],\n transaction,\n });\n\n const relayQuote = relayQuotes[0];\n if (!relayQuote) {\n throw new Error('No relay quote available for fiat estimation');\n }\n\n const relayTotalFeeUsd = getRelayTotalFeeUsd(relayQuote);\n const adjustedAmountFiat = new BigNumber(amountFiat).plus(relayTotalFeeUsd);\n\n if (\n !adjustedAmountFiat.isFinite() ||\n !adjustedAmountFiat.gt(0) ||\n !relayTotalFeeUsd.isFinite() ||\n !relayTotalFeeUsd.gte(0)\n ) {\n throw new Error('Invalid fiat amount after relay fee adjustment');\n }\n\n const adjustedAmount = adjustedAmountFiat.toNumber();\n\n if (!Number.isFinite(adjustedAmount) || adjustedAmount <= 0) {\n throw new Error('Invalid fiat amount after relay fee adjustment');\n }\n\n log('Fiat quote flow', {\n adjustedAmountFiat: adjustedAmountFiat.toString(10),\n amountFiat,\n paymentMethods: [fiatPaymentMethod],\n relayTotalFeeUsd: relayTotalFeeUsd.toString(10),\n sourceAmountRaw: relayRequest.sourceTokenAmount,\n transactionId,\n });\n\n const quotes = await messenger.call('RampsController:getQuotes', {\n amount: adjustedAmount,\n paymentMethods: [fiatPaymentMethod],\n walletAddress,\n });\n\n log('Fetched ramps quotes', {\n rampsQuotesCount: quotes.success?.length ?? 0,\n transactionId,\n });\n\n const fiatQuote = pickBestFiatQuote(quotes);\n\n if (!fiatQuote) {\n throw new Error('No matching ramps quote found for selected provider');\n }\n\n return [\n combineQuotes({\n adjustedAmountFiat: adjustedAmountFiat.toString(10),\n amountFiat,\n fiatQuote,\n relayQuote,\n }),\n ];\n } catch (error) {\n log('Failed to fetch fiat quotes', { error, transactionId });\n }\n\n return [];\n}\n\nfunction getRequiredTokens(\n tokens?: TransactionPayRequiredToken[],\n): TransactionPayRequiredToken[] {\n return tokens?.filter((token) => !token.skipIfBalance) ?? [];\n}\n\nfunction buildRelayRequestFromAmountFiat({\n amountFiat,\n fiatAsset,\n messenger,\n requiredToken,\n walletAddress,\n}: {\n amountFiat: string;\n fiatAsset: {\n address: Hex;\n chainId: Hex;\n decimals: number;\n };\n messenger: PayStrategyGetQuotesRequest['messenger'];\n requiredToken: TransactionPayRequiredToken;\n walletAddress: Hex;\n}): QuoteRequest | undefined {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n fiatAsset.address,\n fiatAsset.chainId,\n );\n\n if (!sourceFiatRate) {\n return undefined;\n }\n\n const sourceAmountRaw = computeRawFromFiatAmount(\n amountFiat,\n fiatAsset.decimals,\n sourceFiatRate.usdRate,\n );\n\n if (!sourceAmountRaw) {\n return undefined;\n }\n\n return {\n from: walletAddress,\n // Force EXACT_INPUT mode: source amount is pre-calculated from the fiat\n // amount, so the relay should treat it as a fixed input rather than\n // computing it from the target.\n isPostQuote: true,\n sourceBalanceRaw: sourceAmountRaw,\n sourceChainId: fiatAsset.chainId,\n sourceTokenAddress: fiatAsset.address,\n sourceTokenAmount: sourceAmountRaw,\n targetAmountMinimum: requiredToken.amountRaw,\n targetChainId: requiredToken.chainId,\n targetTokenAddress: requiredToken.address,\n };\n}\n\n/**\n * Combines fiat and relay legs into a single MM Pay fiat strategy quote.\n *\n * @param params - Combined quote inputs.\n * @param params.adjustedAmountFiat - Fiat amount sent to ramps after adding relay fee estimate.\n * @param params.amountFiat - User-entered fiat amount.\n * @param params.fiatQuote - Selected ramps quote.\n * @param params.relayQuote - Estimated relay quote.\n * @returns A single fiat strategy quote with split fee buckets.\n * @remarks\n * Fee mapping contract for MM Pay Fiat strategy:\n * - `fees.provider`: Total provider fee (relay provider/swap fee + ramps provider/network fee).\n * Consumed by UI transaction fee row and tooltip provider fee.\n * - `fees.providerFiat`: Fiat on-ramp provider fees only (`providerFee + networkFee` from ramps quote).\n * Optional breakdown; client can derive relay portion via `provider - providerFiat`.\n * - `fees.sourceNetwork` / `fees.targetNetwork`: Relay settlement network fees.\n * Consumed by UI transaction fee row and tooltip network fee.\n * - `fees.metaMask`: MM Pay fee (currently 100 bps over `amountFiat + adjustedAmountFiat`).\n * Consumed by UI transaction fee row and tooltip MetaMask fee.\n * - `totals.total` should represent Amount + Transaction Fee using the totals pipeline.\n */\nfunction combineQuotes({\n adjustedAmountFiat,\n amountFiat,\n fiatQuote,\n relayQuote,\n}: {\n adjustedAmountFiat: string;\n amountFiat: string;\n fiatQuote: RampsQuote;\n relayQuote: TransactionPayQuote<RelayQuote>;\n}): TransactionPayQuote<FiatQuote> {\n const rampsProviderFee = getRampsProviderFee(fiatQuote);\n const totalProviderFee = new BigNumber(relayQuote.fees.provider.usd)\n .plus(rampsProviderFee)\n .toString(10);\n const rampsProviderFeeStr = rampsProviderFee.toString(10);\n const metaMaskFee = getMetaMaskFee({\n adjustedAmountFiat,\n amountFiat,\n }).toString(10);\n\n return {\n ...relayQuote,\n fees: {\n ...relayQuote.fees,\n metaMask: {\n fiat: metaMaskFee,\n usd: metaMaskFee,\n },\n provider: {\n fiat: totalProviderFee,\n usd: totalProviderFee,\n },\n providerFiat: {\n fiat: rampsProviderFeeStr,\n usd: rampsProviderFeeStr,\n },\n },\n original: {\n rampsQuote: fiatQuote,\n relayQuote: relayQuote.original,\n },\n strategy: TransactionPayStrategy.Fiat,\n };\n}\n\n/**\n * Ramps providers handle network gas fees themselves but report them separately\n * as `networkFee` alongside their `providerFee`. We combine both into a single\n * ramps provider fee for the `providerFiat` breakdown.\n *\n * @param fiatQuote - The ramps quote containing provider and network fees.\n * @returns Combined ramps provider fee as a BigNumber.\n */\nfunction getRampsProviderFee(fiatQuote: RampsQuote): BigNumber {\n return new BigNumber(fiatQuote.quote.providerFee ?? 0).plus(\n fiatQuote.quote.networkFee ?? 0,\n );\n}\n\nfunction getRelayTotalFeeUsd(\n relayQuote: TransactionPayQuote<RelayQuote>,\n): BigNumber {\n return new BigNumber(relayQuote.fees.provider.usd)\n .plus(relayQuote.fees.sourceNetwork.estimate.usd)\n .plus(relayQuote.fees.targetNetwork.usd)\n .plus(relayQuote.fees.metaMask.usd);\n}\n\nfunction getMetaMaskFee({\n adjustedAmountFiat,\n amountFiat,\n}: {\n adjustedAmountFiat: BigNumber.Value;\n amountFiat: BigNumber.Value;\n}): BigNumber {\n return new BigNumber(amountFiat).plus(adjustedAmountFiat).dividedBy(100);\n}\n"]}
1
+ {"version":3,"file":"fiat-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Quote as RampsQuote } from '@metamask/ramps-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { TransactionPayStrategy } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayRequiredToken,\n TransactionPayQuote,\n} from '../../types';\nimport { computeRawFromFiatAmount, getTokenFiatRate } from '../../utils/token';\nimport { getRelayQuotes } from '../relay/relay-quotes';\nimport type { RelayQuote } from '../relay/types';\nimport type { FiatQuote } from './types';\nimport { deriveFiatAssetForFiatPayment, pickBestFiatQuote } from './utils';\n\nconst log = createModuleLogger(projectLogger, 'fiat-strategy');\n\n/**\n * Fetches MM Pay fiat strategy quotes using a relay-first estimation flow.\n *\n * @param request - Strategy quotes request.\n * @returns A single combined fiat strategy quote, or an empty array when inputs/quotes are unavailable.\n * @remarks\n * Flow summary:\n * 1. Read `amountFiat` and selected payment method from transaction pay state.\n * 2. Build a synthetic relay request from `amountFiat` using source token USD rate.\n * 3. Fetch relay quote and compute total relay fee (`provider + source network + target network + MetaMask`).\n * 4. Call ramps quotes with `adjustedAmountFiat = amountFiat + relayTotalFeeUsd`.\n * 5. Pick the configured ramps provider quote and combine it with relay quote into one fiat strategy quote.\n */\nexport async function getFiatQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<FiatQuote>[]> {\n const { fiatPaymentMethod, messenger, transaction } = request;\n const transactionId = transaction.id;\n\n const state = messenger.call('TransactionPayController:getState');\n const transactionData = state.transactionData[transactionId];\n const amountFiat = transactionData?.fiatPayment?.amountFiat;\n const walletAddress = transaction.txParams.from as Hex;\n const requiredTokens = getRequiredTokens(transactionData?.tokens);\n const fiatAsset = deriveFiatAssetForFiatPayment(transaction);\n\n if (\n !amountFiat ||\n !fiatPaymentMethod ||\n !requiredTokens.length ||\n !fiatAsset\n ) {\n return [];\n }\n\n try {\n if (requiredTokens.length > 1) {\n throw new Error(\n 'Multiple required tokens not supported for fiat strategy',\n );\n }\n\n const requiredToken = requiredTokens[0];\n\n const relayRequest = buildRelayRequestFromAmountFiat({\n amountFiat,\n fiatAsset,\n messenger,\n requiredToken,\n walletAddress,\n });\n\n if (!relayRequest) {\n throw new Error('Failed to build relay request from fiat amount');\n }\n\n const relayQuotes = await getRelayQuotes({\n messenger,\n requests: [relayRequest],\n transaction,\n });\n\n const relayQuote = relayQuotes[0];\n if (!relayQuote) {\n throw new Error('No relay quote available for fiat estimation');\n }\n\n const relayTotalFeeUsd = getRelayTotalFeeUsd(relayQuote);\n const adjustedAmountFiat = new BigNumber(amountFiat).plus(relayTotalFeeUsd);\n\n if (\n !adjustedAmountFiat.isFinite() ||\n !adjustedAmountFiat.gt(0) ||\n !relayTotalFeeUsd.isFinite() ||\n !relayTotalFeeUsd.gte(0)\n ) {\n throw new Error('Invalid fiat amount after relay fee adjustment');\n }\n\n const adjustedAmount = adjustedAmountFiat.toNumber();\n\n if (!Number.isFinite(adjustedAmount) || adjustedAmount <= 0) {\n throw new Error('Invalid fiat amount after relay fee adjustment');\n }\n\n log('Fiat quote flow', {\n adjustedAmountFiat: adjustedAmountFiat.toString(10),\n amountFiat,\n paymentMethods: [fiatPaymentMethod],\n relayTotalFeeUsd: relayTotalFeeUsd.toString(10),\n sourceAmountRaw: relayRequest.sourceTokenAmount,\n transactionId,\n });\n\n const quotes = await messenger.call('RampsController:getQuotes', {\n amount: adjustedAmount,\n paymentMethods: [fiatPaymentMethod],\n walletAddress,\n });\n\n log('Fetched ramps quotes', {\n rampsQuotesCount: quotes.success?.length ?? 0,\n transactionId,\n });\n\n const fiatQuote = pickBestFiatQuote(quotes);\n\n if (!fiatQuote) {\n throw new Error('No matching ramps quote found for selected provider');\n }\n\n return [\n combineQuotes({\n adjustedAmountFiat: adjustedAmountFiat.toString(10),\n amountFiat,\n fiatQuote,\n relayQuote,\n }),\n ];\n } catch (error) {\n log('Failed to fetch fiat quotes', { error, transactionId });\n }\n\n return [];\n}\n\nfunction getRequiredTokens(\n tokens?: TransactionPayRequiredToken[],\n): TransactionPayRequiredToken[] {\n return tokens?.filter((token) => !token.skipIfBalance) ?? [];\n}\n\nfunction buildRelayRequestFromAmountFiat({\n amountFiat,\n fiatAsset,\n messenger,\n requiredToken,\n walletAddress,\n}: {\n amountFiat: string;\n fiatAsset: {\n address: Hex;\n chainId: Hex;\n decimals: number;\n };\n messenger: PayStrategyGetQuotesRequest['messenger'];\n requiredToken: TransactionPayRequiredToken;\n walletAddress: Hex;\n}): QuoteRequest | undefined {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n fiatAsset.address,\n fiatAsset.chainId,\n );\n\n if (!sourceFiatRate) {\n return undefined;\n }\n\n const sourceAmountRaw = computeRawFromFiatAmount(\n amountFiat,\n fiatAsset.decimals,\n sourceFiatRate.usdRate,\n );\n\n if (!sourceAmountRaw) {\n return undefined;\n }\n\n return {\n from: walletAddress,\n // Force EXACT_INPUT mode: source amount is pre-calculated from the fiat\n // amount, so the relay should treat it as a fixed input rather than\n // computing it from the target.\n isPostQuote: true,\n sourceBalanceRaw: sourceAmountRaw,\n sourceChainId: fiatAsset.chainId,\n sourceTokenAddress: fiatAsset.address,\n sourceTokenAmount: sourceAmountRaw,\n targetAmountMinimum: requiredToken.amountRaw,\n targetChainId: requiredToken.chainId,\n targetTokenAddress: requiredToken.address,\n };\n}\n\n/**\n * Combines fiat and relay legs into a single MM Pay fiat strategy quote.\n *\n * @param params - Combined quote inputs.\n * @param params.adjustedAmountFiat - Fiat amount sent to ramps after adding relay fee estimate.\n * @param params.amountFiat - User-entered fiat amount.\n * @param params.fiatQuote - Selected ramps quote.\n * @param params.relayQuote - Estimated relay quote.\n * @returns A single fiat strategy quote with split fee buckets.\n * @remarks\n * Fee mapping contract for MM Pay Fiat strategy:\n * - `fees.provider`: Total provider fee (relay provider/swap fee + ramps provider/network fee).\n * Consumed by UI transaction fee row and tooltip provider fee.\n * - `fees.providerFiat`: Fiat on-ramp provider fees only (`providerFee + networkFee` from ramps quote).\n * Optional breakdown; client can derive relay portion via `provider - providerFiat`.\n * - `fees.sourceNetwork` / `fees.targetNetwork`: Relay settlement network fees.\n * Consumed by UI transaction fee row and tooltip network fee.\n * - `fees.metaMask`: MM Pay fee (currently 100 bps over `amountFiat + adjustedAmountFiat`).\n * Consumed by UI transaction fee row and tooltip MetaMask fee.\n * - `totals.total` should represent Amount + Transaction Fee using the totals pipeline.\n */\nfunction combineQuotes({\n adjustedAmountFiat,\n amountFiat,\n fiatQuote,\n relayQuote,\n}: {\n adjustedAmountFiat: string;\n amountFiat: string;\n fiatQuote: RampsQuote;\n relayQuote: TransactionPayQuote<RelayQuote>;\n}): TransactionPayQuote<FiatQuote> {\n const rampsProviderFee = getRampsProviderFee(fiatQuote);\n const totalProviderFee = new BigNumber(relayQuote.fees.provider.usd)\n .plus(rampsProviderFee)\n .toString(10);\n const rampsProviderFeeStr = rampsProviderFee.toString(10);\n const metaMaskFee = getMetaMaskFee({\n adjustedAmountFiat,\n amountFiat,\n }).toString(10);\n\n return {\n ...relayQuote,\n fees: {\n ...relayQuote.fees,\n metaMask: {\n fiat: metaMaskFee,\n usd: metaMaskFee,\n },\n provider: {\n fiat: totalProviderFee,\n usd: totalProviderFee,\n },\n providerFiat: {\n fiat: rampsProviderFeeStr,\n usd: rampsProviderFeeStr,\n },\n },\n original: {\n rampsQuote: fiatQuote,\n relayQuote: relayQuote.original,\n },\n strategy: TransactionPayStrategy.Fiat,\n };\n}\n\n/**\n * Ramps providers handle network gas fees themselves but report them separately\n * as `networkFee` alongside their `providerFee`. We combine both into a single\n * ramps provider fee for the `providerFiat` breakdown.\n *\n * @param fiatQuote - The ramps quote containing provider and network fees.\n * @returns Combined ramps provider fee as a BigNumber.\n */\nfunction getRampsProviderFee(fiatQuote: RampsQuote): BigNumber {\n return new BigNumber(fiatQuote.quote.providerFee ?? 0).plus(\n fiatQuote.quote.networkFee ?? 0,\n );\n}\n\nfunction getRelayTotalFeeUsd(\n relayQuote: TransactionPayQuote<RelayQuote>,\n): BigNumber {\n return new BigNumber(relayQuote.fees.provider.usd)\n .plus(relayQuote.fees.sourceNetwork.estimate.usd)\n .plus(relayQuote.fees.targetNetwork.usd)\n .plus(relayQuote.fees.metaMask.usd);\n}\n\nfunction getMetaMaskFee({\n adjustedAmountFiat,\n amountFiat,\n}: {\n adjustedAmountFiat: BigNumber.Value;\n amountFiat: BigNumber.Value;\n}): BigNumber {\n return new BigNumber(amountFiat).plus(adjustedAmountFiat).dividedBy(100);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fiat-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CACpC,QAA8C;IAE9C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC;AAJD,4CAIC","sourcesContent":["import type { FiatQuote } from './types';\nimport type { PayStrategy, PayStrategyExecuteRequest } from '../../types';\n\n/**\n * Submit Fiat quotes.\n *\n * @param _request - Strategy execute request.\n * @returns Empty transaction hash until fiat submit implementation is added.\n */\nexport async function submitFiatQuotes(\n _request: PayStrategyExecuteRequest<FiatQuote>,\n): ReturnType<PayStrategy<FiatQuote>['execute']> {\n return { transactionHash: undefined };\n}\n"]}
1
+ {"version":3,"file":"fiat-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CACpC,QAA8C;IAE9C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC;AAJD,4CAIC","sourcesContent":["import type { PayStrategy, PayStrategyExecuteRequest } from '../../types';\nimport type { FiatQuote } from './types';\n\n/**\n * Submit Fiat quotes.\n *\n * @param _request - Strategy execute request.\n * @returns Empty transaction hash until fiat submit implementation is added.\n */\nexport async function submitFiatQuotes(\n _request: PayStrategyExecuteRequest<FiatQuote>,\n): ReturnType<PayStrategy<FiatQuote>['execute']> {\n return { transactionHash: undefined };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { FiatQuote } from "./types.cjs";
2
1
  import type { PayStrategy, PayStrategyExecuteRequest } from "../../types.cjs";
2
+ import type { FiatQuote } from "./types.cjs";
3
3
  /**
4
4
  * Submit Fiat quotes.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"fiat-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAgB;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,yBAAyB,EAAE,wBAAoB;AAE1E;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAE/C"}
1
+ {"version":3,"file":"fiat-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,yBAAyB,EAAE,wBAAoB;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAgB;AAEzC;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAE/C"}
@@ -1,5 +1,5 @@
1
- import type { FiatQuote } from "./types.mjs";
2
1
  import type { PayStrategy, PayStrategyExecuteRequest } from "../../types.mjs";
2
+ import type { FiatQuote } from "./types.mjs";
3
3
  /**
4
4
  * Submit Fiat quotes.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"fiat-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAgB;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,yBAAyB,EAAE,wBAAoB;AAE1E;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAE/C"}
1
+ {"version":3,"file":"fiat-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,yBAAyB,EAAE,wBAAoB;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAgB;AAEzC;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAE/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"fiat-submit.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA8C;IAE9C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC","sourcesContent":["import type { FiatQuote } from './types';\nimport type { PayStrategy, PayStrategyExecuteRequest } from '../../types';\n\n/**\n * Submit Fiat quotes.\n *\n * @param _request - Strategy execute request.\n * @returns Empty transaction hash until fiat submit implementation is added.\n */\nexport async function submitFiatQuotes(\n _request: PayStrategyExecuteRequest<FiatQuote>,\n): ReturnType<PayStrategy<FiatQuote>['execute']> {\n return { transactionHash: undefined };\n}\n"]}
1
+ {"version":3,"file":"fiat-submit.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA8C;IAE9C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC","sourcesContent":["import type { PayStrategy, PayStrategyExecuteRequest } from '../../types';\nimport type { FiatQuote } from './types';\n\n/**\n * Submit Fiat quotes.\n *\n * @param _request - Strategy execute request.\n * @returns Empty transaction hash until fiat submit implementation is added.\n */\nexport async function submitFiatQuotes(\n _request: PayStrategyExecuteRequest<FiatQuote>,\n): ReturnType<PayStrategy<FiatQuote>['execute']> {\n return { transactionHash: undefined };\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RelayStrategy = void 0;
4
+ const feature_flags_1 = require("../../utils/feature-flags.cjs");
4
5
  const relay_quotes_1 = require("./relay-quotes.cjs");
5
6
  const relay_submit_1 = require("./relay-submit.cjs");
6
- const feature_flags_1 = require("../../utils/feature-flags.cjs");
7
7
  class RelayStrategy {
8
8
  supports(request) {
9
9
  const config = (0, feature_flags_1.getPayStrategiesConfig)(request.messenger);
@@ -1 +1 @@
1
- {"version":3,"file":"RelayStrategy.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":";;;AAAA,qDAAgD;AAChD,qDAAmD;AAQnD,iEAAmE;AAEnE,MAAa,aAAa;IACxB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,IAAA,sCAAsB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAoC;QAEpC,OAAO,IAAA,6BAAc,EAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA8C;QAE9C,OAAO,MAAM,IAAA,gCAAiB,EAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF;AAjBD,sCAiBC","sourcesContent":["import { getRelayQuotes } from './relay-quotes';\nimport { submitRelayQuotes } from './relay-submit';\nimport type { RelayQuote } from './types';\nimport type {\n PayStrategy,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags';\n\nexport class RelayStrategy implements PayStrategy<RelayQuote> {\n supports(request: PayStrategyGetQuotesRequest): boolean {\n const config = getPayStrategiesConfig(request.messenger);\n return config.relay.enabled;\n }\n\n async getQuotes(\n request: PayStrategyGetQuotesRequest,\n ): Promise<TransactionPayQuote<RelayQuote>[]> {\n return getRelayQuotes(request);\n }\n\n async execute(\n request: PayStrategyExecuteRequest<RelayQuote>,\n ): ReturnType<PayStrategy<RelayQuote>['execute']> {\n return await submitRelayQuotes(request);\n }\n}\n"]}
1
+ {"version":3,"file":"RelayStrategy.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":";;;AAMA,iEAAmE;AACnE,qDAAgD;AAChD,qDAAmD;AAGnD,MAAa,aAAa;IACxB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,IAAA,sCAAsB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAoC;QAEpC,OAAO,IAAA,6BAAc,EAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA8C;QAE9C,OAAO,MAAM,IAAA,gCAAiB,EAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF;AAjBD,sCAiBC","sourcesContent":["import type {\n PayStrategy,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags';\nimport { getRelayQuotes } from './relay-quotes';\nimport { submitRelayQuotes } from './relay-submit';\nimport type { RelayQuote } from './types';\n\nexport class RelayStrategy implements PayStrategy<RelayQuote> {\n supports(request: PayStrategyGetQuotesRequest): boolean {\n const config = getPayStrategiesConfig(request.messenger);\n return config.relay.enabled;\n }\n\n async getQuotes(\n request: PayStrategyGetQuotesRequest,\n ): Promise<TransactionPayQuote<RelayQuote>[]> {\n return getRelayQuotes(request);\n }\n\n async execute(\n request: PayStrategyExecuteRequest<RelayQuote>,\n ): ReturnType<PayStrategy<RelayQuote>['execute']> {\n return await submitRelayQuotes(request);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { RelayQuote } from "./types.cjs";
2
1
  import type { PayStrategy, PayStrategyExecuteRequest, PayStrategyGetQuotesRequest, TransactionPayQuote } from "../../types.cjs";
2
+ import type { RelayQuote } from "./types.cjs";
3
3
  export declare class RelayStrategy implements PayStrategy<RelayQuote> {
4
4
  supports(request: PayStrategyGetQuotesRequest): boolean;
5
5
  getQuotes(request: PayStrategyGetQuotesRequest): Promise<TransactionPayQuote<RelayQuote>[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"RelayStrategy.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAC1C,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;AAGrB,qBAAa,aAAc,YAAW,WAAW,CAAC,UAAU,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO;IAKjD,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;IAIvC,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC;CAGlD"}
1
+ {"version":3,"file":"RelayStrategy.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;AAIrB,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAE1C,qBAAa,aAAc,YAAW,WAAW,CAAC,UAAU,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO;IAKjD,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;IAIvC,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC;CAGlD"}
@@ -1,5 +1,5 @@
1
- import type { RelayQuote } from "./types.mjs";
2
1
  import type { PayStrategy, PayStrategyExecuteRequest, PayStrategyGetQuotesRequest, TransactionPayQuote } from "../../types.mjs";
2
+ import type { RelayQuote } from "./types.mjs";
3
3
  export declare class RelayStrategy implements PayStrategy<RelayQuote> {
4
4
  supports(request: PayStrategyGetQuotesRequest): boolean;
5
5
  getQuotes(request: PayStrategyGetQuotesRequest): Promise<TransactionPayQuote<RelayQuote>[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"RelayStrategy.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAC1C,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;AAGrB,qBAAa,aAAc,YAAW,WAAW,CAAC,UAAU,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO;IAKjD,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;IAIvC,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC;CAGlD"}
1
+ {"version":3,"file":"RelayStrategy.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;AAIrB,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAE1C,qBAAa,aAAc,YAAW,WAAW,CAAC,UAAU,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO;IAKjD,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;IAIvC,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC;CAGlD"}
@@ -1,6 +1,6 @@
1
+ import { getPayStrategiesConfig } from "../../utils/feature-flags.mjs";
1
2
  import { getRelayQuotes } from "./relay-quotes.mjs";
2
3
  import { submitRelayQuotes } from "./relay-submit.mjs";
3
- import { getPayStrategiesConfig } from "../../utils/feature-flags.mjs";
4
4
  export class RelayStrategy {
5
5
  supports(request) {
6
6
  const config = getPayStrategiesConfig(request.messenger);
@@ -1 +1 @@
1
- {"version":3,"file":"RelayStrategy.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,2BAAuB;AAChD,OAAO,EAAE,iBAAiB,EAAE,2BAAuB;AAQnD,OAAO,EAAE,sBAAsB,EAAE,sCAAkC;AAEnE,MAAM,OAAO,aAAa;IACxB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAoC;QAEpC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA8C;QAE9C,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import { getRelayQuotes } from './relay-quotes';\nimport { submitRelayQuotes } from './relay-submit';\nimport type { RelayQuote } from './types';\nimport type {\n PayStrategy,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags';\n\nexport class RelayStrategy implements PayStrategy<RelayQuote> {\n supports(request: PayStrategyGetQuotesRequest): boolean {\n const config = getPayStrategiesConfig(request.messenger);\n return config.relay.enabled;\n }\n\n async getQuotes(\n request: PayStrategyGetQuotesRequest,\n ): Promise<TransactionPayQuote<RelayQuote>[]> {\n return getRelayQuotes(request);\n }\n\n async execute(\n request: PayStrategyExecuteRequest<RelayQuote>,\n ): ReturnType<PayStrategy<RelayQuote>['execute']> {\n return await submitRelayQuotes(request);\n }\n}\n"]}
1
+ {"version":3,"file":"RelayStrategy.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/RelayStrategy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,sCAAkC;AACnE,OAAO,EAAE,cAAc,EAAE,2BAAuB;AAChD,OAAO,EAAE,iBAAiB,EAAE,2BAAuB;AAGnD,MAAM,OAAO,aAAa;IACxB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAoC;QAEpC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA8C;QAE9C,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import type {\n PayStrategy,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags';\nimport { getRelayQuotes } from './relay-quotes';\nimport { submitRelayQuotes } from './relay-submit';\nimport type { RelayQuote } from './types';\n\nexport class RelayStrategy implements PayStrategy<RelayQuote> {\n supports(request: PayStrategyGetQuotesRequest): boolean {\n const config = getPayStrategiesConfig(request.messenger);\n return config.relay.enabled;\n }\n\n async getQuotes(\n request: PayStrategyGetQuotesRequest,\n ): Promise<TransactionPayQuote<RelayQuote>[]> {\n return getRelayQuotes(request);\n }\n\n async execute(\n request: PayStrategyExecuteRequest<RelayQuote>,\n ): ReturnType<PayStrategy<RelayQuote>['execute']> {\n return await submitRelayQuotes(request);\n }\n}\n"]}
@@ -4,9 +4,9 @@ exports.submitHyperliquidWithdraw = void 0;
4
4
  const controller_utils_1 = require("@metamask/controller-utils");
5
5
  const keyring_controller_1 = require("@metamask/keyring-controller");
6
6
  const utils_1 = require("@metamask/utils");
7
- const constants_1 = require("./constants.cjs");
8
- const constants_2 = require("../../constants.cjs");
7
+ const constants_1 = require("../../constants.cjs");
9
8
  const logger_1 = require("../../logger.cjs");
9
+ const constants_2 = require("./constants.cjs");
10
10
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'hyperliquid-withdraw');
11
11
  const DOMAIN_FIELD_MAP = {
12
12
  name: { name: 'name', type: 'string' },
@@ -90,7 +90,7 @@ async function executeAuthorizeStep(step, from, messenger) {
90
90
  data: JSON.stringify(typedData),
91
91
  }, keyring_controller_1.SignTypedDataVersion.V4);
92
92
  log('Posting authorize signature to Relay');
93
- const authorizeUrl = `${constants_1.RELAY_AUTHORIZE_URL}?signature=${signature}`;
93
+ const authorizeUrl = `${constants_2.RELAY_AUTHORIZE_URL}?signature=${signature}`;
94
94
  try {
95
95
  const response = await (0, controller_utils_1.successfulFetch)(authorizeUrl, {
96
96
  method: post.method,
@@ -131,7 +131,7 @@ async function executeDepositStep(step, from, messenger) {
131
131
  // HyperLiquid's EIP-712 signing spec requires Arbitrum's chain ID in the
132
132
  // domain and message. This does not affect which chain the withdrawal
133
133
  // targets — the destination chain is determined by the Relay quote.
134
- const chainId = Number(constants_2.CHAIN_ID_ARBITRUM);
134
+ const chainId = Number(constants_1.CHAIN_ID_ARBITRUM);
135
135
  const domain = {
136
136
  name: 'HyperliquidSignTransaction',
137
137
  version: '1',
@@ -168,7 +168,7 @@ async function executeDepositStep(step, from, messenger) {
168
168
  log('Posting deposit to HyperLiquid exchange');
169
169
  let result;
170
170
  try {
171
- const response = await (0, controller_utils_1.successfulFetch)(constants_1.HYPERLIQUID_EXCHANGE_URL, {
171
+ const response = await (0, controller_utils_1.successfulFetch)(constants_2.HYPERLIQUID_EXCHANGE_URL, {
172
172
  method: 'POST',
173
173
  headers: { 'Content-Type': 'application/json' },
174
174
  body: JSON.stringify({
@@ -1 +1 @@
1
- {"version":3,"file":"hyperliquid-withdraw.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport { SignTypedDataVersion } from '@metamask/keyring-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_AUTHORIZE_URL, HYPERLIQUID_EXCHANGE_URL } from './constants';\nimport type { RelayQuote, RelaySignatureStep } from './types';\nimport { CHAIN_ID_ARBITRUM } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\n\nconst log = createModuleLogger(projectLogger, 'hyperliquid-withdraw');\n\ntype EIP712DomainField = { name: string; type: string };\n\nconst DOMAIN_FIELD_MAP: Record<string, EIP712DomainField> = {\n name: { name: 'name', type: 'string' },\n version: { name: 'version', type: 'string' },\n chainId: { name: 'chainId', type: 'uint256' },\n verifyingContract: { name: 'verifyingContract', type: 'address' },\n salt: { name: 'salt', type: 'bytes32' },\n};\n\n/**\n * Submit a HyperLiquid 2-step withdrawal via Relay.\n *\n * Step 1 (authorize): Sign an EIP-712 nonce-mapping message, POST to Relay /authorize.\n * Step 2 (deposit): Sign an EIP-712 HyperliquidSignTransaction, POST to HyperLiquid exchange.\n *\n * Both signatures are silent (no user confirmation). Both steps share the same nonce\n * from the Relay quote response.\n *\n * @param quote - Relay quote containing the 2-step flow.\n * @param from - User's account address.\n * @param messenger - Controller messenger (for KeyringController:signTypedMessage).\n */\nexport async function submitHyperliquidWithdraw(\n quote: TransactionPayQuote<RelayQuote>,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const { steps } = quote.original;\n\n log('Starting HyperLiquid withdrawal', {\n stepCount: steps.length,\n stepIds: steps.map((step) => step.id),\n });\n\n const authorizeStep = steps.find(\n (step) => step.kind === 'signature' && step.id === 'authorize',\n ) as RelaySignatureStep | undefined;\n\n const depositStep = steps.find((step) => step.id === 'deposit');\n\n if (!authorizeStep || !depositStep) {\n throw new Error(\n `Expected authorize and deposit steps for HyperLiquid withdrawal, got: ${steps.map((step) => `${step.id}(${step.kind})`).join(', ')}`,\n );\n }\n\n // Step 1: Authorize (nonce-mapping signature -> POST to Relay /authorize)\n await executeAuthorizeStep(authorizeStep, from, messenger);\n\n // Step 2: Deposit (HyperLiquid sendAsset -> POST to HyperLiquid exchange)\n await executeDepositStep(depositStep, from, messenger);\n\n log('HyperLiquid withdrawal submitted successfully');\n}\n\n/**\n * Derive the EIP712Domain type array from a domain object.\n * eth-sig-util defaults to EIP712Domain: [] when absent, breaking\n * the domain separator hash. This ensures it matches ethers.js behavior.\n *\n * @param domain - The EIP-712 domain object.\n * @returns The EIP712Domain type array in canonical order.\n */\nfunction deriveEIP712DomainType(\n domain: Record<string, unknown>,\n): EIP712DomainField[] {\n return Object.keys(DOMAIN_FIELD_MAP)\n .filter((key) => key in domain)\n .map((key) => DOMAIN_FIELD_MAP[key]);\n}\n\n/**\n * Execute the authorize step: sign EIP-712 nonce-mapping and POST to Relay.\n *\n * @param step - The authorize signature step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeAuthorizeStep(\n step: RelaySignatureStep,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n if (step.items.length !== 1) {\n throw new Error(\n `Expected exactly 1 authorize item, got ${step.items.length}`,\n );\n }\n\n const item = step.items[0];\n if (!item) {\n throw new Error('Authorize step has no items');\n }\n\n const { sign, post } = item.data;\n\n const typedData = {\n domain: sign.domain,\n types: {\n ...sign.types,\n EIP712Domain: deriveEIP712DomainType(sign.domain),\n },\n primaryType: sign.primaryType,\n message: sign.value,\n };\n\n log('Signing authorize (nonce-mapping)', { domain: sign.domain });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(typedData),\n },\n SignTypedDataVersion.V4,\n );\n\n log('Posting authorize signature to Relay');\n\n const authorizeUrl = `${RELAY_AUTHORIZE_URL}?signature=${signature}`;\n\n try {\n const response = await successfulFetch(authorizeUrl, {\n method: post.method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(post.body),\n });\n\n const result = await response.json();\n\n log('Authorize response', result);\n } catch (error) {\n throw new Error(\n `HyperLiquid authorize failed: ${(error as Error).message}`,\n );\n }\n}\n\n/**\n * Execute the deposit step: sign HyperLiquid sendAsset and POST to HL exchange.\n *\n * The signature data must be constructed from the step's eip712Types and action\n * parameters, following the Relay HyperLiquid integration spec.\n *\n * @param step - The deposit step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeDepositStep(\n step: RelaySignatureStep | { id: string; kind: string; items: unknown[] },\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const items = step.items as { data: Record<string, unknown> }[];\n\n if (items.length !== 1) {\n throw new Error(`Expected exactly 1 deposit item, got ${items.length}`);\n }\n\n const item = items[0];\n if (!item) {\n throw new Error('Deposit step has no items');\n }\n\n const { data } = item;\n\n const action = data.action as {\n type: string;\n parameters: Record<string, unknown>;\n };\n const nonce = data.nonce as number;\n const eip712Types = data.eip712Types as Record<string, unknown>;\n const eip712PrimaryType = data.eip712PrimaryType as string;\n\n // HyperLiquid's EIP-712 signing spec requires Arbitrum's chain ID in the\n // domain and message. This does not affect which chain the withdrawal\n // targets — the destination chain is determined by the Relay quote.\n const chainId = Number(CHAIN_ID_ARBITRUM);\n\n const domain = {\n name: 'HyperliquidSignTransaction',\n version: '1',\n chainId,\n verifyingContract: '0x0000000000000000000000000000000000000000',\n };\n\n const signatureData = {\n domain,\n types: {\n ...eip712Types,\n EIP712Domain: deriveEIP712DomainType(domain),\n },\n primaryType: eip712PrimaryType,\n message: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n };\n\n log('Signing HyperLiquid deposit (sendAsset)', {\n nonce,\n action: action.type,\n });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(signatureData),\n },\n SignTypedDataVersion.V4,\n );\n\n // eslint-disable-next-line id-length\n const r = signature.slice(0, 66);\n // eslint-disable-next-line id-length\n const s = `0x${signature.slice(66, 130)}`;\n // eslint-disable-next-line id-length\n const v = parseInt(signature.slice(130, 132), 16);\n\n log('Posting deposit to HyperLiquid exchange');\n\n let result: unknown;\n\n try {\n const response = await successfulFetch(HYPERLIQUID_EXCHANGE_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n action: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n nonce,\n signature: { r, s, v },\n }),\n });\n\n result = await response.json();\n } catch (error) {\n throw new Error(`HyperLiquid deposit failed: ${(error as Error).message}`);\n }\n\n if ((result as { status?: string })?.status !== 'ok') {\n throw new Error(`HyperLiquid deposit failed: ${JSON.stringify(result)}`);\n }\n\n log('HyperLiquid deposit response', result);\n}\n"]}
1
+ {"version":3,"file":"hyperliquid-withdraw.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAC7D,qEAAoE;AAEpE,2CAAqD;AAErD,mDAAoD;AACpD,6CAA6C;AAK7C,+CAA4E;AAG5E,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAItE,MAAM,gBAAgB,GAAsC;IAC1D,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;IACtC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC5C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC7C,iBAAiB,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;IACjE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;CACxC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,yBAAyB,CAC7C,KAAsC,EACtC,IAAS,EACT,SAA4C;IAE5C,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;IAEjC,GAAG,CAAC,iCAAiC,EAAE;QACrC,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;KACtC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,EAAE,KAAK,WAAW,CAC7B,CAAC;IAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAEhE,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,yEAAyE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtI,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,MAAM,oBAAoB,CAAC,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAE3D,0EAA0E;IAC1E,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAEvD,GAAG,CAAC,+CAA+C,CAAC,CAAC;AACvD,CAAC;AA/BD,8DA+BC;AAED;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAC7B,MAA+B;IAE/B,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;SACjC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC;SAC9B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,oBAAoB,CACjC,IAAwB,EACxB,IAAS,EACT,SAA4C;IAE5C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAEjC,MAAM,SAAS,GAAG;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE;YACL,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC;SAClD;QACD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,KAAK;KACpB,CAAC;IAEF,GAAG,CAAC,mCAAmC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,IAAI,CACpC,oCAAoC,EACpC;QACE,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;KAChC,EACD,yCAAoB,CAAC,EAAE,CACxB,CAAC;IAEF,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAG,GAAG,+BAAmB,cAAc,SAAS,EAAE,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,YAAY,EAAE;YACnD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAErC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iCAAkC,KAAe,CAAC,OAAO,EAAE,CAC5D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAAyE,EACzE,IAAS,EACT,SAA4C;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAA4C,CAAC;IAEhE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAGnB,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAsC,CAAC;IAChE,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAA2B,CAAC;IAE3D,yEAAyE;IACzE,sEAAsE;IACtE,oEAAoE;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,6BAAiB,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,GAAG;QACZ,OAAO;QACP,iBAAiB,EAAE,4CAA4C;KAChE,CAAC;IAEF,MAAM,aAAa,GAAG;QACpB,MAAM;QACN,KAAK,EAAE;YACL,GAAG,WAAW;YACd,YAAY,EAAE,sBAAsB,CAAC,MAAM,CAAC;SAC7C;QACD,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE;YACP,GAAG,MAAM,CAAC,UAAU;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,gBAAgB,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;SAC9C;KACF,CAAC;IAEF,GAAG,CAAC,yCAAyC,EAAE;QAC7C,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,IAAI;KACpB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,IAAI,CACpC,oCAAoC,EACpC;QACE,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;KACpC,EACD,yCAAoB,CAAC,EAAE,CACxB,CAAC;IAEF,qCAAqC;IACrC,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjC,qCAAqC;IACrC,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;IAC1C,qCAAqC;IACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAElD,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAE/C,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,oCAAwB,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE;oBACN,GAAG,MAAM,CAAC,UAAU;oBACpB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,gBAAgB,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;iBAC9C;gBACD,KAAK;gBACL,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;aACvB,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAAgC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAK,MAA8B,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport { SignTypedDataVersion } from '@metamask/keyring-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { CHAIN_ID_ARBITRUM } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { RELAY_AUTHORIZE_URL, HYPERLIQUID_EXCHANGE_URL } from './constants';\nimport type { RelayQuote, RelaySignatureStep } from './types';\n\nconst log = createModuleLogger(projectLogger, 'hyperliquid-withdraw');\n\ntype EIP712DomainField = { name: string; type: string };\n\nconst DOMAIN_FIELD_MAP: Record<string, EIP712DomainField> = {\n name: { name: 'name', type: 'string' },\n version: { name: 'version', type: 'string' },\n chainId: { name: 'chainId', type: 'uint256' },\n verifyingContract: { name: 'verifyingContract', type: 'address' },\n salt: { name: 'salt', type: 'bytes32' },\n};\n\n/**\n * Submit a HyperLiquid 2-step withdrawal via Relay.\n *\n * Step 1 (authorize): Sign an EIP-712 nonce-mapping message, POST to Relay /authorize.\n * Step 2 (deposit): Sign an EIP-712 HyperliquidSignTransaction, POST to HyperLiquid exchange.\n *\n * Both signatures are silent (no user confirmation). Both steps share the same nonce\n * from the Relay quote response.\n *\n * @param quote - Relay quote containing the 2-step flow.\n * @param from - User's account address.\n * @param messenger - Controller messenger (for KeyringController:signTypedMessage).\n */\nexport async function submitHyperliquidWithdraw(\n quote: TransactionPayQuote<RelayQuote>,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const { steps } = quote.original;\n\n log('Starting HyperLiquid withdrawal', {\n stepCount: steps.length,\n stepIds: steps.map((step) => step.id),\n });\n\n const authorizeStep = steps.find(\n (step) => step.kind === 'signature' && step.id === 'authorize',\n ) as RelaySignatureStep | undefined;\n\n const depositStep = steps.find((step) => step.id === 'deposit');\n\n if (!authorizeStep || !depositStep) {\n throw new Error(\n `Expected authorize and deposit steps for HyperLiquid withdrawal, got: ${steps.map((step) => `${step.id}(${step.kind})`).join(', ')}`,\n );\n }\n\n // Step 1: Authorize (nonce-mapping signature -> POST to Relay /authorize)\n await executeAuthorizeStep(authorizeStep, from, messenger);\n\n // Step 2: Deposit (HyperLiquid sendAsset -> POST to HyperLiquid exchange)\n await executeDepositStep(depositStep, from, messenger);\n\n log('HyperLiquid withdrawal submitted successfully');\n}\n\n/**\n * Derive the EIP712Domain type array from a domain object.\n * eth-sig-util defaults to EIP712Domain: [] when absent, breaking\n * the domain separator hash. This ensures it matches ethers.js behavior.\n *\n * @param domain - The EIP-712 domain object.\n * @returns The EIP712Domain type array in canonical order.\n */\nfunction deriveEIP712DomainType(\n domain: Record<string, unknown>,\n): EIP712DomainField[] {\n return Object.keys(DOMAIN_FIELD_MAP)\n .filter((key) => key in domain)\n .map((key) => DOMAIN_FIELD_MAP[key]);\n}\n\n/**\n * Execute the authorize step: sign EIP-712 nonce-mapping and POST to Relay.\n *\n * @param step - The authorize signature step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeAuthorizeStep(\n step: RelaySignatureStep,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n if (step.items.length !== 1) {\n throw new Error(\n `Expected exactly 1 authorize item, got ${step.items.length}`,\n );\n }\n\n const item = step.items[0];\n if (!item) {\n throw new Error('Authorize step has no items');\n }\n\n const { sign, post } = item.data;\n\n const typedData = {\n domain: sign.domain,\n types: {\n ...sign.types,\n EIP712Domain: deriveEIP712DomainType(sign.domain),\n },\n primaryType: sign.primaryType,\n message: sign.value,\n };\n\n log('Signing authorize (nonce-mapping)', { domain: sign.domain });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(typedData),\n },\n SignTypedDataVersion.V4,\n );\n\n log('Posting authorize signature to Relay');\n\n const authorizeUrl = `${RELAY_AUTHORIZE_URL}?signature=${signature}`;\n\n try {\n const response = await successfulFetch(authorizeUrl, {\n method: post.method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(post.body),\n });\n\n const result = await response.json();\n\n log('Authorize response', result);\n } catch (error) {\n throw new Error(\n `HyperLiquid authorize failed: ${(error as Error).message}`,\n );\n }\n}\n\n/**\n * Execute the deposit step: sign HyperLiquid sendAsset and POST to HL exchange.\n *\n * The signature data must be constructed from the step's eip712Types and action\n * parameters, following the Relay HyperLiquid integration spec.\n *\n * @param step - The deposit step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeDepositStep(\n step: RelaySignatureStep | { id: string; kind: string; items: unknown[] },\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const items = step.items as { data: Record<string, unknown> }[];\n\n if (items.length !== 1) {\n throw new Error(`Expected exactly 1 deposit item, got ${items.length}`);\n }\n\n const item = items[0];\n if (!item) {\n throw new Error('Deposit step has no items');\n }\n\n const { data } = item;\n\n const action = data.action as {\n type: string;\n parameters: Record<string, unknown>;\n };\n const nonce = data.nonce as number;\n const eip712Types = data.eip712Types as Record<string, unknown>;\n const eip712PrimaryType = data.eip712PrimaryType as string;\n\n // HyperLiquid's EIP-712 signing spec requires Arbitrum's chain ID in the\n // domain and message. This does not affect which chain the withdrawal\n // targets — the destination chain is determined by the Relay quote.\n const chainId = Number(CHAIN_ID_ARBITRUM);\n\n const domain = {\n name: 'HyperliquidSignTransaction',\n version: '1',\n chainId,\n verifyingContract: '0x0000000000000000000000000000000000000000',\n };\n\n const signatureData = {\n domain,\n types: {\n ...eip712Types,\n EIP712Domain: deriveEIP712DomainType(domain),\n },\n primaryType: eip712PrimaryType,\n message: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n };\n\n log('Signing HyperLiquid deposit (sendAsset)', {\n nonce,\n action: action.type,\n });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(signatureData),\n },\n SignTypedDataVersion.V4,\n );\n\n // eslint-disable-next-line id-length\n const r = signature.slice(0, 66);\n // eslint-disable-next-line id-length\n const s = `0x${signature.slice(66, 130)}`;\n // eslint-disable-next-line id-length\n const v = parseInt(signature.slice(130, 132), 16);\n\n log('Posting deposit to HyperLiquid exchange');\n\n let result: unknown;\n\n try {\n const response = await successfulFetch(HYPERLIQUID_EXCHANGE_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n action: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n nonce,\n signature: { r, s, v },\n }),\n });\n\n result = await response.json();\n } catch (error) {\n throw new Error(`HyperLiquid deposit failed: ${(error as Error).message}`);\n }\n\n if ((result as { status?: string })?.status !== 'ok') {\n throw new Error(`HyperLiquid deposit failed: ${JSON.stringify(result)}`);\n }\n\n log('HyperLiquid deposit response', result);\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { Hex } from "@metamask/utils";
2
- import type { RelayQuote } from "./types.cjs";
3
2
  import type { TransactionPayControllerMessenger, TransactionPayQuote } from "../../types.cjs";
3
+ import type { RelayQuote } from "./types.cjs";
4
4
  /**
5
5
  * Submit a HyperLiquid 2-step withdrawal via Relay.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hyperliquid-withdraw.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAsB,oBAAgB;AAG9D,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAcrB;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
1
+ {"version":3,"file":"hyperliquid-withdraw.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAErB,OAAO,KAAK,EAAE,UAAU,EAAsB,oBAAgB;AAc9D;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
@@ -1,6 +1,6 @@
1
1
  import type { Hex } from "@metamask/utils";
2
- import type { RelayQuote } from "./types.mjs";
3
2
  import type { TransactionPayControllerMessenger, TransactionPayQuote } from "../../types.mjs";
3
+ import type { RelayQuote } from "./types.mjs";
4
4
  /**
5
5
  * Submit a HyperLiquid 2-step withdrawal via Relay.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hyperliquid-withdraw.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAsB,oBAAgB;AAG9D,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAcrB;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
1
+ {"version":3,"file":"hyperliquid-withdraw.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAErB,OAAO,KAAK,EAAE,UAAU,EAAsB,oBAAgB;AAc9D;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
@@ -1,9 +1,9 @@
1
1
  import { successfulFetch } from "@metamask/controller-utils";
2
2
  import { SignTypedDataVersion } from "@metamask/keyring-controller";
3
3
  import { createModuleLogger } from "@metamask/utils";
4
- import { RELAY_AUTHORIZE_URL, HYPERLIQUID_EXCHANGE_URL } from "./constants.mjs";
5
4
  import { CHAIN_ID_ARBITRUM } from "../../constants.mjs";
6
5
  import { projectLogger } from "../../logger.mjs";
6
+ import { RELAY_AUTHORIZE_URL, HYPERLIQUID_EXCHANGE_URL } from "./constants.mjs";
7
7
  const log = createModuleLogger(projectLogger, 'hyperliquid-withdraw');
8
8
  const DOMAIN_FIELD_MAP = {
9
9
  name: { name: 'name', type: 'string' },
@@ -1 +1 @@
1
- {"version":3,"file":"hyperliquid-withdraw.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport { SignTypedDataVersion } from '@metamask/keyring-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_AUTHORIZE_URL, HYPERLIQUID_EXCHANGE_URL } from './constants';\nimport type { RelayQuote, RelaySignatureStep } from './types';\nimport { CHAIN_ID_ARBITRUM } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\n\nconst log = createModuleLogger(projectLogger, 'hyperliquid-withdraw');\n\ntype EIP712DomainField = { name: string; type: string };\n\nconst DOMAIN_FIELD_MAP: Record<string, EIP712DomainField> = {\n name: { name: 'name', type: 'string' },\n version: { name: 'version', type: 'string' },\n chainId: { name: 'chainId', type: 'uint256' },\n verifyingContract: { name: 'verifyingContract', type: 'address' },\n salt: { name: 'salt', type: 'bytes32' },\n};\n\n/**\n * Submit a HyperLiquid 2-step withdrawal via Relay.\n *\n * Step 1 (authorize): Sign an EIP-712 nonce-mapping message, POST to Relay /authorize.\n * Step 2 (deposit): Sign an EIP-712 HyperliquidSignTransaction, POST to HyperLiquid exchange.\n *\n * Both signatures are silent (no user confirmation). Both steps share the same nonce\n * from the Relay quote response.\n *\n * @param quote - Relay quote containing the 2-step flow.\n * @param from - User's account address.\n * @param messenger - Controller messenger (for KeyringController:signTypedMessage).\n */\nexport async function submitHyperliquidWithdraw(\n quote: TransactionPayQuote<RelayQuote>,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const { steps } = quote.original;\n\n log('Starting HyperLiquid withdrawal', {\n stepCount: steps.length,\n stepIds: steps.map((step) => step.id),\n });\n\n const authorizeStep = steps.find(\n (step) => step.kind === 'signature' && step.id === 'authorize',\n ) as RelaySignatureStep | undefined;\n\n const depositStep = steps.find((step) => step.id === 'deposit');\n\n if (!authorizeStep || !depositStep) {\n throw new Error(\n `Expected authorize and deposit steps for HyperLiquid withdrawal, got: ${steps.map((step) => `${step.id}(${step.kind})`).join(', ')}`,\n );\n }\n\n // Step 1: Authorize (nonce-mapping signature -> POST to Relay /authorize)\n await executeAuthorizeStep(authorizeStep, from, messenger);\n\n // Step 2: Deposit (HyperLiquid sendAsset -> POST to HyperLiquid exchange)\n await executeDepositStep(depositStep, from, messenger);\n\n log('HyperLiquid withdrawal submitted successfully');\n}\n\n/**\n * Derive the EIP712Domain type array from a domain object.\n * eth-sig-util defaults to EIP712Domain: [] when absent, breaking\n * the domain separator hash. This ensures it matches ethers.js behavior.\n *\n * @param domain - The EIP-712 domain object.\n * @returns The EIP712Domain type array in canonical order.\n */\nfunction deriveEIP712DomainType(\n domain: Record<string, unknown>,\n): EIP712DomainField[] {\n return Object.keys(DOMAIN_FIELD_MAP)\n .filter((key) => key in domain)\n .map((key) => DOMAIN_FIELD_MAP[key]);\n}\n\n/**\n * Execute the authorize step: sign EIP-712 nonce-mapping and POST to Relay.\n *\n * @param step - The authorize signature step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeAuthorizeStep(\n step: RelaySignatureStep,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n if (step.items.length !== 1) {\n throw new Error(\n `Expected exactly 1 authorize item, got ${step.items.length}`,\n );\n }\n\n const item = step.items[0];\n if (!item) {\n throw new Error('Authorize step has no items');\n }\n\n const { sign, post } = item.data;\n\n const typedData = {\n domain: sign.domain,\n types: {\n ...sign.types,\n EIP712Domain: deriveEIP712DomainType(sign.domain),\n },\n primaryType: sign.primaryType,\n message: sign.value,\n };\n\n log('Signing authorize (nonce-mapping)', { domain: sign.domain });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(typedData),\n },\n SignTypedDataVersion.V4,\n );\n\n log('Posting authorize signature to Relay');\n\n const authorizeUrl = `${RELAY_AUTHORIZE_URL}?signature=${signature}`;\n\n try {\n const response = await successfulFetch(authorizeUrl, {\n method: post.method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(post.body),\n });\n\n const result = await response.json();\n\n log('Authorize response', result);\n } catch (error) {\n throw new Error(\n `HyperLiquid authorize failed: ${(error as Error).message}`,\n );\n }\n}\n\n/**\n * Execute the deposit step: sign HyperLiquid sendAsset and POST to HL exchange.\n *\n * The signature data must be constructed from the step's eip712Types and action\n * parameters, following the Relay HyperLiquid integration spec.\n *\n * @param step - The deposit step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeDepositStep(\n step: RelaySignatureStep | { id: string; kind: string; items: unknown[] },\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const items = step.items as { data: Record<string, unknown> }[];\n\n if (items.length !== 1) {\n throw new Error(`Expected exactly 1 deposit item, got ${items.length}`);\n }\n\n const item = items[0];\n if (!item) {\n throw new Error('Deposit step has no items');\n }\n\n const { data } = item;\n\n const action = data.action as {\n type: string;\n parameters: Record<string, unknown>;\n };\n const nonce = data.nonce as number;\n const eip712Types = data.eip712Types as Record<string, unknown>;\n const eip712PrimaryType = data.eip712PrimaryType as string;\n\n // HyperLiquid's EIP-712 signing spec requires Arbitrum's chain ID in the\n // domain and message. This does not affect which chain the withdrawal\n // targets — the destination chain is determined by the Relay quote.\n const chainId = Number(CHAIN_ID_ARBITRUM);\n\n const domain = {\n name: 'HyperliquidSignTransaction',\n version: '1',\n chainId,\n verifyingContract: '0x0000000000000000000000000000000000000000',\n };\n\n const signatureData = {\n domain,\n types: {\n ...eip712Types,\n EIP712Domain: deriveEIP712DomainType(domain),\n },\n primaryType: eip712PrimaryType,\n message: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n };\n\n log('Signing HyperLiquid deposit (sendAsset)', {\n nonce,\n action: action.type,\n });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(signatureData),\n },\n SignTypedDataVersion.V4,\n );\n\n // eslint-disable-next-line id-length\n const r = signature.slice(0, 66);\n // eslint-disable-next-line id-length\n const s = `0x${signature.slice(66, 130)}`;\n // eslint-disable-next-line id-length\n const v = parseInt(signature.slice(130, 132), 16);\n\n log('Posting deposit to HyperLiquid exchange');\n\n let result: unknown;\n\n try {\n const response = await successfulFetch(HYPERLIQUID_EXCHANGE_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n action: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n nonce,\n signature: { r, s, v },\n }),\n });\n\n result = await response.json();\n } catch (error) {\n throw new Error(`HyperLiquid deposit failed: ${(error as Error).message}`);\n }\n\n if ((result as { status?: string })?.status !== 'ok') {\n throw new Error(`HyperLiquid deposit failed: ${JSON.stringify(result)}`);\n }\n\n log('HyperLiquid deposit response', result);\n}\n"]}
1
+ {"version":3,"file":"hyperliquid-withdraw.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/hyperliquid-withdraw.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport { SignTypedDataVersion } from '@metamask/keyring-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { CHAIN_ID_ARBITRUM } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { RELAY_AUTHORIZE_URL, HYPERLIQUID_EXCHANGE_URL } from './constants';\nimport type { RelayQuote, RelaySignatureStep } from './types';\n\nconst log = createModuleLogger(projectLogger, 'hyperliquid-withdraw');\n\ntype EIP712DomainField = { name: string; type: string };\n\nconst DOMAIN_FIELD_MAP: Record<string, EIP712DomainField> = {\n name: { name: 'name', type: 'string' },\n version: { name: 'version', type: 'string' },\n chainId: { name: 'chainId', type: 'uint256' },\n verifyingContract: { name: 'verifyingContract', type: 'address' },\n salt: { name: 'salt', type: 'bytes32' },\n};\n\n/**\n * Submit a HyperLiquid 2-step withdrawal via Relay.\n *\n * Step 1 (authorize): Sign an EIP-712 nonce-mapping message, POST to Relay /authorize.\n * Step 2 (deposit): Sign an EIP-712 HyperliquidSignTransaction, POST to HyperLiquid exchange.\n *\n * Both signatures are silent (no user confirmation). Both steps share the same nonce\n * from the Relay quote response.\n *\n * @param quote - Relay quote containing the 2-step flow.\n * @param from - User's account address.\n * @param messenger - Controller messenger (for KeyringController:signTypedMessage).\n */\nexport async function submitHyperliquidWithdraw(\n quote: TransactionPayQuote<RelayQuote>,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const { steps } = quote.original;\n\n log('Starting HyperLiquid withdrawal', {\n stepCount: steps.length,\n stepIds: steps.map((step) => step.id),\n });\n\n const authorizeStep = steps.find(\n (step) => step.kind === 'signature' && step.id === 'authorize',\n ) as RelaySignatureStep | undefined;\n\n const depositStep = steps.find((step) => step.id === 'deposit');\n\n if (!authorizeStep || !depositStep) {\n throw new Error(\n `Expected authorize and deposit steps for HyperLiquid withdrawal, got: ${steps.map((step) => `${step.id}(${step.kind})`).join(', ')}`,\n );\n }\n\n // Step 1: Authorize (nonce-mapping signature -> POST to Relay /authorize)\n await executeAuthorizeStep(authorizeStep, from, messenger);\n\n // Step 2: Deposit (HyperLiquid sendAsset -> POST to HyperLiquid exchange)\n await executeDepositStep(depositStep, from, messenger);\n\n log('HyperLiquid withdrawal submitted successfully');\n}\n\n/**\n * Derive the EIP712Domain type array from a domain object.\n * eth-sig-util defaults to EIP712Domain: [] when absent, breaking\n * the domain separator hash. This ensures it matches ethers.js behavior.\n *\n * @param domain - The EIP-712 domain object.\n * @returns The EIP712Domain type array in canonical order.\n */\nfunction deriveEIP712DomainType(\n domain: Record<string, unknown>,\n): EIP712DomainField[] {\n return Object.keys(DOMAIN_FIELD_MAP)\n .filter((key) => key in domain)\n .map((key) => DOMAIN_FIELD_MAP[key]);\n}\n\n/**\n * Execute the authorize step: sign EIP-712 nonce-mapping and POST to Relay.\n *\n * @param step - The authorize signature step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeAuthorizeStep(\n step: RelaySignatureStep,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n if (step.items.length !== 1) {\n throw new Error(\n `Expected exactly 1 authorize item, got ${step.items.length}`,\n );\n }\n\n const item = step.items[0];\n if (!item) {\n throw new Error('Authorize step has no items');\n }\n\n const { sign, post } = item.data;\n\n const typedData = {\n domain: sign.domain,\n types: {\n ...sign.types,\n EIP712Domain: deriveEIP712DomainType(sign.domain),\n },\n primaryType: sign.primaryType,\n message: sign.value,\n };\n\n log('Signing authorize (nonce-mapping)', { domain: sign.domain });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(typedData),\n },\n SignTypedDataVersion.V4,\n );\n\n log('Posting authorize signature to Relay');\n\n const authorizeUrl = `${RELAY_AUTHORIZE_URL}?signature=${signature}`;\n\n try {\n const response = await successfulFetch(authorizeUrl, {\n method: post.method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(post.body),\n });\n\n const result = await response.json();\n\n log('Authorize response', result);\n } catch (error) {\n throw new Error(\n `HyperLiquid authorize failed: ${(error as Error).message}`,\n );\n }\n}\n\n/**\n * Execute the deposit step: sign HyperLiquid sendAsset and POST to HL exchange.\n *\n * The signature data must be constructed from the step's eip712Types and action\n * parameters, following the Relay HyperLiquid integration spec.\n *\n * @param step - The deposit step from the Relay quote.\n * @param from - User's account address.\n * @param messenger - Controller messenger for signing.\n */\nasync function executeDepositStep(\n step: RelaySignatureStep | { id: string; kind: string; items: unknown[] },\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const items = step.items as { data: Record<string, unknown> }[];\n\n if (items.length !== 1) {\n throw new Error(`Expected exactly 1 deposit item, got ${items.length}`);\n }\n\n const item = items[0];\n if (!item) {\n throw new Error('Deposit step has no items');\n }\n\n const { data } = item;\n\n const action = data.action as {\n type: string;\n parameters: Record<string, unknown>;\n };\n const nonce = data.nonce as number;\n const eip712Types = data.eip712Types as Record<string, unknown>;\n const eip712PrimaryType = data.eip712PrimaryType as string;\n\n // HyperLiquid's EIP-712 signing spec requires Arbitrum's chain ID in the\n // domain and message. This does not affect which chain the withdrawal\n // targets — the destination chain is determined by the Relay quote.\n const chainId = Number(CHAIN_ID_ARBITRUM);\n\n const domain = {\n name: 'HyperliquidSignTransaction',\n version: '1',\n chainId,\n verifyingContract: '0x0000000000000000000000000000000000000000',\n };\n\n const signatureData = {\n domain,\n types: {\n ...eip712Types,\n EIP712Domain: deriveEIP712DomainType(domain),\n },\n primaryType: eip712PrimaryType,\n message: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n };\n\n log('Signing HyperLiquid deposit (sendAsset)', {\n nonce,\n action: action.type,\n });\n\n const signature = await messenger.call(\n 'KeyringController:signTypedMessage',\n {\n from,\n data: JSON.stringify(signatureData),\n },\n SignTypedDataVersion.V4,\n );\n\n // eslint-disable-next-line id-length\n const r = signature.slice(0, 66);\n // eslint-disable-next-line id-length\n const s = `0x${signature.slice(66, 130)}`;\n // eslint-disable-next-line id-length\n const v = parseInt(signature.slice(130, 132), 16);\n\n log('Posting deposit to HyperLiquid exchange');\n\n let result: unknown;\n\n try {\n const response = await successfulFetch(HYPERLIQUID_EXCHANGE_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n action: {\n ...action.parameters,\n type: action.type,\n signatureChainId: `0x${chainId.toString(16)}`,\n },\n nonce,\n signature: { r, s, v },\n }),\n });\n\n result = await response.json();\n } catch (error) {\n throw new Error(`HyperLiquid deposit failed: ${(error as Error).message}`);\n }\n\n if ((result as { status?: string })?.status !== 'ok') {\n throw new Error(`HyperLiquid deposit failed: ${JSON.stringify(result)}`);\n }\n\n log('HyperLiquid deposit response', result);\n}\n"]}
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getRelayStatus = exports.submitRelayExecute = exports.fetchRelayQuote = void 0;
4
4
  const controller_utils_1 = require("@metamask/controller-utils");
5
- const constants_1 = require("./constants.cjs");
6
5
  const feature_flags_1 = require("../../utils/feature-flags.cjs");
6
+ const constants_1 = require("./constants.cjs");
7
7
  /**
8
8
  * Fetch a quote from the Relay API.
9
9
  *
@@ -1 +1 @@
1
- {"version":3,"file":"relay-api.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAE7D,+CAA+C;AAS/C,iEAA4D;AAE5D;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CACnC,SAA4C,EAC5C,IAAuB;IAEvB,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,+BAAe,EAAC,SAAS,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,aAAa,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;IACpD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC;AAhBD,0CAgBC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,kBAAkB,CACtC,SAA4C,EAC5C,IAAyB;IAEzB,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,+BAAe,EAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,eAAe,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;AACzD,CAAC;AAbD,gDAaC;AAED;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAClC,SAAiB;IAEjB,MAAM,GAAG,GAAG,GAAG,4BAAgB,cAAc,SAAS,EAAE,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;AACxD,CAAC;AARD,wCAQC","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\n\nimport { RELAY_STATUS_URL } from './constants';\nimport type {\n RelayExecuteRequest,\n RelayExecuteResponse,\n RelayQuote,\n RelayQuoteRequest,\n RelayStatusResponse,\n} from './types';\nimport type { TransactionPayControllerMessenger } from '../../types';\nimport { getFeatureFlags } from '../../utils/feature-flags';\n\n/**\n * Fetch a quote from the Relay API.\n *\n * @param messenger - Controller messenger.\n * @param body - Quote request parameters.\n * @returns The Relay quote with the request attached.\n */\nexport async function fetchRelayQuote(\n messenger: TransactionPayControllerMessenger,\n body: RelayQuoteRequest,\n): Promise<RelayQuote> {\n const { relayQuoteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayQuoteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n quote.request = body;\n\n return quote;\n}\n\n/**\n * Submit a gasless transaction via the Relay /execute endpoint.\n *\n * @param messenger - Controller messenger.\n * @param body - Execute request parameters.\n * @returns The execute response containing the request ID.\n */\nexport async function submitRelayExecute(\n messenger: TransactionPayControllerMessenger,\n body: RelayExecuteRequest,\n): Promise<RelayExecuteResponse> {\n const { relayExecuteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayExecuteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n return (await response.json()) as RelayExecuteResponse;\n}\n\n/**\n * Poll the Relay status endpoint for a given request ID.\n *\n * @param requestId - The Relay request ID to check.\n * @returns The current status of the request.\n */\nexport async function getRelayStatus(\n requestId: string,\n): Promise<RelayStatusResponse> {\n const url = `${RELAY_STATUS_URL}?requestId=${requestId}`;\n\n const response = await successfulFetch(url, { method: 'GET' });\n\n return (await response.json()) as RelayStatusResponse;\n}\n"]}
1
+ {"version":3,"file":"relay-api.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAG7D,iEAA4D;AAC5D,+CAA+C;AAS/C;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CACnC,SAA4C,EAC5C,IAAuB;IAEvB,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,+BAAe,EAAC,SAAS,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,aAAa,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;IACpD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC;AAhBD,0CAgBC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,kBAAkB,CACtC,SAA4C,EAC5C,IAAyB;IAEzB,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,+BAAe,EAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,eAAe,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;AACzD,CAAC;AAbD,gDAaC;AAED;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAClC,SAAiB;IAEjB,MAAM,GAAG,GAAG,GAAG,4BAAgB,cAAc,SAAS,EAAE,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;AACxD,CAAC;AARD,wCAQC","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\n\nimport type { TransactionPayControllerMessenger } from '../../types';\nimport { getFeatureFlags } from '../../utils/feature-flags';\nimport { RELAY_STATUS_URL } from './constants';\nimport type {\n RelayExecuteRequest,\n RelayExecuteResponse,\n RelayQuote,\n RelayQuoteRequest,\n RelayStatusResponse,\n} from './types';\n\n/**\n * Fetch a quote from the Relay API.\n *\n * @param messenger - Controller messenger.\n * @param body - Quote request parameters.\n * @returns The Relay quote with the request attached.\n */\nexport async function fetchRelayQuote(\n messenger: TransactionPayControllerMessenger,\n body: RelayQuoteRequest,\n): Promise<RelayQuote> {\n const { relayQuoteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayQuoteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n quote.request = body;\n\n return quote;\n}\n\n/**\n * Submit a gasless transaction via the Relay /execute endpoint.\n *\n * @param messenger - Controller messenger.\n * @param body - Execute request parameters.\n * @returns The execute response containing the request ID.\n */\nexport async function submitRelayExecute(\n messenger: TransactionPayControllerMessenger,\n body: RelayExecuteRequest,\n): Promise<RelayExecuteResponse> {\n const { relayExecuteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayExecuteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n return (await response.json()) as RelayExecuteResponse;\n}\n\n/**\n * Poll the Relay status endpoint for a given request ID.\n *\n * @param requestId - The Relay request ID to check.\n * @returns The current status of the request.\n */\nexport async function getRelayStatus(\n requestId: string,\n): Promise<RelayStatusResponse> {\n const url = `${RELAY_STATUS_URL}?requestId=${requestId}`;\n\n const response = await successfulFetch(url, { method: 'GET' });\n\n return (await response.json()) as RelayStatusResponse;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { RelayExecuteRequest, RelayExecuteResponse, RelayQuote, RelayQuoteRequest, RelayStatusResponse } from "./types.cjs";
2
1
  import type { TransactionPayControllerMessenger } from "../../types.cjs";
2
+ import type { RelayExecuteRequest, RelayExecuteResponse, RelayQuote, RelayQuoteRequest, RelayStatusResponse } from "./types.cjs";
3
3
  /**
4
4
  * Fetch a quote from the Relay API.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"relay-api.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACpB,oBAAgB;AACjB,OAAO,KAAK,EAAE,iCAAiC,EAAE,wBAAoB;AAGrE;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAU/B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAM9B"}
1
+ {"version":3,"file":"relay-api.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iCAAiC,EAAE,wBAAoB;AAGrE,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACpB,oBAAgB;AAEjB;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAU/B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAM9B"}
@@ -1,5 +1,5 @@
1
- import type { RelayExecuteRequest, RelayExecuteResponse, RelayQuote, RelayQuoteRequest, RelayStatusResponse } from "./types.mjs";
2
1
  import type { TransactionPayControllerMessenger } from "../../types.mjs";
2
+ import type { RelayExecuteRequest, RelayExecuteResponse, RelayQuote, RelayQuoteRequest, RelayStatusResponse } from "./types.mjs";
3
3
  /**
4
4
  * Fetch a quote from the Relay API.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"relay-api.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACpB,oBAAgB;AACjB,OAAO,KAAK,EAAE,iCAAiC,EAAE,wBAAoB;AAGrE;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAU/B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAM9B"}
1
+ {"version":3,"file":"relay-api.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iCAAiC,EAAE,wBAAoB;AAGrE,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACpB,oBAAgB;AAEjB;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAU/B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAM9B"}
@@ -1,6 +1,6 @@
1
1
  import { successfulFetch } from "@metamask/controller-utils";
2
- import { RELAY_STATUS_URL } from "./constants.mjs";
3
2
  import { getFeatureFlags } from "../../utils/feature-flags.mjs";
3
+ import { RELAY_STATUS_URL } from "./constants.mjs";
4
4
  /**
5
5
  * Fetch a quote from the Relay API.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"relay-api.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mCAAmC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,wBAAoB;AAS/C,OAAO,EAAE,eAAe,EAAE,sCAAkC;AAE5D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAA4C,EAC5C,IAAuB;IAEvB,MAAM,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;IACpD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA4C,EAC5C,IAAyB;IAEzB,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,eAAe,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB;IAEjB,MAAM,GAAG,GAAG,GAAG,gBAAgB,cAAc,SAAS,EAAE,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;AACxD,CAAC","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\n\nimport { RELAY_STATUS_URL } from './constants';\nimport type {\n RelayExecuteRequest,\n RelayExecuteResponse,\n RelayQuote,\n RelayQuoteRequest,\n RelayStatusResponse,\n} from './types';\nimport type { TransactionPayControllerMessenger } from '../../types';\nimport { getFeatureFlags } from '../../utils/feature-flags';\n\n/**\n * Fetch a quote from the Relay API.\n *\n * @param messenger - Controller messenger.\n * @param body - Quote request parameters.\n * @returns The Relay quote with the request attached.\n */\nexport async function fetchRelayQuote(\n messenger: TransactionPayControllerMessenger,\n body: RelayQuoteRequest,\n): Promise<RelayQuote> {\n const { relayQuoteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayQuoteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n quote.request = body;\n\n return quote;\n}\n\n/**\n * Submit a gasless transaction via the Relay /execute endpoint.\n *\n * @param messenger - Controller messenger.\n * @param body - Execute request parameters.\n * @returns The execute response containing the request ID.\n */\nexport async function submitRelayExecute(\n messenger: TransactionPayControllerMessenger,\n body: RelayExecuteRequest,\n): Promise<RelayExecuteResponse> {\n const { relayExecuteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayExecuteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n return (await response.json()) as RelayExecuteResponse;\n}\n\n/**\n * Poll the Relay status endpoint for a given request ID.\n *\n * @param requestId - The Relay request ID to check.\n * @returns The current status of the request.\n */\nexport async function getRelayStatus(\n requestId: string,\n): Promise<RelayStatusResponse> {\n const url = `${RELAY_STATUS_URL}?requestId=${requestId}`;\n\n const response = await successfulFetch(url, { method: 'GET' });\n\n return (await response.json()) as RelayStatusResponse;\n}\n"]}
1
+ {"version":3,"file":"relay-api.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mCAAmC;AAG7D,OAAO,EAAE,eAAe,EAAE,sCAAkC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,wBAAoB;AAS/C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAA4C,EAC5C,IAAuB;IAEvB,MAAM,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;IACpD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA4C,EAC5C,IAAyB;IAEzB,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,eAAe,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB;IAEjB,MAAM,GAAG,GAAG,GAAG,gBAAgB,cAAc,SAAS,EAAE,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;AACxD,CAAC","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\n\nimport type { TransactionPayControllerMessenger } from '../../types';\nimport { getFeatureFlags } from '../../utils/feature-flags';\nimport { RELAY_STATUS_URL } from './constants';\nimport type {\n RelayExecuteRequest,\n RelayExecuteResponse,\n RelayQuote,\n RelayQuoteRequest,\n RelayStatusResponse,\n} from './types';\n\n/**\n * Fetch a quote from the Relay API.\n *\n * @param messenger - Controller messenger.\n * @param body - Quote request parameters.\n * @returns The Relay quote with the request attached.\n */\nexport async function fetchRelayQuote(\n messenger: TransactionPayControllerMessenger,\n body: RelayQuoteRequest,\n): Promise<RelayQuote> {\n const { relayQuoteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayQuoteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n quote.request = body;\n\n return quote;\n}\n\n/**\n * Submit a gasless transaction via the Relay /execute endpoint.\n *\n * @param messenger - Controller messenger.\n * @param body - Execute request parameters.\n * @returns The execute response containing the request ID.\n */\nexport async function submitRelayExecute(\n messenger: TransactionPayControllerMessenger,\n body: RelayExecuteRequest,\n): Promise<RelayExecuteResponse> {\n const { relayExecuteUrl } = getFeatureFlags(messenger);\n\n const response = await successfulFetch(relayExecuteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n return (await response.json()) as RelayExecuteResponse;\n}\n\n/**\n * Poll the Relay status endpoint for a given request ID.\n *\n * @param requestId - The Relay request ID to check.\n * @returns The current status of the request.\n */\nexport async function getRelayStatus(\n requestId: string,\n): Promise<RelayStatusResponse> {\n const url = `${RELAY_STATUS_URL}?requestId=${requestId}`;\n\n const response = await successfulFetch(url, { method: 'GET' });\n\n return (await response.json()) as RelayStatusResponse;\n}\n"]}
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getRelayMaxGasStationQuote = void 0;
4
4
  const utils_1 = require("@metamask/utils");
5
5
  const bignumber_js_1 = require("bignumber.js");
6
- const gas_station_1 = require("./gas-station.cjs");
7
6
  const logger_1 = require("../../logger.cjs");
8
7
  const token_1 = require("../../utils/token.cjs");
8
+ const gas_station_1 = require("./gas-station.cjs");
9
9
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'relay-max-gas-station');
10
10
  const PROBE_AMOUNT_PERCENTAGE = 0.25;
11
11
  var GasCostEstimateSource;