descent-js
Version:
A Typescript library for interacting with the Descent Protocol
111 lines (110 loc) • 4.2 kB
JavaScript
// src/services/getters.ts
import { ethers } from "ethers";
import { getContractAddress } from "../contracts/getContractAddresses.mjs";
import { VaultGetters__factory } from "../generated.mjs";
var getVault = async (collateral, owner, chainId, contract, internal) => {
const collateralAddress = getContractAddress(collateral)[chainId];
const vaultContractAddress = getContractAddress("Vault")[chainId];
const vaultGettersAddress = getContractAddress("VaultGetters")[chainId];
let iface = internal.getInterface(VaultGetters__factory.abi);
const getVaultData = iface.encodeFunctionData("getVault", [
vaultContractAddress,
collateralAddress,
owner
]);
const getAvailablexNGN = iface.encodeFunctionData("getMaxBorrowable", [
vaultContractAddress,
collateralAddress,
owner
]);
const getAvailableCollateral = iface.encodeFunctionData("getMaxWithdrawable", [
vaultContractAddress,
collateralAddress,
owner
]);
const getCollateralRatio = iface.encodeFunctionData("getCollateralRatio", [
vaultContractAddress,
collateralAddress,
owner
]);
const getHealthFactor = iface.encodeFunctionData("getHealthFactor", [
vaultContractAddress,
collateralAddress,
owner
]);
const multiCallData = [
{
target: vaultGettersAddress,
callData: getVaultData
},
{
target: vaultGettersAddress,
callData: getAvailablexNGN
},
{
target: vaultGettersAddress,
callData: getAvailableCollateral
},
{
target: vaultGettersAddress,
callData: getCollateralRatio
},
{
target: vaultGettersAddress,
callData: getHealthFactor
}
];
const getVaultInfo = (await contract.getMultistaticcallContract()).multiStaticcall(multiCallData);
const returnData = (await getVaultInfo).map((item) => item.returnDatum);
const fnc = [
"getVault",
"getMaxBorrowable",
"getMaxWithdrawable",
"getCollateralRatio",
"getHealthFactor"
];
let formattedReturnData = [];
for (let i = 0; i < fnc.length; i++) {
const currentFnc = fnc[i];
formattedReturnData.push(iface.decodeFunctionResult(currentFnc, returnData[i]));
}
const depositedCollateral = formattedReturnData[0][0];
const borrowedAmount = formattedReturnData[0][1];
const _accruedFees = formattedReturnData[0][2];
const borrowableAmount = formattedReturnData[1];
const withdrawableCollateral = formattedReturnData[2];
const collateralRatio = formattedReturnData[3];
const healthFactor = formattedReturnData[4];
return {
healthFactor: healthFactor ? "Safe" : "Unsafe",
depositedCollateral: ethers.formatUnits(depositedCollateral.toString(), 6),
collateralLocked: Number(ethers.formatUnits(depositedCollateral.toString(), 6)) - Number(ethers.formatUnits(withdrawableCollateral.toString(), 6)),
borrowedAmount: ethers.formatUnits(borrowedAmount.toString(), 18),
accruedFees: ethers.formatUnits(_accruedFees.toString(), 18),
currentCollateralRatio: `${ethers.formatUnits(collateralRatio.toString(), 16)}%`,
availableCollateral: ethers.formatUnits(withdrawableCollateral.toString(), 6),
availablexNGN: ethers.formatUnits(borrowableAmount.toString(), 18)
};
};
var getCollateralData = async (collateral, chainId, contract) => {
const collateralAddress = getContractAddress(collateral)[chainId];
const vaultContractAddress = getContractAddress("Vault")[chainId];
const getCollateralInfo = (await contract.getVaultGetterContract()).getCollateralInfo(
vaultContractAddress,
collateralAddress
);
const returnData = (await getCollateralInfo).map((item) => item);
return {
totalDepositedCollateral: ethers.formatUnits(returnData[0].toString(), 6),
totalBorrowedAmount: ethers.formatUnits(returnData[1].toString(), 18),
liquidationThreshold: `${ethers.formatUnits(returnData[2].toString(), 16)}%`,
debtCeiling: ethers.formatUnits(returnData[3].toString(), 18),
rate: ethers.formatUnits(returnData[4].toString(), 6),
minDeposit: ethers.formatUnits(returnData[5].toString(), 18),
collateralPrice: ethers.formatUnits(returnData[6].toString(), 6)
};
};
export {
getCollateralData,
getVault
};