@uniswap/universal-router-sdk 4.33.0 → 4.34.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.
@@ -9,6 +9,10 @@ export declare type FlatFeeOptions = {
9
9
  amount: BigNumberish;
10
10
  recipient: string;
11
11
  };
12
+ export declare enum TokenTransferMode {
13
+ Permit2 = "Permit2",
14
+ ApproveProxy = "ApproveProxy"
15
+ }
12
16
  export declare type SwapOptions = Omit<RouterSwapOptions, 'inputTokenPermit'> & {
13
17
  useRouterBalance?: boolean;
14
18
  inputTokenPermit?: Permit2Permit;
@@ -16,6 +20,8 @@ export declare type SwapOptions = Omit<RouterSwapOptions, 'inputTokenPermit'> &
16
20
  safeMode?: boolean;
17
21
  maxHopSlippage?: BigNumber[];
18
22
  urVersion?: URVersion;
23
+ tokenTransferMode?: TokenTransferMode;
24
+ chainId?: number;
19
25
  };
20
26
  export declare class UniswapTrade implements Command {
21
27
  trade: RouterTrade<Currency, Currency, TradeType>;
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export * from './entities';
4
4
  export * from './utils/routerTradeAdapter';
5
5
  export { RoutePlanner, CommandType, COMMAND_DEFINITION, Parser, Subparser } from './utils/routerCommands';
6
6
  export type { CommandDefinition, ParamType } from './utils/routerCommands';
7
- export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, UniversalRouterVersion, } from './utils/constants';
7
+ export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, SWAP_PROXY_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, UniversalRouterVersion, } from './utils/constants';
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';
@@ -38,6 +38,7 @@ export interface MigrateV3ToV4Options {
38
38
  }
39
39
  export declare abstract class SwapRouter {
40
40
  static INTERFACE: Interface;
41
+ static PROXY_INTERFACE: Interface;
41
42
  static swapCallParameters(trades: RouterTrade<Currency, Currency, TradeType>, options: SwapOptions, bridgeOptions?: AcrossV4DepositV3Params[]): MethodParameters;
42
43
  /**
43
44
  * Generate EIP712 payload for signed execution (no signing performed)
@@ -78,4 +79,9 @@ export declare abstract class SwapRouter {
78
79
  * @param config the router config
79
80
  */
80
81
  private static encodePlan;
82
+ /**
83
+ * Encodes a planned route into calldata targeting the SwapProxy contract.
84
+ * The proxy pulls ERC20 tokens from the user into the UR, then executes commands.
85
+ */
86
+ private static encodeProxyPlan;
81
87
  }
@@ -449,6 +449,7 @@ var _routerConfigs, _routerConfigs2, _routerConfigs3, _routerConfigs4, _routerCo
449
449
  UniversalRouterVersion["V2_1"] = "2.1";
450
450
  })(exports.UniversalRouterVersion || (exports.UniversalRouterVersion = {}));
451
451
  var WETH_NOT_SUPPORTED_ON_CHAIN = '0x0000000000000000000000000000000000000000';
452
+ var SWAP_PROXY_DEPLOY_ADDRESS = '0x02E5be68D46DAc0B524905bfF209cf47EE6dB2a9';
452
453
  // Todo: Change `CHAIN_CONFIGS` to pull the UR address with v4
453
454
  var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
454
455
  weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
