@fenine/universal-router-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +331 -0
  2. package/dist/cjs/src/entities/Command.d.ts +12 -0
  3. package/dist/cjs/src/entities/Command.js +9 -0
  4. package/dist/cjs/src/entities/Command.js.map +1 -0
  5. package/dist/cjs/src/entities/actions/across.d.ts +21 -0
  6. package/dist/cjs/src/entities/actions/across.js +7 -0
  7. package/dist/cjs/src/entities/actions/across.js.map +1 -0
  8. package/dist/cjs/src/entities/actions/index.d.ts +3 -0
  9. package/dist/cjs/src/entities/actions/index.js +7 -0
  10. package/dist/cjs/src/entities/actions/index.js.map +1 -0
  11. package/dist/cjs/src/entities/actions/uniswap.d.ts +38 -0
  12. package/dist/cjs/src/entities/actions/uniswap.js +545 -0
  13. package/dist/cjs/src/entities/actions/uniswap.js.map +1 -0
  14. package/dist/cjs/src/entities/actions/unwrapWETH.d.ts +12 -0
  15. package/dist/cjs/src/entities/actions/unwrapWETH.js +33 -0
  16. package/dist/cjs/src/entities/actions/unwrapWETH.js.map +1 -0
  17. package/dist/cjs/src/entities/index.d.ts +2 -0
  18. package/dist/cjs/src/entities/index.js +6 -0
  19. package/dist/cjs/src/entities/index.js.map +1 -0
  20. package/dist/cjs/src/index.d.ts +14 -0
  21. package/dist/cjs/src/index.js +36 -0
  22. package/dist/cjs/src/index.js.map +1 -0
  23. package/dist/cjs/src/swapRouter.d.ts +103 -0
  24. package/dist/cjs/src/swapRouter.js +338 -0
  25. package/dist/cjs/src/swapRouter.js.map +1 -0
  26. package/dist/cjs/src/types/encodeSwaps.d.ts +149 -0
  27. package/dist/cjs/src/types/encodeSwaps.js +3 -0
  28. package/dist/cjs/src/types/encodeSwaps.js.map +1 -0
  29. package/dist/cjs/src/utils/commandParser.d.ts +34 -0
  30. package/dist/cjs/src/utils/commandParser.js +145 -0
  31. package/dist/cjs/src/utils/commandParser.js.map +1 -0
  32. package/dist/cjs/src/utils/computeEncodeSwapsAmounts.d.ts +8 -0
  33. package/dist/cjs/src/utils/computeEncodeSwapsAmounts.js +47 -0
  34. package/dist/cjs/src/utils/computeEncodeSwapsAmounts.js.map +1 -0
  35. package/dist/cjs/src/utils/constants.d.ts +39 -0
  36. package/dist/cjs/src/utils/constants.js +560 -0
  37. package/dist/cjs/src/utils/constants.js.map +1 -0
  38. package/dist/cjs/src/utils/eip712.d.ts +17 -0
  39. package/dist/cjs/src/utils/eip712.js +43 -0
  40. package/dist/cjs/src/utils/eip712.js.map +1 -0
  41. package/dist/cjs/src/utils/encodeSwapStep.d.ts +4 -0
  42. package/dist/cjs/src/utils/encodeSwapStep.js +61 -0
  43. package/dist/cjs/src/utils/encodeSwapStep.js.map +1 -0
  44. package/dist/cjs/src/utils/encodeV4Action.d.ts +8 -0
  45. package/dist/cjs/src/utils/encodeV4Action.js +97 -0
  46. package/dist/cjs/src/utils/encodeV4Action.js.map +1 -0
  47. package/dist/cjs/src/utils/getCurrencyAddress.d.ts +2 -0
  48. package/dist/cjs/src/utils/getCurrencyAddress.js +9 -0
  49. package/dist/cjs/src/utils/getCurrencyAddress.js.map +1 -0
  50. package/dist/cjs/src/utils/inputTokens.d.ts +23 -0
  51. package/dist/cjs/src/utils/inputTokens.js +58 -0
  52. package/dist/cjs/src/utils/inputTokens.js.map +1 -0
  53. package/dist/cjs/src/utils/normalizeEncodeSwapsSpec.d.ts +2 -0
  54. package/dist/cjs/src/utils/normalizeEncodeSwapsSpec.js +18 -0
  55. package/dist/cjs/src/utils/normalizeEncodeSwapsSpec.js.map +1 -0
  56. package/dist/cjs/src/utils/numbers.d.ts +7 -0
  57. package/dist/cjs/src/utils/numbers.js +27 -0
  58. package/dist/cjs/src/utils/numbers.js.map +1 -0
  59. package/dist/cjs/src/utils/pathCurrency.d.ts +3 -0
  60. package/dist/cjs/src/utils/pathCurrency.js +27 -0
  61. package/dist/cjs/src/utils/pathCurrency.js.map +1 -0
  62. package/dist/cjs/src/utils/routerCommands.d.ts +77 -0
  63. package/dist/cjs/src/utils/routerCommands.js +334 -0
  64. package/dist/cjs/src/utils/routerCommands.js.map +1 -0
  65. package/dist/cjs/src/utils/routerTradeAdapter.d.ts +73 -0
  66. package/dist/cjs/src/utils/routerTradeAdapter.js +139 -0
  67. package/dist/cjs/src/utils/routerTradeAdapter.js.map +1 -0
  68. package/dist/cjs/src/utils/validateEncodeSwaps.d.ts +2 -0
  69. package/dist/cjs/src/utils/validateEncodeSwaps.js +135 -0
  70. package/dist/cjs/src/utils/validateEncodeSwaps.js.map +1 -0
  71. package/dist/esm/src/entities/Command.d.ts +12 -0
  72. package/dist/esm/src/entities/Command.js +6 -0
  73. package/dist/esm/src/entities/Command.js.map +1 -0
  74. package/dist/esm/src/entities/actions/across.d.ts +21 -0
  75. package/dist/esm/src/entities/actions/across.js +3 -0
  76. package/dist/esm/src/entities/actions/across.js.map +1 -0
  77. package/dist/esm/src/entities/actions/index.d.ts +3 -0
  78. package/dist/esm/src/entities/actions/index.js +4 -0
  79. package/dist/esm/src/entities/actions/index.js.map +1 -0
  80. package/dist/esm/src/entities/actions/uniswap.d.ts +38 -0
  81. package/dist/esm/src/entities/actions/uniswap.js +541 -0
  82. package/dist/esm/src/entities/actions/uniswap.js.map +1 -0
  83. package/dist/esm/src/entities/actions/unwrapWETH.d.ts +12 -0
  84. package/dist/esm/src/entities/actions/unwrapWETH.js +28 -0
  85. package/dist/esm/src/entities/actions/unwrapWETH.js.map +1 -0
  86. package/dist/esm/src/entities/index.d.ts +2 -0
  87. package/dist/esm/src/entities/index.js +3 -0
  88. package/dist/esm/src/entities/index.js.map +1 -0
  89. package/dist/esm/src/index.d.ts +14 -0
  90. package/dist/esm/src/index.js +11 -0
  91. package/dist/esm/src/index.js.map +1 -0
  92. package/dist/esm/src/swapRouter.d.ts +103 -0
  93. package/dist/esm/src/swapRouter.js +333 -0
  94. package/dist/esm/src/swapRouter.js.map +1 -0
  95. package/dist/esm/src/types/encodeSwaps.d.ts +149 -0
  96. package/dist/esm/src/types/encodeSwaps.js +2 -0
  97. package/dist/esm/src/types/encodeSwaps.js.map +1 -0
  98. package/dist/esm/src/utils/commandParser.d.ts +34 -0
  99. package/dist/esm/src/utils/commandParser.js +137 -0
  100. package/dist/esm/src/utils/commandParser.js.map +1 -0
  101. package/dist/esm/src/utils/computeEncodeSwapsAmounts.d.ts +8 -0
  102. package/dist/esm/src/utils/computeEncodeSwapsAmounts.js +43 -0
  103. package/dist/esm/src/utils/computeEncodeSwapsAmounts.js.map +1 -0
  104. package/dist/esm/src/utils/constants.d.ts +39 -0
  105. package/dist/esm/src/utils/constants.js +552 -0
  106. package/dist/esm/src/utils/constants.js.map +1 -0
  107. package/dist/esm/src/utils/eip712.d.ts +17 -0
  108. package/dist/esm/src/utils/eip712.js +38 -0
  109. package/dist/esm/src/utils/eip712.js.map +1 -0
  110. package/dist/esm/src/utils/encodeSwapStep.d.ts +4 -0
  111. package/dist/esm/src/utils/encodeSwapStep.js +57 -0
  112. package/dist/esm/src/utils/encodeSwapStep.js.map +1 -0
  113. package/dist/esm/src/utils/encodeV4Action.d.ts +8 -0
  114. package/dist/esm/src/utils/encodeV4Action.js +92 -0
  115. package/dist/esm/src/utils/encodeV4Action.js.map +1 -0
  116. package/dist/esm/src/utils/getCurrencyAddress.d.ts +2 -0
  117. package/dist/esm/src/utils/getCurrencyAddress.js +5 -0
  118. package/dist/esm/src/utils/getCurrencyAddress.js.map +1 -0
  119. package/dist/esm/src/utils/inputTokens.d.ts +23 -0
  120. package/dist/esm/src/utils/inputTokens.js +51 -0
  121. package/dist/esm/src/utils/inputTokens.js.map +1 -0
  122. package/dist/esm/src/utils/normalizeEncodeSwapsSpec.d.ts +2 -0
  123. package/dist/esm/src/utils/normalizeEncodeSwapsSpec.js +14 -0
  124. package/dist/esm/src/utils/normalizeEncodeSwapsSpec.js.map +1 -0
  125. package/dist/esm/src/utils/numbers.d.ts +7 -0
  126. package/dist/esm/src/utils/numbers.js +19 -0
  127. package/dist/esm/src/utils/numbers.js.map +1 -0
  128. package/dist/esm/src/utils/pathCurrency.d.ts +3 -0
  129. package/dist/esm/src/utils/pathCurrency.js +23 -0
  130. package/dist/esm/src/utils/pathCurrency.js.map +1 -0
  131. package/dist/esm/src/utils/routerCommands.d.ts +77 -0
  132. package/dist/esm/src/utils/routerCommands.js +329 -0
  133. package/dist/esm/src/utils/routerCommands.js.map +1 -0
  134. package/dist/esm/src/utils/routerTradeAdapter.d.ts +73 -0
  135. package/dist/esm/src/utils/routerTradeAdapter.js +134 -0
  136. package/dist/esm/src/utils/routerTradeAdapter.js.map +1 -0
  137. package/dist/esm/src/utils/validateEncodeSwaps.d.ts +2 -0
  138. package/dist/esm/src/utils/validateEncodeSwaps.js +130 -0
  139. package/dist/esm/src/utils/validateEncodeSwaps.js.map +1 -0
  140. package/dist/types/src/entities/Command.d.ts +12 -0
  141. package/dist/types/src/entities/actions/across.d.ts +21 -0
  142. package/dist/types/src/entities/actions/index.d.ts +3 -0
  143. package/dist/types/src/entities/actions/uniswap.d.ts +38 -0
  144. package/dist/types/src/entities/actions/unwrapWETH.d.ts +12 -0
  145. package/dist/types/src/entities/index.d.ts +2 -0
  146. package/dist/types/src/index.d.ts +14 -0
  147. package/dist/types/src/swapRouter.d.ts +103 -0
  148. package/dist/types/src/types/encodeSwaps.d.ts +149 -0
  149. package/dist/types/src/utils/commandParser.d.ts +34 -0
  150. package/dist/types/src/utils/computeEncodeSwapsAmounts.d.ts +8 -0
  151. package/dist/types/src/utils/constants.d.ts +39 -0
  152. package/dist/types/src/utils/eip712.d.ts +17 -0
  153. package/dist/types/src/utils/encodeSwapStep.d.ts +4 -0
  154. package/dist/types/src/utils/encodeV4Action.d.ts +8 -0
  155. package/dist/types/src/utils/getCurrencyAddress.d.ts +2 -0
  156. package/dist/types/src/utils/inputTokens.d.ts +23 -0
  157. package/dist/types/src/utils/normalizeEncodeSwapsSpec.d.ts +2 -0
  158. package/dist/types/src/utils/numbers.d.ts +7 -0
  159. package/dist/types/src/utils/pathCurrency.d.ts +3 -0
  160. package/dist/types/src/utils/routerCommands.d.ts +77 -0
  161. package/dist/types/src/utils/routerTradeAdapter.d.ts +73 -0
  162. package/dist/types/src/utils/validateEncodeSwaps.d.ts +2 -0
  163. package/package.json +78 -0
