@ring-protocol/universal-router-sdk 0.1.6 → 0.1.9

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.
@@ -21,6 +21,7 @@ export declare class UniswapTrade implements Command {
21
21
  readonly payerIsUser: boolean;
22
22
  constructor(trade: RouterTrade<Currency, Currency, TradeType>, options: SwapOptions);
23
23
  get isAllV4(): boolean;
24
+ get hasFewV2(): boolean;
24
25
  get inputRequiresWrap(): boolean;
25
26
  get inputRequiresUnwrap(): boolean;
26
27
  get outputRequiresWrap(): boolean;
package/dist/index.d.ts CHANGED
@@ -8,3 +8,4 @@ export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, ROUTER_AS_RE
8
8
  export { CommandParser, GenericCommandParser } from './utils/commandParser';
9
9
  export type { UniversalRouterCommand, UniversalRouterCall, Param, CommandsDefinition } from './utils/commandParser';
10
10
  export type { Permit2Permit } from './utils/inputTokens';
11
+ export { FEW_WRAPPED_NATIVE_CURRENCY } from './utils/token';
@@ -12,6 +12,7 @@ var v3Sdk = require('@ring-protocol/v3-sdk');
12
12
  var v4Sdk = require('@ring-protocol/v4-sdk');
13
13
  var sdkCore = require('@ring-protocol/sdk-core');
14
14
  var utils = require('ethers/lib/utils');
15
+ var fewV2Sdk = require('@ring-protocol/few-v2-sdk');
15
16
  var v2Sdk = require('@ring-protocol/v2-sdk');
16
17
  var routerSdk = require('@ring-protocol/router-sdk');
17
18
  require('jsbi');
@@ -94,6 +95,10 @@ var _COMMAND_DEFINITION;
94
95
  CommandType[CommandType["V4_INITIALIZE_POOL"] = 19] = "V4_INITIALIZE_POOL";
95
96
  CommandType[CommandType["V4_POSITION_MANAGER_CALL"] = 20] = "V4_POSITION_MANAGER_CALL";
96
97
  CommandType[CommandType["EXECUTE_SUB_PLAN"] = 33] = "EXECUTE_SUB_PLAN";
98
+ CommandType[CommandType["FEW_V2_SWAP_EXACT_IN"] = 35] = "FEW_V2_SWAP_EXACT_IN";
99
+ CommandType[CommandType["FEW_V2_SWAP_EXACT_OUT"] = 36] = "FEW_V2_SWAP_EXACT_OUT";
100
+ CommandType[CommandType["WRAP_FEW_TOKEN"] = 39] = "WRAP_FEW_TOKEN";
101
+ CommandType[CommandType["UNWRAP_FEW_TOKEN"] = 40] = "UNWRAP_FEW_TOKEN";
97
102
  })(exports.CommandType || (exports.CommandType = {}));
98
103
  (function (Subparser) {
99
104
  Subparser[Subparser["V3PathExactIn"] = 0] = "V3PathExactIn";
@@ -230,8 +235,68 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
230
235
  name: 'payerIsUser',
231
236
  type: 'bool'
232
237
  }]