@@ -461,7 +462,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
461
462
  }, _routerConfigs[exports.UniversalRouterVersion.V2_1] = {
462
463
  address: '0xd92a36b0000531ef3063ded4de20a0783308446c',
463
464
  creationBlock: 23836348
464
- }, _routerConfigs)
465
+ }, _routerConfigs),
466
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
465
467
  }, _CHAIN_CONFIGS[5] = {
466
468
  weth: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6',
467
469
  routerConfigs: (_routerConfigs2 = {}, _routerConfigs2[exports.UniversalRouterVersion.V1_2] = {
@@ -485,7 +487,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
485
487
  }, _routerConfigs3[exports.UniversalRouterVersion.V2_1] = {
486
488
  address: '0x470FFC67b1feEEC31D16C46AC7545C98716a194c',
487
489
  creationBlock: 9664766
488
- }, _routerConfigs3)
490
+ }, _routerConfigs3),
491
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
489
492
  }, _CHAIN_CONFIGS[137] = {
490
493
  weth: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
491
494
  routerConfigs: (_routerConfigs4 = {}, _routerConfigs4[exports.UniversalRouterVersion.V1_2] = {
@@ -497,7 +500,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
497
500
  }, _routerConfigs4[exports.UniversalRouterVersion.V2_1] = {
498
501
  address: '0xE27610fD9dD05FC061366bc9dA414CA6F948f204',
499
502
  creationBlock: 79245524
500
- }, _routerConfigs4)
503
+ }, _routerConfigs4),
504
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
501
505
  }, _CHAIN_CONFIGS[80001] = {
502
506
  weth: '0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889',
503
507
  routerConfigs: (_routerConfigs5 = {}, _routerConfigs5[exports.UniversalRouterVersion.V1_2] = {
@@ -521,7 +525,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
521
525
  }, _routerConfigs6[exports.UniversalRouterVersion.V2_1] = {
522
526
  address: '0xde20EEE5398D3790a4D356e8925bD21Ea65D99Af',
523
527
  creationBlock: 143998769
524
- }, _routerConfigs6)
528
+ }, _routerConfigs6),
529
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
525
530
  }, _CHAIN_CONFIGS[420] = {
526
531
  weth: '0x4200000000000000000000000000000000000006',
527
532
  routerConfigs: (_routerConfigs7 = {}, _routerConfigs7[exports.UniversalRouterVersion.V1_2] = {
@@ -545,7 +550,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
545
550
  }, _routerConfigs8[exports.UniversalRouterVersion.V2_1] = {
546
551
  address: '0x96b2FD2F80e9428Daa65d859653117D453981AB4',
547
552
  creationBlock: 402060097
548
- }, _routerConfigs8)
553
+ }, _routerConfigs8),
554
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
549
555
  }, _CHAIN_CONFIGS[421613] = {
550
556
  weth: '0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3',
551
557
  routerConfigs: (_routerConfigs9 = {}, _routerConfigs9[exports.UniversalRouterVersion.V1_2] = {
@@ -569,7 +575,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
569
575
  }, _routerConfigs0[exports.UniversalRouterVersion.V2_1] = {
570
576
  address: '0xBB8Ed9bF0BFF210652AE5f473a849F82e990DDf6',
571
577
  creationBlock: 51696199
572
- }, _routerConfigs0)
578
+ }, _routerConfigs0),
579
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
573
580
  }, _CHAIN_CONFIGS[44787] = {
574
581
  weth: WETH_NOT_SUPPORTED_ON_CHAIN,
575
582
  routerConfigs: (_routerConfigs1 = {}, _routerConfigs1[exports.UniversalRouterVersion.V1_2] = {
@@ -593,7 +600,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
593
600
  }, _routerConfigs10[exports.UniversalRouterVersion.V2_1] = {
594
601
  address: '0x91BF3bfAEf8D771A74E1A8fE460b3EE646b2e588',
595
602
  creationBlock: 68794488
596
- }, _routerConfigs10)
603
+ }, _routerConfigs10),
604
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
597
605
  }, _CHAIN_CONFIGS[43114] = {
598
606
  weth: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',
599
607
  routerConfigs: (_routerConfigs11 = {}, _routerConfigs11[exports.UniversalRouterVersion.V1_2] = {
@@ -605,7 +613,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
605
613
  }, _routerConfigs11[exports.UniversalRouterVersion.V2_1] = {
606
614
  address: '0x0Cf1f86B331A03179646341D10A2A87515087221',
607
615
  creationBlock: 72254439
608
- }, _routerConfigs11)
616
+ }, _routerConfigs11),
617
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
609
618
  }, _CHAIN_CONFIGS[84531] = {
610
619
  weth: '0x4200000000000000000000000000000000000006',
611
620
  routerConfigs: (_routerConfigs12 = {}, _routerConfigs12[exports.UniversalRouterVersion.V1_2] = {
@@ -629,7 +638,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
629
638
  }, _routerConfigs13[exports.UniversalRouterVersion.V2_1] = {
630
639
  address: '0xf3a4f4094bd2c6c06ca2f61789d8727b8d1e7259',
631
640
  creationBlock: 38404211
632
- }, _routerConfigs13)
641
+ }, _routerConfigs13),
642
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
633
643
  }, _CHAIN_CONFIGS[81457] = {
634
644
  weth: '0x4300000000000000000000000000000000000004',
635
645
  routerConfigs: (_routerConfigs14 = {}, _routerConfigs14[exports.UniversalRouterVersion.V1_2] = {
@@ -641,7 +651,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
641
651
  }, _routerConfigs14[exports.UniversalRouterVersion.V2_1] = {
642
652
  address: '0x77c0097c1acf6fd84878d3f7c0603e3f04e8bec7',
643
653
  creationBlock: 27394047
644
- }, _routerConfigs14)
654
+ }, _routerConfigs14),
655
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
645
656
  }, _CHAIN_CONFIGS[7777777] = {
646
657
  weth: '0x4200000000000000000000000000000000000006',
647
658
  routerConfigs: (_routerConfigs15 = {}, _routerConfigs15[exports.UniversalRouterVersion.V1_2] = {
@@ -653,7 +664,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
653
664
  }, _routerConfigs15[exports.UniversalRouterVersion.V2_1] = {
654
665
  address: '0x880853091b60f80301a0c1d2f9893c4993041295',
655
666
  creationBlock: 38452170
656
- }, _routerConfigs15)
667
+ }, _routerConfigs15),
668
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
657
669
  }, _CHAIN_CONFIGS[324] = {
658
670
  weth: '0x5aea5775959fbc2557cc8789bc1bf90a239d9a91',
659
671
  routerConfigs: (_routerConfigs16 = {}, _routerConfigs16[exports.UniversalRouterVersion.V1_2] = {
@@ -665,7 +677,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
665
677
  }, _routerConfigs16[exports.UniversalRouterVersion.V2_1] = {
666
678
  address: '0x0000000000000000000000000000000000000000',
667
679
  creationBlock: 1
668
- }, _routerConfigs16)
680
+ }, _routerConfigs16),
681
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
669
682
  }, _CHAIN_CONFIGS[480] = {
670
683
  weth: '0x4200000000000000000000000000000000000006',
671
684
  routerConfigs: (_routerConfigs17 = {}, _routerConfigs17[exports.UniversalRouterVersion.V1_2] = {
@@ -677,7 +690,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
677
690
  }, _routerConfigs17[exports.UniversalRouterVersion.V2_1] = {
678
691
  address: '0x03c4f6b55733cdf3caa07c01e5b83ddee3381f60',
679
692
  creationBlock: 22131418
680
- }, _routerConfigs17)
693
+ }, _routerConfigs17),
694
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
681
695
  }, _CHAIN_CONFIGS[1301] = {
682
696
  weth: '0x4200000000000000000000000000000000000006',
683
697
  routerConfigs: (_routerConfigs18 = {}, _routerConfigs18[exports.UniversalRouterVersion.V1_2] = {
@@ -689,7 +703,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
689
703
  }, _routerConfigs18[exports.UniversalRouterVersion.V2_1] = {
690
704
  address: '0x7F9B8D606E0F35E5073ABf93695814530b28a37b',
691
705
  creationBlock: 36746405
692
- }, _routerConfigs18)
706
+ }, _routerConfigs18),
707
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
693
708
  }, _CHAIN_CONFIGS[130] = {
694
709
  weth: '0x4200000000000000000000000000000000000006',
695
710
  routerConfigs: (_routerConfigs19 = {}, _routerConfigs19[exports.UniversalRouterVersion.V1_2] = {
@@ -701,7 +716,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
701
716
  }, _routerConfigs19[exports.UniversalRouterVersion.V2_1] = {
702
717
  address: '0xe6039ae5b44f90d56c6b029354fb22999861a9a0',
703
718
  creationBlock: 32850661
704
- }, _routerConfigs19)
719
+ }, _routerConfigs19),
720
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
705
721
  }, _CHAIN_CONFIGS[10143] = {
706
722
  weth: '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',
707
723
  routerConfigs: (_routerConfigs20 = {}, _routerConfigs20[exports.UniversalRouterVersion.V1_2] = {
@@ -713,7 +729,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
713
729
  }, _routerConfigs20[exports.UniversalRouterVersion.V2_1] = {
714
730
  address: '0x0000000000000000000000000000000000000000',
715
731
  creationBlock: 1
716
- }, _routerConfigs20)
732
+ }, _routerConfigs20),
733
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
717
734
  }, _CHAIN_CONFIGS[84532] = {
718
735
  weth: '0x4200000000000000000000000000000000000006',
719
736
  routerConfigs: (_routerConfigs21 = {}, _routerConfigs21[exports.UniversalRouterVersion.V1_2] = {
@@ -725,7 +742,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
725
742
  }, _routerConfigs21[exports.UniversalRouterVersion.V2_1] = {
726
743
  address: '0x0000000000000000000000000000000000000000',
727
744
  creationBlock: 1
728
- }, _routerConfigs21)
745
+ }, _routerConfigs21),
746
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
729
747
  }, _CHAIN_CONFIGS[1868] = {
730
748
  weth: '0x4200000000000000000000000000000000000006',
731
749
  routerConfigs: (_routerConfigs22 = {}, _routerConfigs22[exports.UniversalRouterVersion.V1_2] = {
@@ -737,7 +755,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
737
755
  }, _routerConfigs22[exports.UniversalRouterVersion.V2_1] = {
738
756
  address: '0xdb1d5986551c820bd0f3b1caca3e77ce03acb5ef',
739
757
  creationBlock: 15232223
740
- }, _routerConfigs22)
758
+ }, _routerConfigs22),
759
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
741
760
  }, _CHAIN_CONFIGS[143] = {
742
761
  weth: '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A',
743
762
  routerConfigs: (_routerConfigs23 = {}, _routerConfigs23[exports.UniversalRouterVersion.V1_2] = {
@@ -749,7 +768,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
749
768
  }, _routerConfigs23[exports.UniversalRouterVersion.V2_1] = {
750
769
  address: '0xBC2A036E5027b9AE57BbA847eF88E1b14823F7B1',
751
770
  creationBlock: 36720825
752
- }, _routerConfigs23)
771
+ }, _routerConfigs23),
772
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
753
773
  }, _CHAIN_CONFIGS[59144] = {
754
774
  weth: '0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f',
755
775
  routerConfigs: (_routerConfigs24 = {}, _routerConfigs24[exports.UniversalRouterVersion.V1_2] = {
@@ -761,7 +781,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
761
781
  }, _routerConfigs24[exports.UniversalRouterVersion.V2_1] = {
762
782
  address: '0xba548ce7a95f87bc66a0c7c6eab1e428735f8b57',
763
783
  creationBlock: 1
764
- }, _routerConfigs24)
784
+ }, _routerConfigs24),
785
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
765
786
  }, _CHAIN_CONFIGS[4217] = {
766
787
  weth: WETH_NOT_SUPPORTED_ON_CHAIN,
767
788
  routerConfigs: (_routerConfigs25 = {}, _routerConfigs25[exports.UniversalRouterVersion.V1_2] = {
@@ -773,7 +794,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
773
794
  }, _routerConfigs25[exports.UniversalRouterVersion.V2_1] = {
774
795
  address: '0xa2dc7d0266f0cc50b3eeaf36c9bfcecff1beea91',
775
796
  creationBlock: 1
776
- }, _routerConfigs25)
797
+ }, _routerConfigs25),
798
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
777
799
  }, _CHAIN_CONFIGS[196] = {
778
800
  weth: '0xe538905cf8410324e03A5A23C1c177a474D59b2b',
779
801
  routerConfigs: (_routerConfigs26 = {}, _routerConfigs26[exports.UniversalRouterVersion.V1_2] = {
@@ -785,12 +807,19 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
785
807
  }, _routerConfigs26[exports.UniversalRouterVersion.V2_1] = {
786
808
  address: '0x0000000000000000000000000000000000000000',
787
809
  creationBlock: 1
788
- }, _routerConfigs26)
810
+ }, _routerConfigs26),
811
+ swapProxy: SWAP_PROXY_DEPLOY_ADDRESS
789
812
  }, _CHAIN_CONFIGS);