@@ -0,0 +1,149 @@
1
+ import { BigNumberish } from 'ethers';
2
+ import { Currency, CurrencyAmount, Percent, TradeType } from '@fenine/sdk-core';
3
+ import { type PathKey, type PoolKey } from '@uniswap/v4-sdk';
4
+ import { TokenTransferMode } from '../entities/actions/uniswap';
5
+ import { Permit2Permit } from '../utils/inputTokens';
6
+ import { UniversalRouterVersion } from '../utils/constants';
7
+ export type { PathKey, PoolKey };
8
+ export type Fee = {
9
+ kind: 'portion';
10
+ recipient: string;
11
+ fee: Percent;
12
+ } | {
13
+ kind: 'flat';
14
+ recipient: string;
15
+ amount: BigNumberish;
16
+ };
17
+ export type SwapSpecification = {
18
+ tradeType: TradeType;
19
+ routing: {
20
+ inputToken: Currency;
21
+ outputToken: Currency;
22
+ amount: CurrencyAmount<Currency>;
23
+ quote: CurrencyAmount<Currency>;
24
+ };
25
+ slippageTolerance: Percent;
26
+ recipient?: string;
27
+ fee?: Fee;
28
+ tokenTransferMode?: TokenTransferMode;
29
+ permit?: Permit2Permit;
30
+ chainId?: number;
31
+ deadline?: BigNumberish;
32
+ urVersion?: UniversalRouterVersion;
33
+ safeMode?: boolean;
34
+ };
35
+ export type NormalizedSwapSpecification = Omit<SwapSpecification, 'recipient' | 'tokenTransferMode' | 'urVersion' | 'safeMode'> & {
36
+ recipient: string;
37
+ tokenTransferMode: TokenTransferMode;
38
+ urVersion: UniversalRouterVersion;
39
+ safeMode: boolean;
40
+ };
41
+ export type V2SwapExactIn = {
42
+ type: 'V2_SWAP_EXACT_IN';
43
+ recipient: string;
44
+ amountIn: BigNumberish;
45
+ amountOutMin: BigNumberish;
46
+ path: string[];
47
+ minHopPriceX36?: BigNumberish[];
48
+ };
49
+ export type V2SwapExactOut = {
50
+ type: 'V2_SWAP_EXACT_OUT';
51
+ recipient: string;
52
+ amountOut: BigNumberish;
53
+ amountInMax: BigNumberish;
54
+ path: string[];
55
+ minHopPriceX36?: BigNumberish[];
56
+ };
57
+ export type V3SwapExactIn = {
58
+ type: 'V3_SWAP_EXACT_IN';
59
+ recipient: string;
60
+ amountIn: BigNumberish;
61
+ amountOutMin: BigNumberish;
62
+ path: string;
63
+ minHopPriceX36?: BigNumberish[];
64
+ };
65
+ export type V3SwapExactOut = {
66
+ type: 'V3_SWAP_EXACT_OUT';
67
+ recipient: string;
68
+ amountOut: BigNumberish;
69
+ amountInMax: BigNumberish;
70
+ path: string;
71
+ minHopPriceX36?: BigNumberish[];
72
+ };
73
+ export type V4Swap = {
74
+ type: 'V4_SWAP';
75
+ v4Actions: V4Action[];
76
+ };
77
+ export type WrapEth = {
78
+ type: 'WRAP_ETH';
79
+ recipient: string;
80
+ amount: BigNumberish;
81
+ };
82
+ export type UnwrapWeth = {
83
+ type: 'UNWRAP_WETH';
84
+ recipient: string;
85
+ amountMin: BigNumberish;
86
+ };
87
+ export type SwapStep = V2SwapExactIn | V2SwapExactOut | V3SwapExactIn | V3SwapExactOut | V4Swap | WrapEth | UnwrapWeth;
88
+ export type V4SwapExactIn = {
89
+ action: 'SWAP_EXACT_IN';
90
+ currencyIn: string;
91
+ path: PathKey[];
92
+ amountIn: BigNumberish;
93
+ amountOutMinimum: BigNumberish;
94
+ minHopPriceX36?: BigNumberish[];
95
+ };
96
+ export type V4SwapExactInSingle = {
97
+ action: 'SWAP_EXACT_IN_SINGLE';
98
+ poolKey: PoolKey;
99
+ zeroForOne: boolean;
100
+ amountIn: BigNumberish;
101
+ amountOutMinimum: BigNumberish;
102
+ minHopPriceX36?: BigNumberish;
103
+ hookData: string;
104
+ };
105
+ export type V4SwapExactOut = {
106
+ action: 'SWAP_EXACT_OUT';
107
+ currencyOut: string;
108
+ path: PathKey[];
109
+ amountOut: BigNumberish;
110
+ amountInMaximum: BigNumberish;
111
+ minHopPriceX36?: BigNumberish[];
112
+ };
113
+ export type V4SwapExactOutSingle = {
114
+ action: 'SWAP_EXACT_OUT_SINGLE';
115
+ poolKey: PoolKey;
116
+ zeroForOne: boolean;
117
+ amountOut: BigNumberish;
118
+ amountInMaximum: BigNumberish;
119
+ minHopPriceX36?: BigNumberish;
120
+ hookData: string;
121
+ };
122
+ export type V4Settle = {
123
+ action: 'SETTLE';
124
+ currency: string;
125
+ amount: BigNumberish;
126
+ };
127
+ export type V4SettleAll = {
128
+ action: 'SETTLE_ALL';
129
+ currency: string;
130
+ maxAmount: BigNumberish;
131
+ };
132
+ export type V4Take = {
133
+ action: 'TAKE';
134
+ currency: string;
135
+ recipient: string;
136
+ amount: BigNumberish;
137
+ };
138
+ export type V4TakeAll = {
139
+ action: 'TAKE_ALL';
140
+ currency: string;
141
+ minAmount: BigNumberish;
142
+ };
143
+ export type V4TakePortion = {
144
+ action: 'TAKE_PORTION';
145
+ currency: string;
146
+ recipient: string;
147
+ bips: BigNumberish;
148
+ };
149
+ export type V4Action = V4SwapExactIn | V4SwapExactInSingle | V4SwapExactOut | V4SwapExactOutSingle | V4Settle | V4SettleAll | V4Take | V4TakeAll | V4TakePortion;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=encodeSwaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encodeSwaps.js","sourceRoot":"","sources":["../../../../src/types/encodeSwaps.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { CommandType, CommandDefinition } from '../utils/routerCommands';
3
+ export type Param = {
4
+ readonly name: string;
5
+ readonly value: any;
6
+ };
7
+ export type UniversalRouterCommand = {
8
+ readonly commandName: string;
9
+ readonly commandType: CommandType;
10
+ readonly params: readonly Param[];
11
+ };
12
+ export type UniversalRouterCall = {
13
+ readonly commands: readonly UniversalRouterCommand[];
14
+ };
15
+ export type V3PathItem = {
16
+ readonly tokenIn: string;
17
+ readonly tokenOut: string;
18
+ readonly fee: number;
19
+ };
20
+ export interface CommandsDefinition {
21
+ [key: number]: CommandDefinition;
22
+ }
23
+ export declare abstract class CommandParser {
24
+ static INTERFACE: Interface;
25
+ static parseCalldata(calldata: string): UniversalRouterCall;
26
+ }
27
+ export declare class GenericCommandParser {
28
+ private readonly commandDefinition;
29
+ constructor(commandDefinition: CommandsDefinition);
30
+ parse(commands: string, inputs: string[]): UniversalRouterCall;
31
+ private static getCommands;
32
+ }
33
+ export declare function parseV3PathExactIn(path: string): readonly V3PathItem[];
34
+ export declare function parseV3PathExactOut(path: string): readonly V3PathItem[];
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseV3PathExactOut = exports.parseV3PathExactIn = exports.GenericCommandParser = exports.CommandParser = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const ethers_1 = require("ethers");
6
+ const UniversalRouter_json_1 = tslib_1.__importDefault(require("@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json"));
7
+ const abi_1 = require("@ethersproject/abi");
8
+ const v4_sdk_1 = require("@uniswap/v4-sdk");
9
+ const routerCommands_1 = require("../utils/routerCommands");
10
+ // Parses UniversalRouter V2 commands
11
+ class CommandParser {
12
+ static parseCalldata(calldata) {
13
+ const genericParser = new GenericCommandParser(routerCommands_1.COMMAND_DEFINITION);
14
+ const txDescription = CommandParser.INTERFACE.parseTransaction({ data: calldata });
15
+ const { commands, inputs } = txDescription.args;
16
+ return genericParser.parse(commands, inputs);
17
+ }
18
+ }
19
+ exports.CommandParser = CommandParser;
20
+ CommandParser.INTERFACE = new abi_1.Interface(UniversalRouter_json_1.default.abi);
21
+ // Parses commands based on given command definition
22
+ class GenericCommandParser {
23
+ constructor(commandDefinition) {
24
+ this.commandDefinition = commandDefinition;
25
+ }
26
+ parse(commands, inputs) {
27
+ const commandTypes = GenericCommandParser.getCommands(commands);
28
+ return {
29
+ commands: commandTypes.map((commandType, i) => {
30
+ const commandDef = this.commandDefinition[commandType];
31
+ if (commandDef.parser === routerCommands_1.Parser.V4Actions) {
32
+ const { actions } = v4_sdk_1.V4BaseActionsParser.parseCalldata(inputs[i]);
33
+ return {
34
+ commandName: routerCommands_1.CommandType[commandType],
35
+ commandType,
36
+ params: v4RouterCallToParams(actions),
37
+ };
38
+ }
39
+ else if (commandDef.parser === routerCommands_1.Parser.Abi) {
40
+ const abiDef = commandDef.params;
41
+ const rawParams = ethers_1.ethers.utils.defaultAbiCoder.decode(abiDef.map((command) => command.type), inputs[i]);
42
+ const params = rawParams.map((param, j) => {
43
+ switch (abiDef[j].subparser) {
44
+ case routerCommands_1.Subparser.V3PathExactIn:
45
+ return {
46
+ name: abiDef[j].name,
47
+ value: parseV3PathExactIn(param),
48
+ };
49
+ case routerCommands_1.Subparser.V3PathExactOut:
50
+ return {
51
+ name: abiDef[j].name,
52
+ value: parseV3PathExactOut(param),
53
+ };
54
+ default:
55
+ return {
56
+ name: abiDef[j].name,
57
+ value: param,
58
+ };
59
+ }
60
+ });
61
+ return {
62
+ commandName: routerCommands_1.CommandType[commandType],
63
+ commandType,
64
+ params,
65
+ };
66
+ }
67
+ else if (commandDef.parser === routerCommands_1.Parser.V3Actions) {
68
+ // TODO: implement better parsing here
69
+ return {
70
+ commandName: routerCommands_1.CommandType[commandType],
71
+ commandType,
72
+ params: inputs.map((input) => ({ name: 'command', value: input })),
73
+ };
74
+ }
75
+ else {
76
+ throw new Error(`Unsupported parser: ${commandDef}`);
77
+ }
78
+ }),
79
+ };
80
+ }
81
+ // parse command types from bytes string
82
+ static getCommands(commands) {
83
+ const commandTypes = [];
84
+ for (let i = 2; i < commands.length; i += 2) {
85
+ const byte = commands.substring(i, i + 2);
86
+ commandTypes.push(parseInt(byte, 16));
87
+ }
88
+ return commandTypes;
89
+ }
90
+ }
91
+ exports.GenericCommandParser = GenericCommandParser;
92
+ function parseV3PathExactIn(path) {
93
+ const strippedPath = path.replace('0x', '');
94
+ let tokenIn = ethers_1.ethers.utils.getAddress(strippedPath.substring(0, 40));
95
+ let loc = 40;
96
+ const res = [];
97
+ while (loc < strippedPath.length) {
98
+ const feeAndTokenOut = strippedPath.substring(loc, loc + 46);
99
+ const fee = parseInt(feeAndTokenOut.substring(0, 6), 16);
100
+ const tokenOut = ethers_1.ethers.utils.getAddress(feeAndTokenOut.substring(6, 46));
101
+ res.push({
102
+ tokenIn,
103
+ tokenOut,
104
+ fee,
105
+ });
106
+ tokenIn = tokenOut;
107
+ loc += 46;
108
+ }
109
+ return res;
110
+ }
111
+ exports.parseV3PathExactIn = parseV3PathExactIn;
112
+ function parseV3PathExactOut(path) {
113
+ const strippedPath = path.replace('0x', '');
114
+ let tokenIn = ethers_1.ethers.utils.getAddress(strippedPath.substring(strippedPath.length - 40));
115
+ let loc = strippedPath.length - 86; // 86 = (20 addr + 3 fee + 20 addr) * 2 (for hex characters)
116
+ const res = [];
117
+ while (loc >= 0) {
118
+ const feeAndTokenOut = strippedPath.substring(loc, loc + 46);
119
+ const tokenOut = ethers_1.ethers.utils.getAddress(feeAndTokenOut.substring(0, 40));
120
+ const fee = parseInt(feeAndTokenOut.substring(40, 46), 16);
121
+ res.push({
122
+ tokenIn,
123
+ tokenOut,
124
+ fee,
125
+ });
126
+ tokenIn = tokenOut;
127
+ loc -= 46;
128
+ }
129
+ return res;
130
+ }
131
+ exports.parseV3PathExactOut = parseV3PathExactOut;
132
+ function v4RouterCallToParams(actions) {
133
+ return actions.map((action) => {
134
+ return {
135
+ name: action.actionName,
136
+ value: action.params.map((param) => {
137
+ return {
138
+ name: param.name,
139
+ value: param.value,
140
+ };
141
+ }),
142
+ };
143
+ });
144
+ }
145
+ //# sourceMappingURL=commandParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandParser.js","sourceRoot":"","sources":["../../../../src/utils/commandParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { BigNumber } from 'ethers';
2
+ import { NormalizedSwapSpecification } from '../types/encodeSwaps';
3
+ export type EncodeSwapsAmounts = {
4
+ exactOrMaxAmountIn: BigNumber;
5
+ grossMinOrExactAmountOut: BigNumber;
6
+ netMinOrExactAmountOut: BigNumber;
7
+ };
8
+ export declare function computeEncodeSwapsAmounts(spec: NormalizedSwapSpecification): EncodeSwapsAmounts;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeEncodeSwapsAmounts = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const sdk_core_1 = require("@fenine/sdk-core");
6
+ const constants_1 = require("./constants");
7
+ const numbers_1 = require("./numbers");
8
+ // Slippage is applied to the quote: scaled down to a floor for exact-input output,
9
+ // scaled up to a ceiling for exact-output input. The unscaled side is the user's exact value.
10
+ // Portion fees pair with exact-input (1e18 precision on >=v2.1.1, bps on v2.0); flat fees pair with exact-output.
11
+ function computeEncodeSwapsAmounts(spec) {
12
+ var _a, _b;
13
+ const routingAmount = ethers_1.BigNumber.from(spec.routing.amount.quotient.toString());
14
+ const routingQuote = ethers_1.BigNumber.from(spec.routing.quote.quotient.toString());
15
+ const slippageNumerator = ethers_1.BigNumber.from(spec.slippageTolerance.numerator.toString());
16
+ const slippageDenominator = ethers_1.BigNumber.from(spec.slippageTolerance.denominator.toString());
17
+ if (spec.tradeType === sdk_core_1.TradeType.EXACT_INPUT) {
18
+ const grossMinOrExactAmountOut = routingQuote
19
+ .mul(slippageDenominator)
20
+ .div(slippageDenominator.add(slippageNumerator));
21
+ if (((_a = spec.fee) === null || _a === void 0 ? void 0 : _a.kind) === 'portion') {
22
+ const feeAmount = (0, constants_1.isAtLeastV2_1_1)(spec.urVersion)
23
+ ? grossMinOrExactAmountOut.mul(ethers_1.BigNumber.from((0, numbers_1.encodeFee1e18)(spec.fee.fee))).div(ethers_1.BigNumber.from(10).pow(18))
24
+ : grossMinOrExactAmountOut.mul(ethers_1.BigNumber.from((0, numbers_1.encodeFeeBips)(spec.fee.fee))).div(10000);
25
+ return {
26
+ exactOrMaxAmountIn: routingAmount,
27
+ grossMinOrExactAmountOut,
28
+ netMinOrExactAmountOut: grossMinOrExactAmountOut.sub(feeAmount),
29
+ };
30
+ }
31
+ return {
32
+ exactOrMaxAmountIn: routingAmount,
33
+ grossMinOrExactAmountOut,
34
+ netMinOrExactAmountOut: grossMinOrExactAmountOut,
35
+ };
36
+ }
37
+ const exactOrMaxAmountIn = routingQuote.mul(slippageDenominator.add(slippageNumerator)).div(slippageDenominator);
38
+ const grossMinOrExactAmountOut = routingAmount;
39
+ const netMinOrExactAmountOut = ((_b = spec.fee) === null || _b === void 0 ? void 0 : _b.kind) === 'flat' ? grossMinOrExactAmountOut.sub(ethers_1.BigNumber.from(spec.fee.amount)) : grossMinOrExactAmountOut;
40
+ return {
41
+ exactOrMaxAmountIn,
42
+ grossMinOrExactAmountOut,
43
+ netMinOrExactAmountOut,
44
+ };
45
+ }
46
+ exports.computeEncodeSwapsAmounts = computeEncodeSwapsAmounts;
47
+ //# sourceMappingURL=computeEncodeSwapsAmounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeEncodeSwapsAmounts.js","sourceRoot":"","sources":["../../../../src/utils/computeEncodeSwapsAmounts.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAClC,+CAA4C;AAC5C,2CAA6C;AAC7C,uCAAwD;AAWxD,mFAAmF;AACnF,8FAA8F;AAC9F,kHAAkH;AAClH,SAAgB,yBAAyB,CAAC,IAAiC;;IACzE,MAAM,aAAa,GAAG,kBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7E,MAAM,YAAY,GAAG,kBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC3E,MAAM,iBAAiB,GAAG,kBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrF,MAAM,mBAAmB,GAAG,kBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEzF,IAAI,IAAI,CAAC,SAAS,KAAK,oBAAS,CAAC,WAAW,EAAE;QAC5C,MAAM,wBAAwB,GAAG,YAAY;aAC1C,GAAG,CAAC,mBAAmB,CAAC;aACxB,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAElD,IAAI,CAAA,MAAA,IAAI,CAAC,GAAG,0CAAE,IAAI,MAAK,SAAS,EAAE;YAChC,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,IAAI,CAAC,SAAS,CAAC;gBAC/C,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,kBAAS,CAAC,IAAI,CAAC,IAAA,uBAAa,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3G,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,kBAAS,CAAC,IAAI,CAAC,IAAA,uBAAa,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAM,CAAC,CAAA;YAEzF,OAAO;gBACL,kBAAkB,EAAE,aAAa;gBACjC,wBAAwB;gBACxB,sBAAsB,EAAE,wBAAwB,CAAC,GAAG,CAAC,SAAS,CAAC;aAChE,CAAA;SACF;QAED,OAAO;YACL,kBAAkB,EAAE,aAAa;YACjC,wBAAwB;YACxB,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;KACF;IAED,MAAM,kBAAkB,GAAG,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAChH,MAAM,wBAAwB,GAAG,aAAa,CAAA;IAC9C,MAAM,sBAAsB,GAC1B,CAAA,MAAA,IAAI,CAAC,GAAG,0CAAE,IAAI,MAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,kBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAA;IAEtH,OAAO;QACL,kBAAkB;QAClB,wBAAwB;QACxB,sBAAsB;KACvB,CAAA;AACH,CAAC;AAxCD,8DAwCC"}
@@ -0,0 +1,39 @@
1
+ import { BigNumber } from 'ethers';
2
+ export declare enum UniversalRouterVersion {
3
+ V1_2 = "1.2",
4
+ V2_0 = "2.0",
5
+ V2_1_1 = "2.1.1"
6
+ }
7
+ /**
8
+ * Check if a UniversalRouterVersion is at least V2_1_1.
9
+ * Duplicated from @uniswap/v4-sdk's isAtLeastV2_1_1 (which operates on URVersion)
10
+ * to avoid coupling universal-router-sdk's version logic to v4-sdk.
11
+ */
12
+ export declare function isAtLeastV2_1_1(version?: UniversalRouterVersion): boolean;
13
+ export type RouterConfig = {
14
+ address: string;
15
+ creationBlock: number;
16
+ };
17
+ type ChainConfig = {
18
+ weth: string;
19
+ routerConfigs: {
20
+ [key in UniversalRouterVersion]?: RouterConfig;
21
+ };
22
+ swapProxy?: string;
23
+ };
24
+ export declare const CHAIN_CONFIGS: {
25
+ [key: number]: ChainConfig;
26
+ };
27
+ export declare const UNIVERSAL_ROUTER_ADDRESS: (version: UniversalRouterVersion, chainId: number) => string;
28
+ export declare const SWAP_PROXY_ADDRESS: (chainId: number) => string;
29
+ export declare const UNIVERSAL_ROUTER_CREATION_BLOCK: (version: UniversalRouterVersion, chainId: number) => number;
30
+ export declare const WETH_ADDRESS: (chainId: number) => string;
31
+ export declare const CONTRACT_BALANCE: BigNumber;
32
+ export declare const ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
33
+ export declare const E_ETH_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
34
+ export declare const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
35
+ export declare const MAX_UINT256: BigNumber;
36
+ export declare const MAX_UINT160: BigNumber;
37
+ export declare const SENDER_AS_RECIPIENT = "0x0000000000000000000000000000000000000001";
38
+ export declare const ROUTER_AS_RECIPIENT = "0x0000000000000000000000000000000000000002";
39
+ export {};