@uniswap/universal-router-sdk 3.4.0 → 4.1.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.
package/dist/index.d.ts CHANGED
@@ -2,5 +2,5 @@ export { SwapRouter } from './swapRouter';
2
2
  export * from './entities';
3
3
  export * from './utils/routerTradeAdapter';
4
4
  export { RoutePlanner, CommandType } from './utils/routerCommands';
5
- export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, PERMIT2_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, UniversalRouterVersion, } from './utils/constants';
5
+ export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, UniversalRouterVersion, } from './utils/constants';
6
6
  export { CommandParser, UniversalRouterCommand, UniversalRouterCall, Param } from './utils/commandParser';
@@ -1,6 +1,7 @@
1
1
  import { Interface } from '@ethersproject/abi';
2
2
  import { BigNumberish } from 'ethers';
3
- import { MethodParameters } from '@uniswap/v3-sdk';
3
+ import { MethodParameters, Position as V3Position, RemoveLiquidityOptions as V3RemoveLiquidityOptions } from '@uniswap/v3-sdk';
4
+ import { Position as V4Position, AddLiquidityOptions as V4AddLiquidityOptions } from '@uniswap/v4-sdk';
4
5
  import { Trade as RouterTrade } from '@uniswap/router-sdk';
5
6
  import { Currency, TradeType } from '@uniswap/sdk-core';
6
7
  import { SwapOptions } from './entities/actions/uniswap';
@@ -8,9 +9,24 @@ export declare type SwapRouterConfig = {
8
9
  sender?: string;
9
10
  deadline?: BigNumberish;
10
11
  };
12
+ export interface MigrateV3ToV4Options {
13
+ inputPosition: V3Position;
14
+ outputPosition: V4Position;
15
+ v3RemoveLiquidityOptions: V3RemoveLiquidityOptions;
16
+ v4AddLiquidityOptions: V4AddLiquidityOptions;
17
+ }
11
18
  export declare abstract class SwapRouter {
12
19
  static INTERFACE: Interface;
13
20
  static swapCallParameters(trades: RouterTrade<Currency, Currency, TradeType>, options: SwapOptions): MethodParameters;
21
+ /**
22
+ * Builds the call parameters for a migration from a V3 position to a V4 position.
23
+ * Some requirements of the parameters:
24
+ * - v3RemoveLiquidityOptions.collectOptions.recipient must equal v4PositionManager
25
+ * - v3RemoveLiquidityOptions.liquidityPercentage must be 100%
26
+ * - input pool and output pool must have the same tokens
27
+ * - V3 NFT must be approved, or valid inputV3NFTPermit must be provided with UR as spender
28
+ */
29
+ static migrateV3ToV4CallParameters(options: MigrateV3ToV4Options): MethodParameters;
14
30
  /**
15
31
  * Encodes a planned route into a method name and parameters for the Router contract.
16
32
  * @param planner the planned route
@@ -4,5 +4,5 @@ export declare const FORGE_PERMIT2_ADDRESS = "0x4a873bdd49f7f9cc0a5458416a12973f
4
4
  export declare const FORGE_SENDER_ADDRESS = "0xcf03dd0a894ef79cb5b601a43c4b25e3ae4c67ed";
5
5
  export declare const TEST_RECIPIENT_ADDRESS = "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
6
6
  export declare const TEST_FEE_RECIPIENT_ADDRESS = "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
7
- export declare const PERMIT2_ADDRESS: string;
7
+ export declare const PERMIT2_ADDRESS: any;
8
8
  export declare const ROUTER_ADDRESS: string;
@@ -8,12 +8,12 @@ var invariant = _interopDefault(require('tiny-invariant'));
8
8
  var UniversalRouter_json = require('@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json');
9
9
  var abi = require('@ethersproject/abi');
10
10
  var ethers = require('ethers');
11
- var utils = require('ethers/lib/utils');
12
- var v2Sdk = require('@uniswap/v2-sdk');
13
11
  var v3Sdk = require('@uniswap/v3-sdk');
14
12
  var v4Sdk = require('@uniswap/v4-sdk');
15
- var routerSdk = require('@uniswap/router-sdk');
16
13
  var sdkCore = require('@uniswap/sdk-core');
14
+ var utils = require('ethers/lib/utils');
15
+ var v2Sdk = require('@uniswap/v2-sdk');
16
+ var routerSdk = require('@uniswap/router-sdk');
17
17
  require('jsbi');
18
18
  require('bignumber.js');
19
19
 
@@ -515,7 +515,6 @@ var WETH_ADDRESS = function WETH_ADDRESS(chainId) {
515
515
  if (CHAIN_CONFIGS[chainId].weth == WETH_NOT_SUPPORTED_ON_CHAIN) throw new Error("Chain " + chainId + " does not have WETH");
516
516
  return CHAIN_CONFIGS[chainId].weth;
517
517
  };
518
- var PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
519
518
  var CONTRACT_BALANCE = /*#__PURE__*/ethers.BigNumber.from(2).pow(255);
520
519
  var ETH_ADDRESS = '0x0000000000000000000000000000000000000000';
521
520
  var E_ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
@@ -784,6 +783,10 @@ function encodePermit(planner, permit2) {
784
783
  }
785
784
  planner.addCommand(exports.CommandType.PERMIT2_PERMIT, [permit2, signature]);
786
785
  }
