baluni-api
Version:
Api for baluni-cli
226 lines (225 loc) • 11.7 kB
JavaScript
"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;