238
+ }, _COMMAND_DEFINITION[exports.CommandType.FEW_V2_SWAP_EXACT_IN] = {
239
+ parser: exports.Parser.Abi,
240
+ params: [{
241
+ name: 'recipient',
242
+ type: 'address'
243
+ }, {
244
+ name: 'amountIn',
245
+ type: 'uint256'
246
+ }, {
247
+ name: 'amountOutMin',
248
+ type: 'uint256'
249
+ }, {
250
+ name: 'path',
251
+ type: 'address[]'
252
+ }, {
253
+ name: 'payerIsUser',
254
+ type: 'bool'
255
+ }]
256
+ }, _COMMAND_DEFINITION[exports.CommandType.FEW_V2_SWAP_EXACT_OUT] = {
257
+ parser: exports.Parser.Abi,
258
+ params: [{
259
+ name: 'recipient',
260
+ type: 'address'
261
+ }, {
262
+ name: 'amountOut',
263
+ type: 'uint256'
264
+ }, {
265
+ name: 'amountInMax',
266
+ type: 'uint256'
267
+ }, {
268
+ name: 'path',
269
+ type: 'address[]'
270
+ }, {
271
+ name: 'payerIsUser',
272
+ type: 'bool'
273
+ }]
233
274
  }, _COMMAND_DEFINITION[exports.CommandType.V4_SWAP] = {
234
275
  parser: exports.Parser.V4Actions
276
+ }, _COMMAND_DEFINITION[exports.CommandType.WRAP_FEW_TOKEN] = {
277
+ parser: exports.Parser.Abi,
278
+ params: [{
279
+ name: 'token',
280
+ type: 'address'
281
+ }, {
282
+ name: 'recipient',
283
+ type: 'address'
284
+ }, {
285
+ name: 'amount',
286
+ type: 'uint256'
287
+ }]
288
+ }, _COMMAND_DEFINITION[exports.CommandType.UNWRAP_FEW_TOKEN] = {
289
+ parser: exports.Parser.Abi,
290
+ params: [{
291
+ name: 'wrappedToken',
292
+ type: 'address'
293
+ }, {
294
+ name: 'recipient',
295
+ type: 'address'
296
+ }, {
297
+ name: 'amountMin',
298
+ type: 'uint256'
299
+ }]
235
300
  }, _COMMAND_DEFINITION[exports.CommandType.WRAP_ETH] = {
236
301
  parser: exports.Parser.Abi,
237
302
  params: [{
@@ -368,6 +433,9 @@ function createCommand(type, parameters) {
368
433
  }
369
434
 
370
435
  function getPathCurrency(currency, pool) {
436
+ if (fewV2Sdk.isFewToken(pool.token0.wrapped) || fewV2Sdk.isFewToken(pool.token1.wrapped)) {
437
+ return currency;
438
+ }
371
439
  // return currency if the currency matches a currency of the pool
372
440
  if (pool.involvesToken(currency)) {
373
441
  return currency;
@@ -389,7 +457,7 @@ function getPathCurrency(currency, pool) {
389
457
  RouterActionType["UnwrapWETH"] = "UnwrapWETH";
390
458
  })(exports.RouterActionType || (exports.RouterActionType = {}));
391
459
 
392
- var _routerConfigs, _routerConfigs2, _routerConfigs3, _routerConfigs4, _routerConfigs5, _routerConfigs6, _routerConfigs7, _routerConfigs8, _routerConfigs9, _routerConfigs0, _routerConfigs1, _routerConfigs10, _routerConfigs11, _routerConfigs12, _routerConfigs13, _routerConfigs14, _routerConfigs15, _routerConfigs16, _routerConfigs17, _routerConfigs18, _routerConfigs19, _routerConfigs20, _routerConfigs21, _routerConfigs22, _routerConfigs23, _CHAIN_CONFIGS;
460
+ var _routerConfigs, _routerConfigs2, _routerConfigs3, _routerConfigs4, _routerConfigs5, _routerConfigs6, _routerConfigs7, _routerConfigs8, _routerConfigs9, _routerConfigs0, _routerConfigs1, _routerConfigs10, _routerConfigs11, _routerConfigs12, _routerConfigs13, _routerConfigs14, _routerConfigs15, _routerConfigs16, _routerConfigs17, _routerConfigs18, _routerConfigs19, _routerConfigs20, _routerConfigs21, _routerConfigs22, _routerConfigs23, _routerConfigs24, _CHAIN_CONFIGS;
393
461
  (function (UniversalRouterVersion) {
394
462
  UniversalRouterVersion["V1_2"] = "1.2";
395
463
  UniversalRouterVersion["V2_0"] = "2.0";
@@ -621,6 +689,15 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
621
689
  address: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',
622
690
  creationBlock: 29255937
623
691
  }, _routerConfigs23)
692
+ }, _CHAIN_CONFIGS[999] = {
693
+ weth: '0x5555555555555555555555555555555555555555',
694
+ routerConfigs: (_routerConfigs24 = {}, _routerConfigs24[exports.UniversalRouterVersion.V1_2] = {
695
+ address: '0x7d3D28dee339C17452A4d6b53C71b2557278B530',
696
+ creationBlock: 9273064
697
+ }, _routerConfigs24[exports.UniversalRouterVersion.V2_0] = {
698
+ address: '0x7d3D28dee339C17452A4d6b53C71b2557278B530',
699
+ creationBlock: 9273064
700
+ }, _routerConfigs24)
624
701
  }, _CHAIN_CONFIGS);
625
702
  var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(version, chainId) {
626
703
  if (!(chainId in CHAIN_CONFIGS)) throw new Error("Universal Router not deployed on chain " + chainId);
@@ -649,6 +726,11 @@ function encodeFeeBips(fee) {
649
726
  return v3Sdk.toHex(fee.multiply(10000).quotient);
650
727
  }
651
728
 
729
+ var _FEW_WRAPPED_NATIVE_C;
730
+ var FEW_WRAPPED_NATIVE_CURRENCY = (_FEW_WRAPPED_NATIVE_C = {}, _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.HYPER_MAINNET] = /*#__PURE__*/new sdkCore.Token(999, '0x9e1148bC3665a9f7C35F313d89c0432c34928AEf', 18, 'fwWHYPE', 'Few Wrapped Wrapped Hyper'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.MAINNET] = /*#__PURE__*/new sdkCore.Token(1, '0xa250CC729Bb3323e7933022a67B52200fE354767', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.BASE] = /*#__PURE__*/new sdkCore.Token(8453, '0xd38e4149df30AfFFEE13d771f3Ec9277c72333E4', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.ARBITRUM_ONE] = /*#__PURE__*/new sdkCore.Token(42161, '0x76CDff74222533Efa4BAa713BC3d14df81A460F7', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.ARBITRUM_SEPOLIA] = /*#__PURE__*/new sdkCore.Token(421614, '0x1fc632A9A9c99ae7C406f8565cd709b52BA0ed47', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.UNICHAIN] = /*#__PURE__*/new sdkCore.Token(130, '0x05e6c1B4Da05c41c86c35Ce42a8a222C1a450167', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.UNICHAIN_SEPOLIA] = /*#__PURE__*/new sdkCore.Token(1301, '0x1fc632A9A9c99ae7C406f8565cd709b52BA0ed47',
731
+ //TODO: replace to mainnet
732
+ 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.GOERLI] = /*#__PURE__*/new sdkCore.Token(5, '0x6b7e07C37a157d01D71012c36644907Ab5a7694e', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.BLAST] = /*#__PURE__*/new sdkCore.Token(81457, '0x66714DB8F3397c767d0A602458B5b4E3C0FE7dd1', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.SEPOLIA] = /*#__PURE__*/new sdkCore.Token(11155111, '0x98b902eF4f9fEB2F6982ceEB4E98761294854D61', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.BLAST_SEPOLIA] = /*#__PURE__*/new sdkCore.Token(sdkCore.ChainId.BLAST_SEPOLIA, '0x798dE0520497E28E8eBfF0DF1d791c2E942eA881', 18, 'fwWETH', 'Few Wrapped Wrapped Ether'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.STORY_ODYSSEY] = /*#__PURE__*/new sdkCore.Token(sdkCore.ChainId.STORY_ODYSSEY, '0xA67013F71AF4f21563BAf8C1d156F1Dc7ab681C6', 18, 'fwWIP', 'Few Wrapped Wrapped IP'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.STORY_MAINNET] = /*#__PURE__*/new sdkCore.Token(sdkCore.ChainId.STORY_MAINNET, '0x088dE218b725975E6285995C25Ce3706BAe0f4Ec', 18, 'fwWIP', 'Few Wrapped Wrapped IP'), _FEW_WRAPPED_NATIVE_C[sdkCore.ChainId.BNB] = /*#__PURE__*/new sdkCore.Token(56, '0x7f0172b75d3823D8aF04feE3A3f6a14aBD68EFE1', 18, 'fwWBNB', 'Few Wrapped Wrapped BNB'), _FEW_WRAPPED_NATIVE_C);
733
+
652
734
  var REFUND_ETH_PRICE_IMPACT_THRESHOLD = /*#__PURE__*/new sdkCore.Percent(50, 100);
653
735
  // Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router
654
736
  // also translates trade objects from previous (v2, v3) SDKs
@@ -687,6 +769,9 @@ var UniswapTrade = /*#__PURE__*/function () {
687
769
  for (var _iterator = _createForOfIteratorHelperLoose(this.trade.swaps), _step; !(_step = _iterator()).done;) {
688
770
  var swap = _step.value;
689
771
  switch (swap.route.protocol) {
772
+ case routerSdk.Protocol.FEWV2:
773
+ addRingV2Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
774
+ break;
690
775
  case routerSdk.Protocol.V2:
691
776
  addV2Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
692
777
  break;
@@ -694,10 +779,10 @@ var UniswapTrade = /*#__PURE__*/function () {
694
779
  addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
695
780
  break;
696
781
  case routerSdk.Protocol.V4:
697
- addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
782
+ addV4Swap(this.trade.swaps, planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
698
783
  break;
699
784
  case routerSdk.Protocol.MIXED:
700
- addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
785
+ addMixedSwap(this.trade.swaps, planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
701
786
  break;
702
787
  default:
703
788
  throw new Error('UNSUPPORTED_TRADE_PROTOCOL');
@@ -734,24 +819,36 @@ var UniswapTrade = /*#__PURE__*/function () {
734
819
  // The remaining tokens that need to be sent to the user after the fee is taken will be caught
735
820
  // by this if-else clause.
736
821
  if (this.outputRequiresUnwrap) {
737
- planner.addCommand(exports.CommandType.UNWRAP_WETH, [this.options.recipient, minimumAmountOut]);
822
+ planner.addCommand(exports.CommandType.UNWRAP_WETH, [this.options.recipient, '0']);
823
+ planner.addCommand(exports.CommandType.SWEEP, [getCurrencyAddress(this.trade.outputAmount.currency), SENDER_AS_RECIPIENT, '0']);
738
824
  } else if (this.outputRequiresWrap) {
739
825
  planner.addCommand(exports.CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE]);
740
826
  } else {
741
- planner.addCommand(exports.CommandType.SWEEP, [getCurrencyAddress(this.trade.outputAmount.currency), this.options.recipient, minimumAmountOut]);
827
+ if (this.hasFewV2) {
828
+ planner.addCommand(exports.CommandType.SWEEP, [getCurrencyAddress(this.trade.outputAmount.currency), this.options.recipient, '0']);
829
+ } else {
830
+ planner.addCommand(exports.CommandType.SWEEP, [getCurrencyAddress(this.trade.outputAmount.currency), this.options.recipient, minimumAmountOut]);
831
+ }
742
832
  }
743
833
  }
834
+ var fwWETH = FEW_WRAPPED_NATIVE_CURRENCY[this.trade.inputAmount.currency.wrapped.chainId];
744
835
  // for exactOutput swaps with native input or that perform an inputToken transition (wrap or unwrap)
745
836
  // we need to send back the change to the user
746
837
  if (this.trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT || riskOfPartialFill(this.trade)) {
747
838
  if (this.inputRequiresWrap) {
839
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fwWETH.address, ROUTER_AS_RECIPIENT, '0']);
748
840
  planner.addCommand(exports.CommandType.UNWRAP_WETH, [this.options.recipient, 0]);
841
+ planner.addCommand(exports.CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
749
842
  } else if (this.inputRequiresUnwrap) {
750
843
  planner.addCommand(exports.CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE]);
751
844
  } else if (this.trade.inputAmount.currency.isNative) {
845
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fwWETH.address, ROUTER_AS_RECIPIENT, '0']);
846
+ planner.addCommand(exports.CommandType.UNWRAP_WETH, [SENDER_AS_RECIPIENT, 0]);
752
847
  // must refund extra native currency sent along for native v4 trades (no input transition)
753
848
  planner.addCommand(exports.CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
754
849
  }
850
+ planner.addCommand(exports.CommandType.SWEEP, [this.trade.inputAmount.currency.wrapped.address, SENDER_AS_RECIPIENT, '0']);
851
+ planner.addCommand(exports.CommandType.SWEEP, [this.trade.outputAmount.currency.wrapped.address, SENDER_AS_RECIPIENT, '0']);
755
852
  }
756
853
  if (this.options.safeMode) planner.addCommand(exports.CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
757
854
  };
@@ -765,6 +862,16 @@ var UniswapTrade = /*#__PURE__*/function () {
765
862
  }
766
863
  return result;
767
864
  }
865
+ }, {
866
+ key: "hasFewV2",
867
+ get: function get() {
868
+ var result = false;
869
+ for (var _iterator3 = _createForOfIteratorHelperLoose(this.trade.swaps), _step3; !(_step3 = _iterator3()).done;) {
870
+ var swap = _step3.value;
871
+ result = result || swap.route.protocol == routerSdk.Protocol.FEWV2;
872
+ }
873
+ return result;
874
+ }
768
875
  // this.trade.swaps is an array of swaps / trades.
769
876
  // we are iterating over one swap (trade) at a time so length is 1
770
877
  // route is either v2, v3, v4, or mixed
@@ -834,14 +941,23 @@ var UniswapTrade = /*#__PURE__*/function () {
834
941
  }
835
942
  }]);
