@metamask/transaction-pay-controller 22.3.1 → 22.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionPayController-method-action-types.d.cts +23 -1
  4. package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionPayController-method-action-types.d.mts +23 -1
  6. package/dist/TransactionPayController-method-action-types.d.mts.map +1 -1
  7. package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionPayController.cjs +38 -5
  9. package/dist/TransactionPayController.cjs.map +1 -1
  10. package/dist/TransactionPayController.d.cts +18 -2
  11. package/dist/TransactionPayController.d.cts.map +1 -1
  12. package/dist/TransactionPayController.d.mts +18 -2
  13. package/dist/TransactionPayController.d.mts.map +1 -1
  14. package/dist/TransactionPayController.mjs +38 -5
  15. package/dist/TransactionPayController.mjs.map +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +2 -2
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +2 -2
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/strategy/across/AcrossStrategy.cjs +12 -1
  23. package/dist/strategy/across/AcrossStrategy.cjs.map +1 -1
  24. package/dist/strategy/across/AcrossStrategy.d.cts.map +1 -1
  25. package/dist/strategy/across/AcrossStrategy.d.mts.map +1 -1
  26. package/dist/strategy/across/AcrossStrategy.mjs +12 -1
  27. package/dist/strategy/across/AcrossStrategy.mjs.map +1 -1
  28. package/dist/strategy/across/across-quotes.cjs +148 -37
  29. package/dist/strategy/across/across-quotes.cjs.map +1 -1
  30. package/dist/strategy/across/across-quotes.d.cts.map +1 -1
  31. package/dist/strategy/across/across-quotes.d.mts.map +1 -1
  32. package/dist/strategy/across/across-quotes.mjs +149 -38
  33. package/dist/strategy/across/across-quotes.mjs.map +1 -1
  34. package/dist/strategy/across/across-submit.cjs +217 -18
  35. package/dist/strategy/across/across-submit.cjs.map +1 -1
  36. package/dist/strategy/across/across-submit.d.cts.map +1 -1
  37. package/dist/strategy/across/across-submit.d.mts.map +1 -1
  38. package/dist/strategy/across/across-submit.mjs +219 -20
  39. package/dist/strategy/across/across-submit.mjs.map +1 -1
  40. package/dist/strategy/across/transactions.cjs +21 -1
  41. package/dist/strategy/across/transactions.cjs.map +1 -1
  42. package/dist/strategy/across/transactions.d.cts +8 -0
  43. package/dist/strategy/across/transactions.d.cts.map +1 -1
  44. package/dist/strategy/across/transactions.d.mts +8 -0
  45. package/dist/strategy/across/transactions.d.mts.map +1 -1
  46. package/dist/strategy/across/transactions.mjs +19 -0
  47. package/dist/strategy/across/transactions.mjs.map +1 -1
  48. package/dist/strategy/across/types.cjs.map +1 -1
  49. package/dist/strategy/across/types.d.cts +1 -0
  50. package/dist/strategy/across/types.d.cts.map +1 -1
  51. package/dist/strategy/across/types.d.mts +1 -0
  52. package/dist/strategy/across/types.d.mts.map +1 -1
  53. package/dist/strategy/across/types.mjs.map +1 -1
  54. package/dist/strategy/fiat/fiat-submit.cjs +15 -29
  55. package/dist/strategy/fiat/fiat-submit.cjs.map +1 -1
  56. package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -1
  57. package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -1
  58. package/dist/strategy/fiat/fiat-submit.mjs +17 -31
  59. package/dist/strategy/fiat/fiat-submit.mjs.map +1 -1
  60. package/dist/strategy/fiat/utils.cjs +76 -1
  61. package/dist/strategy/fiat/utils.cjs.map +1 -1
  62. package/dist/strategy/fiat/utils.d.cts +34 -0
  63. package/dist/strategy/fiat/utils.d.cts.map +1 -1
  64. package/dist/strategy/fiat/utils.d.mts +34 -0
  65. package/dist/strategy/fiat/utils.d.mts.map +1 -1
  66. package/dist/strategy/fiat/utils.mjs +73 -0
  67. package/dist/strategy/fiat/utils.mjs.map +1 -1
  68. package/dist/strategy/relay/polymarket/calldata.cjs +28 -0
  69. package/dist/strategy/relay/polymarket/calldata.cjs.map +1 -0
  70. package/dist/strategy/relay/polymarket/calldata.d.cts +14 -0
  71. package/dist/strategy/relay/polymarket/calldata.d.cts.map +1 -0
  72. package/dist/strategy/relay/polymarket/calldata.d.mts +14 -0
  73. package/dist/strategy/relay/polymarket/calldata.d.mts.map +1 -0
  74. package/dist/strategy/relay/polymarket/calldata.mjs +21 -0
  75. package/dist/strategy/relay/polymarket/calldata.mjs.map +1 -0
  76. package/dist/strategy/relay/polymarket/constants.cjs +9 -0
  77. package/dist/strategy/relay/polymarket/constants.cjs.map +1 -0
  78. package/dist/strategy/relay/polymarket/constants.d.cts +6 -0
  79. package/dist/strategy/relay/polymarket/constants.d.cts.map +1 -0
  80. package/dist/strategy/relay/polymarket/constants.d.mts +6 -0
  81. package/dist/strategy/relay/polymarket/constants.d.mts.map +1 -0
  82. package/dist/strategy/relay/polymarket/constants.mjs +6 -0
  83. package/dist/strategy/relay/polymarket/constants.mjs.map +1 -0
  84. package/dist/strategy/relay/polymarket/withdraw.cjs +170 -0
  85. package/dist/strategy/relay/polymarket/withdraw.cjs.map +1 -0
  86. package/dist/strategy/relay/polymarket/withdraw.d.cts +13 -0
  87. package/dist/strategy/relay/polymarket/withdraw.d.cts.map +1 -0
  88. package/dist/strategy/relay/polymarket/withdraw.d.mts +13 -0
  89. package/dist/strategy/relay/polymarket/withdraw.d.mts.map +1 -0
  90. package/dist/strategy/relay/polymarket/withdraw.mjs +164 -0
  91. package/dist/strategy/relay/polymarket/withdraw.mjs.map +1 -0
  92. package/dist/strategy/relay/relay-quotes.cjs +8 -2
  93. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  94. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  95. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  96. package/dist/strategy/relay/relay-quotes.mjs +8 -2
  97. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  98. package/dist/strategy/relay/relay-submit.cjs +50 -18
  99. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  100. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  101. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  102. package/dist/strategy/relay/relay-submit.mjs +50 -18
  103. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  104. package/dist/strategy/relay/types.cjs.map +1 -1
  105. package/dist/strategy/relay/types.d.cts +2 -1
  106. package/dist/strategy/relay/types.d.cts.map +1 -1
  107. package/dist/strategy/relay/types.d.mts +2 -1
  108. package/dist/strategy/relay/types.d.mts.map +1 -1
  109. package/dist/strategy/relay/types.mjs.map +1 -1
  110. package/dist/tests/messenger-mock.cjs +6 -0
  111. package/dist/tests/messenger-mock.cjs.map +1 -1
  112. package/dist/tests/messenger-mock.d.cts +14 -0
  113. package/dist/tests/messenger-mock.d.cts.map +1 -1
  114. package/dist/tests/messenger-mock.d.mts +14 -0
  115. package/dist/tests/messenger-mock.d.mts.map +1 -1
  116. package/dist/tests/messenger-mock.mjs +6 -0
  117. package/dist/tests/messenger-mock.mjs.map +1 -1
  118. package/dist/types.cjs.map +1 -1
  119. package/dist/types.d.cts +27 -0
  120. package/dist/types.d.cts.map +1 -1
  121. package/dist/types.d.mts +27 -0
  122. package/dist/types.d.mts.map +1 -1
  123. package/dist/types.mjs.map +1 -1
  124. package/dist/utils/feature-flags.cjs +1 -1
  125. package/dist/utils/feature-flags.cjs.map +1 -1
  126. package/dist/utils/feature-flags.d.cts +0 -1
  127. package/dist/utils/feature-flags.d.cts.map +1 -1
  128. package/dist/utils/feature-flags.d.mts +0 -1
  129. package/dist/utils/feature-flags.d.mts.map +1 -1
  130. package/dist/utils/feature-flags.mjs +1 -1
  131. package/dist/utils/feature-flags.mjs.map +1 -1
  132. package/dist/utils/quotes.cjs +8 -3
  133. package/dist/utils/quotes.cjs.map +1 -1
  134. package/dist/utils/quotes.d.cts.map +1 -1
  135. package/dist/utils/quotes.d.mts.map +1 -1
  136. package/dist/utils/quotes.mjs +8 -3
  137. package/dist/utils/quotes.mjs.map +1 -1
  138. package/dist/utils/source-amounts.cjs +10 -8
  139. package/dist/utils/source-amounts.cjs.map +1 -1
  140. package/dist/utils/source-amounts.d.cts.map +1 -1
  141. package/dist/utils/source-amounts.d.mts.map +1 -1
  142. package/dist/utils/source-amounts.mjs +10 -8
  143. package/dist/utils/source-amounts.mjs.map +1 -1
  144. package/dist/utils/token.cjs +5 -2
  145. package/dist/utils/token.cjs.map +1 -1
  146. package/dist/utils/token.d.cts.map +1 -1
  147. package/dist/utils/token.d.mts.map +1 -1
  148. package/dist/utils/token.mjs +5 -2
  149. package/dist/utils/token.mjs.map +1 -1
  150. package/dist/utils/transaction.cjs +137 -1
  151. package/dist/utils/transaction.cjs.map +1 -1
  152. package/dist/utils/transaction.d.cts +24 -0
  153. package/dist/utils/transaction.d.cts.map +1 -1
  154. package/dist/utils/transaction.d.mts +24 -0
  155. package/dist/utils/transaction.d.mts.map +1 -1
  156. package/dist/utils/transaction.mjs +135 -0
  157. package/dist/utils/transaction.mjs.map +1 -1
  158. package/package.json +4 -4
