@uniswap/universal-router-sdk 4.3.2 → 4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -2
- package/dist/universal-router-sdk.cjs.development.js +132 -69
- package/dist/universal-router-sdk.cjs.development.js.map +1 -1
- package/dist/universal-router-sdk.cjs.production.min.js +1 -1
- package/dist/universal-router-sdk.cjs.production.min.js.map +1 -1
- package/dist/universal-router-sdk.esm.js +107 -43
- package/dist/universal-router-sdk.esm.js.map +1 -1
- package/dist/utils/commandParser.d.ts +9 -1
- package/dist/utils/pathCurrency.d.ts +3 -0
- package/dist/utils/routerTradeAdapter.d.ts +2 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { SwapRouter, MigrateV3ToV4Options } from './swapRouter';
|
|
2
2
|
export * from './entities';
|
|
3
3
|
export * from './utils/routerTradeAdapter';
|
|
4
|
-
export { RoutePlanner, CommandType } from './utils/routerCommands';
|
|
4
|
+
export { RoutePlanner, CommandType, COMMAND_DEFINITION, CommandDefinition, Parser, Subparser, ParamType, } from './utils/routerCommands';
|
|
5
5
|
export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, UniversalRouterVersion, } from './utils/constants';
|
|
6
|
-
export { CommandParser, UniversalRouterCommand, UniversalRouterCall, Param } from './utils/commandParser';
|
|
6
|
+
export { CommandParser, UniversalRouterCommand, UniversalRouterCall, Param, CommandsDefinition, } from './utils/commandParser';
|
|
@@ -102,17 +102,15 @@ var _COMMAND_DEFINITION;
|
|
|
102
102
|
CommandType[CommandType["V4_POSITION_CALL"] = 19] = "V4_POSITION_CALL";
|
|
103
103
|
CommandType[CommandType["EXECUTE_SUB_PLAN"] = 33] = "EXECUTE_SUB_PLAN";
|
|
104
104
|
})(exports.CommandType || (exports.CommandType = {}));
|
|
105
|
-
var Subparser;
|
|
106
105
|
(function (Subparser) {
|
|
107
106
|
Subparser[Subparser["V3PathExactIn"] = 0] = "V3PathExactIn";
|
|
108
107
|
Subparser[Subparser["V3PathExactOut"] = 1] = "V3PathExactOut";
|
|
109
|
-
})(Subparser || (Subparser = {}));
|
|
110
|
-
var Parser;
|
|
108
|
+
})(exports.Subparser || (exports.Subparser = {}));
|
|
111
109
|
(function (Parser) {
|
|
112
110
|
Parser[Parser["Abi"] = 0] = "Abi";
|
|
113
111
|
Parser[Parser["V4Actions"] = 1] = "V4Actions";
|
|
114
112
|
Parser[Parser["V3Actions"] = 2] = "V3Actions";
|
|
115
|
-
})(Parser || (Parser = {}));
|
|
113
|
+
})(exports.Parser || (exports.Parser = {}));
|
|
116
114
|
var ALLOW_REVERT_FLAG = 0x80;
|
|
117
115
|
var REVERTIBLE_COMMANDS = /*#__PURE__*/new Set([exports.CommandType.EXECUTE_SUB_PLAN]);
|
|
118
116
|
var PERMIT_STRUCT = '((address token,uint160 amount,uint48 expiration,uint48 nonce) details,address spender,uint256 sigDeadline)';
|
|
@@ -120,7 +118,7 @@ var PERMIT_BATCH_STRUCT = '((address token,uint160 amount,uint48 expiration,uint
|
|
|
120
118
|
var PERMIT2_TRANSFER_FROM_STRUCT = '(address from,address to,uint160 amount,address token)';
|
|
121
119
|
var PERMIT2_TRANSFER_FROM_BATCH_STRUCT = PERMIT2_TRANSFER_FROM_STRUCT + '[]';
|
|
122
120
|
var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.CommandType.EXECUTE_SUB_PLAN] = {
|
|
123
|
-
parser: Parser.Abi,
|
|
121
|
+
parser: exports.Parser.Abi,
|
|
124
122
|
params: [{
|
|
125
123
|
name: 'commands',
|
|
126
124
|
type: 'bytes'
|
|
@@ -129,7 +127,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
129
127
|
type: 'bytes[]'
|
|
130
128
|
}]
|
|
131
129
|
}, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_PERMIT] = {
|
|
132
|
-
parser: Parser.Abi,
|
|
130
|
+
parser: exports.Parser.Abi,
|
|
133
131
|
params: [{
|
|
134
132
|
name: 'permit',
|
|
135
133
|
type: PERMIT_STRUCT
|
|
@@ -138,7 +136,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
138
136
|
type: 'bytes'
|
|
139
137
|
}]
|
|
140
138
|
}, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_PERMIT_BATCH] = {
|
|
141
|
-
parser: Parser.Abi,
|
|
139
|
+
parser: exports.Parser.Abi,
|
|
142
140
|
params: [{
|
|
143
141
|
name: 'permit',
|
|
144
142
|
type: PERMIT_BATCH_STRUCT
|
|
@@ -147,7 +145,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
147
145
|
type: 'bytes'
|
|
148
146
|
}]
|
|
149
147
|
}, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_TRANSFER_FROM] = {
|
|
150
|
-
parser: Parser.Abi,
|
|
148
|
+
parser: exports.Parser.Abi,
|
|
151
149
|
params: [{
|
|
152
150
|
name: 'token',
|
|
153
151
|
type: 'address'
|
|
@@ -159,13 +157,13 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
159
157
|
type: 'uint160'
|
|
160
158
|
}]
|
|
161
159
|
}, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_TRANSFER_FROM_BATCH] = {
|
|
162
|
-
parser: Parser.Abi,
|
|
160
|
+
parser: exports.Parser.Abi,
|
|
163
161
|
params: [{
|
|
164
162
|
name: 'transferFrom',
|
|
165
163
|
type: PERMIT2_TRANSFER_FROM_BATCH_STRUCT
|
|
166
164
|
}]
|
|
167
165
|
}, _COMMAND_DEFINITION[exports.CommandType.V3_SWAP_EXACT_IN] = {
|
|
168
|
-
parser: Parser.Abi,
|
|
166
|
+
parser: exports.Parser.Abi,
|
|
169
167
|
params: [{
|
|
170
168
|
name: 'recipient',
|
|
171
169
|
type: 'address'
|
|
@@ -177,14 +175,14 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
177
175
|
type: 'uint256'
|
|
178
176
|
}, {
|
|
179
177
|
name: 'path',
|
|
180
|
-
subparser: Subparser.V3PathExactIn,
|
|
178
|
+
subparser: exports.Subparser.V3PathExactIn,
|
|
181
179
|
type: 'bytes'
|
|
182
180
|
}, {
|
|
183
181
|
name: 'payerIsUser',
|
|
184
182
|
type: 'bool'
|
|
185
183
|
}]
|
|
186
184
|
}, _COMMAND_DEFINITION[exports.CommandType.V3_SWAP_EXACT_OUT] = {
|
|
187
|
-
parser: Parser.Abi,
|
|
185
|
+
parser: exports.Parser.Abi,
|
|
188
186
|
params: [{
|
|
189
187
|
name: 'recipient',
|
|
190
188
|
type: 'address'
|
|
@@ -196,14 +194,14 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
196
194
|
type: 'uint256'
|
|
197
195
|
}, {
|
|
198
196
|
name: 'path',
|
|
199
|
-
subparser: Subparser.V3PathExactOut,
|
|
197
|
+
subparser: exports.Subparser.V3PathExactOut,
|
|
200
198
|
type: 'bytes'
|
|
201
199
|
}, {
|
|
202
200
|
name: 'payerIsUser',
|
|
203
201
|
type: 'bool'
|
|
204
202
|
}]
|
|
205
203
|
}, _COMMAND_DEFINITION[exports.CommandType.V2_SWAP_EXACT_IN] = {
|
|
206
|
-
parser: Parser.Abi,
|
|
204
|
+
parser: exports.Parser.Abi,
|
|
207
205
|
params: [{
|
|
208
206
|
name: 'recipient',
|
|
209
207
|
type: 'address'
|
|
@@ -221,7 +219,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
221
219
|
type: 'bool'
|
|
222
220
|
}]
|
|
223
221
|
}, _COMMAND_DEFINITION[exports.CommandType.V2_SWAP_EXACT_OUT] = {
|
|
224
|
-
parser: Parser.Abi,
|
|
222
|
+
parser: exports.Parser.Abi,
|
|
225
223
|
params: [{
|
|
226
224
|
name: 'recipient',
|
|
227
225
|
type: 'address'
|
|
@@ -239,9 +237,9 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
239
237
|
type: 'bool'
|
|
240
238
|
}]
|
|
241
239
|
}, _COMMAND_DEFINITION[exports.CommandType.V4_SWAP] = {
|
|
242
|
-
parser: Parser.V4Actions
|
|
240
|
+
parser: exports.Parser.V4Actions
|
|
243
241
|
}, _COMMAND_DEFINITION[exports.CommandType.WRAP_ETH] = {
|
|
244
|
-
parser: Parser.Abi,
|
|
242
|
+
parser: exports.Parser.Abi,
|
|
245
243
|
params: [{
|
|
246
244
|
name: 'recipient',
|
|
247
245
|
type: 'address'
|
|
@@ -250,7 +248,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
250
248
|
type: 'uint256'
|
|
251
249
|
}]
|
|
252
250
|
}, _COMMAND_DEFINITION[exports.CommandType.UNWRAP_WETH] = {
|
|
253
|
-
parser: Parser.Abi,
|
|
251
|
+
parser: exports.Parser.Abi,
|
|
254
252
|
params: [{
|
|
255
253
|
name: 'recipient',
|
|
256
254
|
type: 'address'
|
|
@@ -259,7 +257,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
259
257
|
type: 'uint256'
|
|
260
258
|
}]
|
|
261
259
|
}, _COMMAND_DEFINITION[exports.CommandType.SWEEP] = {
|
|
262
|
-
parser: Parser.Abi,
|
|
260
|
+
parser: exports.Parser.Abi,
|
|
263
261
|
params: [{
|
|
264
262
|
name: 'token',
|
|
265
263
|
type: 'address'
|
|
@@ -271,7 +269,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
271
269
|
type: 'uint256'
|
|
272
270
|
}]
|
|
273
271
|
}, _COMMAND_DEFINITION[exports.CommandType.TRANSFER] = {
|
|
274
|
-
parser: Parser.Abi,
|
|
272
|
+
parser: exports.Parser.Abi,
|
|
275
273
|
params: [{
|
|
276
274
|
name: 'token',
|
|
277
275
|
type: 'address'
|
|
@@ -283,7 +281,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
283
281
|
type: 'uint256'
|
|
284
282
|
}]
|
|
285
283
|
}, _COMMAND_DEFINITION[exports.CommandType.PAY_PORTION] = {
|
|
286
|
-
parser: Parser.Abi,
|
|
284
|
+
parser: exports.Parser.Abi,
|
|
287
285
|
params: [{
|
|
288
286
|
name: 'token',
|
|
289
287
|
type: 'address'
|
|
@@ -295,7 +293,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
295
293
|
type: 'uint256'
|
|
296
294
|
}]
|
|
297
295
|
}, _COMMAND_DEFINITION[exports.CommandType.BALANCE_CHECK_ERC20] = {
|
|
298
|
-
parser: Parser.Abi,
|
|
296
|
+
parser: exports.Parser.Abi,
|
|
299
297
|
params: [{
|
|
300
298
|
name: 'owner',
|
|
301
299
|
type: 'address'
|
|
@@ -307,11 +305,11 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
|
|
|
307
305
|
type: 'uint256'
|
|
308
306
|
}]
|
|
309
307
|
}, _COMMAND_DEFINITION[exports.CommandType.V3_POSITION_MANAGER_PERMIT] = {
|
|
310
|
-
parser: Parser.V3Actions
|
|
308
|
+
parser: exports.Parser.V3Actions
|
|
311
309
|
}, _COMMAND_DEFINITION[exports.CommandType.V3_POSITION_MANAGER_CALL] = {
|
|
312
|
-
parser: Parser.V3Actions
|
|
310
|
+
parser: exports.Parser.V3Actions
|
|
313
311
|
}, _COMMAND_DEFINITION[exports.CommandType.V4_POSITION_CALL] = {
|
|
314
|
-
parser: Parser.V4Actions
|
|
312
|
+
parser: exports.Parser.V4Actions
|
|
315
313
|
}, _COMMAND_DEFINITION);
|
|
316
314
|
var RoutePlanner = /*#__PURE__*/function () {
|
|
317
315
|
function RoutePlanner() {
|
|
@@ -343,7 +341,7 @@ var RoutePlanner = /*#__PURE__*/function () {
|
|
|
343
341
|
function createCommand(type, parameters) {
|
|
344
342
|
var commandDef = COMMAND_DEFINITION[type];
|
|
345
343
|
switch (commandDef.parser) {
|
|
346
|
-
case Parser.Abi:
|
|
344
|
+
case exports.Parser.Abi:
|
|
347
345
|
var encodedInput = utils.defaultAbiCoder.encode(commandDef.params.map(function (abi) {
|
|
348
346
|
return abi.type;
|
|
349
347
|
}), parameters);
|
|
@@ -351,13 +349,13 @@ function createCommand(type, parameters) {
|
|
|
351
349
|
type: type,
|
|
352
350
|
encodedInput: encodedInput
|
|
353
351
|
};
|
|
354
|
-
case Parser.V4Actions:
|
|
352
|
+
case exports.Parser.V4Actions:
|
|
355
353
|
// v4 swap data comes pre-encoded at index 0
|
|
356
354
|
return {
|
|
357
355
|
type: type,
|
|
358
356
|
encodedInput: parameters[0]
|
|
359
357
|
};
|
|
360
|
-
case Parser.V3Actions:
|
|
358
|
+
case exports.Parser.V3Actions:
|
|
361
359
|
// v4 swap data comes pre-encoded at index 0
|
|
362
360
|
return {
|
|
363
361
|
type: type,
|
|
@@ -366,6 +364,27 @@ function createCommand(type, parameters) {
|
|
|
366
364
|
}
|
|
367
365
|
}
|
|
368
366
|
|
|
367
|
+
function getPathCurrency(currency, pool) {
|
|
368
|
+
// return currency if the currency matches a currency of the pool
|
|
369
|
+
if (pool.involvesToken(currency)) {
|
|
370
|
+
return currency;
|
|
371
|
+
// return if currency.wrapped if pool involves wrapped currency
|
|
372
|
+
} else if (pool.involvesToken(currency.wrapped)) {
|
|
373
|
+
return currency.wrapped;
|
|
374
|
+
// return native currency if pool involves native version of wrapped currency (only applies to V4)
|
|
375
|
+
} else if (pool instanceof v4Sdk.Pool) {
|
|
376
|
+
if (pool.token0.wrapped.equals(currency)) {
|
|
377
|
+
return pool.token0;
|
|
378
|
+
} else if (pool.token1.wrapped.equals(currency)) {
|
|
379
|
+
return pool.token1;
|
|
380
|
+
}
|
|
381
|
+
// otherwise the token is invalid
|
|
382
|
+
} else {
|
|
383
|
+
throw new Error("Expected currency " + currency.symbol + " to be either " + pool.token0.symbol + " or " + pool.token1.symbol);
|
|
384
|
+
}
|
|
385
|
+
return currency; // this line needed for typescript to compile
|
|
386
|
+
}
|
|
387
|
+
|
|
369
388
|
(function (RouterActionType) {
|
|
370
389
|
RouterActionType["UniswapTrade"] = "UniswapTrade";
|
|
371
390
|
RouterActionType["UnwrapWETH"] = "UnwrapWETH";
|
|
@@ -619,7 +638,7 @@ var UniswapTrade = /*#__PURE__*/function () {
|
|
|
619
638
|
addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
|
|
620
639
|
break;
|
|
621
640
|
case routerSdk.Protocol.V4:
|
|
622
|
-
addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody
|
|
641
|
+
addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
|
|
623
642
|
break;
|
|
624
643
|
case routerSdk.Protocol.MIXED:
|
|
625
644
|
addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
|
|
@@ -741,7 +760,7 @@ function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCu
|
|
|
741
760
|
planner.addCommand(exports.CommandType.V3_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
|
|
742
761
|
}
|
|
743
762
|
}
|
|
744
|
-
function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody
|
|
763
|
+
function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody) {
|
|
745
764
|
var _options$recipient;
|
|
746
765
|
var route = _ref3.route,
|
|
747
766
|
inputAmount = _ref3.inputAmount,
|
|
@@ -752,7 +771,7 @@ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCu
|
|
|
752
771
|
outputAmount: outputAmount,
|
|
753
772
|
tradeType: tradeType
|
|
754
773
|
});
|
|
755
|
-
var slippageToleranceOnSwap =
|
|
774
|
+
var slippageToleranceOnSwap = routerMustCustody && tradeType == sdkCore.TradeType.EXACT_INPUT ? undefined : options.slippageTolerance;
|
|
756
775
|
var inputWethFromRouter = inputAmount.currency.isNative && !route.input.isNative;
|
|
757
776
|
if (inputWethFromRouter && !payerIsUser) throw new Error('Inconsistent payer');
|
|
758
777
|
var v4Planner = new v4Sdk.V4Planner();
|
|
@@ -764,13 +783,16 @@ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCu
|
|
|
764
783
|
}
|
|
765
784
|
// encode a mixed route swap, i.e. including both v2 and v3 pools
|
|
766
785
|
function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMustCustody) {
|
|
767
|
-
var
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
var
|
|
771
|
-
|
|
786
|
+
var _options$recipient2;
|
|
787
|
+
var route = swap.route;
|
|
788
|
+
var inputAmount = swap.inputAmount;
|
|
789
|
+
var outputAmount = swap.outputAmount;
|
|
790
|
+
var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient2 = options.recipient) != null ? _options$recipient2 : SENDER_AS_RECIPIENT;
|
|
791
|
+
// single hop, so it can be reduced to plain swap logic for one protocol version
|
|
772
792
|
if (route.pools.length === 1) {
|
|
773
|
-
if (route.pools[0] instanceof
|
|
793
|
+
if (route.pools[0] instanceof v4Sdk.Pool) {
|
|
794
|
+
return addV4Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
|
|
795
|
+
} else if (route.pools[0] instanceof v3Sdk.Pool) {
|
|
774
796
|
return addV3Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
|
|
775
797
|
} else if (route.pools[0] instanceof v2Sdk.Pair) {
|
|
776
798
|
return addV2Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
|
|
@@ -792,32 +814,53 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
|
|
|
792
814
|
var isLastSectionInRoute = function isLastSectionInRoute(i) {
|
|
793
815
|
return i === sections.length - 1;
|
|
794
816
|
};
|
|
795
|
-
var
|
|
796
|
-
var inputToken = route.input.wrapped;
|
|
817
|
+
var inputToken = route.pathInput;
|
|
797
818
|
for (var i = 0; i < sections.length; i++) {
|
|
798
819
|
var section = sections[i];
|
|
799
|
-
|
|
800
|
-
outputToken = routerSdk.getOutputOfPools(section, inputToken);
|
|
801
|
-
var
|
|
802
|
-
var
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
return pool instanceof v3Sdk.Pool;
|
|
808
|
-
});
|
|
809
|
-
};
|
|
810
|
-
if (mixedRouteIsAllV3(newRoute)) {
|
|
811
|
-
var path = routerSdk.encodeMixedRouteToPath(newRoute);
|
|
812
|
-
planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [
|
|
813
|
-
// if not last section: send tokens directly to the first v2 pair of the next section
|
|
814
|
-
// note: because of the partitioning function we can be sure that the next section is v2
|
|
815
|
-
isLastSectionInRoute(i) ? tradeRecipient : sections[i + 1][0].liquidityToken.address, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, path, payerIsUser && i === 0]);
|
|
820
|
+
var routePool = section[0];
|
|
821
|
+
var outputToken = routerSdk.getOutputOfPools(section, inputToken);
|
|
822
|
+
var subRoute = new routerSdk.MixedRoute(new routerSdk.MixedRouteSDK([].concat(section), inputToken, outputToken));
|
|
823
|
+
var nextInputToken = void 0;
|
|
824
|
+
var swapRecipient = void 0;
|
|
825
|
+
if (isLastSectionInRoute(i)) {
|
|
826
|
+
nextInputToken = outputToken;
|
|
827
|
+
swapRecipient = tradeRecipient;
|
|
816
828
|
} else {
|
|
817
|
-
|
|
829
|
+
var nextPool = sections[i + 1][0];
|
|
830
|
+
nextInputToken = getPathCurrency(outputToken, nextPool);
|
|
831
|
+
var v2PoolIsSwapRecipient = nextPool instanceof v2Sdk.Pair && outputToken.equals(nextInputToken);
|
|
832
|
+
swapRecipient = v2PoolIsSwapRecipient ? nextPool.liquidityToken.address : ROUTER_AS_RECIPIENT;
|
|
833
|
+
}
|
|
834
|
+
if (routePool instanceof v4Sdk.Pool) {
|
|
835
|
+
var v4Planner = new v4Sdk.V4Planner();
|
|
836
|
+
var v4SubRoute = new v4Sdk.Route(section, subRoute.input, subRoute.output);
|
|
837
|
+
v4Planner.addSettle(inputToken, payerIsUser && i === 0, i == 0 ? amountIn : CONTRACT_BALANCE);
|
|
838
|
+
v4Planner.addAction(v4Sdk.Actions.SWAP_EXACT_IN, [{
|
|
839
|
+
currencyIn: inputToken.isNative ? ETH_ADDRESS : inputToken.address,
|
|
840
|
+
path: v4Sdk.encodeRouteToPath(v4SubRoute),
|
|
841
|
+
amountIn: 0,
|
|
842
|
+
amountOutMinimum: !isLastSectionInRoute(i) ? 0 : amountOut
|
|
843
|
+
}]);
|
|
844
|
+
v4Planner.addTake(outputToken, swapRecipient);
|
|
845
|
+
planner.addCommand(exports.CommandType.V4_SWAP, [v4Planner.finalize()]);
|
|
846
|
+
} else if (routePool instanceof v3Sdk.Pool) {
|
|
847
|
+
planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [swapRecipient, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, routerSdk.encodeMixedRouteToPath(subRoute), payerIsUser && i === 0]);
|
|
848
|
+
} else if (routePool instanceof v2Sdk.Pair) {
|
|
849
|
+
planner.addCommand(exports.CommandType.V2_SWAP_EXACT_IN, [swapRecipient, i === 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, subRoute.path.map(function (token) {
|
|
818
850
|
return token.wrapped.address;
|
|
819
851
|
}), payerIsUser && i === 0]);
|
|
852
|
+
} else {
|
|
853
|
+
throw new Error('Unexpected Pool Type');
|
|
854
|
+
}
|
|
855
|
+
// perform a token transition (wrap/unwrap if necessary)
|
|
856
|
+
if (!isLastSectionInRoute(i)) {
|
|
857
|
+
if (outputToken.isNative && !nextInputToken.isNative) {
|
|
858
|
+
planner.addCommand(exports.CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, CONTRACT_BALANCE]);
|
|
859
|
+
} else if (!outputToken.isNative && nextInputToken.isNative) {
|
|
860
|
+
planner.addCommand(exports.CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0]);
|
|
861
|
+
}
|
|
820
862
|
}
|
|
863
|
+
inputToken = nextInputToken;
|
|
821
864
|
}
|
|
822
865
|
}
|
|
823
866
|
// if price impact is very high, there's a chance of hitting max/min prices resulting in a partial fill of the swap
|
|
@@ -974,6 +1017,7 @@ var UnwrapWETH = /*#__PURE__*/function () {
|
|
|
974
1017
|
(function (PoolType) {
|
|
975
1018
|
PoolType["V2Pool"] = "v2-pool";
|
|
976
1019
|
PoolType["V3Pool"] = "v3-pool";
|
|
1020
|
+
PoolType["V4Pool"] = "v4-pool";
|
|
977
1021
|
})(exports.PoolType || (exports.PoolType = {}));
|
|
978
1022
|
var isNativeCurrency = function isNativeCurrency(address) {
|
|
979
1023
|
return address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase();
|
|
@@ -1090,21 +1134,35 @@ RouterTradeAdapter.toPair = function (_ref2) {
|
|
|
1090
1134
|
return new v2Sdk.Pair(sdkCore.CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve0.token), reserve0.quotient), sdkCore.CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve1.token), reserve1.quotient));
|
|
1091
1135
|
};
|
|
1092
1136
|
|
|
1093
|
-
// Parses UniversalRouter commands
|
|
1137
|
+
// Parses UniversalRouter V2 commands
|
|
1094
1138
|
var CommandParser = /*#__PURE__*/function () {
|
|
1095
1139
|
function CommandParser() {}
|
|
1096
1140
|
CommandParser.parseCalldata = function parseCalldata(calldata) {
|
|
1141
|
+
var genericParser = new GenericCommandParser(COMMAND_DEFINITION);
|
|
1097
1142
|
var txDescription = CommandParser.INTERFACE.parseTransaction({
|
|
1098
1143
|
data: calldata
|
|
1099
1144
|
});
|
|
1100
1145
|
var _txDescription$args = txDescription.args,
|
|
1101
1146
|
commands = _txDescription$args.commands,
|
|
1102
1147
|
inputs = _txDescription$args.inputs;
|
|
1103
|
-
|
|
1148
|
+
return genericParser.parse(commands, inputs);
|
|
1149
|
+
};
|
|
1150
|
+
return CommandParser;
|
|
1151
|
+
}();
|
|
1152
|
+
CommandParser.INTERFACE = /*#__PURE__*/new abi.Interface(UniversalRouter_json.abi);
|
|
1153
|
+
// Parses commands based on given command definition
|
|
1154
|
+
var GenericCommandParser = /*#__PURE__*/function () {
|
|
1155
|
+
function GenericCommandParser(commandDefinition) {
|
|
1156
|
+
this.commandDefinition = commandDefinition;
|
|
1157
|
+
}
|
|
1158
|
+
var _proto = GenericCommandParser.prototype;
|
|
1159
|
+
_proto.parse = function parse(commands, inputs) {
|
|
1160
|
+
var _this = this;
|
|
1161
|
+
var commandTypes = GenericCommandParser.getCommands(commands);
|
|
1104
1162
|
return {
|
|
1105
1163
|
commands: commandTypes.map(function (commandType, i) {
|
|
1106
|
-
var commandDef =
|
|
1107
|
-
if (commandDef.parser === Parser.V4Actions) {
|
|
1164
|
+
var commandDef = _this.commandDefinition[commandType];
|
|
1165
|
+
if (commandDef.parser === exports.Parser.V4Actions) {
|
|
1108
1166
|
var _V4BaseActionsParser$ = v4Sdk.V4BaseActionsParser.parseCalldata(inputs[i]),
|
|
1109
1167
|
actions = _V4BaseActionsParser$.actions;
|
|
1110
1168
|
return {
|
|
@@ -1112,19 +1170,19 @@ var CommandParser = /*#__PURE__*/function () {
|
|
|
1112
1170
|
commandType: commandType,
|
|
1113
1171
|
params: v4RouterCallToParams(actions)
|
|
1114
1172
|
};
|
|
1115
|
-
} else if (commandDef.parser === Parser.Abi) {
|
|
1173
|
+
} else if (commandDef.parser === exports.Parser.Abi) {
|
|
1116
1174
|
var abiDef = commandDef.params;
|
|
1117
1175
|
var rawParams = ethers.ethers.utils.defaultAbiCoder.decode(abiDef.map(function (command) {
|
|
1118
1176
|
return command.type;
|
|
1119
1177
|
}), inputs[i]);
|
|
1120
1178
|
var params = rawParams.map(function (param, j) {
|
|
1121
1179
|
switch (abiDef[j].subparser) {
|
|
1122
|
-
case Subparser.V3PathExactIn:
|
|
1180
|
+
case exports.Subparser.V3PathExactIn:
|
|
1123
1181
|
return {
|
|
1124
1182
|
name: abiDef[j].name,
|
|
1125
1183
|
value: parseV3PathExactIn(param)
|
|
1126
1184
|
};
|
|
1127
|
-
case Subparser.V3PathExactOut:
|
|
1185
|
+
case exports.Subparser.V3PathExactOut:
|
|
1128
1186
|
return {
|
|
1129
1187
|
name: abiDef[j].name,
|
|
1130
1188
|
value: parseV3PathExactOut(param)
|
|
@@ -1141,12 +1199,17 @@ var CommandParser = /*#__PURE__*/function () {
|
|
|
1141
1199
|
commandType: commandType,
|
|
1142
1200
|
params: params
|
|
1143
1201
|
};
|
|
1144
|
-
} else if (commandDef.parser === Parser.V3Actions) {
|
|
1202
|
+
} else if (commandDef.parser === exports.Parser.V3Actions) {
|
|
1145
1203
|
// TODO: implement better parsing here
|
|
1146
1204
|
return {
|
|
1147
1205
|
commandName: exports.CommandType[commandType],
|
|
1148
1206
|
commandType: commandType,
|
|
1149
|
-
params: inputs
|
|
1207
|
+
params: inputs.map(function (input) {
|
|
1208
|
+
return {
|
|
1209
|
+
name: 'command',
|
|
1210
|
+
value: input
|
|
1211
|
+
};
|
|
1212
|
+
})
|
|
1150
1213
|
};
|
|
1151
1214
|
} else {
|
|
1152
1215
|
throw new Error("Unsupported parser: " + commandDef);
|
|
@@ -1156,7 +1219,7 @@ var CommandParser = /*#__PURE__*/function () {
|
|
|
1156
1219
|
}
|
|
1157
1220
|
// parse command types from bytes string
|
|
1158
1221
|
;
|
|
1159
|
-
|
|
1222
|
+
GenericCommandParser.getCommands = function getCommands(commands) {
|
|
1160
1223
|
var commandTypes = [];
|
|
1161
1224
|
for (var i = 2; i < commands.length; i += 2) {
|
|
1162
1225
|
var _byte = commands.substring(i, i + 2);
|
|
@@ -1164,9 +1227,8 @@ var CommandParser = /*#__PURE__*/function () {
|
|
|
1164
1227
|
}
|
|
1165
1228
|
return commandTypes;
|
|
1166
1229
|
};
|
|
1167
|
-
return
|
|
1230
|
+
return GenericCommandParser;
|
|
1168
1231
|
}();
|
|
1169
|
-
CommandParser.INTERFACE = /*#__PURE__*/new abi.Interface(UniversalRouter_json.abi);
|
|
1170
1232
|
function parseV3PathExactIn(path) {
|
|
1171
1233
|
var strippedPath = path.replace('0x', '');
|
|
1172
1234
|
var tokenIn = ethers.ethers.utils.getAddress(strippedPath.substring(0, 40));
|
|
@@ -1219,6 +1281,7 @@ function v4RouterCallToParams(actions) {
|
|
|
1219
1281
|
});
|
|
1220
1282
|
}
|
|
1221
1283
|
|
|
1284
|
+
exports.COMMAND_DEFINITION = COMMAND_DEFINITION;
|
|
1222
1285
|
exports.CommandParser = CommandParser;
|
|
1223
1286
|
exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
|
|
1224
1287
|
exports.RoutePlanner = RoutePlanner;
|