UNPKG

@catalabs/catalyst-sdk

Version:
88 lines 4.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.assetsToUnitsVolatile = assetsToUnitsVolatile; exports.assetsForUnitsVolatile = assetsForUnitsVolatile; exports.poolTokensToUnitsVolatile = poolTokensToUnitsVolatile; exports.getDifferenceUnitsVolatile = getDifferenceUnitsVolatile; exports.findOptimalSwapsVolatile = findOptimalSwapsVolatile; exports.findOptimalWithdrawalsVolatile = findOptimalWithdrawalsVolatile; const math_lib_1 = require("../math.lib"); const math_utils_1 = require("../math.utils"); const math_volatile_functions_1 = require("./math.volatile.functions"); const math_volatile_integrals_1 = require("./math.volatile.integrals"); function assetsToUnitsVolatile(vaults, userDeposit, flat) { const units = []; for (let vaultIndex = 0; vaultIndex < vaults.length; ++vaultIndex) { const vault = vaults[vaultIndex]; const vaultDeposit = userDeposit[vaultIndex]; const vaultUnits = []; for (let assetIndex = 0; assetIndex < vault.balances.length; ++assetIndex) { if (vaultDeposit[assetIndex] === 0n) { vaultUnits.push(0n); continue; } const boughtUnits = ((0, math_volatile_functions_1.sendAssetVol)(vault.balances[assetIndex], vaultDeposit[assetIndex], vault.weights[assetIndex]) * (math_lib_1.WAD - vault.vaultFee)) / math_lib_1.WAD; vaultUnits.push(boughtUnits); } units.push(vaultUnits); } return flat ? units.map((v) => (0, math_utils_1.bigNumberSum)(v)) : units; } function assetsForUnitsVolatile(vaults, userWithdrawal) { const units = userWithdrawal.map((vaultWithdrawal, vaultIndex) => { const vault = vaults[vaultIndex]; return vaultWithdrawal.map((withdraw, assetIndex) => { if (vaultWithdrawal[assetIndex] === 0n) { return 0n; } const boughtUnits = (0, math_volatile_functions_1.getAssetVol)(vault.balances[assetIndex], withdraw, vault.weights[assetIndex]); return boughtUnits; }); }); return units; } function poolTokensToUnitsVolatile(vaults, vaultTokens) { const units = []; for (let vaultIndex = 0; vaultIndex < vaults.length; ++vaultIndex) { const vault = vaults[vaultIndex]; const userVaultTokens = vaultTokens[vaultIndex]; const vaultUnits = (0, math_volatile_integrals_1.calcVaultTokensToUnitsVol)(userVaultTokens, vault.totalSupply, (0, math_utils_1.bigNumberSum)(vault.weights)); units.push(vaultUnits); } return units; } function getDifferenceUnitsVolatile(vaults, units) { const vaultWeights = vaults.map((v) => (0, math_utils_1.bigNumberSum)(v.weights)); const wsum = (0, math_utils_1.bigNumberSum)(vaultWeights); const unitsByWeight = (0, math_utils_1.bigNumberSum)(units) / wsum; const targetUnits = vaultWeights.map((vw) => vw * unitsByWeight); const differenceUnits = targetUnits.map((tu, i) => units[i] - tu); return differenceUnits; } function findOptimalSwapsVolatile(vaults, units, existingUnitValue) { if (units.length !== existingUnitValue.length) { throw new Error('Different length units array and existingUnitValue'); } const newUnbalancedDeposit = units.map((u, i) => u + existingUnitValue[i]); if ((0, math_utils_1.bigNumberSum)(newUnbalancedDeposit) < 0n) { throw new Error(`More units withdrawn than user have. Net: ${(0, math_utils_1.bigNumberSum)(newUnbalancedDeposit).toString()} units.`); } const differenceUnits = getDifferenceUnitsVolatile(vaults, newUnbalancedDeposit); const movements = (0, math_utils_1.distributeUnitsSorted)(vaults, differenceUnits); return movements; } function findOptimalWithdrawalsVolatile(vaults, units, existingUnitValue) { if (units.length !== existingUnitValue.length) { throw new Error('Different length units array and existingUnitValue'); } const newUnbalancedDeposit = units.map((u, i) => u + existingUnitValue[i]); if ((0, math_utils_1.bigNumberSum)(newUnbalancedDeposit) < 0n) { throw new Error(`More units withdrawn than user have. Net: ${(0, math_utils_1.bigNumberSum)(newUnbalancedDeposit).toString()} units.`); } const differenceUnits = getDifferenceUnitsVolatile(vaults, newUnbalancedDeposit); const movements = (0, math_utils_1.selectDistributeUnits)(vaults, units, differenceUnits, existingUnitValue); return movements; } //# sourceMappingURL=liquidity.volatile.functions.js.map