@@ -1,6 +1,12 @@
1
1
  import { TransactionType } from "@metamask/transaction-controller";
2
+ import { createModuleLogger } from "@metamask/utils";
3
+ import { BigNumber } from "bignumber.js";
4
+ import { projectLogger } from "../../logger.mjs";
2
5
  import { getFiatAssetPerTransactionType } from "../../utils/feature-flags.mjs";
6
+ import { getTokenInfo } from "../../utils/token.mjs";
7
+ import { getTransferredAmountFromTxHash } from "../../utils/transaction.mjs";
3
8
  import { FIAT_ASSET_ID_BY_TX_TYPE } from "./constants.mjs";
9
+ const log = createModuleLogger(projectLogger, 'fiat-utils');
4
10
  export function deriveFiatAssetForFiatPayment(transaction, messenger) {
5
11
  const txType = resolveTransactionType(transaction);
6
12
  return getFiatAssetPerTransactionType(messenger, txType);
@@ -11,4 +17,71 @@ function resolveTransactionType(transaction) {
11
17
  }
12
18
  return transaction.nestedTransactions?.find((tx) => tx.type && FIAT_ASSET_ID_BY_TX_TYPE[tx.type] !== undefined)?.type;
13
19
  }
20
+ /**
21
+ * Resolves the raw source amount for a completed fiat order.
22
+ *
23
+ * Attempts to read the actual transferred amount from the on-chain transaction
24
+ * identified by `order.txHash`. If the on-chain read fails or returns
25
+ * no amount, falls back to computing the amount from `order.cryptoAmount`.
26
+ *
27
+ * @param options - The resolution options.
28
+ * @param options.messenger - Controller messenger for network access.
29
+ * @param options.order - The completed on-ramp order.
30
+ * @param options.fiatAsset - The fiat asset describing the expected token.
31
+ * @param options.walletAddress - Recipient wallet address for on-chain lookup.
32
+ * @returns The raw (atomic) source amount as a decimal string.
33
+ */
34
+ export async function resolveSourceAmountRaw({ messenger, order, fiatAsset, walletAddress, }) {
35
+ if (order.txHash) {
36
+ try {
37
+ const onChainAmount = await getTransferredAmountFromTxHash({
38
+ messenger,
39
+ txHash: order.txHash,
40
+ chainId: fiatAsset.chainId,
41
+ tokenAddress: fiatAsset.address,
42
+ walletAddress,
43
+ });
44
+ if (onChainAmount) {
45
+ log('Resolved source amount from on-chain transaction', {
46
+ txHash: order.txHash,
47
+ onChainAmount,
48
+ });
49
+ return onChainAmount;
50
+ }
51
+ }
52
+ catch (error) {
53
+ log('Failed to read on-chain amount, falling back to order.cryptoAmount', { txHash: order.txHash, error });
54
+ }
55
+ }
56
+ const tokenInfo = getTokenInfo(messenger, fiatAsset.address, fiatAsset.chainId);
57
+ if (!tokenInfo) {
58
+ throw new Error(`Unable to resolve token info for fiat asset ${fiatAsset.address} on chain ${fiatAsset.chainId}`);
59
+ }
60
+ return getRawSourceAmountFromOrderCryptoAmount({
61
+ cryptoAmount: order.cryptoAmount,
62
+ decimals: tokenInfo.decimals,
63
+ });
64
+ }
65
+ /**
66
+ * Converts the order's human-readable crypto amount to a raw token amount.
67
+ *
68
+ * @param options - The conversion options.
69
+ * @param options.cryptoAmount - Human-readable crypto amount from the completed order.
70
+ * @param options.decimals - Token decimals for the fiat asset.
71
+ * @returns The raw token amount as a string.
72
+ */
73
+ export function getRawSourceAmountFromOrderCryptoAmount({ cryptoAmount, decimals, }) {
74
+ const normalizedAmount = new BigNumber(String(cryptoAmount));
75
+ if (!normalizedAmount.isFinite() || normalizedAmount.lte(0)) {
76
+ throw new Error(`Invalid fiat order crypto amount: ${String(cryptoAmount)}`);
77
+ }
78
+ const rawAmount = normalizedAmount
79
+ .shiftedBy(decimals)
80
+ .decimalPlaces(0, BigNumber.ROUND_DOWN)
81
+ .toFixed(0);
82
+ if (!new BigNumber(rawAmount).gt(0)) {
83
+ throw new Error('Computed fiat order source amount is not positive');
84
+ }
85
+ return rawAmount;
86
+ }
14
87
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,yCAAyC;AAGnE,OAAO,EAAE,8BAA8B,EAAE,sCAAkC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,wBAAoB;AAEvD,MAAM,UAAU,6BAA6B,CAC3C,WAA4B,EAC5B,SAA4C;IAE5C,MAAM,MAAM,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAEnD,OAAO,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,sBAAsB,CAC7B,WAA4B;IAE5B,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/C,OAAO,WAAW,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,OAAO,WAAW,CAAC,kBAAkB,EAAE,IAAI,CACzC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,wBAAwB,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,CACnE,EAAE,IAAI,CAAC;AACV,CAAC","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\n\nimport type { TransactionPayControllerMessenger } from '../../types';\nimport { getFiatAssetPerTransactionType } from '../../utils/feature-flags';\nimport type { TransactionPayFiatAsset } from './constants';\nimport { FIAT_ASSET_ID_BY_TX_TYPE } from './constants';\n\nexport function deriveFiatAssetForFiatPayment(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n): TransactionPayFiatAsset {\n const txType = resolveTransactionType(transaction);\n\n return getFiatAssetPerTransactionType(messenger, txType);\n}\n\nfunction resolveTransactionType(\n transaction: TransactionMeta,\n): TransactionType | undefined {\n if (transaction.type !== TransactionType.batch) {\n return transaction.type;\n }\n\n return transaction.nestedTransactions?.find(\n (tx) => tx.type && FIAT_ASSET_ID_BY_TX_TYPE[tx.type] !== undefined,\n )?.type;\n}\n"]}
1
+ {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RampsOrder } from '@metamask/ramps-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger';\nimport type { TransactionPayControllerMessenger } from '../../types';\nimport { getFiatAssetPerTransactionType } from '../../utils/feature-flags';\nimport { getTokenInfo } from '../../utils/token';\nimport { getTransferredAmountFromTxHash } from '../../utils/transaction';\nimport type { TransactionPayFiatAsset } from './constants';\nimport { FIAT_ASSET_ID_BY_TX_TYPE } from './constants';\n\nconst log = createModuleLogger(projectLogger, 'fiat-utils');\n\nexport function deriveFiatAssetForFiatPayment(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n): TransactionPayFiatAsset {\n const txType = resolveTransactionType(transaction);\n\n return getFiatAssetPerTransactionType(messenger, txType);\n}\n\nfunction resolveTransactionType(\n transaction: TransactionMeta,\n): TransactionType | undefined {\n if (transaction.type !== TransactionType.batch) {\n return transaction.type;\n }\n\n return transaction.nestedTransactions?.find(\n (tx) => tx.type && FIAT_ASSET_ID_BY_TX_TYPE[tx.type] !== undefined,\n )?.type;\n}\n\n/**\n * Resolves the raw source amount for a completed fiat order.\n *\n * Attempts to read the actual transferred amount from the on-chain transaction\n * identified by `order.txHash`. If the on-chain read fails or returns\n * no amount, falls back to computing the amount from `order.cryptoAmount`.\n *\n * @param options - The resolution options.\n * @param options.messenger - Controller messenger for network access.\n * @param options.order - The completed on-ramp order.\n * @param options.fiatAsset - The fiat asset describing the expected token.\n * @param options.walletAddress - Recipient wallet address for on-chain lookup.\n * @returns The raw (atomic) source amount as a decimal string.\n */\nexport async function resolveSourceAmountRaw({\n messenger,\n order,\n fiatAsset,\n walletAddress,\n}: {\n messenger: TransactionPayControllerMessenger;\n order: RampsOrder;\n fiatAsset: TransactionPayFiatAsset;\n walletAddress: Hex;\n}): Promise<string> {\n if (order.txHash) {\n try {\n const onChainAmount = await getTransferredAmountFromTxHash({\n messenger,\n txHash: order.txHash,\n chainId: fiatAsset.chainId,\n tokenAddress: fiatAsset.address,\n walletAddress,\n });\n\n if (onChainAmount) {\n log('Resolved source amount from on-chain transaction', {\n txHash: order.txHash,\n onChainAmount,\n });\n return onChainAmount;\n }\n } catch (error) {\n log(\n 'Failed to read on-chain amount, falling back to order.cryptoAmount',\n { txHash: order.txHash, error },\n );\n }\n }\n\n const tokenInfo = getTokenInfo(\n messenger,\n fiatAsset.address,\n fiatAsset.chainId,\n );\n\n if (!tokenInfo) {\n throw new Error(\n `Unable to resolve token info for fiat asset ${fiatAsset.address} on chain ${fiatAsset.chainId}`,\n );\n }\n\n return getRawSourceAmountFromOrderCryptoAmount({\n cryptoAmount: order.cryptoAmount,\n decimals: tokenInfo.decimals,\n });\n}\n\n/**\n * Converts the order's human-readable crypto amount to a raw token amount.\n *\n * @param options - The conversion options.\n * @param options.cryptoAmount - Human-readable crypto amount from the completed order.\n * @param options.decimals - Token decimals for the fiat asset.\n * @returns The raw token amount as a string.\n */\nexport function getRawSourceAmountFromOrderCryptoAmount({\n cryptoAmount,\n decimals,\n}: {\n cryptoAmount: RampsOrder['cryptoAmount'];\n decimals: number;\n}): string {\n const normalizedAmount = new BigNumber(String(cryptoAmount));\n\n if (!normalizedAmount.isFinite() || normalizedAmount.lte(0)) {\n throw new Error(\n `Invalid fiat order crypto amount: ${String(cryptoAmount)}`,\n );\n }\n\n const rawAmount = normalizedAmount\n .shiftedBy(decimals)\n .decimalPlaces(0, BigNumber.ROUND_DOWN)\n .toFixed(0);\n\n if (!new BigNumber(rawAmount).gt(0)) {\n throw new Error('Computed fiat order source amount is not positive');\n }\n\n return rawAmount;\n}\n"]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractErc20TransferRecipient = exports.encodeWrap = exports.encodeUnwrap = exports.encodeApprove = void 0;
4
+ const abi_1 = require("@ethersproject/abi");
5
+ const iface = new abi_1.Interface([
6
+ 'function approve(address spender, uint256 amount)',
7
+ 'function unwrap(address asset, address recipient, uint256 amount)',
8
+ 'function wrap(address asset, address recipient, uint256 amount)',
9
+ 'function transfer(address recipient, uint256 amount)',
10
+ ]);
11
+ function encodeApprove(spender, amount) {
12
+ return iface.encodeFunctionData('approve', [spender, amount]);
13
+ }
14
+ exports.encodeApprove = encodeApprove;
15
+ function encodeUnwrap({ asset, recipient, amount, }) {
16
+ return iface.encodeFunctionData('unwrap', [asset, recipient, amount]);
17
+ }
18
+ exports.encodeUnwrap = encodeUnwrap;
19
+ function encodeWrap({ asset, recipient, amount, }) {
20
+ return iface.encodeFunctionData('wrap', [asset, recipient, amount]);
21
+ }
22
+ exports.encodeWrap = encodeWrap;
23
+ function extractErc20TransferRecipient(data) {
24
+ const [recipient] = iface.decodeFunctionData('transfer', data);
25
+ return recipient;
26
+ }
27
+ exports.extractErc20TransferRecipient = extractErc20TransferRecipient;
28
+ //# sourceMappingURL=calldata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calldata.cjs","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/calldata.ts"],"names":[],"mappings":";;;AAAA,4CAA+C;AAG/C,MAAM,KAAK,GAAG,IAAI,eAAS,CAAC;IAC1B,mDAAmD;IACnD,mEAAmE;IACnE,iEAAiE;IACjE,sDAAsD;CACvD,CAAC,CAAC;AAEH,SAAgB,aAAa,CAAC,OAAY,EAAE,MAAc;IACxD,OAAO,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAQ,CAAC;AACvE,CAAC;AAFD,sCAEC;AAED,SAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,MAAM,GAKP;IACC,OAAO,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAQ,CAAC;AAC/E,CAAC;AAVD,oCAUC;AAED,SAAgB,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,EACT,MAAM,GAKP;IACC,OAAO,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAQ,CAAC;AAC7E,CAAC;AAVD,gCAUC;AAED,SAAgB,6BAA6B,CAAC,IAAS;IACrD,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/D,OAAO,SAAgB,CAAC;AAC1B,CAAC;AAHD,sEAGC","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport type { Hex } from '@metamask/utils';\n\nconst iface = new Interface([\n 'function approve(address spender, uint256 amount)',\n 'function unwrap(address asset, address recipient, uint256 amount)',\n 'function wrap(address asset, address recipient, uint256 amount)',\n 'function transfer(address recipient, uint256 amount)',\n]);\n\nexport function encodeApprove(spender: Hex, amount: bigint): Hex {\n return iface.encodeFunctionData('approve', [spender, amount]) as Hex;\n}\n\nexport function encodeUnwrap({\n asset,\n recipient,\n amount,\n}: {\n asset: Hex;\n recipient: Hex;\n amount: bigint;\n}): Hex {\n return iface.encodeFunctionData('unwrap', [asset, recipient, amount]) as Hex;\n}\n\nexport function encodeWrap({\n asset,\n recipient,\n amount,\n}: {\n asset: Hex;\n recipient: Hex;\n amount: bigint;\n}): Hex {\n return iface.encodeFunctionData('wrap', [asset, recipient, amount]) as Hex;\n}\n\nexport function extractErc20TransferRecipient(data: Hex): Hex {\n const [recipient] = iface.decodeFunctionData('transfer', data);\n return recipient as Hex;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ export declare function encodeApprove(spender: Hex, amount: bigint): Hex;
3
+ export declare function encodeUnwrap({ asset, recipient, amount, }: {
4
+ asset: Hex;
5
+ recipient: Hex;
6
+ amount: bigint;
7
+ }): Hex;
8
+ export declare function encodeWrap({ asset, recipient, amount, }: {
9
+ asset: Hex;
10
+ recipient: Hex;
11
+ amount: bigint;
12
+ }): Hex;
13
+ export declare function extractErc20TransferRecipient(data: Hex): Hex;
14
+ //# sourceMappingURL=calldata.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calldata.d.cts","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/calldata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAS3C,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAE/D;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,MAAM,GACP,EAAE;IACD,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,GAAG,CAEN;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,EACT,MAAM,GACP,EAAE;IACD,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,GAAG,CAEN;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAG5D"}
@@ -0,0 +1,14 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ export declare function encodeApprove(spender: Hex, amount: bigint): Hex;
3
+ export declare function encodeUnwrap({ asset, recipient, amount, }: {
4
+ asset: Hex;
5
+ recipient: Hex;
6
+ amount: bigint;
7
+ }): Hex;
8
+ export declare function encodeWrap({ asset, recipient, amount, }: {
9
+ asset: Hex;
10
+ recipient: Hex;
11
+ amount: bigint;
12
+ }): Hex;
13
+ export declare function extractErc20TransferRecipient(data: Hex): Hex;
14
+ //# sourceMappingURL=calldata.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calldata.d.mts","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/calldata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAS3C,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAE/D;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,MAAM,GACP,EAAE;IACD,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,GAAG,CAEN;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,EACT,MAAM,GACP,EAAE;IACD,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,GAAG,CAEN;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAG5D"}
@@ -0,0 +1,21 @@
1
+ import { Interface } from "@ethersproject/abi";
2
+ const iface = new Interface([
3
+ 'function approve(address spender, uint256 amount)',
4
+ 'function unwrap(address asset, address recipient, uint256 amount)',
5
+ 'function wrap(address asset, address recipient, uint256 amount)',
6
+ 'function transfer(address recipient, uint256 amount)',
7
+ ]);
8
+ export function encodeApprove(spender, amount) {
9
+ return iface.encodeFunctionData('approve', [spender, amount]);
10
+ }
11
+ export function encodeUnwrap({ asset, recipient, amount, }) {
12
+ return iface.encodeFunctionData('unwrap', [asset, recipient, amount]);
13
+ }
14
+ export function encodeWrap({ asset, recipient, amount, }) {
15
+ return iface.encodeFunctionData('wrap', [asset, recipient, amount]);
16
+ }
17
+ export function extractErc20TransferRecipient(data) {
18
+ const [recipient] = iface.decodeFunctionData('transfer', data);
19
+ return recipient;
20
+ }
21
+ //# sourceMappingURL=calldata.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calldata.mjs","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/calldata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,2BAA2B;AAG/C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC;IAC1B,mDAAmD;IACnD,mEAAmE;IACnE,iEAAiE;IACjE,sDAAsD;CACvD,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa,CAAC,OAAY,EAAE,MAAc;IACxD,OAAO,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAQ,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,MAAM,GAKP;IACC,OAAO,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAQ,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,EACT,MAAM,GAKP;IACC,OAAO,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAQ,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,IAAS;IACrD,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/D,OAAO,SAAgB,CAAC;AAC1B,CAAC","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport type { Hex } from '@metamask/utils';\n\nconst iface = new Interface([\n 'function approve(address spender, uint256 amount)',\n 'function unwrap(address asset, address recipient, uint256 amount)',\n 'function wrap(address asset, address recipient, uint256 amount)',\n 'function transfer(address recipient, uint256 amount)',\n]);\n\nexport function encodeApprove(spender: Hex, amount: bigint): Hex {\n return iface.encodeFunctionData('approve', [spender, amount]) as Hex;\n}\n\nexport function encodeUnwrap({\n asset,\n recipient,\n amount,\n}: {\n asset: Hex;\n recipient: Hex;\n amount: bigint;\n}): Hex {\n return iface.encodeFunctionData('unwrap', [asset, recipient, amount]) as Hex;\n}\n\nexport function encodeWrap({\n asset,\n recipient,\n amount,\n}: {\n asset: Hex;\n recipient: Hex;\n amount: bigint;\n}): Hex {\n return iface.encodeFunctionData('wrap', [asset, recipient, amount]) as Hex;\n}\n\nexport function extractErc20TransferRecipient(data: Hex): Hex {\n const [recipient] = iface.decodeFunctionData('transfer', data);\n return recipient as Hex;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SWEEP_RELAYER_SETTLE_DELAY_MS = exports.SWEEP_BALANCE_RETRY_DELAY_MS = exports.SWEEP_BALANCE_RETRY_ATTEMPTS = exports.POLYMARKET_COLLATERAL_ONRAMP_POLYGON = exports.POLYMARKET_COLLATERAL_OFFRAMP_POLYGON = void 0;
4
+ exports.POLYMARKET_COLLATERAL_OFFRAMP_POLYGON = '0x2957922Eb93258b93368531d39fAcCA3B4dC5854';
5
+ exports.POLYMARKET_COLLATERAL_ONRAMP_POLYGON = '0x93070a847efEf7F70739046A929D47a521F5B8ee';
6
+ exports.SWEEP_BALANCE_RETRY_ATTEMPTS = 5;
7
+ exports.SWEEP_BALANCE_RETRY_DELAY_MS = 1000;
8
+ exports.SWEEP_RELAYER_SETTLE_DELAY_MS = 3000;
9
+ //# sourceMappingURL=constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,qCAAqC,GAChD,4CAAmD,CAAC;AAEzC,QAAA,oCAAoC,GAC/C,4CAAmD,CAAC;AAEzC,QAAA,4BAA4B,GAAG,CAAC,CAAC;AAEjC,QAAA,4BAA4B,GAAG,IAAI,CAAC;AAEpC,QAAA,6BAA6B,GAAG,IAAI,CAAC","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport const POLYMARKET_COLLATERAL_OFFRAMP_POLYGON =\n '0x2957922Eb93258b93368531d39fAcCA3B4dC5854' as Hex;\n\nexport const POLYMARKET_COLLATERAL_ONRAMP_POLYGON =\n '0x93070a847efEf7F70739046A929D47a521F5B8ee' as Hex;\n\nexport const SWEEP_BALANCE_RETRY_ATTEMPTS = 5;\n\nexport const SWEEP_BALANCE_RETRY_DELAY_MS = 1000;\n\nexport const SWEEP_RELAYER_SETTLE_DELAY_MS = 3000;\n"]}
@@ -0,0 +1,6 @@
1
+ export declare const POLYMARKET_COLLATERAL_OFFRAMP_POLYGON: `0x${string}`;
2
+ export declare const POLYMARKET_COLLATERAL_ONRAMP_POLYGON: `0x${string}`;
3
+ export declare const SWEEP_BALANCE_RETRY_ATTEMPTS = 5;
4
+ export declare const SWEEP_BALANCE_RETRY_DELAY_MS = 1000;
5
+ export declare const SWEEP_RELAYER_SETTLE_DELAY_MS = 3000;
6
+ //# sourceMappingURL=constants.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qCAAqC,eACG,CAAC;AAEtD,eAAO,MAAM,oCAAoC,eACI,CAAC;AAEtD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,eAAO,MAAM,6BAA6B,OAAO,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const POLYMARKET_COLLATERAL_OFFRAMP_POLYGON: `0x${string}`;
2
+ export declare const POLYMARKET_COLLATERAL_ONRAMP_POLYGON: `0x${string}`;
3
+ export declare const SWEEP_BALANCE_RETRY_ATTEMPTS = 5;
4
+ export declare const SWEEP_BALANCE_RETRY_DELAY_MS = 1000;
5
+ export declare const SWEEP_RELAYER_SETTLE_DELAY_MS = 3000;
6
+ //# sourceMappingURL=constants.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qCAAqC,eACG,CAAC;AAEtD,eAAO,MAAM,oCAAoC,eACI,CAAC;AAEtD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,eAAO,MAAM,6BAA6B,OAAO,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const POLYMARKET_COLLATERAL_OFFRAMP_POLYGON = '0x2957922Eb93258b93368531d39fAcCA3B4dC5854';
2
+ export const POLYMARKET_COLLATERAL_ONRAMP_POLYGON = '0x93070a847efEf7F70739046A929D47a521F5B8ee';
3
+ export const SWEEP_BALANCE_RETRY_ATTEMPTS = 5;
4
+ export const SWEEP_BALANCE_RETRY_DELAY_MS = 1000;
5
+ export const SWEEP_RELAYER_SETTLE_DELAY_MS = 3000;
6
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qCAAqC,GAChD,4CAAmD,CAAC;AAEtD,MAAM,CAAC,MAAM,oCAAoC,GAC/C,4CAAmD,CAAC;AAEtD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAEjD,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport const POLYMARKET_COLLATERAL_OFFRAMP_POLYGON =\n '0x2957922Eb93258b93368531d39fAcCA3B4dC5854' as Hex;\n\nexport const POLYMARKET_COLLATERAL_ONRAMP_POLYGON =\n '0x93070a847efEf7F70739046A929D47a521F5B8ee' as Hex;\n\nexport const SWEEP_BALANCE_RETRY_ATTEMPTS = 5;\n\nexport const SWEEP_BALANCE_RETRY_DELAY_MS = 1000;\n\nexport const SWEEP_RELAYER_SETTLE_DELAY_MS = 3000;\n"]}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sweepPolymarketDepositWallet = exports.submitPolymarketWithdraw = exports.applyPolymarketDepositWalletOverrides = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ const constants_1 = require("../../../constants.cjs");
6
+ const logger_1 = require("../../../logger.cjs");
7
+ const token_1 = require("../../../utils/token.cjs");
8
+ const calldata_1 = require("./calldata.cjs");
9
+ const constants_2 = require("./constants.cjs");
10
+ const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'polymarket-withdraw');
11
+ async function applyPolymarketDepositWalletOverrides(body, request, messenger) {
12
+ const depositWalletAddress = await getDepositWalletAddress(messenger, request.from);
13
+ body.originCurrency = constants_1.POLYGON_USDCE_ADDRESS;
14
+ body.user = depositWalletAddress;
15
+ body.refundTo = depositWalletAddress;
16
+ body.useDepositAddress = true;
17
+ body.strict = true;
18
+ }
19
+ exports.applyPolymarketDepositWalletOverrides = applyPolymarketDepositWalletOverrides;
20
+ async function submitPolymarketWithdraw(quote, from, messenger) {
21
+ const depositWalletAddress = await getDepositWalletAddress(messenger, from);
22
+ const relayDepositAddress = extractRelayDepositAddress(quote.original);
23
+ const amount = BigInt(quote.sourceAmount.raw);
24
+ const preSubmitUsdceBalance = await readUsdceBalanceOrZero(messenger, depositWalletAddress);
25
+ log('Submitting unwrap batch to Relay deposit address', {
26
+ depositWalletAddress,
27
+ relayDepositAddress,
28
+ amount: amount.toString(),
29
+ preSubmitUsdceBalance: preSubmitUsdceBalance.toString(),
30
+ });
31
+ const result = await submitDepositWalletBatch(messenger, {
32
+ eoa: from,
33
+ depositWallet: depositWalletAddress,
34
+ calls: [
35
+ {
36
+ target: constants_1.POLYGON_PUSD_ADDRESS,
37
+ value: '0',
38
+ data: (0, calldata_1.encodeApprove)(constants_2.POLYMARKET_COLLATERAL_OFFRAMP_POLYGON, amount),
39
+ },
40
+ {
41
+ target: constants_2.POLYMARKET_COLLATERAL_OFFRAMP_POLYGON,
42
+ value: '0',
43
+ data: (0, calldata_1.encodeUnwrap)({
44
+ asset: constants_1.POLYGON_USDCE_ADDRESS,
45
+ recipient: relayDepositAddress,
46
+ amount,
47
+ }),
48
+ },
49
+ ],
50
+ });
51
+ return { ...result, preSubmitUsdceBalance };
52
+ }
53
+ exports.submitPolymarketWithdraw = submitPolymarketWithdraw;
54
+ async function sweepPolymarketDepositWallet(from, messenger, options) {
55
+ const isRefund = options.relayStatus === 'refund' || options.relayStatus === 'refunded';
56
+ const waitForBalanceAbove = isRefund
57
+ ? options.preSubmitUsdceBalance
58
+ : undefined;
59
+ const depositWalletAddress = await getDepositWalletAddress(messenger, from);
60
+ const usdceBalance = await readDepositWalletUsdceBalance(messenger, depositWalletAddress, waitForBalanceAbove);
61
+ if (usdceBalance === undefined) {
62
+ return;
63
+ }
64
+ if (usdceBalance === 0n) {
65
+ log('USDC.e sweep: nothing to wrap');
66
+ return;
67
+ }
68
+ if (waitForBalanceAbove !== undefined && usdceBalance > waitForBalanceAbove) {
69
+ log('USDC.e sweep: waiting for relayer RPC to catch up to new balance');
70
+ await new Promise((resolve) => setTimeout(resolve, constants_2.SWEEP_RELAYER_SETTLE_DELAY_MS));
71
+ }
72
+ try {
73
+ await submitDepositWalletBatch(messenger, {
74
+ eoa: from,
75
+ depositWallet: depositWalletAddress,
76
+ calls: [
77
+ {
78
+ target: constants_1.POLYGON_USDCE_ADDRESS,
79
+ value: '0',
80
+ data: (0, calldata_1.encodeApprove)(constants_2.POLYMARKET_COLLATERAL_ONRAMP_POLYGON, usdceBalance),
81
+ },
82
+ {
83
+ target: constants_2.POLYMARKET_COLLATERAL_ONRAMP_POLYGON,
84
+ value: '0',
85
+ data: (0, calldata_1.encodeWrap)({
86
+ asset: constants_1.POLYGON_USDCE_ADDRESS,
87
+ recipient: depositWalletAddress,
88
+ amount: usdceBalance,
89
+ }),
90
+ },
91
+ ],
92
+ });
93
+ }
94
+ catch (error) {
95
+ log('USDC.e sweep: batch submission failed', { error });
96
+ }
97
+ }
98
+ exports.sweepPolymarketDepositWallet = sweepPolymarketDepositWallet;
99
+ async function readUsdceBalanceOrZero(messenger, depositWalletAddress) {
100
+ try {
101
+ const raw = await (0, token_1.getLiveTokenBalance)(messenger, depositWalletAddress, constants_1.CHAIN_ID_POLYGON, constants_1.POLYGON_USDCE_ADDRESS);
102
+ return BigInt(raw);
103
+ }
104
+ catch (error) {
105
+ log('USDC.e balance read failed, defaulting to zero', { error });
106
+ return 0n;
107
+ }
108
+ }
109
+ async function readDepositWalletUsdceBalance(messenger, depositWalletAddress, waitForBalanceAbove) {
110
+ const shouldRetry = waitForBalanceAbove !== undefined;
111
+ const maxAttempts = shouldRetry ? constants_2.SWEEP_BALANCE_RETRY_ATTEMPTS : 1;
112
+ let lastBalance = 0n;
113
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
114
+ if (attempt > 1) {
115
+ await new Promise((resolve) => setTimeout(resolve, constants_2.SWEEP_BALANCE_RETRY_DELAY_MS));
116
+ }
117
+ try {
118
+ const raw = await (0, token_1.getLiveTokenBalance)(messenger, depositWalletAddress, constants_1.CHAIN_ID_POLYGON, constants_1.POLYGON_USDCE_ADDRESS);
119
+ lastBalance = BigInt(raw);
120
+ }
121
+ catch (error) {
122
+ log('USDC.e sweep: failed to read deposit wallet balance', { error });
123
+ return undefined;
124
+ }
125
+ log('USDC.e sweep: deposit wallet balance', {
126
+ depositWalletAddress,
127
+ balance: lastBalance.toString(),
128
+ attempt,
129
+ waitForBalanceAbove: waitForBalanceAbove?.toString(),
130
+ });
131
+ const hasIncreased = waitForBalanceAbove === undefined || lastBalance > waitForBalanceAbove;
132
+ if (hasIncreased) {
133
+ return lastBalance;
134
+ }
135
+ }
136
+ return lastBalance;
137
+ }
138
+ async function getDepositWalletAddress(messenger, eoa) {
139
+ const depositWalletAddress = await messenger.call('TransactionPayController:polymarketGetDepositWalletAddress', { eoa });
140
+ log('Polymarket callback: getDepositWalletAddress', {
141
+ eoa,
142
+ depositWalletAddress,
143
+ });
144
+ return depositWalletAddress;
145
+ }
146
+ async function submitDepositWalletBatch(messenger, params) {
147
+ log('Polymarket callback: submitDepositWalletBatch', {
148
+ eoa: params.eoa,
149
+ depositWallet: params.depositWallet,
150
+ callCount: params.calls.length,
151
+ });
152
+ const result = await messenger.call('TransactionPayController:polymarketSubmitDepositWalletBatch', params);
153
+ log('Polymarket callback: submitDepositWalletBatch returned', {
154
+ sourceHash: result.sourceHash,
155
+ });
156
+ return result;
157
+ }
158
+ function extractRelayDepositAddress(relayQuote) {
159
+ const depositStep = relayQuote.steps.find((step) => step.id === 'deposit');
160
+ if (depositStep?.kind !== 'transaction') {
161
+ throw new Error('Polymarket deposit wallet withdraw: Relay quote has no deposit step');
162
+ }
163
+ const transactionStep = depositStep;
164
+ const depositCallData = transactionStep.items[0]?.data?.data;
165
+ if (!depositCallData) {
166
+ throw new Error('Polymarket deposit wallet withdraw: Relay quote deposit step is missing calldata');
167
+ }
168
+ return (0, calldata_1.extractErc20TransferRecipient)(depositCallData);
169
+ }
170
+ //# sourceMappingURL=withdraw.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.cjs","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/withdraw.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport {\n CHAIN_ID_POLYGON,\n POLYGON_PUSD_ADDRESS,\n POLYGON_USDCE_ADDRESS,\n} from '../../../constants';\nimport { projectLogger } from '../../../logger';\nimport type {\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../../types';\nimport { getLiveTokenBalance } from '../../../utils/token';\nimport type {\n RelayQuote,\n RelayQuoteRequest,\n RelayStatus,\n RelayTransactionStep,\n} from '../types';\nimport {\n encodeApprove,\n encodeUnwrap,\n encodeWrap,\n extractErc20TransferRecipient,\n} from './calldata';\nimport {\n POLYMARKET_COLLATERAL_OFFRAMP_POLYGON,\n POLYMARKET_COLLATERAL_ONRAMP_POLYGON,\n SWEEP_BALANCE_RETRY_ATTEMPTS,\n SWEEP_BALANCE_RETRY_DELAY_MS,\n SWEEP_RELAYER_SETTLE_DELAY_MS,\n} from './constants';\n\nconst log = createModuleLogger(projectLogger, 'polymarket-withdraw');\n\nexport async function applyPolymarketDepositWalletOverrides(\n body: RelayQuoteRequest,\n request: QuoteRequest,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const depositWalletAddress = await getDepositWalletAddress(\n messenger,\n request.from,\n );\n\n body.originCurrency = POLYGON_USDCE_ADDRESS;\n body.user = depositWalletAddress;\n body.refundTo = depositWalletAddress;\n body.useDepositAddress = true;\n body.strict = true;\n}\n\nexport async function submitPolymarketWithdraw(\n quote: TransactionPayQuote<RelayQuote>,\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n): Promise<{ sourceHash: Hex; preSubmitUsdceBalance: bigint }> {\n const depositWalletAddress = await getDepositWalletAddress(messenger, from);\n const relayDepositAddress = extractRelayDepositAddress(quote.original);\n const amount = BigInt(quote.sourceAmount.raw);\n\n const preSubmitUsdceBalance = await readUsdceBalanceOrZero(\n messenger,\n depositWalletAddress,\n );\n\n log('Submitting unwrap batch to Relay deposit address', {\n depositWalletAddress,\n relayDepositAddress,\n amount: amount.toString(),\n preSubmitUsdceBalance: preSubmitUsdceBalance.toString(),\n });\n\n const result = await submitDepositWalletBatch(messenger, {\n eoa: from,\n depositWallet: depositWalletAddress,\n calls: [\n {\n target: POLYGON_PUSD_ADDRESS,\n value: '0',\n data: encodeApprove(POLYMARKET_COLLATERAL_OFFRAMP_POLYGON, amount),\n },\n {\n target: POLYMARKET_COLLATERAL_OFFRAMP_POLYGON,\n value: '0',\n data: encodeUnwrap({\n asset: POLYGON_USDCE_ADDRESS,\n recipient: relayDepositAddress,\n amount,\n }),\n },\n ],\n });\n\n return { ...result, preSubmitUsdceBalance };\n}\n\nexport async function sweepPolymarketDepositWallet(\n from: Hex,\n messenger: TransactionPayControllerMessenger,\n options: {\n relayStatus: RelayStatus | 'timeout';\n preSubmitUsdceBalance: bigint;\n },\n): Promise<void> {\n const isRefund =\n options.relayStatus === 'refund' || options.relayStatus === 'refunded';\n const waitForBalanceAbove = isRefund\n ? options.preSubmitUsdceBalance\n : undefined;\n\n const depositWalletAddress = await getDepositWalletAddress(messenger, from);\n const usdceBalance = await readDepositWalletUsdceBalance(\n messenger,\n depositWalletAddress,\n waitForBalanceAbove,\n );\n\n if (usdceBalance === undefined) {\n return;\n }\n\n if (usdceBalance === 0n) {\n log('USDC.e sweep: nothing to wrap');\n return;\n }\n\n if (waitForBalanceAbove !== undefined && usdceBalance > waitForBalanceAbove) {\n log('USDC.e sweep: waiting for relayer RPC to catch up to new balance');\n await new Promise((resolve) =>\n setTimeout(resolve, SWEEP_RELAYER_SETTLE_DELAY_MS),\n );\n }\n\n try {\n await submitDepositWalletBatch(messenger, {\n eoa: from,\n depositWallet: depositWalletAddress,\n calls: [\n {\n target: POLYGON_USDCE_ADDRESS,\n value: '0',\n data: encodeApprove(\n POLYMARKET_COLLATERAL_ONRAMP_POLYGON,\n usdceBalance,\n ),\n },\n {\n target: POLYMARKET_COLLATERAL_ONRAMP_POLYGON,\n value: '0',\n data: encodeWrap({\n asset: POLYGON_USDCE_ADDRESS,\n recipient: depositWalletAddress,\n amount: usdceBalance,\n }),\n },\n ],\n });\n } catch (error) {\n log('USDC.e sweep: batch submission failed', { error });\n }\n}\n\nasync function readUsdceBalanceOrZero(\n messenger: TransactionPayControllerMessenger,\n depositWalletAddress: Hex,\n): Promise<bigint> {\n try {\n const raw = await getLiveTokenBalance(\n messenger,\n depositWalletAddress,\n CHAIN_ID_POLYGON,\n POLYGON_USDCE_ADDRESS,\n );\n return BigInt(raw);\n } catch (error) {\n log('USDC.e balance read failed, defaulting to zero', { error });\n return 0n;\n }\n}\n\nasync function readDepositWalletUsdceBalance(\n messenger: TransactionPayControllerMessenger,\n depositWalletAddress: Hex,\n waitForBalanceAbove: bigint | undefined,\n): Promise<bigint | undefined> {\n const shouldRetry = waitForBalanceAbove !== undefined;\n const maxAttempts = shouldRetry ? SWEEP_BALANCE_RETRY_ATTEMPTS : 1;\n let lastBalance = 0n;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (attempt > 1) {\n await new Promise((resolve) =>\n setTimeout(resolve, SWEEP_BALANCE_RETRY_DELAY_MS),\n );\n }\n\n try {\n const raw = await getLiveTokenBalance(\n messenger,\n depositWalletAddress,\n CHAIN_ID_POLYGON,\n POLYGON_USDCE_ADDRESS,\n );\n lastBalance = BigInt(raw);\n } catch (error) {\n log('USDC.e sweep: failed to read deposit wallet balance', { error });\n return undefined;\n }\n\n log('USDC.e sweep: deposit wallet balance', {\n depositWalletAddress,\n balance: lastBalance.toString(),\n attempt,\n waitForBalanceAbove: waitForBalanceAbove?.toString(),\n });\n\n const hasIncreased =\n waitForBalanceAbove === undefined || lastBalance > waitForBalanceAbove;\n\n if (hasIncreased) {\n return lastBalance;\n }\n }\n\n return lastBalance;\n}\n\nasync function getDepositWalletAddress(\n messenger: TransactionPayControllerMessenger,\n eoa: Hex,\n): Promise<Hex> {\n const depositWalletAddress = await messenger.call(\n 'TransactionPayController:polymarketGetDepositWalletAddress',\n { eoa },\n );\n log('Polymarket callback: getDepositWalletAddress', {\n eoa,\n depositWalletAddress,\n });\n return depositWalletAddress;\n}\n\nasync function submitDepositWalletBatch(\n messenger: TransactionPayControllerMessenger,\n params: {\n eoa: Hex;\n depositWallet: Hex;\n calls: { target: Hex; data: Hex; value: string }[];\n },\n): Promise<{ sourceHash: Hex }> {\n log('Polymarket callback: submitDepositWalletBatch', {\n eoa: params.eoa,\n depositWallet: params.depositWallet,\n callCount: params.calls.length,\n });\n const result = await messenger.call(\n 'TransactionPayController:polymarketSubmitDepositWalletBatch',\n params,\n );\n log('Polymarket callback: submitDepositWalletBatch returned', {\n sourceHash: result.sourceHash,\n });\n return result;\n}\n\nfunction extractRelayDepositAddress(relayQuote: RelayQuote): Hex {\n const depositStep = relayQuote.steps.find((step) => step.id === 'deposit');\n\n if (depositStep?.kind !== 'transaction') {\n throw new Error(\n 'Polymarket deposit wallet withdraw: Relay quote has no deposit step',\n );\n }\n\n const transactionStep = depositStep as RelayTransactionStep;\n const depositCallData = transactionStep.items[0]?.data?.data;\n\n if (!depositCallData) {\n throw new Error(\n 'Polymarket deposit wallet withdraw: Relay quote deposit step is missing calldata',\n );\n }\n\n return extractErc20TransferRecipient(depositCallData);\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { QuoteRequest, TransactionPayControllerMessenger, TransactionPayQuote } from "../../../types.cjs";
3
+ import type { RelayQuote, RelayQuoteRequest, RelayStatus } from "../types.cjs";
4
+ export declare function applyPolymarketDepositWalletOverrides(body: RelayQuoteRequest, request: QuoteRequest, messenger: TransactionPayControllerMessenger): Promise<void>;
5
+ export declare function submitPolymarketWithdraw(quote: TransactionPayQuote<RelayQuote>, from: Hex, messenger: TransactionPayControllerMessenger): Promise<{
6
+ sourceHash: Hex;
7
+ preSubmitUsdceBalance: bigint;
8
+ }>;
9
+ export declare function sweepPolymarketDepositWallet(from: Hex, messenger: TransactionPayControllerMessenger, options: {
10
+ relayStatus: RelayStatus | 'timeout';
11
+ preSubmitUsdceBalance: bigint;
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=withdraw.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.d.cts","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAS3C,OAAO,KAAK,EACV,YAAY,EACZ,iCAAiC,EACjC,mBAAmB,EACpB,2BAAuB;AAExB,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,WAAW,EAEZ,qBAAiB;AAiBlB,wBAAsB,qCAAqC,CACzD,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC;IAAE,UAAU,EAAE,GAAG,CAAC;IAAC,qBAAqB,EAAE,MAAM,CAAA;CAAE,CAAC,CAuC7D;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,EAC5C,OAAO,EAAE;IACP,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,qBAAqB,EAAE,MAAM,CAAC;CAC/B,GACA,OAAO,CAAC,IAAI,CAAC,CAyDf"}
@@ -0,0 +1,13 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { QuoteRequest, TransactionPayControllerMessenger, TransactionPayQuote } from "../../../types.mjs";
3
+ import type { RelayQuote, RelayQuoteRequest, RelayStatus } from "../types.mjs";
4
+ export declare function applyPolymarketDepositWalletOverrides(body: RelayQuoteRequest, request: QuoteRequest, messenger: TransactionPayControllerMessenger): Promise<void>;
5
+ export declare function submitPolymarketWithdraw(quote: TransactionPayQuote<RelayQuote>, from: Hex, messenger: TransactionPayControllerMessenger): Promise<{
6
+ sourceHash: Hex;
7
+ preSubmitUsdceBalance: bigint;
8
+ }>;
9
+ export declare function sweepPolymarketDepositWallet(from: Hex, messenger: TransactionPayControllerMessenger, options: {
10
+ relayStatus: RelayStatus | 'timeout';
11
+ preSubmitUsdceBalance: bigint;
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=withdraw.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.d.mts","sourceRoot":"","sources":["../../../../src/strategy/relay/polymarket/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAS3C,OAAO,KAAK,EACV,YAAY,EACZ,iCAAiC,EACjC,mBAAmB,EACpB,2BAAuB;AAExB,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,WAAW,EAEZ,qBAAiB;AAiBlB,wBAAsB,qCAAqC,CACzD,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC;IAAE,UAAU,EAAE,GAAG,CAAC;IAAC,qBAAqB,EAAE,MAAM,CAAA;CAAE,CAAC,CAuC7D;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,iCAAiC,EAC5C,OAAO,EAAE;IACP,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,qBAAqB,EAAE,MAAM,CAAC;CAC/B,GACA,OAAO,CAAC,IAAI,CAAC,CAyDf"}