836
943
  }();
837
- // encode a uniswap v2 swap
838
- function addV2Swap(planner, _ref, tradeType, options, payerIsUser, routerMustCustody) {
944
+ // encode a ring v2 swap
945
+ function addRingV2Swap(planner, _ref, tradeType, options, payerIsUser, routerMustCustody) {
839
946
  var route = _ref.route,
840
947
  inputAmount = _ref.inputAmount,
841
948
  outputAmount = _ref.outputAmount;
842
- var trade = new v2Sdk.Trade(route, tradeType == sdkCore.TradeType.EXACT_INPUT ? inputAmount : outputAmount, tradeType);
949
+ var trade = new fewV2Sdk.Trade(route, tradeType == sdkCore.TradeType.EXACT_INPUT ? inputAmount : outputAmount, tradeType);
950
+ var pathInput = route.path[0];
951
+ var pathOutput = route.path[route.path.length - 1];
952
+ if (!trade.inputAmount.currency.isNative) {
953
+ // send wrapped token to router to unwrap
954
+ planner.addCommand(exports.CommandType.PERMIT2_TRANSFER_FROM, [trade.inputAmount.currency.address, ROUTER_AS_RECIPIENT, trade.maximumAmountIn(options.slippageTolerance).quotient.toString()]);
955
+ }
956
+ planner.addCommand(exports.CommandType.WRAP_FEW_TOKEN, [trade.inputAmount.currency.wrapped.address, ROUTER_AS_RECIPIENT, trade.inputAmount.quotient.toString()]);
957
+ payerIsUser = false;
958
+ routerMustCustody = true; // TOTO, check again
843
959
  if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
844
- planner.addCommand(exports.CommandType.V2_SWAP_EXACT_IN, [
960
+ planner.addCommand(exports.CommandType.FEW_V2_SWAP_EXACT_IN, [
845
961
  // if native, we have to unwrap so keep in the router for now
846
962
  routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),
847
963
  // if router will custody funds, we do aggregated slippage check from router
@@ -849,63 +965,213 @@ function addV2Swap(planner, _ref, tradeType, options, payerIsUser, routerMustCus
849
965
  return token.wrapped.address;
850
966
  }), payerIsUser]);
851
967
  } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
852
- planner.addCommand(exports.CommandType.V2_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
968
+ planner.addCommand(exports.CommandType.FEW_V2_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
853
969
  return token.wrapped.address;
854
970
  }), payerIsUser]);
