UNPKG

baluni-api

Version:
226 lines (225 loc) 11.7 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildSwapUniswap = void 0; const ethers_1 = require("ethers"); const ERC20_json_1 = __importDefault(require("../../abis/common/ERC20.json")); const constants_1 = require("../../constants"); const dotenv_1 = __importDefault(require("dotenv")); const bestQuote_1 = require("../../utils/uniswap/bestQuote"); const sdk_1 = require("@uniswap/sdk"); const Router_json_1 = __importDefault(require("../../abis/infra/Router.json")); dotenv_1.default.config(); const debug = true; function buildSwapUniswap(swaps) { return __awaiter(this, void 0, void 0, function* () { console.log('Building Batch Swap tx'); const wallet = swaps[0].wallet; const walletAddress = swaps[0].address; const protocol = constants_1.PROTOCOLS[swaps[0].chainId][swaps[0].protocol]; const infraRouter = String(constants_1.INFRA[swaps[0].chainId].ROUTER); const InfraRouterContract = new ethers_1.Contract(infraRouter, Router_json_1.default, wallet); const uniRouter = String(protocol.ROUTER); const Approvals = []; const ApprovalsAgent = []; const Calldatas = []; let TokensReturn = []; if (debug) console.log('::API::UNISWAP::ROUTER', infraRouter); if (debug) console.log('::API::UNISWAP::UNIROUTER', uniRouter); const tokensSet = new Set(); for (const swap of swaps) { const agentAddress = yield (InfraRouterContract === null || InfraRouterContract === void 0 ? void 0 : InfraRouterContract.getAgentAddress(swap.address)); if (debug) console.log('::API: -----------------------------------------------'); if (debug) console.log('::API::UNISWAP::AGENT', agentAddress); const tokenAAddress = swap.reverse ? swap.token1 : swap.token0; const tokenBAddress = swap.reverse ? swap.token0 : swap.token1; const tokenAContract = new ethers_1.Contract(tokenAAddress, ERC20_json_1.default, wallet); const tokenABalance = yield (tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.balanceOf(swap.address)); const tokenBContract = new ethers_1.Contract(tokenBAddress, ERC20_json_1.default, wallet); if (debug) console.log('::API::UNISWAP::TOKEN_A', tokenAAddress); if (debug) console.log('::API::UNISWAP::TOKEN_B', tokenBAddress); if (debug) console.log('::API::UNISWAP::BALANCE', Number(tokenABalance)); const allowanceAgent = yield (tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.allowance(swap.address, agentAddress)); const tokenADecimals = yield tokenAContract.decimals(); const tokenBDecimals = yield tokenBContract.decimals(); let adjAmount = ethers_1.ethers.BigNumber.from(0); if (debug) console.log('::API::UNISWAP::AMOUNT:', String(swap.amount)); adjAmount = (0, bestQuote_1.getAdjAmount)(swap.amount, tokenADecimals); if (debug) console.log('::API::UNISWAP::ADJ_AMOUNT:', String(adjAmount)); // Allowance for Sender to Agnet // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- if (adjAmount.gt(allowanceAgent)) { if (debug) console.log('::API::UNISWAP::MISSING_ALLOWANCE_SENDER_AGENT'); const dataApproveToAgent = tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.interface.encodeFunctionData('approve', [agentAddress, ethers_1.ethers.constants.MaxUint256]); const approvalToAgent = { to: tokenAAddress, value: 0, data: dataApproveToAgent, }; Approvals.push(approvalToAgent); } else { if (debug) console.log('::API::UNISWAP::FOUND_ALLOWANCE_SENDER_AGENT'); } // Check allowance Router to UniRouter // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // const allowanceAgentToUniRouter = await tokenAContract?.allowance( // agentAddress, // uniRouter // ) // if (adjAmount.gt(allowanceAgentToUniRouter)) { // if (debug) console.log('::API::UNISWAP::MISSING_ALLOWANCE_AGENT_UNISWAP') // const calldataApproveAgentToRouter = // tokenAContract.interface.encodeFunctionData('approve', [ // uniRouter, // ethers.constants.MaxUint256, // ]) // const approvalAgentToRouter = { // to: tokenAAddress, // value: 0, // data: calldataApproveAgentToRouter, // } // ApprovalsAgent.push(approvalAgentToRouter) // } else { // if (debug) console.log('::API::UNISWAP::FOUND_ALLOWANCE_AGENT_UNISWAP') // } // Transfer tokens from Sender to Agent // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- const dataTransferFromSenderToAgent = tokenAContract.interface.encodeFunctionData('transferFrom', [ swap.address, agentAddress, adjAmount, ]); const transferFromSenderToAgent = { to: tokenAAddress, value: 0, data: dataTransferFromSenderToAgent, }; if (transferFromSenderToAgent) if (debug) console.log('::API::UNISWAP::BUILD_TRANSFER_FROM_SENDER_AGENT'); Calldatas.push(transferFromSenderToAgent); // Encode Swap tx to Uni Router // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // const quote = await quotePair( // tokenAAddress, // tokenBAddress, // Number(swap.chainId) // ); // const slippageTolerance = swap.slippage; const currency = { address: tokenBAddress, decimals: tokenBDecimals, symbol: yield tokenBContract.symbol(), name: yield tokenBContract.name(), }; const currencyAmount = { address: tokenAAddress, decimals: tokenADecimals, symbol: yield tokenAContract.symbol(), name: yield tokenAContract.name(), }; const bestRoute = yield (0, bestQuote_1.route)({ chainId: Number(137), recipient: agentAddress, amount: adjAmount, tradeType: sdk_1.TradeType.EXACT_INPUT, currencyAmount: currencyAmount, currency: currency, slippage: swaps[0].slippage, }); const swapMultiAgentToRouter = { to: bestRoute.methodParameters.to, value: bestRoute.methodParameters.value, data: bestRoute.methodParameters.calldata, }; const allowanceAgentToUniversalRouter = yield (tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.allowance(agentAddress, bestRoute.methodParameters.to)); if (adjAmount.gt(allowanceAgentToUniversalRouter)) { if (debug) console.log('::API::UNISWAP::MISSING_ALLOWANCE_AGENT_UNIVERSAL_ROUTER'); const calldataApproveAgentToRouter = tokenAContract.interface.encodeFunctionData('approve', [ bestRoute.methodParameters.to, ethers_1.ethers.constants.MaxUint256, ]); const approvalAgentToRouter = { to: tokenAAddress, value: 0, data: calldataApproveAgentToRouter, }; Calldatas.push(approvalAgentToRouter); } else { if (debug) console.log('::API::UNISWAP::FOUND_ALLOWANCE_AGENT_UNIVERSAL_ROUTER'); } const allowanceSenderToUniversalRouter = yield (tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.allowance(walletAddress, bestRoute.methodParameters.to)); if (adjAmount.gt(allowanceSenderToUniversalRouter)) { if (debug) console.log('::API::UNISWAP::MISSING_ALLOWANCE_SENDER-UNIVERSAL_ROUTER'); const calldataApproveAgentToRouter = tokenAContract.interface.encodeFunctionData('approve', [ bestRoute.methodParameters.to, ethers_1.ethers.constants.MaxUint256, ]); const approvalAgentToRouter = { to: tokenAAddress, value: 0, data: calldataApproveAgentToRouter, }; Approvals.push(approvalAgentToRouter); } else { if (debug) console.log('::API::UNISWAP::FOUND_ALLOWANCE_AGENT_UNIVERSAL_ROUTER'); } for (let i = 0; i < bestRoute.route.length; i++) { bestRoute.route[i].tokenPath.forEach(token => tokensSet.add(token.address)); } if (swapMultiAgentToRouter) if (debug) console.log('::API::UNISWAP::BUILD_AGENT_EXACT_INPUT_TO_UNIROUTER'); Calldatas.push(swapMultiAgentToRouter); } TokensReturn = Array.from(tokensSet); if (debug) console.log('::API::UNISWAP::Approvals', Approvals.length); if (debug) console.log('::API::UNISWAP::ApprovalsAgent', ApprovalsAgent.length); if (debug) console.log('::API::UNISWAP::Calldatas', Calldatas.length); if (debug) console.log('::API::UNISWAP::TokensReturn', TokensReturn.length); return { Approvals, ApprovalsAgent, Calldatas, TokensReturn, }; }); } exports.buildSwapUniswap = buildSwapUniswap;