@metamask/transaction-pay-controller 18.0.0 → 18.2.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 (142) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/dist/TransactionPayController-method-action-types.cjs +1 -1
  3. package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
  4. package/dist/TransactionPayController-method-action-types.d.cts +1 -1
  5. package/dist/TransactionPayController-method-action-types.d.mts +1 -1
  6. package/dist/TransactionPayController-method-action-types.mjs +1 -1
  7. package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionPayController.cjs +2 -0
  9. package/dist/TransactionPayController.cjs.map +1 -1
  10. package/dist/TransactionPayController.d.cts.map +1 -1
  11. package/dist/TransactionPayController.d.mts.map +1 -1
  12. package/dist/TransactionPayController.mjs +2 -0
  13. package/dist/TransactionPayController.mjs.map +1 -1
  14. package/dist/constants.cjs +6 -2
  15. package/dist/constants.cjs.map +1 -1
  16. package/dist/constants.d.cts +4 -0
  17. package/dist/constants.d.cts.map +1 -1
  18. package/dist/constants.d.mts +4 -0
  19. package/dist/constants.d.mts.map +1 -1
  20. package/dist/constants.mjs +5 -1
  21. package/dist/constants.mjs.map +1 -1
  22. package/dist/strategy/across/across-actions.cjs +185 -0
  23. package/dist/strategy/across/across-actions.cjs.map +1 -0
  24. package/dist/strategy/across/across-actions.d.cts +21 -0
  25. package/dist/strategy/across/across-actions.d.cts.map +1 -0
  26. package/dist/strategy/across/across-actions.d.mts +21 -0
  27. package/dist/strategy/across/across-actions.d.mts.map +1 -0
  28. package/dist/strategy/across/across-actions.mjs +178 -0
  29. package/dist/strategy/across/across-actions.mjs.map +1 -0
  30. package/dist/strategy/across/across-quotes.cjs +2 -72
  31. package/dist/strategy/across/across-quotes.cjs.map +1 -1
  32. package/dist/strategy/across/across-quotes.d.cts.map +1 -1
  33. package/dist/strategy/across/across-quotes.d.mts.map +1 -1
  34. package/dist/strategy/across/across-quotes.mjs +1 -71
  35. package/dist/strategy/across/across-quotes.mjs.map +1 -1
  36. package/dist/strategy/fiat/FiatStrategy.cjs +15 -0
  37. package/dist/strategy/fiat/FiatStrategy.cjs.map +1 -0
  38. package/dist/strategy/fiat/FiatStrategy.d.cts +7 -0
  39. package/dist/strategy/fiat/FiatStrategy.d.cts.map +1 -0
  40. package/dist/strategy/fiat/FiatStrategy.d.mts +7 -0
  41. package/dist/strategy/fiat/FiatStrategy.d.mts.map +1 -0
  42. package/dist/strategy/fiat/FiatStrategy.mjs +11 -0
  43. package/dist/strategy/fiat/FiatStrategy.mjs.map +1 -0
  44. package/dist/strategy/fiat/constants.cjs +24 -0
  45. package/dist/strategy/fiat/constants.cjs.map +1 -0
  46. package/dist/strategy/fiat/constants.d.cts +10 -0
  47. package/dist/strategy/fiat/constants.d.cts.map +1 -0
  48. package/dist/strategy/fiat/constants.d.mts +10 -0
  49. package/dist/strategy/fiat/constants.d.mts.map +1 -0
  50. package/dist/strategy/fiat/constants.mjs +21 -0
  51. package/dist/strategy/fiat/constants.mjs.map +1 -0
  52. package/dist/strategy/fiat/fiat-quotes.cjs +214 -0
  53. package/dist/strategy/fiat/fiat-quotes.cjs.map +1 -0
  54. package/dist/strategy/fiat/fiat-quotes.d.cts +17 -0
  55. package/dist/strategy/fiat/fiat-quotes.d.cts.map +1 -0
  56. package/dist/strategy/fiat/fiat-quotes.d.mts +17 -0
  57. package/dist/strategy/fiat/fiat-quotes.d.mts.map +1 -0
  58. package/dist/strategy/fiat/fiat-quotes.mjs +210 -0
  59. package/dist/strategy/fiat/fiat-quotes.mjs.map +1 -0
  60. package/dist/strategy/fiat/fiat-submit.cjs +14 -0
  61. package/dist/strategy/fiat/fiat-submit.cjs.map +1 -0
  62. package/dist/strategy/fiat/fiat-submit.d.cts +10 -0
  63. package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -0
  64. package/dist/strategy/fiat/fiat-submit.d.mts +10 -0
  65. package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -0
  66. package/dist/strategy/fiat/fiat-submit.mjs +10 -0
  67. package/dist/strategy/fiat/fiat-submit.mjs.map +1 -0
  68. package/dist/strategy/fiat/types.cjs +3 -0
  69. package/dist/strategy/fiat/types.cjs.map +1 -0
  70. package/dist/strategy/fiat/types.d.cts +8 -0
  71. package/dist/strategy/fiat/types.d.cts.map +1 -0
  72. package/dist/strategy/fiat/types.d.mts +8 -0
  73. package/dist/strategy/fiat/types.d.mts.map +1 -0
  74. package/dist/strategy/fiat/types.mjs +2 -0
  75. package/dist/strategy/fiat/types.mjs.map +1 -0
  76. package/dist/strategy/fiat/utils.cjs +23 -0
  77. package/dist/strategy/fiat/utils.cjs.map +1 -0
  78. package/dist/strategy/fiat/utils.d.cts +6 -0
  79. package/dist/strategy/fiat/utils.d.cts.map +1 -0
  80. package/dist/strategy/fiat/utils.d.mts +6 -0
  81. package/dist/strategy/fiat/utils.d.mts.map +1 -0
  82. package/dist/strategy/fiat/utils.mjs +18 -0
  83. package/dist/strategy/fiat/utils.mjs.map +1 -0
  84. package/dist/strategy/relay/relay-max-gas-station.cjs +2 -1
  85. package/dist/strategy/relay/relay-max-gas-station.cjs.map +1 -1
  86. package/dist/strategy/relay/relay-max-gas-station.d.cts.map +1 -1
  87. package/dist/strategy/relay/relay-max-gas-station.d.mts.map +1 -1
  88. package/dist/strategy/relay/relay-max-gas-station.mjs +2 -1
  89. package/dist/strategy/relay/relay-max-gas-station.mjs.map +1 -1
  90. package/dist/strategy/relay/relay-quotes.cjs +35 -4
  91. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  92. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  93. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  94. package/dist/strategy/relay/relay-quotes.mjs +36 -5
  95. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  96. package/dist/strategy/relay/relay-submit.cjs +4 -2
  97. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  98. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  99. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  100. package/dist/strategy/relay/relay-submit.mjs +4 -2
  101. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  102. package/dist/strategy/relay/types.cjs.map +1 -1
  103. package/dist/strategy/relay/types.d.cts +66 -18
  104. package/dist/strategy/relay/types.d.cts.map +1 -1
  105. package/dist/strategy/relay/types.d.mts +66 -18
  106. package/dist/strategy/relay/types.d.mts.map +1 -1
  107. package/dist/strategy/relay/types.mjs.map +1 -1
  108. package/dist/tests/messenger-mock.d.cts +1 -1
  109. package/dist/tests/messenger-mock.d.mts +1 -1
  110. package/dist/types.cjs.map +1 -1
  111. package/dist/types.d.cts +16 -1
  112. package/dist/types.d.cts.map +1 -1
  113. package/dist/types.d.mts +16 -1
  114. package/dist/types.d.mts.map +1 -1
  115. package/dist/types.mjs.map +1 -1
  116. package/dist/utils/quotes.cjs +12 -9
  117. package/dist/utils/quotes.cjs.map +1 -1
  118. package/dist/utils/quotes.d.cts.map +1 -1
  119. package/dist/utils/quotes.d.mts.map +1 -1
  120. package/dist/utils/quotes.mjs +12 -9
  121. package/dist/utils/quotes.mjs.map +1 -1
  122. package/dist/utils/strategy.cjs +3 -0
  123. package/dist/utils/strategy.cjs.map +1 -1
  124. package/dist/utils/strategy.d.cts.map +1 -1
  125. package/dist/utils/strategy.d.mts.map +1 -1
  126. package/dist/utils/strategy.mjs +3 -0
  127. package/dist/utils/strategy.mjs.map +1 -1
  128. package/dist/utils/token.cjs +26 -1
  129. package/dist/utils/token.cjs.map +1 -1
  130. package/dist/utils/token.d.cts +10 -0
  131. package/dist/utils/token.d.cts.map +1 -1
  132. package/dist/utils/token.d.mts +10 -0
  133. package/dist/utils/token.d.mts.map +1 -1
  134. package/dist/utils/token.mjs +24 -0
  135. package/dist/utils/token.mjs.map +1 -1
  136. package/dist/utils/totals.cjs +2 -0
  137. package/dist/utils/totals.cjs.map +1 -1
  138. package/dist/utils/totals.d.cts.map +1 -1
  139. package/dist/utils/totals.d.mts.map +1 -1
  140. package/dist/utils/totals.mjs +2 -0
  141. package/dist/utils/totals.mjs.map +1 -1
  142. package/package.json +12 -11
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isExtractableOutputTokenTransferCall = exports.getAcrossDestination = exports.getTransferRecipient = exports.buildAcrossActionFromCall = exports.UNSUPPORTED_DESTINATION_ERROR = exports.SAFE_EXEC_TRANSACTION_SIGNATURE = exports.CREATE_PROXY_SIGNATURE = exports.TOKEN_TRANSFER_SIGNATURE = void 0;
4
+ const abi_1 = require("@ethersproject/abi");
5
+ exports.TOKEN_TRANSFER_SIGNATURE = 'function transfer(address to, uint256 value)';
6
+ exports.CREATE_PROXY_SIGNATURE = 'function createProxy(address paymentToken, uint256 payment, address payable paymentReceiver, (uint8 v, bytes32 r, bytes32 s) createSig)';
7
+ exports.SAFE_EXEC_TRANSACTION_SIGNATURE = 'function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures)';
8
+ exports.UNSUPPORTED_DESTINATION_ERROR = 'Across only supports direct token transfers and a limited set of post-swap destination actions at the moment';
9
+ const ACROSS_ACTION_SIGNATURES = [
10
+ exports.CREATE_PROXY_SIGNATURE,
11
+ exports.SAFE_EXEC_TRANSACTION_SIGNATURE,
12
+ ];
13
+ function buildAcrossActionFromCall(call, request) {
14
+ if (isTransferCall(call.data)) {
15
+ return buildAcrossTransferAction(call, request);
16
+ }
17
+ const parsedCall = parseAcrossActionCall(call.data);
18
+ return {
19
+ args: Array.from(parsedCall.transaction.args).map((arg) => ({
20
+ populateDynamically: false,
21
+ value: serializeAcrossActionValue(arg),
22
+ })),
23
+ functionSignature: parsedCall.functionSignature,
24
+ isNativeTransfer: false,
25
+ target: getRequiredTarget(call),
26
+ value: '0',
27
+ };
28
+ }
29
+ exports.buildAcrossActionFromCall = buildAcrossActionFromCall;
30
+ function getTransferRecipient(data) {
31
+ const parsedCall = tryParseTransferCall(data);
32
+ if (!parsedCall) {
33
+ throw new Error(getUnsupportedDestinationErrorMessage(data));
34
+ }
35
+ return normalizeHexString(String(parsedCall.args[0]));
36
+ }
37
+ exports.getTransferRecipient = getTransferRecipient;
38
+ function getAcrossDestination(transaction, request) {
39
+ const { from } = request;
40
+ const destinationCalls = getDestinationCalls(transaction);
41
+ const swapRecipientTransferCallIndex = destinationCalls.findIndex((call) => isExtractableOutputTokenTransferCall(call, request));
42
+ const callsForActions = [...destinationCalls];
43
+ let recipient = from;
44
+ if (swapRecipientTransferCallIndex !== -1) {
45
+ const [swapRecipientTransferCall] = callsForActions.splice(swapRecipientTransferCallIndex, 1);
46
+ recipient = getTransferRecipient(swapRecipientTransferCall.data);
47
+ }
48
+ return {
49
+ actions: callsForActions.map((call) => buildAcrossActionFromCall(call, request)),
50
+ recipient,
51
+ };
52
+ }
53
+ exports.getAcrossDestination = getAcrossDestination;
54
+ function isExtractableOutputTokenTransferCall(call, request) {
55
+ return (isTransferCall(call.data) &&
56
+ (call.target === undefined ||
57
+ normalizeHexString(call.target) ===
58
+ normalizeHexString(request.targetTokenAddress)));
59
+ }
60
+ exports.isExtractableOutputTokenTransferCall = isExtractableOutputTokenTransferCall;
61
+ function getRequiredTarget(call) {
62
+ if (!call.target) {
63
+ throw new Error(exports.UNSUPPORTED_DESTINATION_ERROR);
64
+ }
65
+ return call.target;
66
+ }
67
+ function normalizeHexString(value) {
68
+ /* istanbul ignore next: current supported Across action signatures only emit hex strings here. */
69
+ if (!value.startsWith('0x')) {
70
+ return value;
71
+ }
72
+ return value.toLowerCase();
73
+ }
74
+ function parseAcrossActionCall(data) {
75
+ const parsedCall = tryParseAcrossActionCall(data);
76
+ if (!parsedCall) {
77
+ throw new Error(getUnsupportedDestinationErrorMessage(data));
78
+ }
79
+ return parsedCall;
80
+ }
81
+ function serializeAcrossActionValue(value) {
82
+ if (Array.isArray(value)) {
83
+ return value.map((entry) => serializeAcrossActionScalar(entry));
84
+ }
85
+ return serializeAcrossActionScalar(value);
86
+ }
87
+ function buildAcrossTransferAction(call, request) {
88
+ return {
89
+ args: [
90
+ {
91
+ populateDynamically: false,
92
+ value: getTransferRecipient(call.data),
93
+ },
94
+ {
95
+ balanceSourceToken: request.targetTokenAddress,
96
+ populateDynamically: true,
97
+ value: '0',
98
+ },
99
+ ],
100
+ functionSignature: exports.TOKEN_TRANSFER_SIGNATURE,
101
+ isNativeTransfer: false,
102
+ target: call.target ?? request.targetTokenAddress,
103
+ value: '0',
104
+ };
105
+ }
106
+ function getDestinationCalls(transaction) {
107
+ const nestedCalls = (transaction.nestedTransactions ?? []).flatMap((nestedTx) => nestedTx.data !== undefined && nestedTx.data !== '0x'
108
+ ? [{ data: nestedTx.data, target: nestedTx.to }]
109
+ : []);
110
+ if (nestedCalls.length > 0) {
111
+ return nestedCalls;
112
+ }
113
+ const data = transaction.txParams?.data;
114
+ if (data === undefined || data === '0x') {
115
+ return [];
116
+ }
117
+ return [
118
+ {
119
+ data,
120
+ target: transaction.txParams?.to,
121
+ },
122
+ ];
123
+ }
124
+ function getUnsupportedDestinationErrorMessage(data) {
125
+ const selector = getDestinationSelector(data);
126
+ return selector
127
+ ? `${exports.UNSUPPORTED_DESTINATION_ERROR}. Destination selector: ${selector}`
128
+ : exports.UNSUPPORTED_DESTINATION_ERROR;
129
+ }
130
+ function getDestinationSelector(data) {
131
+ if (!data || data.length < 10) {
132
+ return undefined;
133
+ }
134
+ return data.slice(0, 10).toLowerCase();
135
+ }
136
+ function serializeAcrossActionScalar(value) {
137
+ if (typeof value === 'string') {
138
+ return normalizeHexString(value);
139
+ }
140
+ if (typeof value === 'number' ||
141
+ typeof value === 'bigint' ||
142
+ typeof value === 'boolean') {
143
+ return String(value);
144
+ }
145
+ if (isBigNumberLike(value)) {
146
+ return value.toString();
147
+ }
148
+ /* istanbul ignore next: supported Across action ABIs only decode scalars and tuples of scalars. */
149
+ throw new Error(exports.UNSUPPORTED_DESTINATION_ERROR);
150
+ }
151
+ function isBigNumberLike(value) {
152
+ return (typeof value === 'object' &&
153
+ value !== null &&
154
+ '_isBigNumber' in value &&
155
+ value._isBigNumber === true &&
156
+ 'toString' in value &&
157
+ typeof value.toString === 'function');
158
+ }
159
+ function isTransferCall(data) {
160
+ return tryParseTransferCall(data) !== undefined;
161
+ }
162
+ function tryParseAcrossActionCall(data) {
163
+ for (const functionSignature of ACROSS_ACTION_SIGNATURES) {
164
+ try {
165
+ const actionInterface = new abi_1.Interface([functionSignature]);
166
+ return {
167
+ functionSignature,
168
+ transaction: actionInterface.parseTransaction({ data }),
169
+ };
170
+ }
171
+ catch {
172
+ // Intentionally empty.
173
+ }
174
+ }
175
+ return undefined;
176
+ }
177
+ function tryParseTransferCall(data) {
178
+ try {
179
+ return new abi_1.Interface([exports.TOKEN_TRANSFER_SIGNATURE]).parseTransaction({ data });
180
+ }
181
+ catch {
182
+ return undefined;
183
+ }
184
+ }
185
+ //# sourceMappingURL=across-actions.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"across-actions.cjs","sourceRoot":"","sources":["../../../src/strategy/across/across-actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport type { TransactionDescription } from '@ethersproject/abi';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport type { AcrossAction, AcrossActionArg } from './types';\nimport type { QuoteRequest } from '../../types';\n\nexport const TOKEN_TRANSFER_SIGNATURE =\n 'function transfer(address to, uint256 value)';\nexport const CREATE_PROXY_SIGNATURE =\n 'function createProxy(address paymentToken, uint256 payment, address payable paymentReceiver, (uint8 v, bytes32 r, bytes32 s) createSig)';\nexport const SAFE_EXEC_TRANSACTION_SIGNATURE =\n 'function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures)';\n\nexport const UNSUPPORTED_DESTINATION_ERROR =\n 'Across only supports direct token transfers and a limited set of post-swap destination actions at the moment';\n\nexport type AcrossDestinationCall = {\n data: Hex;\n target?: Hex;\n};\n\nexport type AcrossDestination = {\n actions: AcrossAction[];\n recipient: Hex;\n};\n\ntype ParsedAcrossActionCall = {\n functionSignature: string;\n transaction: TransactionDescription;\n};\n\ntype BigNumberLike = {\n _isBigNumber: true;\n toString: () => string;\n};\n\nconst ACROSS_ACTION_SIGNATURES = [\n CREATE_PROXY_SIGNATURE,\n SAFE_EXEC_TRANSACTION_SIGNATURE,\n];\n\nexport function buildAcrossActionFromCall(\n call: AcrossDestinationCall,\n request: QuoteRequest,\n): AcrossAction {\n if (isTransferCall(call.data)) {\n return buildAcrossTransferAction(call, request);\n }\n\n const parsedCall = parseAcrossActionCall(call.data);\n\n return {\n args: Array.from(parsedCall.transaction.args).map((arg) => ({\n populateDynamically: false,\n value: serializeAcrossActionValue(arg),\n })),\n functionSignature: parsedCall.functionSignature,\n isNativeTransfer: false,\n target: getRequiredTarget(call),\n value: '0',\n };\n}\n\nexport function getTransferRecipient(data: Hex): Hex {\n const parsedCall = tryParseTransferCall(data);\n\n if (!parsedCall) {\n throw new Error(getUnsupportedDestinationErrorMessage(data));\n }\n\n return normalizeHexString(String(parsedCall.args[0])) as Hex;\n}\n\nexport function getAcrossDestination(\n transaction: TransactionMeta,\n request: QuoteRequest,\n): AcrossDestination {\n const { from } = request;\n const destinationCalls = getDestinationCalls(transaction);\n const swapRecipientTransferCallIndex = destinationCalls.findIndex((call) =>\n isExtractableOutputTokenTransferCall(call, request),\n );\n const callsForActions = [...destinationCalls];\n let recipient = from;\n\n if (swapRecipientTransferCallIndex !== -1) {\n const [swapRecipientTransferCall] = callsForActions.splice(\n swapRecipientTransferCallIndex,\n 1,\n );\n\n recipient = getTransferRecipient(swapRecipientTransferCall.data);\n }\n\n return {\n actions: callsForActions.map((call) =>\n buildAcrossActionFromCall(call, request),\n ),\n recipient,\n };\n}\n\nexport function isExtractableOutputTokenTransferCall(\n call: AcrossDestinationCall,\n request: QuoteRequest,\n): boolean {\n return (\n isTransferCall(call.data) &&\n (call.target === undefined ||\n normalizeHexString(call.target) ===\n normalizeHexString(request.targetTokenAddress))\n );\n}\n\nfunction getRequiredTarget(call: AcrossDestinationCall): Hex {\n if (!call.target) {\n throw new Error(UNSUPPORTED_DESTINATION_ERROR);\n }\n\n return call.target;\n}\n\nfunction normalizeHexString(value: string): string {\n /* istanbul ignore next: current supported Across action signatures only emit hex strings here. */\n if (!value.startsWith('0x')) {\n return value;\n }\n\n return value.toLowerCase();\n}\n\nfunction parseAcrossActionCall(data: Hex): ParsedAcrossActionCall {\n const parsedCall = tryParseAcrossActionCall(data);\n\n if (!parsedCall) {\n throw new Error(getUnsupportedDestinationErrorMessage(data));\n }\n\n return parsedCall;\n}\n\nfunction serializeAcrossActionValue(value: unknown): AcrossActionArg['value'] {\n if (Array.isArray(value)) {\n return value.map((entry) =>\n serializeAcrossActionScalar(entry),\n ) as AcrossActionArg['value'];\n }\n\n return serializeAcrossActionScalar(value);\n}\n\nfunction buildAcrossTransferAction(\n call: AcrossDestinationCall,\n request: QuoteRequest,\n): AcrossAction {\n return {\n args: [\n {\n populateDynamically: false,\n value: getTransferRecipient(call.data),\n },\n {\n balanceSourceToken: request.targetTokenAddress,\n populateDynamically: true,\n value: '0',\n },\n ],\n functionSignature: TOKEN_TRANSFER_SIGNATURE,\n isNativeTransfer: false,\n target: call.target ?? request.targetTokenAddress,\n value: '0',\n };\n}\n\nfunction getDestinationCalls(\n transaction: TransactionMeta,\n): AcrossDestinationCall[] {\n const nestedCalls = (\n transaction.nestedTransactions ?? []\n ).flatMap<AcrossDestinationCall>((nestedTx: { data?: Hex; to?: Hex }) =>\n nestedTx.data !== undefined && nestedTx.data !== '0x'\n ? [{ data: nestedTx.data, target: nestedTx.to }]\n : [],\n );\n\n if (nestedCalls.length > 0) {\n return nestedCalls;\n }\n\n const data = transaction.txParams?.data as Hex | undefined;\n\n if (data === undefined || data === '0x') {\n return [];\n }\n\n return [\n {\n data,\n target: transaction.txParams?.to as Hex | undefined,\n },\n ];\n}\n\nfunction getUnsupportedDestinationErrorMessage(data?: Hex): string {\n const selector = getDestinationSelector(data);\n\n return selector\n ? `${UNSUPPORTED_DESTINATION_ERROR}. Destination selector: ${selector}`\n : UNSUPPORTED_DESTINATION_ERROR;\n}\n\nfunction getDestinationSelector(data?: Hex): Hex | undefined {\n if (!data || data.length < 10) {\n return undefined;\n }\n\n return data.slice(0, 10).toLowerCase() as Hex;\n}\n\nfunction serializeAcrossActionScalar(value: unknown): string {\n if (typeof value === 'string') {\n return normalizeHexString(value);\n }\n\n if (\n typeof value === 'number' ||\n typeof value === 'bigint' ||\n typeof value === 'boolean'\n ) {\n return String(value);\n }\n\n if (isBigNumberLike(value)) {\n return value.toString();\n }\n\n /* istanbul ignore next: supported Across action ABIs only decode scalars and tuples of scalars. */\n throw new Error(UNSUPPORTED_DESTINATION_ERROR);\n}\n\nfunction isBigNumberLike(value: unknown): value is BigNumberLike {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_isBigNumber' in value &&\n value._isBigNumber === true &&\n 'toString' in value &&\n typeof value.toString === 'function'\n );\n}\n\nfunction isTransferCall(data: Hex): boolean {\n return tryParseTransferCall(data) !== undefined;\n}\n\nfunction tryParseAcrossActionCall(\n data: Hex,\n): ParsedAcrossActionCall | undefined {\n for (const functionSignature of ACROSS_ACTION_SIGNATURES) {\n try {\n const actionInterface = new Interface([functionSignature]);\n\n return {\n functionSignature,\n transaction: actionInterface.parseTransaction({ data }),\n };\n } catch {\n // Intentionally empty.\n }\n }\n\n return undefined;\n}\n\nfunction tryParseTransferCall(data: Hex): TransactionDescription | undefined {\n try {\n return new Interface([TOKEN_TRANSFER_SIGNATURE]).parseTransaction({ data });\n } catch {\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { TransactionMeta } from "@metamask/transaction-controller";
2
+ import type { Hex } from "@metamask/utils";
3
+ import type { AcrossAction } from "./types.cjs";
4
+ import type { QuoteRequest } from "../../types.cjs";
5
+ export declare const TOKEN_TRANSFER_SIGNATURE = "function transfer(address to, uint256 value)";
6
+ export declare const CREATE_PROXY_SIGNATURE = "function createProxy(address paymentToken, uint256 payment, address payable paymentReceiver, (uint8 v, bytes32 r, bytes32 s) createSig)";
7
+ export declare const SAFE_EXEC_TRANSACTION_SIGNATURE = "function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures)";
8
+ export declare const UNSUPPORTED_DESTINATION_ERROR = "Across only supports direct token transfers and a limited set of post-swap destination actions at the moment";
9
+ export type AcrossDestinationCall = {
10
+ data: Hex;
11
+ target?: Hex;
12
+ };
13
+ export type AcrossDestination = {
14
+ actions: AcrossAction[];
15
+ recipient: Hex;
16
+ };
17
+ export declare function buildAcrossActionFromCall(call: AcrossDestinationCall, request: QuoteRequest): AcrossAction;
18
+ export declare function getTransferRecipient(data: Hex): Hex;
19
+ export declare function getAcrossDestination(transaction: TransactionMeta, request: QuoteRequest): AcrossDestination;
20
+ export declare function isExtractableOutputTokenTransferCall(call: AcrossDestinationCall, request: QuoteRequest): boolean;
21
+ //# sourceMappingURL=across-actions.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"across-actions.d.cts","sourceRoot":"","sources":["../../../src/strategy/across/across-actions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAmB,oBAAgB;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAoB;AAEhD,eAAO,MAAM,wBAAwB,iDACW,CAAC;AACjD,eAAO,MAAM,sBAAsB,4IACwG,CAAC;AAC5I,eAAO,MAAM,+BAA+B,uMAC0J,CAAC;AAEvM,eAAO,MAAM,6BAA6B,iHACsE,CAAC;AAEjH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,GAAG,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC;CAChB,CAAC;AAiBF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,YAAY,GACpB,YAAY,CAiBd;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAQnD;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,eAAe,EAC5B,OAAO,EAAE,YAAY,GACpB,iBAAiB,CAwBnB;AAED,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,YAAY,GACpB,OAAO,CAOT"}
@@ -0,0 +1,21 @@
1
+ import type { TransactionMeta } from "@metamask/transaction-controller";
2
+ import type { Hex } from "@metamask/utils";
3
+ import type { AcrossAction } from "./types.mjs";
4
+ import type { QuoteRequest } from "../../types.mjs";
5
+ export declare const TOKEN_TRANSFER_SIGNATURE = "function transfer(address to, uint256 value)";
6
+ export declare const CREATE_PROXY_SIGNATURE = "function createProxy(address paymentToken, uint256 payment, address payable paymentReceiver, (uint8 v, bytes32 r, bytes32 s) createSig)";
7
+ export declare const SAFE_EXEC_TRANSACTION_SIGNATURE = "function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures)";
8
+ export declare const UNSUPPORTED_DESTINATION_ERROR = "Across only supports direct token transfers and a limited set of post-swap destination actions at the moment";
9
+ export type AcrossDestinationCall = {
10
+ data: Hex;
11
+ target?: Hex;
12
+ };
13
+ export type AcrossDestination = {
14
+ actions: AcrossAction[];
15
+ recipient: Hex;
16
+ };
17
+ export declare function buildAcrossActionFromCall(call: AcrossDestinationCall, request: QuoteRequest): AcrossAction;
18
+ export declare function getTransferRecipient(data: Hex): Hex;
19
+ export declare function getAcrossDestination(transaction: TransactionMeta, request: QuoteRequest): AcrossDestination;
20
+ export declare function isExtractableOutputTokenTransferCall(call: AcrossDestinationCall, request: QuoteRequest): boolean;
21
+ //# sourceMappingURL=across-actions.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"across-actions.d.mts","sourceRoot":"","sources":["../../../src/strategy/across/across-actions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAmB,oBAAgB;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAoB;AAEhD,eAAO,MAAM,wBAAwB,iDACW,CAAC;AACjD,eAAO,MAAM,sBAAsB,4IACwG,CAAC;AAC5I,eAAO,MAAM,+BAA+B,uMAC0J,CAAC;AAEvM,eAAO,MAAM,6BAA6B,iHACsE,CAAC;AAEjH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,GAAG,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC;CAChB,CAAC;AAiBF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,YAAY,GACpB,YAAY,CAiBd;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAQnD;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,eAAe,EAC5B,OAAO,EAAE,YAAY,GACpB,iBAAiB,CAwBnB;AAED,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,YAAY,GACpB,OAAO,CAOT"}
@@ -0,0 +1,178 @@
1
+ import { Interface } from "@ethersproject/abi";
2
+ export const TOKEN_TRANSFER_SIGNATURE = 'function transfer(address to, uint256 value)';
3
+ export const CREATE_PROXY_SIGNATURE = 'function createProxy(address paymentToken, uint256 payment, address payable paymentReceiver, (uint8 v, bytes32 r, bytes32 s) createSig)';
4
+ export const SAFE_EXEC_TRANSACTION_SIGNATURE = 'function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures)';
5
+ export const UNSUPPORTED_DESTINATION_ERROR = 'Across only supports direct token transfers and a limited set of post-swap destination actions at the moment';
6
+ const ACROSS_ACTION_SIGNATURES = [
7
+ CREATE_PROXY_SIGNATURE,
8
+ SAFE_EXEC_TRANSACTION_SIGNATURE,
9
+ ];
10
+ export function buildAcrossActionFromCall(call, request) {
11
+ if (isTransferCall(call.data)) {
12
+ return buildAcrossTransferAction(call, request);
13
+ }
14
+ const parsedCall = parseAcrossActionCall(call.data);
15
+ return {
16
+ args: Array.from(parsedCall.transaction.args).map((arg) => ({
17
+ populateDynamically: false,
18
+ value: serializeAcrossActionValue(arg),
19
+ })),
20
+ functionSignature: parsedCall.functionSignature,
21
+ isNativeTransfer: false,
22
+ target: getRequiredTarget(call),
23
+ value: '0',
24
+ };
25
+ }
26
+ export function getTransferRecipient(data) {
27
+ const parsedCall = tryParseTransferCall(data);
28
+ if (!parsedCall) {
29
+ throw new Error(getUnsupportedDestinationErrorMessage(data));
30
+ }
31
+ return normalizeHexString(String(parsedCall.args[0]));
32
+ }
33
+ export function getAcrossDestination(transaction, request) {
34
+ const { from } = request;
35
+ const destinationCalls = getDestinationCalls(transaction);
36
+ const swapRecipientTransferCallIndex = destinationCalls.findIndex((call) => isExtractableOutputTokenTransferCall(call, request));
37
+ const callsForActions = [...destinationCalls];
38
+ let recipient = from;
39
+ if (swapRecipientTransferCallIndex !== -1) {
40
+ const [swapRecipientTransferCall] = callsForActions.splice(swapRecipientTransferCallIndex, 1);
41
+ recipient = getTransferRecipient(swapRecipientTransferCall.data);
42
+ }
43
+ return {
44
+ actions: callsForActions.map((call) => buildAcrossActionFromCall(call, request)),
45
+ recipient,
46
+ };
47
+ }
48
+ export function isExtractableOutputTokenTransferCall(call, request) {
49
+ return (isTransferCall(call.data) &&
50
+ (call.target === undefined ||
51
+ normalizeHexString(call.target) ===
52
+ normalizeHexString(request.targetTokenAddress)));
53
+ }
54
+ function getRequiredTarget(call) {
55
+ if (!call.target) {
56
+ throw new Error(UNSUPPORTED_DESTINATION_ERROR);
57
+ }
58
+ return call.target;
59
+ }
60
+ function normalizeHexString(value) {
61
+ /* istanbul ignore next: current supported Across action signatures only emit hex strings here. */
62
+ if (!value.startsWith('0x')) {
63
+ return value;
64
+ }
65
+ return value.toLowerCase();
66
+ }
67
+ function parseAcrossActionCall(data) {
68
+ const parsedCall = tryParseAcrossActionCall(data);
69
+ if (!parsedCall) {
70
+ throw new Error(getUnsupportedDestinationErrorMessage(data));
71
+ }
72
+ return parsedCall;
73
+ }
74
+ function serializeAcrossActionValue(value) {
75
+ if (Array.isArray(value)) {
76
+ return value.map((entry) => serializeAcrossActionScalar(entry));
77
+ }
78
+ return serializeAcrossActionScalar(value);
79
+ }
80
+ function buildAcrossTransferAction(call, request) {
81
+ return {
82
+ args: [
83
+ {
84
+ populateDynamically: false,
85
+ value: getTransferRecipient(call.data),
86
+ },
87
+ {
88
+ balanceSourceToken: request.targetTokenAddress,
89
+ populateDynamically: true,
90
+ value: '0',
91
+ },
92
+ ],
93
+ functionSignature: TOKEN_TRANSFER_SIGNATURE,
94
+ isNativeTransfer: false,
95
+ target: call.target ?? request.targetTokenAddress,
96
+ value: '0',
97
+ };
98
+ }
99
+ function getDestinationCalls(transaction) {
100
+ const nestedCalls = (transaction.nestedTransactions ?? []).flatMap((nestedTx) => nestedTx.data !== undefined && nestedTx.data !== '0x'
101
+ ? [{ data: nestedTx.data, target: nestedTx.to }]
102
+ : []);
103
+ if (nestedCalls.length > 0) {
104
+ return nestedCalls;
105
+ }
106
+ const data = transaction.txParams?.data;
107
+ if (data === undefined || data === '0x') {
108
+ return [];
109
+ }
110
+ return [
111
+ {
112
+ data,
113
+ target: transaction.txParams?.to,
114
+ },
115
+ ];
116
+ }
117
+ function getUnsupportedDestinationErrorMessage(data) {
118
+ const selector = getDestinationSelector(data);
119
+ return selector
120
+ ? `${UNSUPPORTED_DESTINATION_ERROR}. Destination selector: ${selector}`
121
+ : UNSUPPORTED_DESTINATION_ERROR;
122
+ }
123
+ function getDestinationSelector(data) {
124
+ if (!data || data.length < 10) {
125
+ return undefined;
126
+ }
127
+ return data.slice(0, 10).toLowerCase();
128
+ }
129
+ function serializeAcrossActionScalar(value) {
130
+ if (typeof value === 'string') {
131
+ return normalizeHexString(value);
132
+ }
133
+ if (typeof value === 'number' ||
134
+ typeof value === 'bigint' ||
135
+ typeof value === 'boolean') {
136
+ return String(value);
137
+ }
138
+ if (isBigNumberLike(value)) {
139
+ return value.toString();
140
+ }
141
+ /* istanbul ignore next: supported Across action ABIs only decode scalars and tuples of scalars. */
142
+ throw new Error(UNSUPPORTED_DESTINATION_ERROR);
143
+ }
144
+ function isBigNumberLike(value) {
145
+ return (typeof value === 'object' &&
146
+ value !== null &&
147
+ '_isBigNumber' in value &&
148
+ value._isBigNumber === true &&
149
+ 'toString' in value &&
150
+ typeof value.toString === 'function');
151
+ }
152
+ function isTransferCall(data) {
153
+ return tryParseTransferCall(data) !== undefined;
154
+ }
155
+ function tryParseAcrossActionCall(data) {
156
+ for (const functionSignature of ACROSS_ACTION_SIGNATURES) {
157
+ try {
158
+ const actionInterface = new Interface([functionSignature]);
159
+ return {
160
+ functionSignature,
161
+ transaction: actionInterface.parseTransaction({ data }),
162
+ };
163
+ }
164
+ catch {
165
+ // Intentionally empty.
166
+ }
167
+ }
168
+ return undefined;
169
+ }
170
+ function tryParseTransferCall(data) {
171
+ try {
172
+ return new Interface([TOKEN_TRANSFER_SIGNATURE]).parseTransaction({ data });
173
+ }
174
+ catch {
175
+ return undefined;
176
+ }
177
+ }
178
+ //# sourceMappingURL=across-actions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"across-actions.mjs","sourceRoot":"","sources":["../../../src/strategy/across/across-actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport type { TransactionDescription } from '@ethersproject/abi';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport type { AcrossAction, AcrossActionArg } from './types';\nimport type { QuoteRequest } from '../../types';\n\nexport const TOKEN_TRANSFER_SIGNATURE =\n 'function transfer(address to, uint256 value)';\nexport const CREATE_PROXY_SIGNATURE =\n 'function createProxy(address paymentToken, uint256 payment, address payable paymentReceiver, (uint8 v, bytes32 r, bytes32 s) createSig)';\nexport const SAFE_EXEC_TRANSACTION_SIGNATURE =\n 'function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures)';\n\nexport const UNSUPPORTED_DESTINATION_ERROR =\n 'Across only supports direct token transfers and a limited set of post-swap destination actions at the moment';\n\nexport type AcrossDestinationCall = {\n data: Hex;\n target?: Hex;\n};\n\nexport type AcrossDestination = {\n actions: AcrossAction[];\n recipient: Hex;\n};\n\ntype ParsedAcrossActionCall = {\n functionSignature: string;\n transaction: TransactionDescription;\n};\n\ntype BigNumberLike = {\n _isBigNumber: true;\n toString: () => string;\n};\n\nconst ACROSS_ACTION_SIGNATURES = [\n CREATE_PROXY_SIGNATURE,\n SAFE_EXEC_TRANSACTION_SIGNATURE,\n];\n\nexport function buildAcrossActionFromCall(\n call: AcrossDestinationCall,\n request: QuoteRequest,\n): AcrossAction {\n if (isTransferCall(call.data)) {\n return buildAcrossTransferAction(call, request);\n }\n\n const parsedCall = parseAcrossActionCall(call.data);\n\n return {\n args: Array.from(parsedCall.transaction.args).map((arg) => ({\n populateDynamically: false,\n value: serializeAcrossActionValue(arg),\n })),\n functionSignature: parsedCall.functionSignature,\n isNativeTransfer: false,\n target: getRequiredTarget(call),\n value: '0',\n };\n}\n\nexport function getTransferRecipient(data: Hex): Hex {\n const parsedCall = tryParseTransferCall(data);\n\n if (!parsedCall) {\n throw new Error(getUnsupportedDestinationErrorMessage(data));\n }\n\n return normalizeHexString(String(parsedCall.args[0])) as Hex;\n}\n\nexport function getAcrossDestination(\n transaction: TransactionMeta,\n request: QuoteRequest,\n): AcrossDestination {\n const { from } = request;\n const destinationCalls = getDestinationCalls(transaction);\n const swapRecipientTransferCallIndex = destinationCalls.findIndex((call) =>\n isExtractableOutputTokenTransferCall(call, request),\n );\n const callsForActions = [...destinationCalls];\n let recipient = from;\n\n if (swapRecipientTransferCallIndex !== -1) {\n const [swapRecipientTransferCall] = callsForActions.splice(\n swapRecipientTransferCallIndex,\n 1,\n );\n\n recipient = getTransferRecipient(swapRecipientTransferCall.data);\n }\n\n return {\n actions: callsForActions.map((call) =>\n buildAcrossActionFromCall(call, request),\n ),\n recipient,\n };\n}\n\nexport function isExtractableOutputTokenTransferCall(\n call: AcrossDestinationCall,\n request: QuoteRequest,\n): boolean {\n return (\n isTransferCall(call.data) &&\n (call.target === undefined ||\n normalizeHexString(call.target) ===\n normalizeHexString(request.targetTokenAddress))\n );\n}\n\nfunction getRequiredTarget(call: AcrossDestinationCall): Hex {\n if (!call.target) {\n throw new Error(UNSUPPORTED_DESTINATION_ERROR);\n }\n\n return call.target;\n}\n\nfunction normalizeHexString(value: string): string {\n /* istanbul ignore next: current supported Across action signatures only emit hex strings here. */\n if (!value.startsWith('0x')) {\n return value;\n }\n\n return value.toLowerCase();\n}\n\nfunction parseAcrossActionCall(data: Hex): ParsedAcrossActionCall {\n const parsedCall = tryParseAcrossActionCall(data);\n\n if (!parsedCall) {\n throw new Error(getUnsupportedDestinationErrorMessage(data));\n }\n\n return parsedCall;\n}\n\nfunction serializeAcrossActionValue(value: unknown): AcrossActionArg['value'] {\n if (Array.isArray(value)) {\n return value.map((entry) =>\n serializeAcrossActionScalar(entry),\n ) as AcrossActionArg['value'];\n }\n\n return serializeAcrossActionScalar(value);\n}\n\nfunction buildAcrossTransferAction(\n call: AcrossDestinationCall,\n request: QuoteRequest,\n): AcrossAction {\n return {\n args: [\n {\n populateDynamically: false,\n value: getTransferRecipient(call.data),\n },\n {\n balanceSourceToken: request.targetTokenAddress,\n populateDynamically: true,\n value: '0',\n },\n ],\n functionSignature: TOKEN_TRANSFER_SIGNATURE,\n isNativeTransfer: false,\n target: call.target ?? request.targetTokenAddress,\n value: '0',\n };\n}\n\nfunction getDestinationCalls(\n transaction: TransactionMeta,\n): AcrossDestinationCall[] {\n const nestedCalls = (\n transaction.nestedTransactions ?? []\n ).flatMap<AcrossDestinationCall>((nestedTx: { data?: Hex; to?: Hex }) =>\n nestedTx.data !== undefined && nestedTx.data !== '0x'\n ? [{ data: nestedTx.data, target: nestedTx.to }]\n : [],\n );\n\n if (nestedCalls.length > 0) {\n return nestedCalls;\n }\n\n const data = transaction.txParams?.data as Hex | undefined;\n\n if (data === undefined || data === '0x') {\n return [];\n }\n\n return [\n {\n data,\n target: transaction.txParams?.to as Hex | undefined,\n },\n ];\n}\n\nfunction getUnsupportedDestinationErrorMessage(data?: Hex): string {\n const selector = getDestinationSelector(data);\n\n return selector\n ? `${UNSUPPORTED_DESTINATION_ERROR}. Destination selector: ${selector}`\n : UNSUPPORTED_DESTINATION_ERROR;\n}\n\nfunction getDestinationSelector(data?: Hex): Hex | undefined {\n if (!data || data.length < 10) {\n return undefined;\n }\n\n return data.slice(0, 10).toLowerCase() as Hex;\n}\n\nfunction serializeAcrossActionScalar(value: unknown): string {\n if (typeof value === 'string') {\n return normalizeHexString(value);\n }\n\n if (\n typeof value === 'number' ||\n typeof value === 'bigint' ||\n typeof value === 'boolean'\n ) {\n return String(value);\n }\n\n if (isBigNumberLike(value)) {\n return value.toString();\n }\n\n /* istanbul ignore next: supported Across action ABIs only decode scalars and tuples of scalars. */\n throw new Error(UNSUPPORTED_DESTINATION_ERROR);\n}\n\nfunction isBigNumberLike(value: unknown): value is BigNumberLike {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_isBigNumber' in value &&\n value._isBigNumber === true &&\n 'toString' in value &&\n typeof value.toString === 'function'\n );\n}\n\nfunction isTransferCall(data: Hex): boolean {\n return tryParseTransferCall(data) !== undefined;\n}\n\nfunction tryParseAcrossActionCall(\n data: Hex,\n): ParsedAcrossActionCall | undefined {\n for (const functionSignature of ACROSS_ACTION_SIGNATURES) {\n try {\n const actionInterface = new Interface([functionSignature]);\n\n return {\n functionSignature,\n transaction: actionInterface.parseTransaction({ data }),\n };\n } catch {\n // Intentionally empty.\n }\n }\n\n return undefined;\n}\n\nfunction tryParseTransferCall(data: Hex): TransactionDescription | undefined {\n try {\n return new Interface([TOKEN_TRANSFER_SIGNATURE]).parseTransaction({ data });\n } catch {\n return undefined;\n }\n}\n"]}
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getAcrossQuotes = void 0;
4
- const abi_1 = require("@ethersproject/abi");
5
4
  const controller_utils_1 = require("@metamask/controller-utils");