790
813
  var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(version, chainId) {
791
814
  if (!(chainId in CHAIN_CONFIGS)) throw new Error("Universal Router not deployed on chain " + chainId);
792
815
  return CHAIN_CONFIGS[chainId].routerConfigs[version].address;
793
816
  };
817
+ var SWAP_PROXY_ADDRESS = function SWAP_PROXY_ADDRESS(chainId) {
818
+ if (!(chainId in CHAIN_CONFIGS)) throw new Error("SwapProxy not deployed on chain " + chainId);
819
+ var proxy = CHAIN_CONFIGS[chainId].swapProxy;
820
+ if (!proxy) throw new Error("SwapProxy not configured for chain " + chainId);
821
+ return proxy;
822
+ };
794
823
  var UNIVERSAL_ROUTER_CREATION_BLOCK = function UNIVERSAL_ROUTER_CREATION_BLOCK(version, chainId) {
795
824
  if (!(chainId in CHAIN_CONFIGS)) throw new Error("Universal Router not deployed on chain " + chainId);
796
825
  return CHAIN_CONFIGS[chainId].routerConfigs[version].creationBlock;
@@ -814,6 +843,10 @@ function encodeFeeBips(fee) {
814
843
  return v3Sdk.toHex(fee.multiply(10000).quotient);
815
844
  }
816
845
 
846
+ (function (TokenTransferMode) {
847
+ TokenTransferMode["Permit2"] = "Permit2";
848
+ TokenTransferMode["ApproveProxy"] = "ApproveProxy";
849
+ })(exports.TokenTransferMode || (exports.TokenTransferMode = {}));
817
850
  var REFUND_ETH_PRICE_IMPACT_THRESHOLD = /*#__PURE__*/new sdkCore.Percent(50, 100);
818
851
  // Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router
819
852
  // also translates trade objects from previous (v2, v3) SDKs
@@ -823,7 +856,12 @@ var UniswapTrade = /*#__PURE__*/function () {
823
856
  this.options = options;
824
857
  this.tradeType = exports.RouterActionType.UniswapTrade;
825
858
  if (!!options.fee && !!options.flatFee) throw new Error('Only one fee option permitted');
826
- if (this.inputRequiresWrap || this.inputRequiresUnwrap || this.options.useRouterBalance) {
859
+ if (options.tokenTransferMode === exports.TokenTransferMode.ApproveProxy) {
860
+ if (!options.recipient || options.recipient === SENDER_AS_RECIPIENT) {
861
+ throw new Error('Explicit recipient address required when using SwapProxy (SENDER_AS_RECIPIENT resolves to proxy)');
862
+ }
863
+ this.payerIsUser = false;
864
+ } else if (this.inputRequiresWrap || this.inputRequiresUnwrap || this.options.useRouterBalance) {
827
865
  this.payerIsUser = false;
828
866
  } else {
829
867
  this.payerIsUser = true;
@@ -837,8 +875,11 @@ var UniswapTrade = /*#__PURE__*/function () {
837
875
  // TODO: optimize if only one v2 pool we can directly send this to the pool
838
876
  planner.addCommand(exports.CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
839
877
  } else if (this.inputRequiresUnwrap) {
840
- // send wrapped token to router to unwrap
841
- planner.addCommand(exports.CommandType.PERMIT2_TRANSFER_FROM, [this.trade.inputAmount.currency.address, ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
878
+ if (this.options.tokenTransferMode !== exports.TokenTransferMode.ApproveProxy) {
879
+ // send wrapped token to router to unwrap via Permit2
880
+ planner.addCommand(exports.CommandType.PERMIT2_TRANSFER_FROM, [this.trade.inputAmount.currency.address, ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
881
+ }
882
+ // In proxy mode, the proxy already transferred tokens to the UR; just unwrap
842
883
  planner.addCommand(exports.CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0]);
843
884
  }
844
885
  // The overall recipient at the end of the trade, SENDER_AS_RECIPIENT uses the msg.sender
@@ -913,6 +954,9 @@ var UniswapTrade = /*#__PURE__*/function () {
913
954
  planner.addCommand(exports.CommandType.UNWRAP_WETH, [this.options.recipient, 0]);
914
955
  } else if (this.inputRequiresUnwrap) {
915
956
  planner.addCommand(exports.CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE]);
957
+ } else if (this.options.tokenTransferMode === exports.TokenTransferMode.ApproveProxy) {
958
+ // Proxy pulled maximumAmountIn into the UR; sweep any unused input back to the user
959
+ planner.addCommand(exports.CommandType.SWEEP, [getCurrencyAddress(this.trade.inputAmount.currency), this.options.recipient, 0]);
916
960
  } else if (this.trade.inputAmount.currency.isNative) {
917
961
  // must refund extra native currency sent along for native v4 trades (no input transition)
918
962
  planner.addCommand(exports.CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
@@ -1287,11 +1331,19 @@ function generateNonce() {
1287
1331
  */
1288
1332
  var NONCE_SKIP_CHECK = '0x' + /*#__PURE__*/'f'.repeat(64); // bytes32(type(uint256).max)
1289
1333
 
1334
+ var _UR_VERSION_MAP;
1290
1335
  function isMint(options) {
1291
1336
  return Object.keys(options).some(function (k) {
1292
1337
  return k === 'recipient';
1293
1338
  });
1294
1339
  }
1340
+ var UR_VERSION_MAP = (_UR_VERSION_MAP = {}, _UR_VERSION_MAP[v4Sdk.URVersion.V2_0] = exports.UniversalRouterVersion.V2_0, _UR_VERSION_MAP[v4Sdk.URVersion.V2_1] = exports.UniversalRouterVersion.V2_1, _UR_VERSION_MAP);
1341
+ function toUniversalRouterVersion(urVersion) {
1342
+ if (urVersion === undefined) return undefined;
1343
+ var mapped = UR_VERSION_MAP[urVersion];
1344
+ if (!mapped) throw new Error("Unsupported URVersion: " + urVersion);
1345
+ return mapped;
1346
+ }
1295
1347
  var SwapRouter = /*#__PURE__*/function () {
1296
1348
  function SwapRouter() {}
1297
1349
  SwapRouter.swapCallParameters = function swapCallParameters(trades, options, bridgeOptions // Optional bridge parameters
@@ -1300,9 +1352,15 @@ var SwapRouter = /*#__PURE__*/function () {
1300
1352
  var planner = new RoutePlanner();
1301
1353
  var trade = new UniswapTrade(trades, options);
1302
1354
  var inputCurrency = trade.trade.inputAmount.currency;
1303
- !!(inputCurrency.isNative && !!options.inputTokenPermit) ? invariant(false, 'NATIVE_INPUT_PERMIT') : void 0;
1304
- if (options.inputTokenPermit) {
1305
- encodePermit(planner, options.inputTokenPermit);
1355
+ if (options.tokenTransferMode === exports.TokenTransferMode.ApproveProxy) {
1356
+ !!inputCurrency.isNative ? invariant(false, 'PROXY_NATIVE_INPUT: SwapProxy only supports ERC20 input') : void 0;
1357
+ !!!options.chainId ? invariant(false, 'PROXY_MISSING_CHAIN_ID: chainId required when tokenTransferMode is ApproveProxy') : void 0;
1358
+ !!options.inputTokenPermit ? invariant(false, 'PROXY_PERMIT_CONFLICT: Permit2 not used with SwapProxy') : void 0;
1359
+ } else {
1360
+ !!(inputCurrency.isNative && !!options.inputTokenPermit) ? invariant(false, 'NATIVE_INPUT_PERMIT') : void 0;
1361
+ if (options.inputTokenPermit) {
1362
+ encodePermit(planner, options.inputTokenPermit);
1363
+ }
1306
1364
  }
1307
1365
  var nativeCurrencyValue = inputCurrency.isNative ? ethers.BigNumber.from(trade.trade.maximumAmountIn(options.slippageTolerance).quotient.toString()) : ethers.BigNumber.from(0);
1308
1366
  trade.encode(planner, {
@@ -1315,6 +1373,9 @@ var SwapRouter = /*#__PURE__*/function () {
1315
1373
  planner.addAcrossBridge(bridge);
1316
1374
  }
1317
1375
  }
1376
+ if (options.tokenTransferMode === exports.TokenTransferMode.ApproveProxy) {
1377
+ return SwapRouter.encodeProxyPlan(planner, trade, options);
1378
+ }
1318
1379
  return SwapRouter.encodePlan(planner, nativeCurrencyValue, {
1319
1380
  deadline: options.deadlineOrPreviousBlockhash ? ethers.BigNumber.from(options.deadlineOrPreviousBlockhash) : undefined
1320
1381
  });
@@ -1496,10 +1557,30 @@ var SwapRouter = /*#__PURE__*/function () {
1496
1557
  calldata: calldata,
1497
1558
  value: nativeCurrencyValue.toHexString()
1498
1559
  };
1560
+ }
1561
+ /**
1562
+ * Encodes a planned route into calldata targeting the SwapProxy contract.
1563
+ * The proxy pulls ERC20 tokens from the user into the UR, then executes commands.
1564
+ */;
1565
+ SwapRouter.encodeProxyPlan = function encodeProxyPlan(planner, trade, options) {
1566
+ var _toUniversalRouterVer;
1567
+ var commands = planner.commands,
1568
+ inputs = planner.inputs;
1569
+ var urVersion = (_toUniversalRouterVer = toUniversalRouterVersion(options.urVersion)) != null ? _toUniversalRouterVer : exports.UniversalRouterVersion.V2_0;
1570
+ var routerAddress = UNIVERSAL_ROUTER_ADDRESS(urVersion, options.chainId);
1571
+ var inputToken = trade.trade.inputAmount.currency.address;
1572
+ var inputAmount = ethers.BigNumber.from(trade.trade.maximumAmountIn(options.slippageTolerance).quotient.toString());
1573
+ var deadline = options.deadlineOrPreviousBlockhash ? ethers.BigNumber.from(options.deadlineOrPreviousBlockhash) : ethers.BigNumber.from(Math.floor(Date.now() / 1000) + 1800); // 30 min default
1574
+ var calldata = SwapRouter.PROXY_INTERFACE.encodeFunctionData('execute', [routerAddress, inputToken, inputAmount, commands, inputs, deadline]);
1575
+ return {
1576
+ calldata: calldata,
1577
+ value: ethers.BigNumber.from(0).toHexString()
1578
+ };
1499
1579
  };
1500
1580
  return SwapRouter;
1501
1581
  }();
1502
1582
  SwapRouter.INTERFACE = /*#__PURE__*/new abi.Interface(UniversalRouter.abi);
1583
+ SwapRouter.PROXY_INTERFACE = /*#__PURE__*/new abi.Interface(['function execute(address router, address token, uint256 amount, bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external']);
1503
1584
 
1504
1585
  var UnwrapWETH = /*#__PURE__*/function () {
1505
1586
  function UnwrapWETH(amount, chainId, permit2) {
@@ -1831,6 +1912,7 @@ exports.NONCE_SKIP_CHECK = NONCE_SKIP_CHECK;
1831
1912
  exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
1832
1913
  exports.RoutePlanner = RoutePlanner;
1833
1914
  exports.RouterTradeAdapter = RouterTradeAdapter;
1915
+ exports.SWAP_PROXY_ADDRESS = SWAP_PROXY_ADDRESS;
1834
1916
  exports.SwapRouter = SwapRouter;
1835
1917
  exports.UNIVERSAL_ROUTER_ADDRESS = UNIVERSAL_ROUTER_ADDRESS;
1836
1918
  exports.UNIVERSAL_ROUTER_CREATION_BLOCK = UNIVERSAL_ROUTER_CREATION_BLOCK;