UNPKG

@descent-protocol/sdk

Version:

A Typescript library for interacting with the Descent Protocol

163 lines (162 loc) 8.02 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var vault_exports = {}; __export(vault_exports, { VaultHealthFactor: () => VaultHealthFactor, VaultOperations: () => VaultOperations, burnCurrency: () => burnCurrency, collateralizeVault: () => collateralizeVault, mintCurrency: () => mintCurrency, setupVault: () => setupVault, withdrawCollateral: () => withdrawCollateral }); module.exports = __toCommonJS(vault_exports); var import_ethers = require("ethers"); var import_getContractAddresses = require("../contracts/getContractAddresses"); var import_factories = require("../generated/factories"); var import_contracts = require("../contracts"); var VaultHealthFactor = /* @__PURE__ */ ((VaultHealthFactor2) => { VaultHealthFactor2["UNSAFE"] = "UNSAFE"; VaultHealthFactor2["SAFE"] = "SAFE"; return VaultHealthFactor2; })(VaultHealthFactor || {}); var VaultOperations = /* @__PURE__ */ ((VaultOperations2) => { VaultOperations2[VaultOperations2["Invalid"] = 0] = "Invalid"; VaultOperations2[VaultOperations2["DepositCollateral"] = 1] = "DepositCollateral"; VaultOperations2[VaultOperations2["WithdrawCollateral"] = 2] = "WithdrawCollateral"; VaultOperations2[VaultOperations2["MintCurrency"] = 3] = "MintCurrency"; VaultOperations2[VaultOperations2["BurnCurrency"] = 4] = "BurnCurrency"; VaultOperations2[VaultOperations2["Permit2_PermitTransferFrom"] = 5] = "Permit2_PermitTransferFrom"; VaultOperations2[VaultOperations2["Permit2_Permit"] = 5] = "Permit2_Permit"; VaultOperations2[VaultOperations2["Permit2_TransferFrom"] = 6] = "Permit2_TransferFrom"; VaultOperations2[VaultOperations2["ERC20_Permit"] = 7] = "ERC20_Permit"; VaultOperations2[VaultOperations2["ERC20_TransferFrom"] = 8] = "ERC20_TransferFrom"; return VaultOperations2; })(VaultOperations || {}); const setupVault = async (owner, chainId, transaction, internal) => { const vaultRouterAddress = (0, import_getContractAddresses.getContractAddress)("VaultRouter", chainId); const to = (0, import_getContractAddresses.getContractAddress)("Vault", chainId); let iface = internal.getInterface(import_factories.Vault__factory.abi); const data = iface.encodeFunctionData("rely", [vaultRouterAddress]); const txConfig = await internal.getTransactionConfig({ from: owner, to, data }); const relyResult = await transaction.send(txConfig, {}); return relyResult; }; const collateralizeVault = async (amount, collateral, owner, chainId, transaction, internal) => { const collateralAddress = (0, import_getContractAddresses.getContractAddress)(collateral, chainId); const _amount = BigInt(amount) * BigInt(1e6); const to = (0, import_getContractAddresses.getContractAddress)("Vault", chainId); let iface = internal.getInterface(import_factories.Vault__factory.abi); const data = iface.encodeFunctionData("depositCollateral", [collateralAddress, owner, _amount]); const txConfig = await internal.getTransactionConfig({ from: owner, to, data }); const depositResResult = await transaction.send(txConfig, {}); return depositResResult; }; const withdrawCollateral = async (amount, collateral, owner, chainId, transaction, internal, signer) => { const collateralAddress = (0, import_getContractAddresses.getContractAddress)(collateral, chainId); const vaultContractAddress = (0, import_getContractAddresses.getContractAddress)("Vault", chainId); const vaultGetterAddress = (0, import_getContractAddresses.getContractAddress)("VaultGetters", chainId); const vaultGetterContract = (0, import_contracts.Contract)(vaultGetterAddress, import_factories.VaultGetters__factory.abi, signer); const _amount = BigInt(amount) * BigInt(1e6); const to = (0, import_getContractAddresses.getContractAddress)("Vault", chainId); let iface = internal.getInterface(import_factories.Vault__factory.abi); const maxWithdrawable = await vaultGetterContract.getMaxWithdrawable( vaultContractAddress, collateralAddress, owner ); const formattedMaxWithdrawable = (0, import_ethers.formatUnits)((await maxWithdrawable).toString(), 6); if (Number(amount) > Number(formattedMaxWithdrawable.toString())) { throw new Error(" Withdrawal amount is more than available collateral balance"); } const recepientAddress = owner; const data = iface.encodeFunctionData("withdrawCollateral", [ collateralAddress, owner, recepientAddress, _amount ]); const txConfig = await internal.getTransactionConfig({ from: owner, to, data }); const withdrawResResult = await transaction.send(txConfig, {}); return withdrawResResult; }; const mintCurrency = async (amount, collateral, owner, chainId, transaction, internal, signer) => { const collateralAddress = (0, import_getContractAddresses.getContractAddress)(collateral, chainId); const vaultContractAddress = (0, import_getContractAddresses.getContractAddress)("Vault", chainId); const vaultGetterAddress = (0, import_getContractAddresses.getContractAddress)("VaultGetters", chainId); const vaultGetterContract = (0, import_contracts.Contract)(vaultGetterAddress, import_factories.VaultGetters__factory.abi, signer); const _amount = BigInt(amount) * BigInt(1e18); const maxBorrowable = await vaultGetterContract.getMaxBorrowable( vaultContractAddress, collateralAddress, owner ); const formattedmaxBorrowable = (0, import_ethers.formatEther)((await maxBorrowable).toString()); if (Number(amount) > Number(formattedmaxBorrowable)) { throw new Error(" Borrow amount is more than available currency borrowable"); } const recepientAddress = owner; const to = (0, import_getContractAddresses.getContractAddress)("Vault", chainId); let iface = internal.getInterface(import_factories.Vault__factory.abi); const data = iface.encodeFunctionData("mintCurrency", [ collateralAddress, owner, recepientAddress, _amount ]); const txConfig = await internal.getTransactionConfig({ from: owner, to, data }); const mintResResult = await transaction.send(txConfig, {}); return mintResResult; }; const burnCurrency = async (amount, collateral, owner, chainId, transaction, internal, signer) => { const collateralAddress = (0, import_getContractAddresses.getContractAddress)(collateral, chainId); const currencyContractAddress = (0, import_getContractAddresses.getContractAddress)("Currency", chainId); const currencyContract = (0, import_contracts.Contract)(currencyContractAddress, import_factories.Currency__factory.abi, signer); const _amount = BigInt(amount) * BigInt(1e18); const balance = await currencyContract.balanceOf(owner); const formattedBalance = await (0, import_ethers.formatEther)(balance.toString()); if (Number(amount) > Number(formattedBalance.toString())) { throw new Error("Payback xNGN: Insufficient funds"); } const to = (0, import_getContractAddresses.getContractAddress)("Vault", chainId); let iface = internal.getInterface(import_factories.Vault__factory.abi); const data = iface.encodeFunctionData("burnCurrency", [collateralAddress, owner, _amount]); const txConfig = await internal.getTransactionConfig({ from: owner, to, data }); const burnResult = await transaction.send(txConfig, {}); return burnResult; };