UNPKG

baluni-api

Version:
223 lines (222 loc) 11.6 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.redeemFromYearnBatched = exports.redeemFromYearn = void 0; const YearnVault_json_1 = __importDefault(require("../../abis/yearn/YearnVault.json")); const ethers_1 = require("ethers"); const constants_1 = require("../../constants"); const Router_json_1 = __importDefault(require("../../abis/infra/Router.json")); function redeemFromYearn(wallet, pool, amount, receiver, chainId) { return __awaiter(this, void 0, void 0, function* () { try { const provider = new ethers_1.ethers.providers.JsonRpcProvider(constants_1.NETWORKS[chainId]); const vault = new ethers_1.ethers.Contract(pool, YearnVault_json_1.default, wallet); const vaultBalance = yield vault.balanceOf(receiver); const gasLimit = 9000000; const gasPrice = yield (provider === null || provider === void 0 ? void 0 : provider.getGasPrice()); const gas = gasPrice.add(gasPrice.div(10)); if (vaultBalance.lt(amount)) { throw new Error('::API:: Insufficient balance'); } const infraRouter = String(constants_1.INFRA[chainId].ROUTER); const InfraRouterContract = new ethers_1.ethers.Contract(infraRouter, Router_json_1.default, wallet); const agentAddress = yield (InfraRouterContract === null || InfraRouterContract === void 0 ? void 0 : InfraRouterContract.getAgentAddress(receiver)); let Approvals = []; let Calldatas = []; let TokensReturn = []; const allowanceAgent = yield (vault === null || vault === void 0 ? void 0 : vault.allowance(receiver, agentAddress)); // Allowance for Agent // ------------------------------------------------------------------------- if (allowanceAgent.lt(amount)) { console.log('::API::YEARN::REDEEM MISSING_ALLOWANCE_SENDER_FOR_AGENT'); const approveData = vault.interface.encodeFunctionData('approve', [ agentAddress, ethers_1.ethers.constants.MaxUint256, ]); const approvalCalldata = { to: vault.address, value: 0, data: approveData, // gasLimit: gasLimit, // gasPrice: gas, }; Approvals.push(approvalCalldata); } else { console.log('::API::YEARN::REDEEM FOUND_ALLOWANCE_SENDER_FOR_AGENT'); } const allowanceAgentYearn = yield (vault === null || vault === void 0 ? void 0 : vault.allowance(agentAddress, pool)); // Allowance for Yearn Vault // ------------------------------------------------------------------------- if (allowanceAgentYearn.lt(amount)) { console.log('::API::YEARN::REDEEM MISSING_ALLOWANCE_AGENT_FOR_YEARN'); const approveData = vault.interface.encodeFunctionData('approve', [ pool, ethers_1.ethers.constants.MaxUint256, ]); const approvalCalldata = { to: vault.address, value: 0, data: approveData, // gasLimit: gasLimit, // gasPrice: gas, }; Calldatas.push(approvalCalldata); } else { console.log('::API::YEARN::REDEEM FOUND_ALLOWANCE_AGENT_FOR_YEARN'); } // Transfer From // ------------------------------------------------------------------------- const transferFromData = vault.interface.encodeFunctionData('transferFrom', [receiver, agentAddress, amount]); const transferFromCalldata = { to: vault.address, value: 0, data: transferFromData, // gasLimit: gasLimit, // gasPrice: gas, }; Calldatas.push(transferFromCalldata); if (transferFromCalldata) console.log('::API::YEARN::REDEEM BUILD_TRANSFER_FROM_SENDER_TO_AGENT'); // Redeem // ------------------------------------------------------------------------- const redeemData = vault.interface.encodeFunctionData('redeem(uint256,address,address,uint256)', [amount, agentAddress, agentAddress, ethers_1.BigNumber.from(200)]); const redeemCalldata = { to: pool, value: 0, data: redeemData, // gasLimit: gasLimit, // gasPrice: gas, }; Calldatas.push(redeemCalldata); if (redeemCalldata) console.log('::API::YEARN::REDEEM OK_REDEEM'); const asset = yield vault.asset(); TokensReturn.push(asset); console.log('::API:: Approvals', Approvals.length); console.log('::API:: Calldatas', Calldatas.length); console.log('::API:: TokensReturn', TokensReturn.length); return { Approvals, Calldatas, TokensReturn, }; } catch (e) { console.log(e); } }); } exports.redeemFromYearn = redeemFromYearn; function redeemFromYearnBatched(redeems) { return __awaiter(this, void 0, void 0, function* () { let Approvals = []; let Calldatas = []; let TokensReturn = []; for (let i = 0; i < redeems.length; i++) { const pool = redeems[i].pool; const amount = redeems[i].amount; const wallet = redeems[i].wallet; const provider = new ethers_1.ethers.providers.JsonRpcProvider(constants_1.NETWORKS[redeems[0].chainId]); const receiver = redeems[i].receiver; const chainId = redeems[i].chainId; const vault = new ethers_1.ethers.Contract(pool, YearnVault_json_1.default, wallet); const vaultBalance = yield vault.balanceOf(receiver); console.log('::API::YEARN::REDEEM:BATCHED VAULT_BALANCE', Number(vaultBalance)); console.log('::API::YEARN::REDEEM:BATCHED AMOUNT', Number(amount)); if (vaultBalance.lt(amount)) { throw new Error('::API::YEARN::REDEEM:BATCHED Insufficient balance'); } const infraRouter = String(constants_1.INFRA[chainId].ROUTER); const InfraRouterContract = new ethers_1.ethers.Contract(infraRouter, Router_json_1.default, wallet); const agentAddress = yield (InfraRouterContract === null || InfraRouterContract === void 0 ? void 0 : InfraRouterContract.getAgentAddress(receiver)); const allowanceAgent = yield (vault === null || vault === void 0 ? void 0 : vault.allowance(receiver, agentAddress)); console.log('::API::YEARN::REDEEM:BATCHED AGENT', agentAddress); console.log('::API::YEARN::REDEEM:BATCHED ALLOWANCE', Number(allowanceAgent)); // Allowance for Agent // ------------------------------------------------------------------------- if (allowanceAgent.lt(amount)) { console.log('::API::YEARN::REDEEM:BATCHED MISSING_ALLOWANCE_SENDER_FOR_AGENT'); const approveData = vault.interface.encodeFunctionData('approve', [ agentAddress, ethers_1.ethers.constants.MaxUint256, ]); const approvalCalldata = { to: vault.address, value: 0, data: approveData, }; Approvals.push(approvalCalldata); } else { console.log('::API::YEARN::REDEEM:BATCHED FOUND_ALLOWANCE_SENDER_FOR_AGENT'); } const allowanceAgentYearn = yield (vault === null || vault === void 0 ? void 0 : vault.allowance(agentAddress, pool)); // Allowance for Yearn Vault // ------------------------------------------------------------------------- if (allowanceAgentYearn.lt(amount)) { console.log('::API:: NO_ALLOWANCE_AGENT_FOR_YEARN'); const approveData = vault.interface.encodeFunctionData('approve', [ pool, ethers_1.ethers.constants.MaxUint256, ]); const approvalCalldata = { to: vault.address, value: 0, data: approveData, }; Calldatas.push(approvalCalldata); } else { console.log('::API::YEARN::REDEEM:BATCHED FOUND_ALLOWANCE_AGENT_FOR_YEARN'); } // Transfer From // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- const transferFromData = vault.interface.encodeFunctionData('transferFrom', [receiver, agentAddress, amount]); const transferFromCalldata = { to: vault.address, value: 0, data: transferFromData, }; if (transferFromCalldata) console.log('::API::YEARN::REDEEM:BATCHED BUILD_TRANSFER_FROM_SENDER_TO_AGENT'); Calldatas.push(transferFromCalldata); // Redeem // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- const redeemData = vault.interface.encodeFunctionData('redeem(uint256,address,address,uint256)', [amount, agentAddress, agentAddress, ethers_1.BigNumber.from(200)]); const redeemCalldata = { to: pool, value: 0, data: redeemData, }; Calldatas.push(redeemCalldata); if (redeemCalldata) console.log('::API::YEARN::REDEEM:BATCHED BUILD_REDEEM'); const asset = yield vault.asset(); TokensReturn.push(asset); } console.log('::API::YEARN::REDEEM:BATCHED Approvals', Approvals.length); console.log('::API::YEARN::REDEEM:BATCHED Calldatas', Calldatas.length); console.log('::API::YEARN::REDEEM:BATCHED TokensReturn', TokensReturn.length); return { Approvals, Calldatas, TokensReturn, }; }); } exports.redeemFromYearnBatched = redeemFromYearnBatched;