@uniswap/universal-router-sdk 5.9.0 → 5.11.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 (46) hide show
  1. package/README.md +12 -2
  2. package/dist/cjs/src/entities/actions/uniswap.js +12 -1
  3. package/dist/cjs/src/entities/actions/uniswap.js.map +1 -1
  4. package/dist/cjs/src/index.d.ts +2 -0
  5. package/dist/cjs/src/index.js +3 -1
  6. package/dist/cjs/src/index.js.map +1 -1
  7. package/dist/cjs/src/swapRouter.d.ts +16 -3
  8. package/dist/cjs/src/swapRouter.js +28 -5
  9. package/dist/cjs/src/swapRouter.js.map +1 -1
  10. package/dist/cjs/src/types/encodeSwaps.d.ts +14 -1
  11. package/dist/cjs/src/utils/directTransfers.d.ts +14 -0
  12. package/dist/cjs/src/utils/directTransfers.js +264 -0
  13. package/dist/cjs/src/utils/directTransfers.js.map +1 -0
  14. package/dist/cjs/src/utils/encodeSwapStep.js +5 -5
  15. package/dist/cjs/src/utils/encodeSwapStep.js.map +1 -1
  16. package/dist/cjs/src/utils/encodeV4Action.js +2 -2
  17. package/dist/cjs/src/utils/encodeV4Action.js.map +1 -1
  18. package/dist/cjs/src/utils/normalizeEncodeSwapsSpec.js +3 -2
  19. package/dist/cjs/src/utils/normalizeEncodeSwapsSpec.js.map +1 -1
  20. package/dist/cjs/src/utils/validateEncodeSwaps.js +86 -24
  21. package/dist/cjs/src/utils/validateEncodeSwaps.js.map +1 -1
  22. package/dist/esm/src/entities/actions/uniswap.js +11 -1
  23. package/dist/esm/src/entities/actions/uniswap.js.map +1 -1
  24. package/dist/esm/src/index.d.ts +2 -0
  25. package/dist/esm/src/index.js +1 -0
  26. package/dist/esm/src/index.js.map +1 -1
  27. package/dist/esm/src/swapRouter.d.ts +16 -3
  28. package/dist/esm/src/swapRouter.js +28 -5
  29. package/dist/esm/src/swapRouter.js.map +1 -1
  30. package/dist/esm/src/types/encodeSwaps.d.ts +14 -1
  31. package/dist/esm/src/utils/directTransfers.d.ts +14 -0
  32. package/dist/esm/src/utils/directTransfers.js +253 -0
  33. package/dist/esm/src/utils/directTransfers.js.map +1 -0
  34. package/dist/esm/src/utils/encodeSwapStep.js +5 -5
  35. package/dist/esm/src/utils/encodeSwapStep.js.map +1 -1
  36. package/dist/esm/src/utils/encodeV4Action.js +2 -2
  37. package/dist/esm/src/utils/encodeV4Action.js.map +1 -1
  38. package/dist/esm/src/utils/normalizeEncodeSwapsSpec.js +3 -2
  39. package/dist/esm/src/utils/normalizeEncodeSwapsSpec.js.map +1 -1
  40. package/dist/esm/src/utils/validateEncodeSwaps.js +86 -24
  41. package/dist/esm/src/utils/validateEncodeSwaps.js.map +1 -1
  42. package/dist/types/src/index.d.ts +2 -0
  43. package/dist/types/src/swapRouter.d.ts +16 -3
  44. package/dist/types/src/types/encodeSwaps.d.ts +14 -1
  45. package/dist/types/src/utils/directTransfers.d.ts +14 -0
  46. package/package.json +1 -1
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.directTransferSweepFloor = exports.sumDirectOutputMin = exports.sumUserPaidMax = exports.stepUserPaidPulls = exports.hasUserPaidFlag = exports.v3PathLastToken = exports.v3PathFirstToken = exports.getV3HopCount = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const sdk_core_1 = require("@uniswap/sdk-core");
6
+ const constants_1 = require("./constants");
7
+ // V3 path: 20-byte address + N × (3-byte fee + 20-byte address); minimum is 43 bytes (single hop, N=1)
8
+ // Returns N or undefined if malformed
9
+ function getV3HopCount(path) {
10
+ if (!path.startsWith('0x'))
11
+ return undefined;
12
+ const byteLength = (path.length - 2) / 2;
13
+ if (byteLength < 43)
14
+ return undefined;
15
+ const variableSegmentLength = byteLength - 20;
16
+ if (variableSegmentLength < 23 || variableSegmentLength % 23 !== 0)
17
+ return undefined;
18
+ return variableSegmentLength / 23;
19
+ }
20
+ exports.getV3HopCount = getV3HopCount;
21
+ function v3PathFirstToken(path) {
22
+ if (getV3HopCount(path) === undefined)
23
+ return undefined;
24
+ return '0x' + path.slice(2, 42);
25
+ }
26
+ exports.v3PathFirstToken = v3PathFirstToken;
27
+ function v3PathLastToken(path) {
28
+ if (getV3HopCount(path) === undefined)
29
+ return undefined;
30
+ return '0x' + path.slice(-40);
31
+ }
32
+ exports.v3PathLastToken = v3PathLastToken;
33
+ // SETTLE_ALL / TAKE_ALL are intrinsically direct (no flag on-chain) and are gated separately
34
+ function hasUserPaidFlag(step) {
35
+ switch (step.type) {
36
+ case 'V2_SWAP_EXACT_IN':
37
+ case 'V2_SWAP_EXACT_OUT':
38
+ case 'V3_SWAP_EXACT_IN':
39
+ case 'V3_SWAP_EXACT_OUT':
40
+ return step.payerIsUser === true;
41
+ case 'V4_SWAP':
42
+ return step.v4Actions.some((a) => a.action === 'SETTLE' && a.payerIsUser === true);
43
+ default:
44
+ return false;
45
+ }
46
+ }
47
+ exports.hasUserPaidFlag = hasUserPaidFlag;
48
+ function v4UserPaidPulls(action) {
49
+ switch (action.action) {
50
+ case 'SETTLE':
51
+ return action.payerIsUser === true ? [{ token: action.currency, maxAmount: ethers_1.BigNumber.from(action.amount) }] : [];
52
+ case 'SETTLE_ALL':
53
+ // SETTLE_ALL always settles from msgSender (the user), bounded on-chain by maxAmount
54
+ return [{ token: action.currency, maxAmount: ethers_1.BigNumber.from(action.maxAmount) }];
55
+ default:
56
+ return [];
57
+ }
58
+ }
59
+ // contract-enforced maxima: exact-in pulls exactly amountIn; exact-out reverts above amountInMax
60
+ function stepUserPaidPulls(step) {
61
+ switch (step.type) {
62
+ case 'V2_SWAP_EXACT_IN':
63
+ return step.payerIsUser === true ? [{ token: step.path[0], maxAmount: ethers_1.BigNumber.from(step.amountIn) }] : [];
64
+ case 'V2_SWAP_EXACT_OUT':
65
+ return step.payerIsUser === true ? [{ token: step.path[0], maxAmount: ethers_1.BigNumber.from(step.amountInMax) }] : [];
66
+ case 'V3_SWAP_EXACT_IN':
67
+ return step.payerIsUser === true
68
+ ? [{ token: v3PathFirstToken(step.path), maxAmount: ethers_1.BigNumber.from(step.amountIn) }]
69
+ : [];
70
+ case 'V3_SWAP_EXACT_OUT':
71
+ // exact-out paths are encoded output-first, so the input token is the path tail
72
+ return step.payerIsUser === true
73
+ ? [{ token: v3PathLastToken(step.path), maxAmount: ethers_1.BigNumber.from(step.amountInMax) }]
74
+ : [];
75
+ case 'V4_SWAP':
76
+ return step.v4Actions.flatMap(v4UserPaidPulls);
77
+ default:
78
+ return [];
79
+ }
80
+ }
81
+ exports.stepUserPaidPulls = stepUserPaidPulls;
82
+ // token-agnostic by design: validation binds every pull to the input token before this sum is
83
+ // used, so off-token pulls are rejected rather than filtered (unlike output credits below)
84
+ function sumUserPaidMax(steps) {
85
+ return steps.flatMap(stepUserPaidPulls).reduce((total, pull) => total.add(pull.maxAmount), ethers_1.BigNumber.from(0));
86
+ }
87
+ exports.sumUserPaidMax = sumUserPaidMax;
88
+ // input/output currencies of a v4 swap action's delta within its command's lock
89
+ function v4SwapCurrencies(action) {
90
+ switch (action.action) {
91
+ case 'SWAP_EXACT_IN':
92
+ return action.path.length > 0
93
+ ? { input: action.currencyIn, output: action.path[action.path.length - 1].intermediateCurrency }
94
+ : undefined;
95
+ case 'SWAP_EXACT_OUT':
96
+ // exact-out paths walk from the input side, so the first hop names the input currency
97
+ return action.path.length > 0
98
+ ? { input: action.path[0].intermediateCurrency, output: action.currencyOut }
99
+ : undefined;
100
+ case 'SWAP_EXACT_IN_SINGLE':
101
+ case 'SWAP_EXACT_OUT_SINGLE':
102
+ return action.zeroForOne
103
+ ? { input: action.poolKey.currency0, output: action.poolKey.currency1 }
104
+ : { input: action.poolKey.currency1, output: action.poolKey.currency0 };
105
+ default:
106
+ return undefined;
107
+ }
108
+ }
109
+ // credits exact-in swap minimums that a single OPEN_DELTA take forwards to the recipient.
110
+ // sound because the v4 ledger must zero for the command to succeed: when a currency's only
111
+ // take is one OPEN_DELTA take to the recipient and nothing else in the block can consume that
112
+ // currency, any successful transaction paid the recipient everything the block's swaps produced
113
+ // of it — contract-enforced to be at least the exact-in swaps' summed amountOutMinimums
114
+ // (order-independent: an early take strands later credit and reverts the lock)
115
+ function v4OpenDeltaTakeCredits(actions, recipient) {
116
+ var _a, _b, _c;
117
+ const swapMins = new Map();
118
+ const takeCounts = new Map();
119
+ const soleOpenDeltaToRecipient = new Map();
120
+ const disqualified = new Set();
121
+ for (const action of actions) {
122
+ switch (action.action) {
123
+ case 'SWAP_EXACT_IN':
124
+ case 'SWAP_EXACT_OUT':
125
+ case 'SWAP_EXACT_IN_SINGLE':
126
+ case 'SWAP_EXACT_OUT_SINGLE': {
127
+ const currencies = v4SwapCurrencies(action);
128
+ if (currencies === undefined)
129
+ return []; // unparseable swap: cannot attribute deltas, credit nothing
130
+ disqualified.add(currencies.input.toLowerCase()); // the swap consumes this currency's delta
131
+ // only exact-in minimums are creditable: the action enforces them (V4TooLittleReceived).
132
+ // exact-out amounts are NOT asserted by the deployed v4 router — a price-limit partial
133
+ // fill succeeds with less — so exact-out swaps contribute zero (their actual output only
134
+ // adds on top of the credited exact-in minimums, keeping the credit a valid lower bound)
135
+ if (action.action === 'SWAP_EXACT_IN' || action.action === 'SWAP_EXACT_IN_SINGLE') {
136
+ const output = currencies.output.toLowerCase();
137
+ swapMins.set(output, ((_a = swapMins.get(output)) !== null && _a !== void 0 ? _a : ethers_1.BigNumber.from(0)).add(ethers_1.BigNumber.from(action.amountOutMinimum)));
138
+ }
139
+ break;
140
+ }
141
+ case 'SETTLE':
142
+ case 'SETTLE_ALL':
143
+ disqualified.add(action.currency.toLowerCase());
144
+ break;
145
+ case 'TAKE': {
146
+ const currency = action.currency.toLowerCase();
147
+ takeCounts.set(currency, ((_b = takeCounts.get(currency)) !== null && _b !== void 0 ? _b : 0) + 1);
148
+ soleOpenDeltaToRecipient.set(currency, ethers_1.BigNumber.from(action.amount).isZero() && action.recipient.toLowerCase() === recipient.toLowerCase());
149
+ break;
150
+ }
151
+ case 'TAKE_ALL':
152
+ case 'TAKE_PORTION': {
153
+ const currency = action.currency.toLowerCase();
154
+ takeCounts.set(currency, ((_c = takeCounts.get(currency)) !== null && _c !== void 0 ? _c : 0) + 1);
155
+ soleOpenDeltaToRecipient.set(currency, false);
156
+ break;
157
+ }
158
+ default:
159
+ break;
160
+ }
161
+ }
162
+ const credits = [];
163
+ for (const [currency, min] of swapMins) {
164
+ if (takeCounts.get(currency) === 1 && soleOpenDeltaToRecipient.get(currency) && !disqualified.has(currency)) {
165
+ credits.push({ token: currency, minAmount: min });
166
+ }
167
+ }
168
+ return credits;
169
+ }
170
+ function v4DirectOutputCredits(action, recipient) {
171
+ switch (action.action) {
172
+ case 'TAKE': {
173
+ if (action.recipient.toLowerCase() !== recipient.toLowerCase())
174
+ return [];
175
+ const amount = ethers_1.BigNumber.from(action.amount);
176
+ // OPEN_DELTA (0) / CONTRACT_BALANCE takes are runtime-sized: deliverable, but guarantee nothing
177
+ if (amount.lte(0) || amount.gte(constants_1.CONTRACT_BALANCE))
178
+ return [];
179
+ return [{ token: action.currency, minAmount: amount }];
180
+ }
181
+ case 'TAKE_ALL':
182
+ // pays msgSender on-chain: counts only when the spec recipient IS the sender sentinel
183
+ return recipient === constants_1.SENDER_AS_RECIPIENT
184
+ ? [{ token: action.currency, minAmount: ethers_1.BigNumber.from(action.minAmount) }]
185
+ : [];
186
+ default:
187
+ return [];
188
+ }
189
+ }
190
+ // contract-guaranteed amounts a step delivers directly to `recipient`
191
+ function stepDirectOutputCredits(step, recipient) {
192
+ const isDirect = 'recipient' in step && step.recipient.toLowerCase() === recipient.toLowerCase();
193
+ switch (step.type) {
194
+ case 'V2_SWAP_EXACT_IN':
195
+ return isDirect ? [{ token: step.path[step.path.length - 1], minAmount: ethers_1.BigNumber.from(step.amountOutMin) }] : [];
196
+ case 'V2_SWAP_EXACT_OUT':
197
+ // not creditable: v2SwapExactOutput only bounds amountIn (<= amountInMaximum) and never asserts
198
+ // amountOut was produced — unlike V3 exact-out (V3InvalidAmountOut) or v4 exact-out (concrete TAKE /
199
+ // CurrencyNotSettled). So a fee-on-transfer input/intermediate makes the leg produce less than
200
+ // amountOut and still succeed; like v4 OPEN_DELTA exact-out, contribute zero.
201
+ return [];
202
+ case 'V3_SWAP_EXACT_IN':
203
+ return isDirect ? [{ token: v3PathLastToken(step.path), minAmount: ethers_1.BigNumber.from(step.amountOutMin) }] : [];
204
+ case 'V3_SWAP_EXACT_OUT':
205
+ // exact-out paths are encoded output-first, so the output token is the path head
206
+ return isDirect ? [{ token: v3PathFirstToken(step.path), minAmount: ethers_1.BigNumber.from(step.amountOut) }] : [];
207
+ case 'UNWRAP_WETH':
208
+ return isDirect ? [{ token: constants_1.ETH_ADDRESS, minAmount: ethers_1.BigNumber.from(step.amountMin) }] : [];
209
+ case 'V4_SWAP':
210
+ // per-action concrete credits and the block-level OPEN_DELTA rule are disjoint:
211
+ // an OPEN_DELTA take never produces a per-action credit
212
+ return [
213
+ ...step.v4Actions.flatMap((action) => v4DirectOutputCredits(action, recipient)),
214
+ ...v4OpenDeltaTakeCredits(step.v4Actions, recipient),
215
+ ];
216
+ default:
217
+ return [];
218
+ }
219
+ }
220
+ // Direct-output coverage in the output token: the summed contract-enforced minimum delivered straight to
221
+ // the recipient, and the number of coverage-bearing legs it came from. Summed per-leg floors can trail the
222
+ // trade-level floor by up to one wei each, so the caller uses `legs` to size how much rounding to tolerate;
223
+ // only legs carrying a nonzero minimum count — a zero-min leg has no flooring error to forgive, so it must
224
+ // not pad the tolerance.
225
+ function directOutputCoverage(steps, recipient, outputTokenAddress) {
226
+ const target = outputTokenAddress.toLowerCase();
227
+ const credits = steps
228
+ .flatMap((step) => stepDirectOutputCredits(step, recipient))
229
+ .filter((credit) => credit.token !== undefined && credit.token.toLowerCase() === target);
230
+ return {
231
+ min: credits.reduce((total, credit) => total.add(credit.minAmount), ethers_1.BigNumber.from(0)),
232
+ legs: credits.filter((credit) => credit.minAmount.gt(0)).length,
233
+ };
234
+ }
235
+ function sumDirectOutputMin(steps, recipient, outputTokenAddress) {
236
+ return directOutputCoverage(steps, recipient, outputTokenAddress).min;
237
+ }
238
+ exports.sumDirectOutputMin = sumDirectOutputMin;
239
+ // The final SWEEP floor for a direct-transfer plan: netMin minus what the direct legs already guarantee to
240
+ // the recipient. Direct legs pay straight from the pools, so their credited minimums can sum a few wei
241
+ // below netMin — from independent integer flooring, and from routers that floor slippage in f64 — with no
242
+ // custody balance to cover the gap. A small tolerance forgives that sub-economic rounding so a fully
243
+ // covered direct plan doesn't revert; a larger, real coverage gap still enforces the full floor.
244
+ function directTransferSweepFloor(spec, netMin, swapSteps, outputTokenAddress) {
245
+ const { min: directOutputMin, legs } = directOutputCoverage(swapSteps, spec.recipient, outputTokenAddress);
246
+ const shortfall = netMin.sub(directOutputMin);
247
+ // flexibility tolerance: min(0.5bps of netMin, 1% of the slippage the user set). Headroom for a router's
248
+ // per-leg slippage math; scales to 0 as slippage -> 0 (and is 0 for exact-output, which has no
249
+ // output-side slippage), so an exact-price trade stays exact.
250
+ const slippageNumerator = ethers_1.BigNumber.from(spec.slippageTolerance.numerator.toString());
251
+ const slippageDenominator = ethers_1.BigNumber.from(spec.slippageTolerance.denominator.toString());
252
+ const outputSlippage = spec.tradeType === sdk_core_1.TradeType.EXACT_INPUT
253
+ ? ethers_1.BigNumber.from(spec.routing.quote.quotient.toString()).mul(slippageNumerator).div(slippageDenominator)
254
+ : ethers_1.BigNumber.from(0);
255
+ const halfBps = netMin.div(20000);
256
+ const onePercentOfSlippage = outputSlippage.div(100);
257
+ const flexibilityTolerance = halfBps.lt(onePercentOfSlippage) ? halfBps : onePercentOfSlippage;
258
+ // rounding tolerance: 2 wei per direct leg — inherent integer per-leg flooring, always allowed.
259
+ const roundingTolerance = ethers_1.BigNumber.from(legs * 2);
260
+ const toleratedShortfall = flexibilityTolerance.gt(roundingTolerance) ? flexibilityTolerance : roundingTolerance;
261
+ return shortfall.gt(toleratedShortfall) ? shortfall : ethers_1.BigNumber.from(0);
262
+ }
263
+ exports.directTransferSweepFloor = directTransferSweepFloor;
264
+ //# sourceMappingURL=directTransfers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directTransfers.js","sourceRoot":"","sources":["../../../../src/utils/directTransfers.ts"],"names":[],"mappings":"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"}
@@ -6,34 +6,34 @@ const constants_1 = require("./constants");
6
6
  const routerCommands_1 = require("./routerCommands");