855
971
  }
972
+ var fewOutputToken = fewV2Sdk.getFewTokenFromOriginalToken(trade.outputAmount.currency.wrapped, trade.outputAmount.currency.chainId);
973
+ var fwWETH = FEW_WRAPPED_NATIVE_CURRENCY[trade.inputAmount.currency.wrapped.chainId];
974
+ if (outputAmount.currency.isNative) {
975
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fwWETH.address, ROUTER_AS_RECIPIENT, trade.minimumAmountOut(options.slippageTolerance).quotient.toString()]);
976
+ } else {
977
+ if (fewV2Sdk.isFewToken(route.pathInput.wrapped) && fewV2Sdk.isFewToken(route.pathOutput.wrapped)) {
978
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewOutputToken.address, SENDER_AS_RECIPIENT, trade.minimumAmountOut(options.slippageTolerance).quotient.toString()]);
979
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathInput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
980
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathOutput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
981
+ }
982
+ }
856
983
  }
857
- // encode a uniswap v3 swap
858
- function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCustody) {
984
+ // encode a uniswap v2 swap
985
+ function addV2Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCustody) {
859
986
  var route = _ref2.route,
860
987
  inputAmount = _ref2.inputAmount,
861
988
  outputAmount = _ref2.outputAmount;
989
+ var trade = new v2Sdk.Trade(route, tradeType == sdkCore.TradeType.EXACT_INPUT ? inputAmount : outputAmount, tradeType);
990
+ var pathInput = route.path[0];
991
+ var pathOutput = route.path[route.path.length - 1];
992
+ if (fewV2Sdk.isFewToken(route.pathInput.wrapped) && fewV2Sdk.isFewToken(route.pathOutput.wrapped)) {
993
+ if (!trade.inputAmount.currency.isNative) {
994
+ // send wrapped token to router to unwrap
995
+ planner.addCommand(exports.CommandType.PERMIT2_TRANSFER_FROM, [trade.inputAmount.currency.address, ROUTER_AS_RECIPIENT, trade.maximumAmountIn(options.slippageTolerance).quotient.toString()]);
996
+ }
997
+ planner.addCommand(exports.CommandType.WRAP_FEW_TOKEN, [trade.inputAmount.currency.wrapped.address, ROUTER_AS_RECIPIENT, trade.inputAmount.currency.isNative ? CONTRACT_BALANCE : trade.inputAmount.quotient.toString()]);
998
+ payerIsUser = false;
999
+ routerMustCustody = true; // TOTO, check again
1000
+ if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
1001
+ planner.addCommand(exports.CommandType.V2_SWAP_EXACT_IN, [
1002
+ // if native, we have to unwrap so keep in the router for now
1003
+ routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),
1004
+ // if router will custody funds, we do aggregated slippage check from router
1005
+ routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
1006
+ return token.wrapped.address;
1007
+ }), payerIsUser]);
1008
+ } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
1009
+ planner.addCommand(exports.CommandType.V2_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
1010
+ return token.wrapped.address;
1011
+ }), payerIsUser]);
1012
+ }
1013
+ var fewOutputToken = fewV2Sdk.getFewTokenFromOriginalToken(trade.outputAmount.currency.wrapped, trade.outputAmount.currency.chainId);
1014
+ if (fewV2Sdk.isFewToken(pathInput.wrapped) && fewV2Sdk.isFewToken(pathOutput.wrapped)) {
1015
+ if (outputAmount.currency.isNative) {
1016
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewOutputToken.address, ROUTER_AS_RECIPIENT, trade.minimumAmountOut(options.slippageTolerance).quotient.toString()]);
1017
+ } else {
1018
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewOutputToken.address, SENDER_AS_RECIPIENT, trade.minimumAmountOut(options.slippageTolerance).quotient.toString()]);
1019
+ }
1020
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathInput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
1021
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathOutput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
1022
+ }
1023
+ } else {
1024
+ if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
1025
+ planner.addCommand(exports.CommandType.V2_SWAP_EXACT_IN, [
1026
+ // if native, we have to unwrap so keep in the router for now
1027
+ routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),
1028
+ // if router will custody funds, we do aggregated slippage check from router
1029
+ routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
1030
+ return token.wrapped.address;
1031
+ }), payerIsUser]);
1032
+ } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
1033
+ planner.addCommand(exports.CommandType.V2_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
1034
+ return token.wrapped.address;
1035
+ }), payerIsUser]);
1036
+ }
1037
+ }
1038
+ }
1039
+ // encode a uniswap v3 swap
1040
+ function addV3Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody) {
1041
+ var route = _ref3.route,
1042
+ inputAmount = _ref3.inputAmount,
1043
+ outputAmount = _ref3.outputAmount;
862
1044
  var trade = v3Sdk.Trade.createUncheckedTrade({
863
1045
  route: route,
864
1046
  inputAmount: inputAmount,
865
1047
  outputAmount: outputAmount,
866
1048
  tradeType: tradeType
867
1049
  });
868
- var path = v3Sdk.encodeRouteToPath(route, trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT);
869
- if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
870
- planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
871
- } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
872
- 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]);
1050
+ var pathInput = route.path[0];
1051
+ var pathOutput = route.path[route.path.length - 1];
1052
+ // const fwWETH = FEW_WRAPPED_NATIVE_CURRENCY[trade.inputAmount.currency.wrapped.chainId]
1053
+ if (fewV2Sdk.isFewToken(route.pathInput.wrapped) && fewV2Sdk.isFewToken(route.pathOutput.wrapped)) {
1054
+ if (!trade.inputAmount.currency.isNative) {
1055
+ // send wrapped token to router to unwrap
1056
+ planner.addCommand(exports.CommandType.PERMIT2_TRANSFER_FROM, [trade.inputAmount.currency.address, ROUTER_AS_RECIPIENT, trade.maximumAmountIn(options.slippageTolerance).quotient.toString()]);
1057
+ }
1058
+ planner.addCommand(exports.CommandType.WRAP_FEW_TOKEN, [trade.inputAmount.currency.wrapped.address, ROUTER_AS_RECIPIENT, trade.inputAmount.currency.isNative ? CONTRACT_BALANCE : trade.inputAmount.quotient.toString()]);
1059
+ payerIsUser = false;
1060
+ routerMustCustody = true; // TOTO, check again
1061
+ var fewCurrencyIn = fewV2Sdk.getFewTokenFromOriginalToken(route.input.wrapped, route.input.chainId);
1062
+ var fewCurrencyOut = fewV2Sdk.getFewTokenFromOriginalToken(route.output.wrapped, route.output.chainId);
1063
+ var v3Route = route;
1064
+ var newV3Route = new v3Sdk.Route(v3Route.pools, fewCurrencyIn, fewCurrencyOut);
1065
+ var path = v3Sdk.encodeRouteToPath(newV3Route, trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT);
1066
+ if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
1067
+ planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
1068
+ } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
1069
+ 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]);
1070
+ }
1071
+ var fewInputToken = fewV2Sdk.getFewTokenFromOriginalToken(trade.inputAmount.currency.wrapped, trade.inputAmount.currency.chainId);
1072
+ var fewOutputToken = fewV2Sdk.getFewTokenFromOriginalToken(trade.outputAmount.currency.wrapped, trade.outputAmount.currency.chainId);
1073
+ if (fewV2Sdk.isFewToken(pathInput.wrapped) && fewV2Sdk.isFewToken(pathOutput.wrapped)) {
1074
+ if (outputAmount.currency.isNative) {
1075
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewOutputToken.address, ROUTER_AS_RECIPIENT, '0']);
1076
+ } else if (trade.inputAmount.currency.isNative) {
1077
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewInputToken.address, ROUTER_AS_RECIPIENT, '0']);
1078
+ planner.addCommand(exports.CommandType.UNWRAP_WETH, [SENDER_AS_RECIPIENT, '0']);
1079
+ } else {
1080
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewOutputToken.address, SENDER_AS_RECIPIENT, '0']);
1081
+ }
1082
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathInput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
1083
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathOutput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
1084
+ }
1085
+ } else {
1086
+ var _path = v3Sdk.encodeRouteToPath(route, trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT);
1087
+ if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
1088
+ planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), _path, payerIsUser]);
1089
+ } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
1090
+ 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]);
1091
+ }
873
1092
  }