6
- const transaction_controller_1 = require("@metamask/transaction-controller");
7
5
  const utils_1 = require("@metamask/utils");
8
6
  const bignumber_js_1 = require("bignumber.js");
7
+ const across_actions_1 = require("./across-actions.cjs");
9
8
  const transactions_1 = require("./transactions.cjs");
10
9
  const constants_1 = require("../../constants.cjs");
11
10
  const logger_1 = require("../../logger.cjs");
@@ -14,13 +13,8 @@ const feature_flags_1 = require("../../utils/feature-flags.cjs");
14
13
  const gas_1 = require("../../utils/gas.cjs");
15
14
  const quote_gas_1 = require("../../utils/quote-gas.cjs");
16
15
  const token_1 = require("../../utils/token.cjs");
17
- const constants_2 = require("../relay/constants.cjs");
18
16
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'across-strategy');
19
- const TOKEN_TRANSFER_INTERFACE = new abi_1.Interface([
20
- 'function transfer(address to, uint256 value)',
21
- ]);
22
17
  const UNSUPPORTED_AUTHORIZATION_LIST_ERROR = 'Across does not support type-4/EIP-7702 authorization lists yet';
23
- const UNSUPPORTED_DESTINATION_ERROR = 'Across only supports transfer-style destination flows at the moment';
24
18
  /**
25
19
  * Fetch Across quotes.
26
20
  *
@@ -55,7 +49,7 @@ async function getSingleQuote(request, fullRequest) {
55
49
  const slippageDecimal = (0, feature_flags_1.getSlippage)(messenger, sourceChainId, sourceTokenAddress);
56
50
  const amount = isMaxAmount ? sourceTokenAmount : targetAmountMinimum;
57
51
  const tradeType = isMaxAmount ? 'exactInput' : 'exactOutput';
58
- const destination = getAcrossDestination(transaction, request);
52
+ const destination = (0, across_actions_1.getAcrossDestination)(transaction, request);
59
53
  const quote = await requestAcrossApproval({
60
54
  actions: destination.actions,
61
55
  amount,
@@ -105,70 +99,6 @@ async function requestAcrossApproval(request) {
105
99
  const response = await (0, controller_utils_1.successfulFetch)(url, options);
106
100
  return (await response.json());
107
101
  }
108
- function getAcrossDestination(transaction, request) {
109
- const { txParams } = transaction;
110
- const { from } = request;
111
- const transferData = getTransferData(transaction);
112
- if (transferData) {
113
- const transferRecipient = getTransferRecipient(transferData);
114
- if (transaction.type === transaction_controller_1.TransactionType.predictDeposit) {
115
- return {
116
- actions: [buildAcrossTransferAction(transferRecipient, request)],
117
- recipient: from,
118
- };
119
- }
120
- return {
121
- actions: [],
122
- recipient: transferRecipient,
123
- };
124
- }
125
- const data = txParams?.data;
126
- const hasNoData = data === undefined || data === '0x';
127
- const nestedCalldata = getNestedCalldata(transaction);
128
- if (hasNoData && nestedCalldata.length === 0) {
129
- return {
130
- actions: [],
131
- recipient: from,
132
- };
133
- }
134
- throw new Error(UNSUPPORTED_DESTINATION_ERROR);
135
- }
136
- function buildAcrossTransferAction(transferRecipient, request) {
137
- return {
138
- args: [
139
- {
140
- populateDynamically: false,
141
- value: transferRecipient,
142
- },
143
- {
144
- balanceSourceToken: request.targetTokenAddress,
145
- populateDynamically: true,
146
- value: '0',
147
- },
148
- ],
149
- functionSignature: 'function transfer(address to, uint256 value)',
150
- isNativeTransfer: false,
151
- target: request.targetTokenAddress,
152
- value: '0',
153
- };
154
- }
155
- function getTransferData(transaction) {
156
- const { nestedTransactions, txParams } = transaction;
157
- const nestedTransferData = nestedTransactions?.find((nestedTx) => nestedTx.data?.startsWith(constants_2.TOKEN_TRANSFER_FOUR_BYTE))?.data;
158
- const data = txParams?.data;
159
- const tokenTransferData = data?.startsWith(constants_2.TOKEN_TRANSFER_FOUR_BYTE)
160
- ? data
161
- : undefined;
162
- return nestedTransferData ?? tokenTransferData;
163
- }
164
- function getNestedCalldata(transaction) {
165
- return (transaction.nestedTransactions ?? [])
166
- .map((nestedTx) => nestedTx.data)
167
- .filter((data) => data !== undefined && data !== '0x');
168
- }
169
- function getTransferRecipient(data) {
170
- return TOKEN_TRANSFER_INTERFACE.decodeFunctionData('transfer', data).to.toLowerCase();
171
- }
172
102
  async function normalizeQuote(original, request, fullRequest) {
173
103
  const { messenger } = fullRequest;
174
104
  const { quote } = original;