786
+ function encodeV3PositionPermit(planner, permit, tokenId) {
787
+ var calldata = v3Sdk.NonfungiblePositionManager.INTERFACE.encodeFunctionData('permit', [sdkCore.validateAndParseAddress(permit.spender), tokenId, permit.deadline, permit.v, permit.r, permit.s]);
788
+ planner.addCommand(exports.CommandType.V3_POSITION_MANAGER_PERMIT, [calldata]);
789
+ }
787
790
  // Handles the encoding of commands needed to gather input tokens for a trade
788
791
  // Approval: The router approving another address to take tokens.
789
792
  // note: Only seaport and sudoswap support this action. Approvals are left open.
@@ -801,6 +804,11 @@ function encodeInputTokenOptions(planner, options) {
801
804
  }
802
805
  }
803
806
 
807
+ function isMint(options) {
808
+ return Object.keys(options).some(function (k) {
809
+ return k === 'recipient';
810
+ });
811
+ }
804
812
  var SwapRouter = /*#__PURE__*/function () {
805
813
  function SwapRouter() {}
806
814
  SwapRouter.swapCallParameters = function swapCallParameters(trades, options) {
@@ -820,6 +828,43 @@ var SwapRouter = /*#__PURE__*/function () {
820
828
  deadline: options.deadlineOrPreviousBlockhash ? ethers.BigNumber.from(options.deadlineOrPreviousBlockhash) : undefined
821
829
  });
822
830
  }
831
+ /**
832
+ * Builds the call parameters for a migration from a V3 position to a V4 position.
833
+ * Some requirements of the parameters:
834
+ * - v3RemoveLiquidityOptions.collectOptions.recipient must equal v4PositionManager
835
+ * - v3RemoveLiquidityOptions.liquidityPercentage must be 100%
836
+ * - input pool and output pool must have the same tokens
837
+ * - V3 NFT must be approved, or valid inputV3NFTPermit must be provided with UR as spender
838
+ */;
839
+ SwapRouter.migrateV3ToV4CallParameters = function migrateV3ToV4CallParameters(options) {
840
+ var token0 = options.inputPosition.pool.token0;
841
+ var token1 = options.inputPosition.pool.token1;
842
+ var v4PositionManagerAddress = sdkCore.CHAIN_TO_ADDRESSES_MAP[options.outputPosition.pool.chainId].v4PositionManagerAddress;
843
+ !(token0 === options.outputPosition.pool.token0) ? invariant(false, 'TOKEN0_MISMATCH') : void 0;
844
+ !(token1 === options.outputPosition.pool.token1) ? invariant(false, 'TOKEN1_MISMATCH') : void 0;
845
+ !options.v3RemoveLiquidityOptions.liquidityPercentage.equalTo(new sdkCore.Percent(100, 100)) ? invariant(false, 'FULL_REMOVAL_REQUIRED') : void 0;
846
+ !(options.v3RemoveLiquidityOptions.burnToken == true) ? invariant(false, 'BURN_TOKEN_REQUIRED') : void 0;
847
+ !(options.v3RemoveLiquidityOptions.collectOptions.recipient === v4PositionManagerAddress) ? invariant(false, 'RECIPIENT_NOT_POSITION_MANAGER') : void 0;
848
+ !isMint(options.v4AddLiquidityOptions) ? invariant(false, 'MINT_REQUIRED') : void 0;
849
+ !options.v4AddLiquidityOptions.migrate ? invariant(false, 'MIGRATE_REQUIRED') : void 0;
850
+ var planner = new RoutePlanner();
851
+ if (options.v3RemoveLiquidityOptions.permit) {
852
+ // permit spender should be UR
853
+ var universalRouterAddress = UNIVERSAL_ROUTER_ADDRESS(exports.UniversalRouterVersion.V2_0, options.inputPosition.pool.chainId);
854
+ !(universalRouterAddress == options.v3RemoveLiquidityOptions.permit.spender) ? invariant(false, 'INVALID_SPENDER') : void 0;
855
+ // don't need to transfer it because v3posm uses isApprovedOrOwner()
856
+ encodeV3PositionPermit(planner, options.v3RemoveLiquidityOptions.permit, options.v3RemoveLiquidityOptions.tokenId);
857
+ }
858
+ // encode v3 withdraw
859
+ var v3RemoveParams = v3Sdk.NonfungiblePositionManager.removeCallParameters(options.inputPosition, options.v3RemoveLiquidityOptions);
860
+ planner.addCommand(exports.CommandType.V3_POSITION_MANAGER_CALL, [v3RemoveParams.calldata]);
861
+ // encode v4 mint
862
+ var v4AddParams = v4Sdk.V4PositionManager.addCallParameters(options.outputPosition, options.v4AddLiquidityOptions);
863
+ planner.addCommand(exports.CommandType.V4_POSITION_CALL, [v4AddParams.calldata]);
864
+ return SwapRouter.encodePlan(planner, ethers.BigNumber.from(0), {
865
+ deadline: ethers.BigNumber.from(options.v4AddLiquidityOptions.deadline)
866
+ });
867
+ }
823
868
  /**
824
869
  * Encodes a planned route into a method name and parameters for the Router contract.
825
870
  * @param planner the planned route
@@ -1085,7 +1130,6 @@ function parseV3PathExactOut(path) {
1085
1130
  }
1086
1131
 
1087
1132
  exports.CommandParser = CommandParser;
1088
- exports.PERMIT2_ADDRESS = PERMIT2_ADDRESS;
1089
1133
  exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
1090
1134
  exports.RoutePlanner = RoutePlanner;
1091
1135
  exports.RouterTradeAdapter = RouterTradeAdapter;