874
1093
  }
875
- function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody) {
876
- var _options$recipient;
877
- var inputAmount = _ref3.inputAmount,
878
- outputAmount = _ref3.outputAmount,
879
- route = _ref3.route;
1094
+ function addV4Swap(swaps, planner, _ref4, tradeType, options, payerIsUser, routerMustCustody) {
1095
+ var inputAmount = _ref4.inputAmount,
1096
+ outputAmount = _ref4.outputAmount,
1097
+ route = _ref4.route;
880
1098
  // create a deep copy of pools since v4Planner encoding tampers with array
1099
+ var fewCurrencyIn = fewV2Sdk.getFewTokenFromOriginalToken(inputAmount.currency.wrapped, inputAmount.currency.chainId);
1100
+ var fewCurrencyOut = fewV2Sdk.getFewTokenFromOriginalToken(outputAmount.currency.wrapped, outputAmount.currency.chainId);
1101
+ var firstSwap = swaps[0];
1102
+ var lastSwap = swaps[swaps.length - 1];
1103
+ var pathInput = route.path[0];
1104
+ var pathOutput = route.path[route.path.length - 1];
881
1105
  var pools = route.pools.map(function (p) {
882
1106
  return p;
883
1107
  });
884
1108
  var v4Route = new v4Sdk.Route(pools, inputAmount.currency, outputAmount.currency);
885
- var trade = v4Sdk.Trade.createUncheckedTrade({
886
- route: v4Route,
887
- inputAmount: inputAmount,
888
- outputAmount: outputAmount,
889
- tradeType: tradeType
890
- });
891
- var slippageToleranceOnSwap = routerMustCustody && tradeType == sdkCore.TradeType.EXACT_INPUT ? undefined : options.slippageTolerance;
892
- var v4Planner = new v4Sdk.V4Planner();
893
- v4Planner.addTrade(trade, slippageToleranceOnSwap);
894
- v4Planner.addSettle(trade.route.pathInput, payerIsUser);
895
- v4Planner.addTake(trade.route.pathOutput, routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient = options.recipient) != null ? _options$recipient : SENDER_AS_RECIPIENT);
896
- planner.addCommand(exports.CommandType.V4_SWAP, [v4Planner.finalize()]);
1109
+ if (fewV2Sdk.isFewToken(route.pools[0].token0.wrapped) && fewV2Sdk.isFewToken(route.pools[0].token1.wrapped)) {
1110
+ var _options$recipient;
1111
+ var fewV4Route = new v4Sdk.Route(pools, fewCurrencyIn, fewCurrencyOut);
1112
+ var fewTrade = v4Sdk.Trade.createUncheckedTrade({
1113
+ route: fewV4Route,
1114
+ inputAmount: inputAmount,
1115
+ outputAmount: outputAmount,
1116
+ tradeType: tradeType
1117
+ });
1118
+ if (!fewTrade.inputAmount.currency.isNative) {
1119
+ // send wrapped token to router to unwrap
1120
+ planner.addCommand(exports.CommandType.PERMIT2_TRANSFER_FROM, [fewTrade.inputAmount.currency.address, ROUTER_AS_RECIPIENT, fewTrade.maximumAmountIn(options.slippageTolerance).quotient.toString()]);
1121
+ }
1122
+ if (fewTrade.inputAmount.currency.isNative) {
1123
+ planner.addCommand(exports.CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, fewTrade.inputAmount.quotient.toString()]);
1124
+ }
1125
+ planner.addCommand(exports.CommandType.WRAP_FEW_TOKEN, [fewTrade.inputAmount.currency.wrapped.address, ROUTER_AS_RECIPIENT, fewTrade.inputAmount.currency.isNative ? CONTRACT_BALANCE : fewTrade.inputAmount.quotient.toString()]);
1126
+ payerIsUser = false;
1127
+ routerMustCustody = true; // TOTO, check again
1128
+ var slippageToleranceOnSwap = routerMustCustody && tradeType == sdkCore.TradeType.EXACT_INPUT ? undefined : options.slippageTolerance;
1129
+ var v4Planner = new v4Sdk.V4Planner();
1130
+ v4Planner.addTrade(fewTrade, slippageToleranceOnSwap);
1131
+ v4Planner.addSettle(fewTrade.route.pathInput, payerIsUser);
1132
+ v4Planner.addTake(fewTrade.route.pathOutput, routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient = options.recipient) != null ? _options$recipient : SENDER_AS_RECIPIENT);
1133
+ planner.addCommand(exports.CommandType.V4_SWAP, [v4Planner.finalize()]);
1134
+ var fewOutputToken = fewV2Sdk.getFewTokenFromOriginalToken(fewTrade.outputAmount.currency.wrapped, fewTrade.outputAmount.currency.chainId);
1135
+ if (fewV2Sdk.isFewToken(pathInput.wrapped) && fewV2Sdk.isFewToken(pathOutput.wrapped)) {
1136
+ if (outputAmount.currency.isNative) {
1137
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewOutputToken.address, ROUTER_AS_RECIPIENT, fewTrade.minimumAmountOut(options.slippageTolerance).quotient.toString()]);
1138
+ planner.addCommand(exports.CommandType.UNWRAP_WETH, [SENDER_AS_RECIPIENT, 0]);
1139
+ } else {
1140
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [fewOutputToken.address, SENDER_AS_RECIPIENT, fewTrade.minimumAmountOut(options.slippageTolerance).quotient.toString()]);
1141
+ }
1142
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathInput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
1143
+ planner.addCommand(exports.CommandType.UNWRAP_FEW_TOKEN, [pathOutput.wrapped.address, SENDER_AS_RECIPIENT, '0']);
1144
+ }
1145
+ } else {
1146
+ var _options$recipient2;
1147
+ var trade = v4Sdk.Trade.createUncheckedTrade({
1148
+ route: v4Route,
1149
+ inputAmount: inputAmount,
1150
+ outputAmount: outputAmount,
1151
+ tradeType: tradeType
1152
+ });
1153
+ var _slippageToleranceOnSwap = routerMustCustody && tradeType == sdkCore.TradeType.EXACT_INPUT ? undefined : options.slippageTolerance;
1154
+ var _v4Planner = new v4Sdk.V4Planner();
1155
+ _v4Planner.addTrade(trade, _slippageToleranceOnSwap);
1156
+ _v4Planner.addSettle(trade.route.pathInput, payerIsUser);
1157
+ _v4Planner.addTake(trade.route.pathOutput, routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient2 = options.recipient) != null ? _options$recipient2 : SENDER_AS_RECIPIENT);
1158
+ if (firstSwap.route.protocol !== routerSdk.Protocol.V4 && lastSwap.route.protocol === routerSdk.Protocol.V4 && trade.route.pathInput.isNative) {
1159
+ planner.addCommand(exports.CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0]);
1160
+ }
1161
+ planner.addCommand(exports.CommandType.V4_SWAP, [_v4Planner.finalize()]);
1162
+ }
897
1163
  }
