UNPKG

baluni-api

Version:
218 lines (217 loc) 10.8 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.buildSwapOdos = void 0; const ethers_1 = require("ethers"); const ERC20_json_1 = __importDefault(require("../../abis/common/ERC20.json")); const Router_json_1 = __importDefault(require("../../abis/infra/Router.json")); const constants_1 = require("../../constants"); const dotenv_1 = __importDefault(require("dotenv")); const constants_2 = require("../../constants"); dotenv_1.default.config(); function buildSwapOdos(wallet, sender, chainId, inputTokens, outputTokens, slippageLimitPercent, referralCode, disableRFQs, compact) { return __awaiter(this, void 0, void 0, function* () { console.log('Building Batch Swap tx'); const odosRouter = String(constants_1.PROTOCOLS[chainId]['odos'].ROUTER); const infraRouter = String(constants_1.INFRA[chainId].ROUTER); const InfraRouterContract = new ethers_1.Contract(infraRouter, Router_json_1.default, wallet); const agentAddress = yield (InfraRouterContract === null || InfraRouterContract === void 0 ? void 0 : InfraRouterContract.getAgentAddress(sender)); const Approvals = []; const ApprovalsAgent = []; const Calldatas = []; const TokensReturn = []; console.log('::API::ODOS::ROUTER', infraRouter); for (const token of inputTokens) { console.log('::API::ODOS::AGENT', agentAddress); console.log('::API::ODOS::TOKEN_A', token.tokenAddress); const tokenAContract = new ethers_1.Contract(token.tokenAddress, ERC20_json_1.default, wallet); const adjAmount = ethers_1.ethers.BigNumber.from(token.amount); // Allowance for Sender to Agent // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- const allowanceAgent = yield (tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.allowance(sender, agentAddress)); if (adjAmount.gt(allowanceAgent)) { console.log('::API::ODOS::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: token.tokenAddress, value: 0, data: dataApproveToAgent, }; Approvals.push(approvalToAgent); } else { console.log('::API::ODOS::FOUND_ALLOWANCE_SENDER_AGENT'); } // Allowance for Sender to Router // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // const allowanceSenderRouter = await tokenAContract?.allowance( // sender, // infraRouter // ) // if (adjAmount.gt(allowanceSenderRouter)) { // console.log( // '::API::ODOS::BUILDSWAP:BATCHED MISSING_ALLOWANCE_SENDER_TO_ROUTER' // ) // const dataApproveToRouter = tokenAContract?.interface.encodeFunctionData( // 'approve', // [infraRouter, ethers.constants.MaxUint256] // ) // const approvalToRouter = { // to: token.tokenAddress, // value: 0, // data: dataApproveToRouter, // } // Approvals.push(approvalToRouter) // } else { // console.log( // '::API::ODOS::BUILDSWAP:BATCHED FOUND_ALLOWANCE_SENDER_TO_ROUTER' // ) // } // Allowance for Agent to OdosRouter // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- const allowanceAgentToOdosRouter = yield (tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.allowance(agentAddress, odosRouter)); if (adjAmount.gt(allowanceAgentToOdosRouter)) { console.log('::API::ODOS::MISSING_ALLOWANCE_AGENT_ODOS'); const dataApproveToOdosROuter = tokenAContract === null || tokenAContract === void 0 ? void 0 : tokenAContract.interface.encodeFunctionData('approve', [ odosRouter, ethers_1.ethers.constants.MaxUint256, ]); const approvalToAgentToOdosROuter = { to: token.tokenAddress, value: 0, data: dataApproveToOdosROuter, }; ApprovalsAgent.push(approvalToAgentToOdosROuter); } else { console.log('::API::ODOS::FOUND_ALLOWANCE_AGENT_ODOS'); } // Check allowance Sender to OdosRouter // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // const allowanceSenderToOdosRouter = await tokenAContract?.allowance( // sender, // odosRouter // ) // if (adjAmount.gt(allowanceSenderToOdosRouter)) { // console.log( // '::API::ODOS::BUILDSWAP:BATCHED MISSING_ALLOWANCE_SENDER_TO_ODOSROUTER' // ) // const calldataApproveSenderToOdosRouter = // tokenAContract.interface.encodeFunctionData('approve', [ // odosRouter, // ethers.constants.MaxUint256, // ]) // const approvalSenderToOdosRouter = { // to: token.tokenAddress, // value: 0, // data: calldataApproveSenderToOdosRouter, // } // Approvals.push(approvalSenderToOdosRouter) // } else { // console.log( // '::API::ODOS::BUILDSWAP:BATCHED FOUND_ALLOWANCE_SENDER_TO_ODOSROUTER' // ) // } // Transfer tokens from Sender to Agent // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- const dataTransferFromSenderToAgent = tokenAContract.interface.encodeFunctionData('transferFrom', [ sender, agentAddress, token.amount, ]); const transferFromSenderToAgent = { to: token.tokenAddress, value: 0, data: dataTransferFromSenderToAgent, }; if (transferFromSenderToAgent) console.log('::API::ODOS::BUILD_TRANSFER_FROM_SENDER_AGENT'); Calldatas.push(transferFromSenderToAgent); } // Build Odos Calldata // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- const quoteRequestBody = { chainId: chainId, inputTokens: inputTokens, outputTokens: outputTokens, gasPrice: 80, userAddr: agentAddress, slippageLimitPercent: slippageLimitPercent, sourceBlacklist: [], sourceWhitelist: [], disableRFQs: disableRFQs, referralCode: 3844415834, compact: compact, pathVizImage: true, }; console.log('::API::ODOS:: QUOTE_REQUEST_BODY', quoteRequestBody); const responseQuote = yield fetch(constants_2.ODOS_QUOTE, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(quoteRequestBody), }); let quote; if (responseQuote.status === 200) { quote = yield responseQuote.json(); console.log(quote); } else { console.error('Error in Quote:', responseQuote); return; } const assembleRequestBody = { userAddr: agentAddress, pathId: quote.pathId, simulate: false, }; const responseAssemble = yield fetch(constants_2.ODOS_ASSEMBLE, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(assembleRequestBody), }); if (responseAssemble.status === 200) { const assembledTransaction = yield responseAssemble.json(); console.log(assembledTransaction); const tx = { to: assembledTransaction.transaction.to, value: Number(assembledTransaction.transaction.value), data: assembledTransaction.transaction.data, }; Calldatas.push(tx); } else { console.error('Error in Transaction Assembly:', responseAssemble); } for (const token of outputTokens) { TokensReturn.push(token.tokenAddress); } console.log('::API::ODOS::Approvals', Approvals.length); console.log('::API::ODOS::ApprovalsAgent', ApprovalsAgent.length); console.log('::API::ODOS::Calldatas', Calldatas.length); console.log('::API::ODOS::TokensReturn', TokensReturn.length); return { Approvals, ApprovalsAgent, Calldatas, TokensReturn, }; }); } exports.buildSwapOdos = buildSwapOdos;