baluni-api
Version:
Api for baluni-cli
223 lines (222 loc) • 11.6 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.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;