@pioneer-platform/uniswap-client 0.0.27 → 0.0.29

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.js CHANGED
@@ -70,6 +70,8 @@ var log = require('@pioneer-platform/loggerdog')();
70
70
  var _b = require('ethers'), ethers = _b.ethers, BigNumber = _b.BigNumber;
71
71
  var ethers_1 = require("ethers");
72
72
  var sdk_core_1 = require("@uniswap/sdk-core");
73
+ var clientSideSmartOrderRouter_1 = require("./routing/clientSideSmartOrderRouter");
74
+ var universal_router_sdk_1 = require("@uniswap/universal-router-sdk");
73
75
  var v3_sdk_1 = require("@uniswap/v3-sdk");
74
76
  var networkSupport = [
75
77
  ChainToNetworkId["ETH"],
@@ -107,6 +109,11 @@ var ERC20_ABI = [
107
109
  "function symbol() view returns (string)",
108
110
  "function decimals() view returns (uint8)"
109
111
  ];
112
+ function toDeadline(expiration) {
113
+ return Math.floor((Date.now() + expiration) / 1000);
114
+ }
115
+ var PERMIT_EXPIRATION = 2592000000; // 30 days in milliseconds
116
+ var PERMIT_SIG_EXPIRATION = 1800000; // 30 minutes in milliseconds
110
117
  module.exports = {
111
118
  init: function (settings) {
112
119
  return true;
@@ -117,8 +124,467 @@ module.exports = {
117
124
  assetSupport: function () {
118
125
  return getAssetSupport();
119
126
  },
127
+ buildPermitTx: function (permit) {
128
+ return get_permit(permit);
129
+ },
130
+ buildLpTx: function (quote) {
131
+ return build_lp_tx(quote);
132
+ },
120
133
  getQuote: function (quote) {
121
- return get_quote(quote);
134
+ return get_quote_local(quote);
135
+ }
136
+ //ProvideLP
137
+ // getQuote: function (quote:any) {
138
+ // return get_quote_api(quote);
139
+ // }
140
+ };
141
+ // const build_lp_tx = async function (input: any) {
142
+ // let tag = "build_lp_tx | ";
143
+ // try {
144
+ // log.info("input: ", input);
145
+ // let output: any = {};
146
+ //
147
+ // let inputChain = input.chain;
148
+ // let fromAddress = input.fromAddress;
149
+ // log.info("inputChain: ", inputChain);
150
+ // let providerUrl = EIP155_MAINNET_CHAINS[inputChain].rpc;
151
+ // if (!providerUrl) throw new Error("missing providerUrl");
152
+ // log.info("providerUrl: ", providerUrl);
153
+ //
154
+ // const provider = new ethers.providers.JsonRpcProvider(providerUrl); // Set your Ethereum RPC URL
155
+ //
156
+ // const positionManagerAddress = '0x03a520b32c04bf3beef7beb72e919cf822ed34f1';
157
+ // const positionManagerABI = [
158
+ // "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 amount0Desired, uint128 amount1Desired, uint128 amount0Min, uint128 amount1Min, address recipient, uint256 deadline)) external returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)"
159
+ // ];
160
+ //
161
+ // const walletPrivateKey = process.env.WALLET_PRIVATE_KEY; // Ensure you have the private key in environment variables
162
+ // if (!walletPrivateKey) throw new Error("missing wallet private key");
163
+ //
164
+ // const wallet = new ethers.Wallet(walletPrivateKey, provider);
165
+ // const positionManager = new ethers.Contract(positionManagerAddress, positionManagerABI, wallet);
166
+ //
167
+ // const token0 = '0x4200000000000000000000000000000000000006'; // Address of token0
168
+ // const token1 = '0xef743df8eda497bcf1977393c401a636518dd630'; // Address of token1
169
+ // const fee = 3000; // Fee tier, for example 0.3%
170
+ // const tickLower = -60000; // Lower tick
171
+ // const tickUpper = 60000; // Upper tick
172
+ // const amount0Desired = ethers.utils.parseUnits("0.01", 18); // 10 token0
173
+ // const amount1Desired = ethers.utils.parseUnits("41.2", 18); // 10 token1
174
+ // const amount0Min = ethers.utils.parseUnits("0.001", 18); // Min token0
175
+ // const amount1Min = ethers.utils.parseUnits(".9", 18); // Min token1
176
+ // const recipient = fromAddress; // Recipient address
177
+ // const deadline = Math.floor(Date.now() / 1000) + 60 * 20; // Transaction deadline
178
+ //
179
+ // const params = {
180
+ // token0,
181
+ // token1,
182
+ // fee,
183
+ // tickLower,
184
+ // tickUpper,
185
+ // amount0Desired,
186
+ // amount1Desired,
187
+ // amount0Min,
188
+ // amount1Min,
189
+ // recipient,
190
+ // deadline
191
+ // };
192
+ // log.info(tag, "params: ", params);
193
+ //
194
+ // const txData = await positionManager.populateTransaction.mint(params);
195
+ // log.info(tag, "Transaction data prepared:", txData);
196
+ //
197
+ // const value = token0 === ethers.constants.AddressZero ? amount0Desired : ethers.BigNumber.from(0); // Assuming token0 is ETH
198
+ // log.info("calldata: ", txData.data);
199
+ // log.info("value: ", value);
200
+ //
201
+ // const nonce = await provider.getTransactionCount(fromAddress, "latest");
202
+ // log.info("nonce: ", nonce);
203
+ // let gas = ethers.BigNumber.from("935120"); // 935120
204
+ // const gasPrice = await provider.getGasPrice();
205
+ // log.info("gasPrice: ", gasPrice.toString());
206
+ // const adjustedGasPrice = gasPrice.mul(ethers.BigNumber.from(110)).div(ethers.BigNumber.from(100)); // Example: Increase by 10%
207
+ //
208
+ // let isZero = function isZero(hexNumberString: string) {
209
+ // return hexNumberString === '0' || /^0x0*$/.test(hexNumberString);
210
+ // };
211
+ //
212
+ // output.txs = [];
213
+ // const tx = {
214
+ // from: fromAddress,
215
+ // to: positionManagerAddress,
216
+ // chainId: parseInt(inputChain.split(':')[1]),
217
+ // data: txData.data,
218
+ // ...(value && !isZero(value.toString()) ? { value: value } : {}),
219
+ // gasLimit: gas,
220
+ // gasPrice: adjustedGasPrice,
221
+ // nonce: nonce,
222
+ // };
223
+ //
224
+ // log.info(tag, "Transaction params:", tx);
225
+ //
226
+ // // Send the transaction
227
+ // const transactionResponse = await wallet.sendTransaction(tx);
228
+ // log.info(tag, "Transaction response:", transactionResponse);
229
+ //
230
+ // // Wait for the transaction to be mined
231
+ // const receipt = await transactionResponse.wait();
232
+ // log.info(tag, "Transaction receipt:", receipt);
233
+ //
234
+ // output.txs.push({
235
+ // type: "evm",
236
+ // description: 'mint PRO position',
237
+ // chain: inputChain,
238
+ // txParams: tx,
239
+ // txHash: transactionResponse.hash,
240
+ // receipt: receipt,
241
+ // });
242
+ //
243
+ // output.meta = {
244
+ // quoteMode: "LP"
245
+ // };
246
+ // output.steps = 1;
247
+ // output.complete = true;
248
+ // output.type = 'EVM';
249
+ // output.id = uuid();
250
+ //
251
+ // return output;
252
+ // } catch (e) {
253
+ // console.error(e);
254
+ // }
255
+ // };
256
+ var build_lp_tx = function (input) {
257
+ return __awaiter(this, void 0, void 0, function () {
258
+ var tag, output, inputChain, fromAddress, providerUrl, provider, positionManagerAddress, positionManagerABI, positionManager, token0, token1, fee, tickLower, tickUpper, amount0Desired, amount1Desired, amount0Min, amount1Min, recipient, deadline, params, txData, value, nonce, gas, gasPrice, adjustedGasPrice, isZero, tx, e_1;
259
+ return __generator(this, function (_a) {
260
+ switch (_a.label) {
261
+ case 0:
262
+ tag = TAG + " | build_lp_tx | ";
263
+ _a.label = 1;
264
+ case 1:
265
+ _a.trys.push([1, 5, , 6]);
266
+ log.info("input: ", input);
267
+ output = {};
268
+ inputChain = input.chain;
269
+ fromAddress = input.fromAddress;
270
+ log.info("inputChain: ", inputChain);
271
+ providerUrl = EIP155_MAINNET_CHAINS[inputChain].rpc;
272
+ if (!providerUrl)
273
+ throw new Error("missing providerUrl");
274
+ log.info("providerUrl: ", providerUrl);
275
+ provider = new ethers.providers.JsonRpcProvider(providerUrl);
276
+ positionManagerAddress = '0x03a520b32c04bf3beef7beb72e919cf822ed34f1';
277
+ positionManagerABI = [
278
+ "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 amount0Desired, uint128 amount1Desired, uint128 amount0Min, uint128 amount1Min, address recipient, uint256 deadline)) external returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)"
279
+ ];
280
+ positionManager = new ethers.Contract(positionManagerAddress, positionManagerABI);
281
+ token0 = '0x4200000000000000000000000000000000000006';
282
+ token1 = '0xef743df8eda497bcf1977393c401a636518dd630';
283
+ fee = 3000;
284
+ tickLower = -60000;
285
+ tickUpper = 60000;
286
+ amount0Desired = ethers.utils.parseUnits("0.01", 18);
287
+ amount1Desired = ethers.utils.parseUnits("41.2", 18);
288
+ amount0Min = ethers.utils.parseUnits("0.001", 18);
289
+ amount1Min = ethers.utils.parseUnits(".9", 18);
290
+ recipient = fromAddress;
291
+ deadline = Math.floor(Date.now() / 1000) + 60 * 20;
292
+ params = {
293
+ token0: token0,
294
+ token1: token1,
295
+ fee: fee,
296
+ tickLower: tickLower,
297
+ tickUpper: tickUpper,
298
+ amount0Desired: amount0Desired,
299
+ amount1Desired: amount1Desired,
300
+ amount0Min: amount0Min,
301
+ amount1Min: amount1Min,
302
+ recipient: recipient,
303
+ deadline: deadline
304
+ };
305
+ log.info(tag, "params: ", params);
306
+ return [4 /*yield*/, positionManager.mint.call(params)];
307
+ case 2:
308
+ txData = _a.sent();
309
+ log.info(tag, "Transaction data prepared:", txData);
310
+ value = token0 === ethers.constants.AddressZero ? amount0Desired : '0x0';
311
+ log.info("calldata: ", txData.data);
312
+ log.info("value: ", value);
313
+ return [4 /*yield*/, provider.getTransactionCount(fromAddress, "latest")];
314
+ case 3:
315
+ nonce = _a.sent();
316
+ log.info("nonce: ", nonce);
317
+ gas = "0x".concat(BigInt("935120").toString(16)) // 935120
318
+ ;
319
+ return [4 /*yield*/, provider.getGasPrice()];
320
+ case 4:
321
+ gasPrice = _a.sent();
322
+ log.info("gasPrice: ", gasPrice.toString());
323
+ adjustedGasPrice = gasPrice.mul(ethers.BigNumber.from(110)).div(ethers.BigNumber.from(100));
324
+ isZero = function isZero(hexNumberString) {
325
+ return hexNumberString === '0' || /^0x0*$/.test(hexNumberString);
326
+ };
327
+ output.txs = [];
328
+ tx = __assign(__assign({ from: fromAddress, to: positionManagerAddress, chainId: inputChain.split(':')[1], data: txData.data }, (value && !isZero(value) ? { value: (0, v3_sdk_1.toHex)(value) } : {})), { gas: gas, gasPrice: (0, v3_sdk_1.toHex)(adjustedGasPrice), nonce: (0, v3_sdk_1.toHex)(nonce) });
329
+ output.txs.push({
330
+ type: "evm",
331
+ description: 'mint PRO position',
332
+ chain: inputChain,
333
+ txParams: tx
334
+ });
335
+ output.meta = {
336
+ quoteMode: "LP"
337
+ };
338
+ output.steps = 1;
339
+ output.complete = true;
340
+ output.type = 'EVM';
341
+ output.id = uuid();
342
+ return [2 /*return*/, output];
343
+ case 5:
344
+ e_1 = _a.sent();
345
+ console.error(e_1);
346
+ return [3 /*break*/, 6];
347
+ case 6: return [2 /*return*/];
348
+ }
349
+ });
350
+ });
351
+ };
352
+ // const build_lp_tx = async function (input: any) {
353
+ // let tag = TAG + " | build_lp_tx | ";
354
+ // try {
355
+ // log.info("input: ", input);
356
+ // let output: any = {};
357
+ //
358
+ // const { chain, fromAddress } = input;
359
+ //
360
+ // log.info("inputChain: ", chain);
361
+ // let providerUrl = EIP155_MAINNET_CHAINS[chain].rpc;
362
+ // if (!providerUrl) throw new Error("missing providerUrl");
363
+ // log.info("providerUrl: ", providerUrl);
364
+ //
365
+ // const provider = new ethers.providers.JsonRpcProvider(providerUrl);
366
+ // const nonce = await provider.getTransactionCount(fromAddress, "latest");
367
+ //
368
+ // // Ensure that the deadline, nonce, and other dynamic parameters are set correctly
369
+ // const updatedDeadline = Math.floor(Date.now() / 1000) + 60 * 20; // Adjust the deadline as required
370
+ //
371
+ // let rawData = "0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c4219f5d17000000000000000000000000000000000000000000000000000000000006e815" + updatedDeadline.toString(16).padStart(64, '0') + "00000000000000000000000000000000000000000000000000000000663daccf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000";
372
+ //
373
+ // let gas = `0x3a345`; // Example gas limit, adjust as needed
374
+ // let value = `0x2386f26fc10000`; // 0.01 ETH in wei
375
+ // const gasPrice = await provider.getGasPrice();
376
+ // const adjustedGasPrice = gasPrice.mul(ethers.BigNumber.from(110)).div(ethers.BigNumber.from(100)); // Example: Increase by 10%
377
+ //
378
+ // output.txs = [{
379
+ // type: "evm",
380
+ // description: 'mint PRO position',
381
+ // chain,
382
+ // txParams: {
383
+ // chainId:chain.split(':')[1],
384
+ // from: fromAddress,
385
+ // to: "0x03a520b32c04bf3beef7beb72e919cf822ed34f1",
386
+ // data: rawData,
387
+ // value: value,
388
+ // gas,
389
+ // gasPrice: toHex(adjustedGasPrice),
390
+ // nonce: toHex(nonce),
391
+ // }
392
+ // }];
393
+ //
394
+ // output.meta = {
395
+ // quoteMode: "LP"
396
+ // };
397
+ // output.steps = 1;
398
+ // output.complete = true;
399
+ // output.type = 'EVM';
400
+ // output.id = uuid();
401
+ //
402
+ // return output;
403
+ // } catch (e) {
404
+ // console.error(tag, e);
405
+ // }
406
+ // }
407
+ // const build_lp_tx = async function (input:any) {
408
+ // let tag = TAG + " | build_lp_tx | "
409
+ // try{
410
+ // log.info("input: ",input)
411
+ // let output:any = {}
412
+ //
413
+ // //
414
+ // let inputChain = input.chain
415
+ // let fromAddress = input.fromAddress
416
+ // log.info("inputChain: ",inputChain)
417
+ // let providerUrl = EIP155_MAINNET_CHAINS[inputChain].rpc
418
+ // if(!providerUrl) throw new Error("missing providerUrl")
419
+ // log.info("providerUrl: ",providerUrl)
420
+ //
421
+ // //
422
+ // const provider = new ethers.providers.JsonRpcProvider(providerUrl); // Set your Ethereum RPC URL
423
+ //
424
+ // const positionManagerAddress = '0x03a520b32c04bf3beef7beb72e919cf822ed34f1';
425
+ // const positionManagerABI = [
426
+ // // Include only the necessary part of the ABI for minting a position
427
+ // "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 amount0Desired, uint128 amount1Desired, uint128 amount0Min, uint128 amount1Min, address recipient, uint256 deadline))"
428
+ // ];
429
+ // const positionManager = new ethers.Contract(positionManagerAddress, positionManagerABI);
430
+ //
431
+ // // Define the parameters for the liquidity position
432
+ // //ETH
433
+ // const token0 = '0x4200000000000000000000000000000000000006'; // Address of token0
434
+ // //PRO
435
+ // const token1 = '0xef743df8eda497bcf1977393c401a636518dd630'; // Address of token1
436
+ // const fee = 3000; // Fee tier, for example 0.3%
437
+ // const tickLower = -60000; // Lower tick
438
+ // const tickUpper = 60000; // Upper tick
439
+ // const amount0Desired = ethers.utils.parseUnits("0.01", 18); // 10 token0
440
+ // const amount1Desired = ethers.utils.parseUnits("41.2", 18); // 10 token1
441
+ // const amount0Min = ethers.utils.parseUnits("0.001", 18); // Min token0
442
+ // const amount1Min = ethers.utils.parseUnits(".9", 18); // Min token1
443
+ // const recipient = fromAddress; // Recipient address
444
+ // const deadline = Math.floor(Date.now() / 1000) + 60 * 20; // Transaction deadline
445
+ //
446
+ // // Construct the mint parameters
447
+ // const params = {
448
+ // token0,
449
+ // token1,
450
+ // fee,
451
+ // tickLower,
452
+ // tickUpper,
453
+ // amount0Desired,
454
+ // amount1Desired,
455
+ // amount0Min,
456
+ // amount1Min,
457
+ // recipient,
458
+ // deadline
459
+ // };
460
+ // log.info(tag,"params: ",params)
461
+ // const txData = await positionManager.populateTransaction.mint(params);
462
+ // log.info(tag, "Transaction data prepared:", txData);
463
+ //
464
+ // //output.tx = tx; // Store the transaction data for future signing
465
+ // const value = token0 === ethers.constants.AddressZero ? amount0Desired : '0x0'; // Assuming token0 is ETH
466
+ //
467
+ // log.info("calldata: ",txData.data)
468
+ // log.info("value: ",value)
469
+ // const nonce = await provider.getTransactionCount(fromAddress, "latest");
470
+ // log.info("nonce: ",nonce)
471
+ // let gas = `0x${BigInt("935120").toString(16)}` // 935120
472
+ // const gasPrice = await provider.getGasPrice();
473
+ // log.info("gasPrice: ",gasPrice.toString())
474
+ // const adjustedGasPrice = gasPrice.mul(ethers.BigNumber.from(110)).div(ethers.BigNumber.from(100)); // Example: Increase by 10%
475
+ // let isZero = function isZero(hexNumberString: string) {
476
+ // return hexNumberString === '0' || /^0x0*$/.test(hexNumberString)
477
+ // }
478
+ // output.txs = []
479
+ // const tx = {
480
+ // from:fromAddress,
481
+ // to: EIP155_MAINNET_CHAINS[inputChain].universalRouter,
482
+ // chainId:inputChain.split(':')[1],
483
+ // data: txData.data,
484
+ // // TODO: universal-router-sdk returns a non-hexlified value.
485
+ // ...(value && !isZero(value) ? { value: toHex(value) } : {}),
486
+ // gas,
487
+ // gasPrice: toHex(adjustedGasPrice),
488
+ // nonce: toHex(nonce),
489
+ // }
490
+ // output.txs.push({
491
+ // type:"evm",
492
+ // description:'mint PRO position',
493
+ // chain:inputChain,
494
+ // txParams: tx
495
+ // })
496
+ //
497
+ // output.meta = {
498
+ // quoteMode: "LP"
499
+ // }
500
+ // output.steps = 1
501
+ // output.complete = true
502
+ // output.type = 'EVM'
503
+ // output.id = uuid()
504
+ //
505
+ // return output;
506
+ // }catch(e){
507
+ // console.error(e)
508
+ // }
509
+ // }
510
+ var get_permit = function (permit) {
511
+ var tag = TAG + " | get_permit | ";
512
+ try {
513
+ var from = permit.from;
514
+ var token = permit.token;
515
+ var amount = permit.amount;
516
+ var chainId = permit.chainId;
517
+ //iterate over chains
518
+ var permit712 = {
519
+ "types": {
520
+ "PermitSingle": [
521
+ {
522
+ "name": "details",
523
+ "type": "PermitDetails"
524
+ },
525
+ {
526
+ "name": "spender",
527
+ "type": "address"
528
+ },
529
+ {
530
+ "name": "sigDeadline",
531
+ "type": "uint256"
532
+ }
533
+ ],
534
+ "PermitDetails": [
535
+ {
536
+ "name": "token",
537
+ "type": "address"
538
+ },
539
+ {
540
+ "name": "amount",
541
+ "type": "uint160"
542
+ },
543
+ {
544
+ "name": "expiration",
545
+ "type": "uint48"
546
+ },
547
+ {
548
+ "name": "nonce",
549
+ "type": "uint48"
550
+ }
551
+ ],
552
+ "EIP712Domain": [
553
+ {
554
+ "name": "name",
555
+ "type": "string"
556
+ },
557
+ {
558
+ "name": "chainId",
559
+ "type": "uint256"
560
+ },
561
+ {
562
+ "name": "verifyingContract",
563
+ "type": "address"
564
+ }
565
+ ]
566
+ },
567
+ "domain": {
568
+ "name": "Permit2",
569
+ "chainId": permit.chainId,
570
+ "verifyingContract": "0x000000000022d473030f116ddee9f6b43ac78ba3"
571
+ },
572
+ "primaryType": "PermitSingle",
573
+ "message": {
574
+ "details": {
575
+ "token": permit.token,
576
+ "amount": permit.amount,
577
+ "expiration": permit.expiry,
578
+ "nonce": "1"
579
+ },
580
+ "spender": EIP155_MAINNET_CHAINS['eip155:' + chainId].universalRouter,
581
+ "sigDeadline": permit.sigDeadline
582
+ }
583
+ };
584
+ return permit712;
585
+ }
586
+ catch (e) {
587
+ console.error(e);
122
588
  }
123
589
  };
124
590
  var getAssetSupport = function () {
@@ -126,7 +592,7 @@ var getAssetSupport = function () {
126
592
  try {
127
593
  //iterate over chains
128
594
  var allAssets = Object.keys(pioneer_discovery_1.assetData);
129
- log.info(tag, "allAssets: ", allAssets);
595
+ // log.info(tag,"allAssets: ",allAssets)
130
596
  var supportedAssets = [];
131
597
  for (var i = 0; i < allAssets.length; i++) {
132
598
  var asset = allAssets[i];
@@ -142,9 +608,232 @@ var getAssetSupport = function () {
142
608
  console.error(e);
143
609
  }
144
610
  };
145
- var get_quote = function (quote) {
611
+ var get_quote_local = function (quote) {
146
612
  return __awaiter(this, void 0, void 0, function () {
147
- var tag, output, from, recipient, inputChain, outputChain, providerUrl, chainIdInt, chainId, provider, sellTokenContract, buyTokenContract, BUY_TOKEN, SELL_TOKEN, BUY_TOKEN_ADDRESS, SELL_TOKEN_ADDRESS, buyTokenAddress, symbolBuy, decimalsBuy, balance, sellTokenAddress, symbolSell, decimalsSell, FEE_AMOUNT, inputPRO, args, Protocol, QuoteIntent, CLIENT_PARAMS, tokenIn, tokenInChainId, tokenOut, tokenOutChainId, amount, tradeType, sendPortionEnabled, requestBody, response, uraQuoteResponse, calldata, value, nonce, gas, gasPrice, adjustedGasPrice, isZero, tx, e_1;
613
+ var tag, output, from, recipient, inputChain, outputChain, providerUrl, chainIdInt, chainId, provider, sellTokenContract, buyTokenContract, BUY_TOKEN, SELL_TOKEN, BUY_TOKEN_ADDRESS, SELL_TOKEN_ADDRESS, buyTokenAddress, symbolBuy, decimalsBuy, balance, sellTokenAddress, symbolSell, decimalsSell, inputPRO, spender, allowance, FEE_AMOUNT, args, Protocol, QuoteIntent, CLIENT_PARAMS, router, quoteResult, trade, permit, _a, calldata, value, nonce, gas, gasPrice, adjustedGasPrice, isZero, tx, e_2;
614
+ return __generator(this, function (_b) {
615
+ switch (_b.label) {
616
+ case 0:
617
+ tag = TAG + " | get_quote_local | ";
618
+ _b.label = 1;
619
+ case 1:
620
+ _b.trys.push([1, 16, , 17]);
621
+ output = {};
622
+ if (!quote.sellAsset)
623
+ throw new Error("missing sellAsset");
624
+ if (!quote.buyAsset)
625
+ throw new Error("missing buyAsset");
626
+ if (!quote.sellAmount)
627
+ throw new Error("missing sellAmount");
628
+ if (!quote.senderAddress)
629
+ throw new Error("missing senderAddress");
630
+ if (!quote.recipientAddress)
631
+ throw new Error("missing recipientAddress");
632
+ if (!quote.slippage)
633
+ throw new Error("missing slippage");
634
+ if (!networkSupport.includes(caipToNetworkId(quote.buyAsset))) {
635
+ throw new Error("unsupported buyAsset");
636
+ }
637
+ if (!networkSupport.includes(caipToNetworkId(quote.sellAsset))) {
638
+ throw new Error("unsupported sellAsset");
639
+ }
640
+ // if(!quote.permit2) throw new Error("missing permit2, required for uniswap")
641
+ output.txs = [];
642
+ from = quote.senderAddress;
643
+ recipient = quote.recipientAddress;
644
+ output.sellAsset = {};
645
+ output.source = 'uniswap';
646
+ output.sellAsset.caip = quote.sellAsset;
647
+ output.sellAmount = quote.sellAmount;
648
+ output.buyAsset = {};
649
+ output.buyAsset.caip = quote.buyAsset;
650
+ inputChain = caipToNetworkId(quote.sellAsset);
651
+ outputChain = caipToNetworkId(quote.buyAsset);
652
+ if (inputChain != outputChain)
653
+ throw new Error("Cross Chain not supported");
654
+ log.info("inputChain: ", inputChain);
655
+ providerUrl = EIP155_MAINNET_CHAINS[inputChain].rpc;
656
+ if (!providerUrl)
657
+ throw new Error("missing providerUrl");
658
+ log.info("providerUrl: ", providerUrl);
659
+ chainIdInt = parseInt(inputChain.replace('eip155:', ''));
660
+ log.info(tag, "chainIdInt: ", chainIdInt);
661
+ chainId = chainIdInt;
662
+ provider = new ethers.providers.JsonRpcProvider(providerUrl);
663
+ sellTokenContract = void 0, buyTokenContract = void 0;
664
+ BUY_TOKEN = void 0, SELL_TOKEN = void 0;
665
+ BUY_TOKEN_ADDRESS = void 0, SELL_TOKEN_ADDRESS = void 0;
666
+ if (!(quote.buyAsset.indexOf('erc20') > -1)) return [3 /*break*/, 5];
667
+ buyTokenAddress = quote.buyAsset.split(":")[2].toLowerCase();
668
+ BUY_TOKEN_ADDRESS = buyTokenAddress;
669
+ log.info("buyTokenAddress: ", buyTokenAddress);
670
+ buyTokenContract = new ethers.Contract(buyTokenAddress.toLowerCase(), ERC20_ABI, provider);
671
+ return [4 /*yield*/, buyTokenContract.symbol()];
672
+ case 2:
673
+ symbolBuy = _b.sent();
674
+ return [4 /*yield*/, buyTokenContract.decimals()];
675
+ case 3:
676
+ decimalsBuy = _b.sent();
677
+ log.info("symbolBuy: ", symbolBuy);
678
+ log.info("decimalsBuy: ", decimalsBuy);
679
+ return [4 /*yield*/, buyTokenContract.balanceOf(quote.senderAddress)];
680
+ case 4:
681
+ balance = _b.sent();
682
+ log.info("balance: ", balance.toString());
683
+ if (!symbolBuy)
684
+ throw new Error("missing symbolBuy");
685
+ if (!decimalsBuy)
686
+ throw new Error("missing decimalsBuy");
687
+ BUY_TOKEN = new sdk_core_1.Token(8453, buyTokenAddress, decimalsBuy, symbolBuy, symbolBuy.toLowerCase());
688
+ log.info("BUY_TOKEN: ", BUY_TOKEN);
689
+ return [3 /*break*/, 6];
690
+ case 5:
691
+ BUY_TOKEN = new sdk_core_1.Token(8453, '0x4200000000000000000000000000000000000006', 18, 'WETH');
692
+ BUY_TOKEN_ADDRESS = '0x4200000000000000000000000000000000000006';
693
+ log.info("BUY_TOKEN: ", BUY_TOKEN);
694
+ _b.label = 6;
695
+ case 6:
696
+ if (!(quote.sellAsset.indexOf('erc20') > -1)) return [3 /*break*/, 9];
697
+ sellTokenAddress = quote.sellAsset.split(":")[2].toLowerCase();
698
+ SELL_TOKEN_ADDRESS = sellTokenAddress;
699
+ log.info("sellTokenAddress: ", sellTokenAddress);
700
+ sellTokenContract = new ethers.Contract(sellTokenAddress, ERC20_ABI, provider);
701
+ return [4 /*yield*/, sellTokenContract.symbol()];
702
+ case 7:
703
+ symbolSell = _b.sent();
704
+ return [4 /*yield*/, sellTokenContract.decimals()];
705
+ case 8:
706
+ decimalsSell = _b.sent();
707
+ if (!symbolSell)
708
+ throw new Error("missing symbolSell");
709
+ if (!decimalsSell)
710
+ throw new Error("missing decimalsSell");
711
+ SELL_TOKEN = new sdk_core_1.Token(8453, sellTokenAddress, decimalsSell, symbolSell, symbolSell.toLowerCase());
712
+ log.info("SELL_TOKEN: ", SELL_TOKEN);
713
+ return [3 /*break*/, 10];
714
+ case 9:
715
+ //WETH
716
+ SELL_TOKEN = new sdk_core_1.Token(8453, '0x4200000000000000000000000000000000000006', 18, 'WETH');
717
+ SELL_TOKEN_ADDRESS = '0x4200000000000000000000000000000000000006';
718
+ _b.label = 10;
719
+ case 10:
720
+ inputPRO = ethers_1.utils.parseUnits(quote.sellAmount, 18).toString();
721
+ spender = EIP155_MAINNET_CHAINS['eip155:' + chainId].universalRouter;
722
+ return [4 /*yield*/, sellTokenContract.allowance(from, spender)];
723
+ case 11:
724
+ allowance = _b.sent();
725
+ log.info(tag, "inputPRO: ", inputPRO.toString());
726
+ log.info(tag, "allowance: ", allowance.toString());
727
+ if (allowance.lt(inputPRO)) {
728
+ log.info(tag, "allowance is less than sellAmount, approving...");
729
+ // build approval tx
730
+ throw Error('TODO APPROVE TOKENS');
731
+ }
732
+ FEE_AMOUNT = v3_sdk_1.FeeAmount.MEDIUM;
733
+ args = {
734
+ tokenInAddress: SELL_TOKEN_ADDRESS,
735
+ tokenInDecimals: SELL_TOKEN.decimals,
736
+ tokenInChainId: chainIdInt,
737
+ tokenOutAddress: BUY_TOKEN_ADDRESS,
738
+ tokenOutChainId: chainIdInt,
739
+ tokenOutDecimals: BUY_TOKEN.decimals,
740
+ amount: inputPRO,
741
+ tradeType: 'EXACT_INPUT',
742
+ sendPortionEnabled: false,
743
+ };
744
+ Protocol = void 0;
745
+ (function (Protocol) {
746
+ Protocol["V2"] = "V2";
747
+ Protocol["V3"] = "V3";
748
+ Protocol["MIXED"] = "MIXED";
749
+ })(Protocol || (Protocol = {}));
750
+ QuoteIntent = void 0;
751
+ (function (QuoteIntent) {
752
+ QuoteIntent["Pricing"] = "pricing";
753
+ QuoteIntent["Quote"] = "quote";
754
+ })(QuoteIntent || (QuoteIntent = {}));
755
+ CLIENT_PARAMS = {
756
+ protocols: [Protocol.V2, Protocol.V3, Protocol.MIXED],
757
+ };
758
+ router = (0, clientSideSmartOrderRouter_1.getRouter)(args.tokenInChainId);
759
+ // log.info(tag,'router: ',router)
760
+ log.info(tag, 'args: ', args);
761
+ return [4 /*yield*/, (0, clientSideSmartOrderRouter_1.getClientSideQuote)(args, router, CLIENT_PARAMS)];
762
+ case 12:
763
+ quoteResult = _b.sent();
764
+ log.info(tag, 'quoteResult: ', quoteResult);
765
+ if (!quoteResult)
766
+ throw Error("quoteResult is undefined");
767
+ return [4 /*yield*/, transformQuoteToTrade(args, quoteResult.data, QuoteMethod.CLIENT_SIDE_FALLBACK)];
768
+ case 13:
769
+ trade = _b.sent();
770
+ if (!trade)
771
+ throw Error("trade is undefined");
772
+ log.info(tag, 'trade: ', trade);
773
+ permit = {
774
+ details: {
775
+ token: quote.sellAsset.split(":")[2].toLowerCase(),
776
+ amount: '1000000000000000000000000',
777
+ expiration: toDeadline(PERMIT_EXPIRATION),
778
+ nonce: 0,
779
+ },
780
+ spender: EIP155_MAINNET_CHAINS['eip155:' + chainId].universalRouter,
781
+ sigDeadline: toDeadline(PERMIT_SIG_EXPIRATION),
782
+ signature: quote.permit2
783
+ };
784
+ _a = universal_router_sdk_1.SwapRouter.swapERC20CallParameters(trade, {
785
+ // recipient: from,
786
+ // @ts-ignore
787
+ slippageTolerance: slippageTolerance,
788
+ // deadlineOrPreviousBlockhash: deadline,
789
+ // inputTokenPermit: undefined,
790
+ // @ts-ignore
791
+ inputTokenPermit: permit,
792
+ // fee: options.feeOptions,
793
+ }), calldata = _a.calldata, value = _a.value;
794
+ log.info("calldata: ", calldata);
795
+ log.info("value: ", value);
796
+ return [4 /*yield*/, provider.getTransactionCount(from, "latest")];
797
+ case 14:
798
+ nonce = _b.sent();
799
+ log.info("nonce: ", nonce);
800
+ gas = "0x".concat(BigInt("935120").toString(16)) // 935120
801
+ ;
802
+ return [4 /*yield*/, provider.getGasPrice()];
803
+ case 15:
804
+ gasPrice = _b.sent();
805
+ log.info("gasPrice: ", gasPrice.toString());
806
+ adjustedGasPrice = gasPrice.mul(ethers.BigNumber.from(110)).div(ethers.BigNumber.from(100));
807
+ isZero = function isZero(hexNumberString) {
808
+ return hexNumberString === '0' || /^0x0*$/.test(hexNumberString);
809
+ };
810
+ tx = __assign(__assign({ from: from, to: EIP155_MAINNET_CHAINS['eip155:' + chainId].universalRouter, chainId: chainId, data: calldata }, (value && !isZero(value) ? { value: (0, v3_sdk_1.toHex)(value) } : {})), { gas: gas, gasPrice: (0, v3_sdk_1.toHex)(adjustedGasPrice), nonce: (0, v3_sdk_1.toHex)(nonce) });
811
+ output.txs.push({
812
+ type: "evm",
813
+ description: 'swap tokens',
814
+ chain: inputChain,
815
+ txParams: tx
816
+ });
817
+ output.meta = {
818
+ quoteMode: "ERC20-ERC20"
819
+ };
820
+ output.steps = 1;
821
+ output.complete = true;
822
+ output.type = 'EVM';
823
+ output.id = uuid();
824
+ return [2 /*return*/, output];
825
+ case 16:
826
+ e_2 = _b.sent();
827
+ console.error(e_2);
828
+ return [3 /*break*/, 17];
829
+ case 17: return [2 /*return*/];
830
+ }
831
+ });
832
+ });
833
+ };
834
+ var get_quote_api = function (quote) {
835
+ return __awaiter(this, void 0, void 0, function () {
836
+ var tag, output, from, recipient, inputChain, outputChain, providerUrl, chainIdInt, chainId, provider, sellTokenContract, buyTokenContract, BUY_TOKEN, SELL_TOKEN, BUY_TOKEN_ADDRESS, SELL_TOKEN_ADDRESS, buyTokenAddress, symbolBuy, decimalsBuy, balance, sellTokenAddress, symbolSell, decimalsSell, FEE_AMOUNT, inputPRO, args, Protocol, QuoteIntent, CLIENT_PARAMS, tokenIn, tokenInChainId, tokenOut, tokenOutChainId, amount, tradeType, sendPortionEnabled, requestBody, response, uraQuoteResponse, calldata, value, nonce, gas, gasPrice, adjustedGasPrice, isZero, tx, e_3;
148
837
  return __generator(this, function (_a) {
149
838
  switch (_a.label) {
150
839
  case 0:
@@ -176,6 +865,7 @@ var get_quote = function (quote) {
176
865
  from = quote.senderAddress;
177
866
  recipient = quote.recipientAddress;
178
867
  output.sellAsset = {};
868
+ output.source = 'uniswap';
179
869
  output.sellAsset.caip = quote.sellAsset;
180
870
  output.sellAmount = quote.sellAmount;
181
871
  output.buyAsset = {};
@@ -345,9 +1035,9 @@ var get_quote = function (quote) {
345
1035
  output.type = 'EVM';
346
1036
  return [2 /*return*/, output];
347
1037
  case 14:
348
- e_1 = _a.sent();
349
- console.error(tag, "e: ", e_1);
350
- throw e_1;
1038
+ e_3 = _a.sent();
1039
+ console.error(tag, "e: ", e_3);
1040
+ throw e_3;
351
1041
  case 15: return [2 /*return*/];
352
1042
  }
353
1043
  });