baluni-api
Version:
Api for baluni-cli
218 lines (217 loc) • 10.8 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.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;