7
7
  const encodeV4Action_1 = require("./encodeV4Action");
8
8
  const toV4URVersion_1 = require("./toV4URVersion");
9
- // V2/V3 swap params hardcode payerIsUser=false; encodeSwaps pulls funds into the router first via PERMIT2_TRANSFER_FROM
9
+ // payerIsUser defaults to false (router custody); validateEncodeSwaps gates when true is allowed
10
10
  function encodeSwapStep(planner, step, urVersion) {
11
11
  var _a, _b, _c, _d;
12
12
  const useV2_1_1 = (0, constants_1.isAtLeastV2_1_1)(urVersion);
13
13
  switch (step.type) {
14
14
  case 'V2_SWAP_EXACT_IN': {
15
- const params = [step.recipient, step.amountIn, step.amountOutMin, step.path, false];
15
+ const params = [step.recipient, step.amountIn, step.amountOutMin, step.path, step.payerIsUser === true];
16
16
  if (useV2_1_1)
17
17
  params.push((_a = step.minHopPriceX36) !== null && _a !== void 0 ? _a : []);
18
18
  planner.addCommand(routerCommands_1.CommandType.V2_SWAP_EXACT_IN, params, false, urVersion);
19
19
  return;
20
20
  }
21
21
  case 'V2_SWAP_EXACT_OUT': {
22
- const params = [step.recipient, step.amountOut, step.amountInMax, step.path, false];
22
+ const params = [step.recipient, step.amountOut, step.amountInMax, step.path, step.payerIsUser === true];
23
23
  if (useV2_1_1)
24
24
  params.push((_b = step.minHopPriceX36) !== null && _b !== void 0 ? _b : []);
25
25
  planner.addCommand(routerCommands_1.CommandType.V2_SWAP_EXACT_OUT, params, false, urVersion);
26
26
  return;
27
27
  }
28
28
  case 'V3_SWAP_EXACT_IN': {
29
- const params = [step.recipient, step.amountIn, step.amountOutMin, step.path, false];
29
+ const params = [step.recipient, step.amountIn, step.amountOutMin, step.path, step.payerIsUser === true];
30
30
  if (useV2_1_1)
31
31
  params.push((_c = step.minHopPriceX36) !== null && _c !== void 0 ? _c : []);
32
32
  planner.addCommand(routerCommands_1.CommandType.V3_SWAP_EXACT_IN, params, false, urVersion);
33
33
  return;
34
34
  }
35
35
  case 'V3_SWAP_EXACT_OUT': {
36
- const params = [step.recipient, step.amountOut, step.amountInMax, step.path, false];
36
+ const params = [step.recipient, step.amountOut, step.amountInMax, step.path, step.payerIsUser === true];
37
37
  if (useV2_1_1)
38
38
  params.push((_d = step.minHopPriceX36) !== null && _d !== void 0 ? _d : []);
39
39
  planner.addCommand(routerCommands_1.CommandType.V3_SWAP_EXACT_OUT, params, false, urVersion);
@@ -1 +1 @@
1
- {"version":3,"file":"encodeSwapStep.js","sourceRoot":"","sources":["../../../../src/utils/encodeSwapStep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encodeSwapStep.js","sourceRoot":"","sources":["../../../../src/utils/encodeSwapStep.ts"],"names":[],"mappings":"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"}
@@ -66,8 +66,8 @@ function encodeV4Action(v4Action, urVersion) {
66
66
  ],
67
67
  };
68
68
  case 'SETTLE':
69
- // payerIsUser=false: same router-custody model as encodeSwapStep funds are already in the router
70
- return { action, params: [v4Action.currency, v4Action.amount, false] };
69
+ // payerIsUser defaults to false (router custody); validateEncodeSwaps gates when true is allowed
70
+ return { action, params: [v4Action.currency, v4Action.amount, v4Action.payerIsUser === true] };
71
71
  case 'SETTLE_ALL':
72
72
  return { action, params: [v4Action.currency, v4Action.maxAmount] };
73
73
  case 'TAKE':
@@ -1 +1 @@
1
- {"version":3,"file":"encodeV4Action.js","sourceRoot":"","sources":["../../../../src/utils/encodeV4Action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encodeV4Action.js","sourceRoot":"","sources":["../../../../src/utils/encodeV4Action.ts"],"names":[],"mappings":"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"}
@@ -3,15 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeEncodeSwapsSpec = void 0;
4
4
  const uniswap_1 = require("../entities/actions/uniswap");
5
5
  const constants_1 = require("./constants");
6
- // Fills the four optional fields that `validateEncodeSwaps` and `computeEncodeSwapsAmounts` require.
6
+ // Fills the five optional fields that `validateEncodeSwaps` and `computeEncodeSwapsAmounts` require.
7
7
  function normalizeEncodeSwapsSpec(spec) {
8
- var _a, _b, _c, _d;
8
+ var _a, _b, _c, _d, _e;
9
9
  return {
10
10
  ...spec,
11
11
  recipient: (_a = spec.recipient) !== null && _a !== void 0 ? _a : constants_1.SENDER_AS_RECIPIENT,
12
12
  tokenTransferMode: (_b = spec.tokenTransferMode) !== null && _b !== void 0 ? _b : uniswap_1.TokenTransferMode.Permit2,
13
13
  urVersion: (_c = spec.urVersion) !== null && _c !== void 0 ? _c : constants_1.UniversalRouterVersion.V2_0,
14
14
  safeMode: (_d = spec.safeMode) !== null && _d !== void 0 ? _d : false,
15
+ allowDirectTransfers: (_e = spec.allowDirectTransfers) !== null && _e !== void 0 ? _e : false,
15
16
  };
16
17
  }
17
18
  exports.normalizeEncodeSwapsSpec = normalizeEncodeSwapsSpec;
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeEncodeSwapsSpec.js","sourceRoot":"","sources":["../../../../src/utils/normalizeEncodeSwapsSpec.ts"],"names":[],"mappings":";;;AAAA,yDAA+D;AAE/D,2CAAyE;AAEzE,qGAAqG;AACrG,SAAgB,wBAAwB,CAAC,IAAuB;;IAC9D,OAAO;QACL,GAAG,IAAI;QACP,SAAS,EAAE,MAAA,IAAI,CAAC,SAAS,mCAAI,+BAAmB;QAChD,iBAAiB,EAAE,MAAA,IAAI,CAAC,iBAAiB,mCAAI,2BAAiB,CAAC,OAAO;QACtE,SAAS,EAAE,MAAA,IAAI,CAAC,SAAS,mCAAI,kCAAsB,CAAC,IAAI;QACxD,QAAQ,EAAE,MAAA,IAAI,CAAC,QAAQ,mCAAI,KAAK;KACjC,CAAA;AACH,CAAC;AARD,4DAQC"}
1
+ {"version":3,"file":"normalizeEncodeSwapsSpec.js","sourceRoot":"","sources":["../../../../src/utils/normalizeEncodeSwapsSpec.ts"],"names":[],"mappings":";;;AAAA,yDAA+D;AAE/D,2CAAyE;AAEzE,qGAAqG;AACrG,SAAgB,wBAAwB,CAAC,IAAuB;;IAC9D,OAAO;QACL,GAAG,IAAI;QACP,SAAS,EAAE,MAAA,IAAI,CAAC,SAAS,mCAAI,+BAAmB;QAChD,iBAAiB,EAAE,MAAA,IAAI,CAAC,iBAAiB,mCAAI,2BAAiB,CAAC,OAAO;QACtE,SAAS,EAAE,MAAA,IAAI,CAAC,SAAS,mCAAI,kCAAsB,CAAC,IAAI;QACxD,QAAQ,EAAE,MAAA,IAAI,CAAC,QAAQ,mCAAI,KAAK;QAChC,oBAAoB,EAAE,MAAA,IAAI,CAAC,oBAAoB,mCAAI,KAAK;KACzD,CAAA;AACH,CAAC;AATD,4DASC"}
@@ -7,19 +7,9 @@ const tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant"));
7
7
  const sdk_core_1 = require("@uniswap/sdk-core");
8
8
  const uniswap_1 = require("../entities/actions/uniswap");
9
9
  const constants_1 = require("./constants");
10
- // V3 path: 20-byte address + N × (3-byte fee + 20-byte address); minimum is 43 bytes (single hop, N=1)
11
- // Returns N or undefined if malformed
12
- function getV3HopCount(path) {
13
- if (!path.startsWith('0x'))
14
- return undefined;
15
- const byteLength = (path.length - 2) / 2;
16
- if (byteLength < 43)
17
- return undefined;
18
- const variableSegmentLength = byteLength - 20;
19
- if (variableSegmentLength < 23 || variableSegmentLength % 23 !== 0)
20
- return undefined;
21
- return variableSegmentLength / 23;
22
- }
10
+ const getCurrencyAddress_1 = require("./getCurrencyAddress");
11
+ const directTransfers_1 = require("./directTransfers");
12
+ const computeEncodeSwapsAmounts_1 = require("./computeEncodeSwapsAmounts");
23
13
  function hasV4MinHopPriceX36(action) {
24
14
  switch (action.action) {
25
15
  case 'SWAP_EXACT_IN':
@@ -46,22 +36,52 @@ function validateV4HopCounts(actions) {
46
36
  function assertRouterRecipient(recipient) {
47
37
  (0, tiny_invariant_1.default)(recipient === constants_1.ROUTER_AS_RECIPIENT, 'STEP_RECIPIENT_MUST_BE_ROUTER');
48
38
  }
49
- function assertRouterActionRecipient(recipient) {
50
- (0, tiny_invariant_1.default)(recipient === constants_1.ROUTER_AS_RECIPIENT, 'V4_ACTION_RECIPIENT_MUST_BE_ROUTER');
39
+ // `routerOnlyError` is the surface's legacy flag-off code (steps vs v4 actions)
40
+ function checkRecipient(spec, recipient, routerOnlyError) {
41
+ var _a;
42
+ (0, tiny_invariant_1.default)(typeof recipient === 'string', routerOnlyError);
43
+ if (recipient === constants_1.ROUTER_AS_RECIPIENT)
44
+ return;
45
+ (0, tiny_invariant_1.default)(spec.allowDirectTransfers, routerOnlyError);
46
+ (0, tiny_invariant_1.default)(((_a = spec.fee) === null || _a === void 0 ? void 0 : _a.kind) !== 'portion', 'PORTION_FEE_REQUIRES_ROUTER_CUSTODY');
47
+ (0, tiny_invariant_1.default)(recipient.toLowerCase() === spec.recipient.toLowerCase(), 'STEP_RECIPIENT_NOT_ALLOWED');
51
48
  }
52
- // V4 actions that take a recipient must use router custody so the SDK's settlement sweeps see the funds
53
- function validateV4Recipients(actions) {
49
+ function validateV4Recipients(actions, spec) {
50
+ var _a;
54
51
  for (const action of actions) {
55
52
  switch (action.action) {
56
53
  case 'TAKE':
57
54
  case 'TAKE_PORTION':
58
- assertRouterActionRecipient(action.recipient);
55
+ // fees are sdk-authored (the envelope's PAY_PORTION); a step-level TAKE_PORTION never pays the fee recipient
56
+ checkRecipient(spec, action.recipient, 'V4_ACTION_RECIPIENT_MUST_BE_ROUTER');
57
+ break;
58
+ case 'TAKE_ALL':
59
+ // TAKE_ALL pays msgSender on-chain; any other spec recipient would be the
60
+ // wrong payee while still reducing their sweep floor.
61
+ (0, tiny_invariant_1.default)(spec.allowDirectTransfers, 'TAKE_ALL_REQUIRES_DIRECT_TRANSFERS');
62
+ (0, tiny_invariant_1.default)(((_a = spec.fee) === null || _a === void 0 ? void 0 : _a.kind) !== 'portion', 'PORTION_FEE_REQUIRES_ROUTER_CUSTODY');
63
+ // strict equality: the all-numeric sentinel has no checksum variant; anything else fails closed
64
+ (0, tiny_invariant_1.default)(spec.recipient === constants_1.SENDER_AS_RECIPIENT, 'TAKE_ALL_REQUIRES_SENDER_RECIPIENT');
59
65
  break;
60
66
  default:
61
67
  break;
62
68
  }
63
69
  }
64
70
  }
71
+ const HEX_BYTES = /^0x([0-9a-fA-F]{2})*$/;
72
+ // ethers rejects non-hex hookData (e.g. '') deep inside abi encoding; fail loudly here instead
73
+ function validateV4HookData(actions) {
74
+ for (const action of actions) {
75
+ if (action.action === 'SWAP_EXACT_IN_SINGLE' || action.action === 'SWAP_EXACT_OUT_SINGLE') {
76
+ (0, tiny_invariant_1.default)(HEX_BYTES.test(action.hookData), 'V4_HOOK_DATA_INVALID');
77
+ }
78
+ if (action.action === 'SWAP_EXACT_IN' || action.action === 'SWAP_EXACT_OUT') {
79
+ for (const hop of action.path) {
80
+ (0, tiny_invariant_1.default)(HEX_BYTES.test(hop.hookData), 'V4_HOOK_DATA_INVALID');
81
+ }
82
+ }
83
+ }
84
+ }
65
85
  function validateEncodeSwaps(spec, swapSteps) {
66
86
  var _a, _b, _c, _d;
67
87
  (0, tiny_invariant_1.default)(swapSteps.length > 0, 'EMPTY_SWAP_STEPS');
@@ -106,8 +126,18 @@ function validateEncodeSwaps(spec, swapSteps) {
106
126
  (0, tiny_invariant_1.default)(!(((_d = spec.fee) === null || _d === void 0 ? void 0 : _d.kind) === 'portion' &&
107
127
  spec.urVersion === constants_1.UniversalRouterVersion.V2_0 &&
108
128
  !spec.fee.fee.multiply(10000).remainder.equalTo(0)), 'FRACTIONAL_BPS_PORTION_FEE_UNSUPPORTED_ON_V2_0');
109
- // per-step: capability-gate by UR version, recipients must be router custody, per-hop arrays must match hop counts
129
+ // per-step: capability-gate by UR version, recipients must be router custody (or the spec
130
+ // recipient under allowDirectTransfers), per-hop arrays must match hop counts
110
131
  for (const step of swapSteps) {
132
+ if (!spec.allowDirectTransfers) {
133
+ (0, tiny_invariant_1.default)(!(0, directTransfers_1.hasUserPaidFlag)(step), 'PAYER_IS_USER_REQUIRES_DIRECT_TRANSFERS');
134
+ if (step.type === 'V4_SWAP') {
135
+ for (const action of step.v4Actions) {
136
+ (0, tiny_invariant_1.default)(action.action !== 'SETTLE_ALL', 'SETTLE_ALL_REQUIRES_DIRECT_TRANSFERS');
137
+ (0, tiny_invariant_1.default)(action.action !== 'TAKE_ALL', 'TAKE_ALL_REQUIRES_DIRECT_TRANSFERS');
138
+ }
139
+ }
140
+ }
111
141
  if (spec.urVersion === constants_1.UniversalRouterVersion.V2_0) {
112
142
  (0, tiny_invariant_1.default)(!('minHopPriceX36' in step) || step.minHopPriceX36 === undefined, 'MIN_HOP_PRICE_X36_UNSUPPORTED_ON_V2_0');
113
143
  (0, tiny_invariant_1.default)(!(step.type === 'V4_SWAP' && step.v4Actions.some(hasV4MinHopPriceX36)), 'MIN_HOP_PRICE_X36_UNSUPPORTED_ON_V2_0');
@@ -115,28 +145,60 @@ function validateEncodeSwaps(spec, swapSteps) {
115
145
  switch (step.type) {
116
146
  case 'V2_SWAP_EXACT_IN':
117
147
  case 'V2_SWAP_EXACT_OUT':
118
- assertRouterRecipient(step.recipient);
148
+ checkRecipient(spec, step.recipient, 'STEP_RECIPIENT_MUST_BE_ROUTER');
119
149
  (0, tiny_invariant_1.default)(!step.minHopPriceX36 || step.minHopPriceX36.length === step.path.length - 1, 'V2_MIN_HOP_PRICE_X36_LENGTH_MISMATCH');
120
150
  break;
121
151
  case 'V3_SWAP_EXACT_IN':
122
152
  case 'V3_SWAP_EXACT_OUT': {
123
- assertRouterRecipient(step.recipient);
124
- const hopCount = getV3HopCount(step.path);
153
+ checkRecipient(spec, step.recipient, 'STEP_RECIPIENT_MUST_BE_ROUTER');
154
+ const hopCount = (0, directTransfers_1.getV3HopCount)(step.path);
125
155
  (0, tiny_invariant_1.default)(hopCount === undefined || !step.minHopPriceX36 || step.minHopPriceX36.length === hopCount, 'V3_MIN_HOP_PRICE_X36_LENGTH_MISMATCH');
126
156
  break;
127
157
  }
128
158
  case 'WRAP_ETH':
129
- case 'UNWRAP_WETH':
159
+ // router-only in both regimes: this is the input-side transition, not an outbound payout
130
160
  assertRouterRecipient(step.recipient);
131
161
  break;
162
+ case 'UNWRAP_WETH':
163
+ checkRecipient(spec, step.recipient, 'STEP_RECIPIENT_MUST_BE_ROUTER');
164
+ break;
132
165
  case 'V4_SWAP':
133
166
  validateV4HopCounts(step.v4Actions);
134
- validateV4Recipients(step.v4Actions);
167
+ validateV4HookData(step.v4Actions);
168
+ validateV4Recipients(step.v4Actions, spec);
135
169
  break;
136
170
  default:
137
171
  break;
138
172
  }
139
173
  }
174
+ // inbound budget: user-paid pulls must be concrete input-token amounts whose combined
175
+ // maxima fit within exactOrMaxAmountIn; the encoder then ingresses only the remainder,
176
+ // so total user outflow can never exceed the spec's input
177
+ if (spec.allowDirectTransfers && swapSteps.some((step) => (0, directTransfers_1.stepUserPaidPulls)(step).length > 0)) {
178
+ // permit2-based direct pulls need a plain ERC20 input owned by the tx sender
179
+ (0, tiny_invariant_1.default)(!spec.routing.inputToken.isNative, 'DIRECT_TRANSFERS_NATIVE_INPUT');
180
+ (0, tiny_invariant_1.default)(!spec.nativeErc20Input, 'DIRECT_TRANSFERS_NATIVE_ERC20_INPUT');
181
+ (0, tiny_invariant_1.default)(spec.tokenTransferMode === uniswap_1.TokenTransferMode.Permit2, 'DIRECT_TRANSFERS_REQUIRES_PERMIT2');
182
+ const { exactOrMaxAmountIn } = (0, computeEncodeSwapsAmounts_1.computeEncodeSwapsAmounts)(spec);
183
+ const inputTokenAddress = (0, getCurrencyAddress_1.getCurrencyAddress)(spec.routing.inputToken).toLowerCase();
184
+ let userPaidTotal = ethers_1.BigNumber.from(0);
185
+ swapSteps.forEach((step, stepIndex) => {
186
+ for (const pull of (0, directTransfers_1.stepUserPaidPulls)(step)) {
187
+ // concrete amounts only: bans ALREADY_PAID/OPEN_DELTA (0), CONTRACT_BALANCE (2^255),
188
+ // and anything permit2's uint160 cannot move
189
+ (0, tiny_invariant_1.default)(pull.maxAmount.gt(0) && pull.maxAmount.lte(constants_1.MAX_UINT160), `USER_PAID_AMOUNT_OUT_OF_RANGE (step ${stepIndex})`);
190
+ (0, tiny_invariant_1.default)(typeof pull.token === 'string', `USER_PAID_MALFORMED_PATH (step ${stepIndex})`);
191
+ (0, tiny_invariant_1.default)(pull.token.toLowerCase() === inputTokenAddress, `USER_PAID_INPUT_TOKEN_MISMATCH (step ${stepIndex})`);
192
+ userPaidTotal = userPaidTotal.add(pull.maxAmount);
193
+ }
194
+ });
195
+ (0, tiny_invariant_1.default)(userPaidTotal.lte(exactOrMaxAmountIn), 'USER_PAID_EXCEEDS_MAX_INPUT');
196
+ // keeps the permit2 allowance an on-chain outer ceiling equal to the budget
197
+ if (spec.permit) {
198
+ (0, tiny_invariant_1.default)(spec.permit.details.token.toLowerCase() === inputTokenAddress, 'PERMIT_TOKEN_MISMATCH');
199
+ (0, tiny_invariant_1.default)(ethers_1.BigNumber.from(spec.permit.details.amount).gte(exactOrMaxAmountIn), 'PERMIT_AMOUNT_INSUFFICIENT');
200
+ }
201
+ }
140
202
  }
141
203
  exports.validateEncodeSwaps = validateEncodeSwaps;
142
204
  //# sourceMappingURL=validateEncodeSwaps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validateEncodeSwaps.js","sourceRoot":"","sources":["../../../../src/utils/validateEncodeSwaps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validateEncodeSwaps.js","sourceRoot":"","sources":["../../../../src/utils/validateEncodeSwaps.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import invariant from 'tiny-invariant';
1
2
  import { CommandType } from '../../utils/routerCommands';
2
3
  import { Trade as V2Trade, Pair } from '@uniswap/v2-sdk';
3
4
  import { Trade as V3Trade, Pool as V3Pool, encodeRouteToPath } from '@uniswap/v3-sdk';
@@ -398,7 +399,16 @@ function addV4Swap(planner, { inputAmount, outputAmount, route, minHopPriceX36 }
398
399
  pathOutputForTake = lastPool.currency0;
399
400
  }
400
401
  }
401
- v4Planner.addTake(pathOutputForTake, routerMustCustody ? ROUTER_AS_RECIPIENT : (_b = options.recipient) !== null && _b !== void 0 ? _b : SENDER_AS_RECIPIENT);
402
+ // Floor exact-out delivery: TAKE the exact leg amountOut instead of OPEN_DELTA, so an
403
+ // under-delivering pool (e.g. liquidity exhausted at the price limit) leaves an unsettled
404
+ // delta and reverts at unlock instead of silently forwarding a partial fill.
405
+ let takeAmount;
406
+ if (tradeType === TradeType.EXACT_OUTPUT) {
407
+ takeAmount = BigNumber.from(outputAmount.quotient.toString());
408
+ // amount 0 encodes as the OPEN_DELTA sentinel, which would silently drop the floor
409
+ invariant(!takeAmount.isZero(), 'ZERO_EXACT_OUTPUT_AMOUNT');
410
+ }
411
+ v4Planner.addTake(pathOutputForTake, routerMustCustody ? ROUTER_AS_RECIPIENT : (_b = options.recipient) !== null && _b !== void 0 ? _b : SENDER_AS_RECIPIENT, takeAmount);
402
412
  planner.addCommand(CommandType.V4_SWAP, [v4Planner.finalize()]);
403
413
  }
404
414
  // encode a mixed route swap, i.e. including both v2 and v3 pools