@catalabs/catalyst-sdk
Version:
Catalyst AMM SDK
88 lines • 4.56 kB
JavaScript
;
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