@pioneer-platform/uniswap-client 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ export declare const MAX_UINT = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
2
+ export declare const MAX_UINT160 = "0xffffffffffffffffffffffffffffffffffffffff";
3
+ export declare const DEADLINE = 2000000000;
4
+ export declare const CONTRACT_BALANCE = "0x8000000000000000000000000000000000000000000000000000000000000000";
5
+ export declare const ALREADY_PAID = 0;
6
+ export declare const ALICE_ADDRESS = "0x28c6c06298d514db089934071355e5743bf21d60";
7
+ export declare const ETH_ADDRESS: any;
8
+ export declare const ZERO_ADDRESS: any;
9
+ export declare const ONE_PERCENT_BIPS = 100;
10
+ export declare const MSG_SENDER: string;
11
+ export declare const ADDRESS_THIS: string;
12
+ export declare const SOURCE_MSG_SENDER: boolean;
13
+ export declare const SOURCE_ROUTER: boolean;
14
+ export declare const OPENSEA_CONDUIT = "0x1E0049783F008A0085193E00003D00cd54003c71";
15
+ export declare const OPENSEA_CONDUIT_KEY = "0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000";
16
+ export declare const COVEN_ADDRESS = "0x5180db8f5c931aae63c74266b211f580155ecac8";
17
+ export declare const DECENTRA_DRAGON_ADDRESS = "0xAA107cCFe230a29C345Fd97bc6eb9Bd2fccD0750";
18
+ export declare const TOWNSTAR_ADDRESS = "0xc36cF0cFcb5d905B8B513860dB0CFE63F6Cf9F5c";
19
+ export declare const TWERKY_ADDRESS = "0xf4680c917a873e2dd6ead72f9f433e74eb9c623c";
20
+ export declare const MILADY_ADDRESS = "0x5af0d9827e0c53e4799bb226655a1de152a425a5";
21
+ export declare const ALPHABETTIES_ADDRESS = "0x6d05064fe99e40f1c3464e7310a23ffaded56e20";
22
+ export declare const MENTAL_WORLDS_ADDRESS = "0xEf96021Af16BD04918b0d87cE045d7984ad6c38c";
23
+ export declare const CAMEO_ADDRESS = "0x93317E87a3a47821803CAADC54Ae418Af80603DA";
24
+ export declare const ENS_NFT_ADDRESS = "0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85";
25
+ export declare const CRYPTOPUNKS_MARKET_ADDRESS = "0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB";
26
+ export declare const NFTX_COVEN_VAULT = "0xd89b16331f39ab3878daf395052851d3ac8cf3cd";
27
+ export declare const NFTX_COVEN_VAULT_ID = "333";
28
+ export declare const NFTX_MILADY_VAULT = "0x227c7df69d3ed1ae7574a1a7685fded90292eb48";
29
+ export declare const NFTX_MILADY_VAULT_ID = "392";
30
+ export declare const NFTX_ERC_1155_VAULT = "0x78e09c5ec42d505742a52fd10078a57ea186002a";
31
+ export declare const NFTX_ERC_1155_VAULT_ID = "61";
32
+ export declare const V2_FACTORY_MAINNET = "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f";
33
+ export declare const V3_FACTORY_MAINNET = "0x1F98431c8aD98523631AE4a59f267346ea31F984";
34
+ export declare const V3_INIT_CODE_HASH_MAINNET = "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54";
35
+ export declare const V2_INIT_CODE_HASH_MAINNET = "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f";
36
+ export declare const ROUTER_REWARDS_DISTRIBUTOR = "0x0000000000000000000000000000000000000000";
37
+ export declare const LOOKSRARE_REWARDS_DISTRIBUTOR = "0x0554f068365eD43dcC98dcd7Fd7A8208a5638C72";
38
+ export declare const LOOKSRARE_TOKEN = "0xf4d2888d29D722226FafA5d9B24F9164c092421E";
package/lib/index.js ADDED
@@ -0,0 +1,492 @@
1
+ "use strict";
2
+ /*
3
+ Uniswap Integration
4
+ - Highlander
5
+
6
+ BASE
7
+ https://docs.base.org/contracts/
8
+
9
+
10
+
11
+ */
12
+ var __assign = (this && this.__assign) || function () {
13
+ __assign = Object.assign || function(t) {
14
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
15
+ s = arguments[i];
16
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
17
+ t[p] = s[p];
18
+ }
19
+ return t;
20
+ };
21
+ return __assign.apply(this, arguments);
22
+ };
23
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
24
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
25
+ return new (P || (P = Promise))(function (resolve, reject) {
26
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
27
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
28
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
29
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
30
+ });
31
+ };
32
+ var __generator = (this && this.__generator) || function (thisArg, body) {
33
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
34
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
35
+ function verb(n) { return function (v) { return step([n, v]); }; }
36
+ function step(op) {
37
+ if (f) throw new TypeError("Generator is already executing.");
38
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
39
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
40
+ if (y = 0, t) op = [op[0] & 2, t.value];
41
+ switch (op[0]) {
42
+ case 0: case 1: t = op; break;
43
+ case 4: _.label++; return { value: op[1], done: false };
44
+ case 5: _.label++; y = op[1]; op = [0]; continue;
45
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
46
+ default:
47
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
48
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
49
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
50
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
51
+ if (t[2]) _.ops.pop();
52
+ _.trys.pop(); continue;
53
+ }
54
+ op = body.call(thisArg, _);
55
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
56
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
57
+ }
58
+ };
59
+ var __importDefault = (this && this.__importDefault) || function (mod) {
60
+ return (mod && mod.__esModule) ? mod : { "default": mod };
61
+ };
62
+ Object.defineProperty(exports, "__esModule", { value: true });
63
+ exports.LOOKSRARE_TOKEN = exports.LOOKSRARE_REWARDS_DISTRIBUTOR = exports.ROUTER_REWARDS_DISTRIBUTOR = exports.V2_INIT_CODE_HASH_MAINNET = exports.V3_INIT_CODE_HASH_MAINNET = exports.V3_FACTORY_MAINNET = exports.V2_FACTORY_MAINNET = exports.NFTX_ERC_1155_VAULT_ID = exports.NFTX_ERC_1155_VAULT = exports.NFTX_MILADY_VAULT_ID = exports.NFTX_MILADY_VAULT = exports.NFTX_COVEN_VAULT_ID = exports.NFTX_COVEN_VAULT = exports.CRYPTOPUNKS_MARKET_ADDRESS = exports.ENS_NFT_ADDRESS = exports.CAMEO_ADDRESS = exports.MENTAL_WORLDS_ADDRESS = exports.ALPHABETTIES_ADDRESS = exports.MILADY_ADDRESS = exports.TWERKY_ADDRESS = exports.TOWNSTAR_ADDRESS = exports.DECENTRA_DRAGON_ADDRESS = exports.COVEN_ADDRESS = exports.OPENSEA_CONDUIT_KEY = exports.OPENSEA_CONDUIT = exports.SOURCE_ROUTER = exports.SOURCE_MSG_SENDER = exports.ADDRESS_THIS = exports.MSG_SENDER = exports.ONE_PERCENT_BIPS = exports.ZERO_ADDRESS = exports.ETH_ADDRESS = exports.ALICE_ADDRESS = exports.ALREADY_PAID = exports.CONTRACT_BALANCE = exports.DEADLINE = exports.MAX_UINT160 = exports.MAX_UINT = void 0;
64
+ var TAG = " | Uniswap | ";
65
+ var uuid = require('uuidv4').uuid;
66
+ var log = require('@pioneer-platform/loggerdog')();
67
+ var _a = require("@pioneer-platform/pioneer-caip"), caipToNetworkId = _a.caipToNetworkId, shortListSymbolToCaip = _a.shortListSymbolToCaip, ChainToNetworkId = _a.ChainToNetworkId;
68
+ var _b = require('@pioneer-platform/pioneer-coins'), createMemo = _b.createMemo, parseMemo = _b.parseMemo;
69
+ var _c = require('@uniswap/v2-sdk'), Pair = _c.Pair, WETH = _c.WETH, Route = _c.Route, Trade = _c.Trade, TokenAmount = _c.TokenAmount; // Import necessary components from v2-sdk
70
+ var jsbi_1 = __importDefault(require("jsbi"));
71
+ // import { ethers } from 'ethers'
72
+ var sdk_core_1 = require("@uniswap/sdk-core");
73
+ var v3_sdk_1 = require("@uniswap/v3-sdk");
74
+ var router_sdk_1 = require("@uniswap/router-sdk");
75
+ var universal_router_sdk_1 = require("@uniswap/universal-router-sdk");
76
+ var ethers = require('ethers').ethers;
77
+ var PERMIT2_BASE = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
78
+ // This file is lazy-loaded, so the import of smart-order-router is intentional.
79
+ // eslint-disable-next-line @typescript-eslint/no-restricted-imports
80
+ var smart_order_router_1 = require("@uniswap/smart-order-router");
81
+ //TODO - add all networks
82
+ var networkSupport = [
83
+ ChainToNetworkId["ETH"],
84
+ ChainToNetworkId["BASE"],
85
+ ];
86
+ var router_sdk_2 = require("@uniswap/router-sdk");
87
+ var protocols = [router_sdk_2.Protocol.V2, router_sdk_2.Protocol.V3, router_sdk_2.Protocol.MIXED];
88
+ module.exports = {
89
+ init: function (settings) {
90
+ return true;
91
+ },
92
+ networkSupport: function () {
93
+ return networkSupport;
94
+ },
95
+ getQuote: function (quote) {
96
+ return get_quote(quote);
97
+ },
98
+ };
99
+ // Router Helpers
100
+ exports.MAX_UINT = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff';
101
+ exports.MAX_UINT160 = '0xffffffffffffffffffffffffffffffffffffffff';
102
+ exports.DEADLINE = 2000000000;
103
+ exports.CONTRACT_BALANCE = '0x8000000000000000000000000000000000000000000000000000000000000000';
104
+ exports.ALREADY_PAID = 0;
105
+ exports.ALICE_ADDRESS = '0x28c6c06298d514db089934071355e5743bf21d60';
106
+ exports.ETH_ADDRESS = ethers.constants.AddressZero;
107
+ exports.ZERO_ADDRESS = ethers.constants.AddressZero;
108
+ exports.ONE_PERCENT_BIPS = 100;
109
+ exports.MSG_SENDER = '0x0000000000000000000000000000000000000001';
110
+ exports.ADDRESS_THIS = '0x0000000000000000000000000000000000000002';
111
+ exports.SOURCE_MSG_SENDER = true;
112
+ exports.SOURCE_ROUTER = false;
113
+ // Protocol Data
114
+ exports.OPENSEA_CONDUIT = '0x1E0049783F008A0085193E00003D00cd54003c71';
115
+ exports.OPENSEA_CONDUIT_KEY = '0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000';
116
+ // NFT Addresses
117
+ exports.COVEN_ADDRESS = '0x5180db8f5c931aae63c74266b211f580155ecac8';
118
+ exports.DECENTRA_DRAGON_ADDRESS = '0xAA107cCFe230a29C345Fd97bc6eb9Bd2fccD0750';
119
+ exports.TOWNSTAR_ADDRESS = '0xc36cF0cFcb5d905B8B513860dB0CFE63F6Cf9F5c';
120
+ exports.TWERKY_ADDRESS = '0xf4680c917a873e2dd6ead72f9f433e74eb9c623c';
121
+ exports.MILADY_ADDRESS = '0x5af0d9827e0c53e4799bb226655a1de152a425a5';
122
+ exports.ALPHABETTIES_ADDRESS = '0x6d05064fe99e40f1c3464e7310a23ffaded56e20';
123
+ exports.MENTAL_WORLDS_ADDRESS = '0xEf96021Af16BD04918b0d87cE045d7984ad6c38c';
124
+ exports.CAMEO_ADDRESS = '0x93317E87a3a47821803CAADC54Ae418Af80603DA';
125
+ exports.ENS_NFT_ADDRESS = '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85';
126
+ exports.CRYPTOPUNKS_MARKET_ADDRESS = '0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB';
127
+ exports.NFTX_COVEN_VAULT = '0xd89b16331f39ab3878daf395052851d3ac8cf3cd';
128
+ exports.NFTX_COVEN_VAULT_ID = '333';
129
+ exports.NFTX_MILADY_VAULT = '0x227c7df69d3ed1ae7574a1a7685fded90292eb48';
130
+ exports.NFTX_MILADY_VAULT_ID = '392';
131
+ exports.NFTX_ERC_1155_VAULT = '0x78e09c5ec42d505742a52fd10078a57ea186002a';
132
+ exports.NFTX_ERC_1155_VAULT_ID = '61';
133
+ // Constructor Params
134
+ exports.V2_FACTORY_MAINNET = '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f';
135
+ exports.V3_FACTORY_MAINNET = '0x1F98431c8aD98523631AE4a59f267346ea31F984';
136
+ exports.V3_INIT_CODE_HASH_MAINNET = '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54';
137
+ exports.V2_INIT_CODE_HASH_MAINNET = '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f';
138
+ exports.ROUTER_REWARDS_DISTRIBUTOR = '0x0000000000000000000000000000000000000000';
139
+ exports.LOOKSRARE_REWARDS_DISTRIBUTOR = '0x0554f068365eD43dcC98dcd7Fd7A8208a5638C72';
140
+ exports.LOOKSRARE_TOKEN = '0xf4d2888d29D722226FafA5d9B24F9164c092421E';
141
+ var BASE_UNIVERSIAL_ROUTER = {
142
+ "UniversalRouterV1_2": "0xeC8B0F7Ffe3ae75d7FfAb09429e3675bb63503e4",
143
+ "UniversalRouterV1_2_V2Support": "0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD",
144
+ "UnsupportedProtocol": "0x9E18Efb3BE848940b0C92D300504Fb08C287FE85"
145
+ };
146
+ var ETH_UNIVERSIAL_ROUTER = {
147
+ "UniversalRouter": "0xEf1c6E67703c7BD7107eed8303Fbe6EC2554BF6B",
148
+ "UniversalRouterV1_2": "0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD",
149
+ "UnsupportedProtocol": "0x76D631990d505E4e5b432EEDB852A60897824D68"
150
+ };
151
+ var BASE_CONTRACTS = {
152
+ Permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
153
+ UniversalRouter: "0x198EF79F1F515F02dFE9e3115eD9fC07183f02fC",
154
+ V3CoreFactory: "0x33128a8fC17869897dcE68Ed026d694621f6FDfD",
155
+ Multicall: "0x091e99cb1C49331a94dD62755D168E941AbD0693",
156
+ ProxyAdmin: "0x3334d83e224aF5ef9C2E7DDA7c7C98Efd9621fA9",
157
+ TickLens: "0x0CdeE061c75D43c82520eD998C23ac2991c9ac6d",
158
+ NftDescriptor: "0xF9d1077fd35670d4ACbD27af82652a8d84577d9F",
159
+ NonfungibleTokenPositionDescriptor: "0x4f225937EDc33EFD6109c4ceF7b560B2D6401009",
160
+ DescriptorProxy: "0x4615C383F85D0a2BbED973d83ccecf5CB7121463",
161
+ NonfungibleTokenPositionManager: "0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",
162
+ V3Migrator: "0x23cF10b1ee3AdfCA73B0eF17C07F7577e7ACd2d7",
163
+ V3Staker: "0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1",
164
+ QuoterV2: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
165
+ SwapRouter: "0x2626664c2603336E57B271c5C0b26F421741e481"
166
+ };
167
+ var EIP155_MAINNET_CHAINS = {
168
+ 'eip155:1': {
169
+ chainId: 1,
170
+ WETH: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
171
+ name: 'Ethereum',
172
+ logo: '/chain-logos/eip155-1.png',
173
+ rgb: '99, 125, 234',
174
+ permit2: universal_router_sdk_1.PERMIT2_ADDRESS,
175
+ rpc: 'https://eth.llamarpc.com',
176
+ namespace: 'eip155'
177
+ },
178
+ // 'eip155:43114': {
179
+ // chainId: 43114,
180
+ // name: 'Avalanche C-Chain',
181
+ // logo: '/chain-logos/eip155-43113.png',
182
+ // rgb: '232, 65, 66',
183
+ // rpc: 'https://api.avax.network/ext/bc/C/rpc',
184
+ // namespace: 'eip155'
185
+ // },
186
+ // 'eip155:137': {
187
+ // chainId: 137,
188
+ // name: 'Polygon',
189
+ // logo: '/chain-logos/eip155-137.png',
190
+ // rgb: '130, 71, 229',
191
+ // rpc: 'https://polygon-rpc.com/',
192
+ // namespace: 'eip155'
193
+ // },
194
+ // 'eip155:10': {
195
+ // chainId: 10,
196
+ // name: 'Optimism',
197
+ // logo: '/chain-logos/eip155-10.png',
198
+ // rgb: '235, 0, 25',
199
+ // rpc: 'https://mainnet.optimism.io',
200
+ // namespace: 'eip155'
201
+ // },
202
+ // 'eip155:324': {
203
+ // chainId: 324,
204
+ // name: 'zkSync Era',
205
+ // logo: '/chain-logos/eip155-324.svg',
206
+ // rgb: '242, 242, 242',
207
+ // rpc: 'https://mainnet.era.zksync.io/',
208
+ // namespace: 'eip155'
209
+ // },
210
+ 'eip155:8453': {
211
+ chainId: 8453,
212
+ WETH: '0x4200000000000000000000000000000000000006',
213
+ name: 'Base',
214
+ logo: '/chain-logos/base.png',
215
+ rgb: '242, 242, 242',
216
+ permit2: BASE_CONTRACTS.Permit2,
217
+ rpc: 'https://mainnet.base.org',
218
+ namespace: 'eip155'
219
+ }
220
+ };
221
+ var ERC20_ABI = [
222
+ "function allowance(address owner, address spender) view returns (uint256)",
223
+ "function decimals() view returns (uint8)",
224
+ "function balanceOf(address owner) view returns (uint256)",
225
+ "function approve(address spender, uint256 amount) returns (bool)",
226
+ "function transfer(address to, uint256 amount) returns (bool)"
227
+ ];
228
+ var routersCache = new WeakMap();
229
+ function getRouter(chainId, provider) {
230
+ var routers = routersCache.get(provider) || {};
231
+ var cached = routers[chainId];
232
+ if (cached)
233
+ return cached;
234
+ // V2 is unsupported for chains other than mainnet.
235
+ // TODO(zzmp): Upstream to @uniswap/smart-order-router, exporting an enum of supported v2 chains for clarity.
236
+ var v2SubgraphProvider;
237
+ if (chainId !== sdk_core_1.ChainId.MAINNET) {
238
+ v2SubgraphProvider = new smart_order_router_1.StaticV2SubgraphProvider(chainId);
239
+ }
240
+ // V3 computes on-chain, so the quoter must have gas limits appropriate to the provider.
241
+ // Most defaults are fine, but polygon needs a lower gas limit.
242
+ // TODO(zzmp): Upstream to @uniswap/smart-order-router, possibly making this easier to modify
243
+ // (eg allowing configuration without an instance to avoid duplicating multicall2Provider).
244
+ var onChainQuoteProvider;
245
+ var multicall2Provider;
246
+ if ([sdk_core_1.ChainId.POLYGON, sdk_core_1.ChainId.POLYGON_MUMBAI].includes(chainId)) {
247
+ multicall2Provider = new smart_order_router_1.UniswapMulticallProvider(chainId, provider, 375000);
248
+ // See https://github.com/Uniswap/smart-order-router/blob/98c58bdee9981fd9ffac9e7d7a97b18302d5f77a/src/routers/alpha-router/alpha-router.ts#L464-L487
249
+ onChainQuoteProvider = new smart_order_router_1.OnChainQuoteProvider(chainId, provider, multicall2Provider, {
250
+ retries: 2,
251
+ minTimeout: 100,
252
+ maxTimeout: 1000,
253
+ }, {
254
+ multicallChunk: 10,
255
+ gasLimitPerCall: 5000000,
256
+ quoteMinSuccessRate: 0.1,
257
+ }, {
258
+ gasLimitOverride: 5000000,
259
+ multicallChunk: 5,
260
+ }, {
261
+ gasLimitOverride: 6250000,
262
+ multicallChunk: 4,
263
+ });
264
+ }
265
+ var router = new smart_order_router_1.AlphaRouter({ chainId: chainId, provider: provider, v2SubgraphProvider: v2SubgraphProvider, multicall2Provider: multicall2Provider, onChainQuoteProvider: onChainQuoteProvider });
266
+ routers[chainId] = router;
267
+ routersCache.set(provider, routers);
268
+ return router;
269
+ }
270
+ var SwapRouterNativeAssets;
271
+ (function (SwapRouterNativeAssets) {
272
+ SwapRouterNativeAssets["MATIC"] = "MATIC";
273
+ SwapRouterNativeAssets["ETH"] = "ETH";
274
+ })(SwapRouterNativeAssets || (SwapRouterNativeAssets = {}));
275
+ // interface SwapOptions {
276
+ // slippageTolerance: Percent
277
+ // deadline?: BigNumber
278
+ // permit?: PermitSignature
279
+ // feeOptions?: FeeOptions
280
+ // }
281
+ var getRoute = function (_a) {
282
+ var sellToken = _a.sellToken, buyToken = _a.buyToken, chainId = _a.chainId, amountIn = _a.amountIn, provider = _a.provider;
283
+ return __awaiter(this, void 0, void 0, function () {
284
+ var tag, router, amount, route, e_1;
285
+ return __generator(this, function (_b) {
286
+ switch (_b.label) {
287
+ case 0:
288
+ tag = " | getMinAmountOut | ";
289
+ _b.label = 1;
290
+ case 1:
291
+ _b.trys.push([1, 3, , 4]);
292
+ log.info(tag, "sellToken: ", sellToken);
293
+ log.info(tag, "buyToken: ", buyToken);
294
+ router = getRouter(chainId, provider);
295
+ amount = sdk_core_1.CurrencyAmount.fromRawAmount(buyToken, jsbi_1.default.BigInt(amountIn !== null && amountIn !== void 0 ? amountIn : '1')) // a null amountRaw should initialize the route
296
+ ;
297
+ log.info(tag, "amount: ", amount);
298
+ return [4 /*yield*/, router.route(amount, sellToken, sdk_core_1.TradeType.EXACT_INPUT, /*swapConfig=*/ undefined, { protocols: protocols })];
299
+ case 2:
300
+ route = _b.sent();
301
+ log.info(tag, "route: ", route);
302
+ return [2 /*return*/, route];
303
+ case 3:
304
+ e_1 = _b.sent();
305
+ console.error(tag, "Error in getMinAmountOut: ", e_1);
306
+ throw e_1;
307
+ case 4: return [2 /*return*/];
308
+ }
309
+ });
310
+ });
311
+ };
312
+ var isZero = function isZero(hexNumberString) {
313
+ return hexNumberString === '0' || /^0x0*$/.test(hexNumberString);
314
+ };
315
+ var buildTx = function (_a) {
316
+ var trade = _a.trade, from = _a.from, chainId = _a.chainId;
317
+ return __awaiter(this, void 0, void 0, function () {
318
+ var BIPS_BASE, _b, data, value, tx;
319
+ return __generator(this, function (_c) {
320
+ try {
321
+ BIPS_BASE = jsbi_1.default.BigInt(10000);
322
+ _b = router_sdk_1.SwapRouter.swapCallParameters(trade, {
323
+ // @ts-ignore
324
+ slippageTolerance: new sdk_core_1.Percent(jsbi_1.default.BigInt(200), BIPS_BASE),
325
+ // deadlineOrPreviousBlockhash: options.deadline?.toString(),
326
+ // inputTokenPermit: options.permit,
327
+ // fee: options.feeOptions,
328
+ }), data = _b.calldata, value = _b.value;
329
+ tx = __assign({ from: from, to: (0, universal_router_sdk_1.UNIVERSAL_ROUTER_ADDRESS)(chainId), data: data }, (value && !isZero(value) ? { value: (0, v3_sdk_1.toHex)(value) } : {}));
330
+ return [2 /*return*/, tx];
331
+ }
332
+ catch (e) {
333
+ console.error(e);
334
+ }
335
+ return [2 /*return*/];
336
+ });
337
+ });
338
+ };
339
+ var get_quote = function (quote) {
340
+ return __awaiter(this, void 0, void 0, function () {
341
+ var tag, output, slippageTolerance, recipient, inputChain, outputChain, providerUrl, provider, sellTokenContract, buyTokenContract, buyTokenAddress_1, balance, sellTokenAddress_1, permit2, router, planner, sellAmountBigNumber, path, permit2Address, currentAllowance, _a, sellTokenAddress, buyTokenAddress, sellTokenDecimals, _b, buyTokenDecimals, _c, amountInBigNumber, chainIdInt, sellToken, buyToken, route, trade, amountOut, tx, e_2;
342
+ return __generator(this, function (_d) {
343
+ switch (_d.label) {
344
+ case 0:
345
+ tag = TAG + " | get_quote | ";
346
+ _d.label = 1;
347
+ case 1:
348
+ _d.trys.push([1, 14, , 15]);
349
+ output = {};
350
+ if (!quote.sellAsset)
351
+ throw new Error("missing sellAsset");
352
+ if (!quote.buyAsset)
353
+ throw new Error("missing buyAsset");
354
+ if (!quote.sellAmount)
355
+ throw new Error("missing sellAmount");
356
+ if (!quote.senderAddress)
357
+ throw new Error("missing senderAddress");
358
+ if (!quote.recipientAddress)
359
+ throw new Error("missing recipientAddress");
360
+ if (!quote.slippage)
361
+ throw new Error("missing slippage");
362
+ slippageTolerance = quote.slippage;
363
+ recipient = quote.recipientAddress;
364
+ inputChain = caipToNetworkId(quote.sellAsset);
365
+ outputChain = caipToNetworkId(quote.buyAsset);
366
+ if (inputChain != outputChain)
367
+ throw new Error("Cross Chain not supported");
368
+ log.info("inputChain: ", inputChain);
369
+ providerUrl = EIP155_MAINNET_CHAINS[inputChain].rpc;
370
+ if (!providerUrl)
371
+ throw new Error("missing providerUrl");
372
+ log.info("providerUrl: ", providerUrl);
373
+ provider = new ethers.providers.JsonRpcProvider(providerUrl);
374
+ sellTokenContract = void 0, buyTokenContract = void 0;
375
+ if (!(quote.buyAsset.indexOf('erc20') > -1)) return [3 /*break*/, 3];
376
+ buyTokenAddress_1 = quote.buyAsset.split(":")[2];
377
+ log.info("buyTokenAddress: ", buyTokenAddress_1);
378
+ buyTokenContract = new ethers.Contract(buyTokenAddress_1, ERC20_ABI, provider);
379
+ return [4 /*yield*/, buyTokenContract.balanceOf(quote.senderAddress)];
380
+ case 2:
381
+ balance = _d.sent();
382
+ log.info("balance: ", balance.toString());
383
+ _d.label = 3;
384
+ case 3:
385
+ if (quote.sellAsset.indexOf('erc20') > -1) {
386
+ sellTokenAddress_1 = quote.sellAsset.split(":")[2];
387
+ log.info("sellTokenAddress: ", sellTokenAddress_1);
388
+ sellTokenContract = new ethers.Contract(sellTokenAddress_1, ERC20_ABI, provider);
389
+ }
390
+ permit2 = universal_router_sdk_1.PERMIT2_ADDRESS;
391
+ router = universal_router_sdk_1.UNIVERSAL_ROUTER_ADDRESS;
392
+ planner = new universal_router_sdk_1.RoutePlanner();
393
+ sellAmountBigNumber = ethers.utils.parseUnits(quote.sellAmount.toString(), 'ether');
394
+ path = void 0;
395
+ //build path
396
+ if (sellTokenContract && !buyTokenContract) {
397
+ path = [sellTokenContract.address, EIP155_MAINNET_CHAINS[inputChain].WETH];
398
+ }
399
+ else if (!sellTokenContract && buyTokenContract) {
400
+ path = [EIP155_MAINNET_CHAINS[inputChain].WETH, buyTokenContract.address];
401
+ }
402
+ else if (sellTokenContract && buyTokenContract) {
403
+ path = [sellTokenContract.address, buyTokenContract.address];
404
+ }
405
+ log.info("path: ", path);
406
+ // @ts-ignore
407
+ if ((path[0] !== undefined && path[1] !== undefined) && path[0] === path[1]) {
408
+ throw new Error("Both tokens are the same");
409
+ }
410
+ if (!path)
411
+ throw new Error("missing path");
412
+ if (!sellTokenContract) return [3 /*break*/, 5];
413
+ permit2Address = EIP155_MAINNET_CHAINS[inputChain].permit2;
414
+ if (!permit2Address)
415
+ throw new Error("missing permit2Address for chain: " + inputChain);
416
+ console.log("sellTokenContract: ", sellTokenContract.toString());
417
+ return [4 /*yield*/, sellTokenContract.allowance(quote.senderAddress, permit2Address)];
418
+ case 4:
419
+ currentAllowance = _d.sent();
420
+ console.log("currentAllowance: ", currentAllowance.toString());
421
+ console.log("sellAmountBigNumber: ", sellAmountBigNumber.toString());
422
+ if (currentAllowance.lt(sellAmountBigNumber)) {
423
+ // Requesting approval: Setting allowance to Max UINT256 for simplicity
424
+ throw Error("TODO write code for allowance!");
425
+ }
426
+ _d.label = 5;
427
+ case 5:
428
+ _a = path.map(function (address) { return ethers.utils.getAddress(address); }), sellTokenAddress = _a[0], buyTokenAddress = _a[1];
429
+ console.info("".concat(tag, " sellTokenAddress: ").concat(sellTokenAddress, ", buyTokenAddress: ").concat(buyTokenAddress));
430
+ if (!(sellTokenAddress !== ethers.constants.AddressZero)) return [3 /*break*/, 7];
431
+ return [4 /*yield*/, new ethers.Contract(sellTokenAddress, ERC20_ABI, provider).decimals()];
432
+ case 6:
433
+ _b = _d.sent();
434
+ return [3 /*break*/, 8];
435
+ case 7:
436
+ _b = 18;
437
+ _d.label = 8;
438
+ case 8:
439
+ sellTokenDecimals = _b;
440
+ if (!(buyTokenAddress !== ethers.constants.AddressZero)) return [3 /*break*/, 10];
441
+ return [4 /*yield*/, new ethers.Contract(buyTokenAddress, ERC20_ABI, provider).decimals()];
442
+ case 9:
443
+ _c = _d.sent();
444
+ return [3 /*break*/, 11];
445
+ case 10:
446
+ _c = 18;
447
+ _d.label = 11;
448
+ case 11:
449
+ buyTokenDecimals = _c;
450
+ log.info("".concat(tag, " sellTokenDecimals: ").concat(sellTokenDecimals, ", buyTokenDecimals: ").concat(buyTokenDecimals));
451
+ amountInBigNumber = ethers.utils.parseUnits(quote.sellAmount.toString(), sellTokenDecimals);
452
+ log.info("".concat(tag, " amountInBigNumber: ").concat(amountInBigNumber.toString()));
453
+ chainIdInt = parseInt(inputChain.replace('eip155:', ''));
454
+ log.info(tag, "chainIdInt: ", chainIdInt);
455
+ sellToken = sellTokenAddress === ethers.constants.AddressZero ?
456
+ WETH[sdk_core_1.ChainId.MAINNET] : new sdk_core_1.Token(chainIdInt, sellTokenAddress, sellTokenDecimals);
457
+ buyToken = buyTokenAddress === ethers.constants.AddressZero ?
458
+ WETH[sdk_core_1.ChainId.MAINNET] : new sdk_core_1.Token(chainIdInt, buyTokenAddress, buyTokenDecimals);
459
+ return [4 /*yield*/, getRoute({
460
+ sellToken: sellToken,
461
+ buyToken: buyToken,
462
+ chainId: chainIdInt,
463
+ amountIn: amountInBigNumber,
464
+ provider: provider
465
+ })];
466
+ case 12:
467
+ route = _d.sent();
468
+ console.log("route: ", route);
469
+ if (!route)
470
+ throw new Error("missing route, failed to find route");
471
+ trade = route.trade;
472
+ log.info(tag, "trade: ", trade);
473
+ amountOut = trade.swaps[0].outputAmount;
474
+ log.info(tag, "amountOut: ", amountOut);
475
+ output.amountOut = amountOut.toFixed(18);
476
+ return [4 /*yield*/, buildTx({ trade: trade, from: quote.senderAddress, chainId: chainIdInt })];
477
+ case 13:
478
+ tx = _d.sent();
479
+ log.info(tag, "tx: ", tx);
480
+ output.type = 'EVM';
481
+ output.id = uuid();
482
+ output.tx = tx;
483
+ return [2 /*return*/, output];
484
+ case 14:
485
+ e_2 = _d.sent();
486
+ console.error(tag, "e: ", e_2);
487
+ throw e_2;
488
+ case 15: return [2 /*return*/];
489
+ }
490
+ });
491
+ });
492
+ };
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@pioneer-platform/uniswap-client",
3
+ "version": "0.0.1",
4
+ "main": "./lib/index.js",
5
+ "types": "./lib/index.d.ts",
6
+ "dependencies": {
7
+ "@pioneer-platform/loggerdog": "^8.3.1",
8
+ "@pioneer-platform/maya-network": "^8.3.7",
9
+ "@pioneer-platform/pioneer-caip": "^9.2.23",
10
+ "@pioneer-platform/pioneer-coins": "^9.2.13",
11
+ "@uniswap/sdk": "^3.0.3",
12
+ "@uniswap/sdk-core": "^4.0.7",
13
+ "@uniswap/smart-order-router": "^3.16.25",
14
+ "@uniswap/token-lists": "^1.0.0-beta.34",
15
+ "@uniswap/v2-sdk": "^3.2.1",
16
+ "@uniswap/v3-sdk": "^3.10.0",
17
+ "axios": "^1.3.4",
18
+ "dotenv": "^8.2.0",
19
+ "jsbi": "^4.3.0",
20
+ "rango-sdk": "^0.1.45",
21
+ "uuidv4": "^6.2.13"
22
+ },
23
+ "scripts": {
24
+ "npm": "npm i",
25
+ "test": "npm run build && node __tests__/test-module.js",
26
+ "build": "tsc -p .",
27
+ "prepublish": "npm run build",
28
+ "refresh": "rm -rf ./node_modules ./package-lock.json && npm install"
29
+ },
30
+ "devDependencies": {
31
+ "@types/async-retry": "^1.4.8",
32
+ "@types/bunyan": "^1.8.11",
33
+ "@types/jest": "^25.2.3",
34
+ "@types/node": "^13.13.21",
35
+ "@types/source-map-support": "^0.5.3",
36
+ "jest": "^26.4.2",
37
+ "onchange": "^7.0.2",
38
+ "serve": "^11.3.2",
39
+ "ts-jest": "^29.0.5",
40
+ "typescript": "^5.0.2"
41
+ },
42
+ "gitHead": "a76012f6693a12181c4744e53e977a9eaeef0ed3"
43
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "module": "commonjs",
5
+ "lib": ["es6", "es2015", "dom"],
6
+ "declaration": true,
7
+ "outDir": "lib",
8
+ "rootDir": "src",
9
+ "strict": true,
10
+ "types": ["node"],
11
+ "esModuleInterop": true,
12
+ "resolveJsonModule": true
13
+ }
14
+ }