898
1164
  // encode a mixed route swap, i.e. including both v2 and v3 pools
899
- function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMustCustody) {
900
- var _options$recipient2;
1165
+ function addMixedSwap(swaps, planner, swap, tradeType, options, payerIsUser, routerMustCustody) {
1166
+ var _options$recipient3;
901
1167
  var route = swap.route;
902
1168
  var inputAmount = swap.inputAmount;
903
1169
  var outputAmount = swap.outputAmount;
904
- var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient2 = options.recipient) != null ? _options$recipient2 : SENDER_AS_RECIPIENT;
1170
+ var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient3 = options.recipient) != null ? _options$recipient3 : SENDER_AS_RECIPIENT;
905
1171
  // single hop, so it can be reduced to plain swap logic for one protocol version
906
1172
  if (route.pools.length === 1) {
907
1173
  if (route.pools[0] instanceof v4Sdk.Pool) {
908
- return addV4Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
1174
+ return addV4Swap(swaps, planner, swap, tradeType, options, payerIsUser, routerMustCustody);
909
1175
  } else if (route.pools[0] instanceof v3Sdk.Pool) {
910
1176
  return addV3Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
911
1177
  } else if (route.pools[0] instanceof v2Sdk.Pair) {
@@ -1447,6 +1713,7 @@ function v4RouterCallToParams(actions) {
1447
1713
 
1448
1714
  exports.COMMAND_DEFINITION = COMMAND_DEFINITION;
1449
1715
  exports.CommandParser = CommandParser;
1716
+ exports.FEW_WRAPPED_NATIVE_CURRENCY = FEW_WRAPPED_NATIVE_CURRENCY;
1450
1717
  exports.GenericCommandParser = GenericCommandParser;
1451
1718
  exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
1452
1719
  exports.RoutePlanner = RoutePlanner;