Skip to content

Commit

Permalink
Merge pull request #177 from gammaswap/zero-liquidity-cfmm
Browse files Browse the repository at this point in the history
publish package
  • Loading branch information
0xDanr committed Jan 18, 2024
2 parents a4458d9 + 8b865fd commit 2611b17
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 14 deletions.
39 changes: 27 additions & 12 deletions contracts/base/PoolViewer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ contract PoolViewer is IPoolViewer {
/// @inheritdoc IPoolViewer
function canLiquidate(address pool, uint256 tokenId) external virtual override view returns(bool) {
IGammaPool.LoanData memory _loanData = IGammaPool(pool).getLoanData(tokenId);
if(_loanData.liquidity == 0) {
return false;
}
uint256 liquidity = _updateLiquidity(_loanData.liquidity, _loanData.rateIndex, _getLoanLastFeeIndex(_loanData));
address refAddr = _loanData.refType == 3 ? _loanData.refAddr : address(0);
uint256 collateral = _collateral(pool, tokenId, _loanData.tokensHeld, refAddr);
Expand All @@ -95,6 +98,9 @@ contract PoolViewer is IPoolViewer {
uint256 lastCFMMInvariant;
uint256 lastCFMMTotalSupply;
(, lastCFMMInvariant, lastCFMMTotalSupply) = IGammaPool(_loanData.poolId).getLatestCFMMBalances();
if(lastCFMMTotalSupply == 0) {
return 1e18;
}

(uint256 borrowRate,) = AbstractRateModel(_loanData.shortStrategy).calcBorrowRate(_loanData.LP_INVARIANT,
_loanData.BORROWED_INVARIANT, _loanData.paramsStore, _loanData.poolId);
Expand Down Expand Up @@ -123,6 +129,10 @@ contract PoolViewer is IPoolViewer {
function calcDynamicOriginationFee(address pool, uint256 liquidity) external virtual override view returns(uint256 origFee) {
IGammaPool.RateData memory data = _getLastFeeIndex(pool);

if(liquidity >= data.LP_INVARIANT) {
return 10000;
}

uint256 utilRate = _calcUtilizationRate(data.LP_INVARIANT - liquidity, data.BORROWED_INVARIANT + liquidity) / 1e16;// convert utilizationRate to integer
uint256 emaUtilRate = data.emaUtilRate / 1e4; // convert ema to integer

Expand Down Expand Up @@ -150,24 +160,26 @@ contract PoolViewer is IPoolViewer {
uint256 lastCFMMInvariant;
uint256 lastCFMMTotalSupply;
(, lastCFMMInvariant, lastCFMMTotalSupply) = IGammaPool(pool).getLatestCFMMBalances();
if(lastCFMMTotalSupply > 0) {
(data.borrowRate,data.utilizationRate) = AbstractRateModel(params.shortStrategy).calcBorrowRate(params.LP_INVARIANT,
params.BORROWED_INVARIANT, params.paramsStore, pool);

(data.borrowRate,data.utilizationRate) = AbstractRateModel(params.shortStrategy).calcBorrowRate(params.LP_INVARIANT,
params.BORROWED_INVARIANT, params.paramsStore, pool);
(data.lastFeeIndex,data.lastCFMMFeeIndex) = IShortStrategy(params.shortStrategy)
.getLastFees(data.borrowRate, params.BORROWED_INVARIANT, lastCFMMInvariant, lastCFMMTotalSupply,
params.lastCFMMInvariant, params.lastCFMMTotalSupply, params.LAST_BLOCK_NUMBER, params.lastCFMMFeeIndex);

(data.lastFeeIndex,data.lastCFMMFeeIndex) = IShortStrategy(params.shortStrategy)
.getLastFees(data.borrowRate, params.BORROWED_INVARIANT, lastCFMMInvariant, lastCFMMTotalSupply,
params.lastCFMMInvariant, params.lastCFMMTotalSupply, params.LAST_BLOCK_NUMBER, params.lastCFMMFeeIndex);
data.supplyRate = data.borrowRate * data.utilizationRate / 1e18;

data.supplyRate = data.borrowRate * data.utilizationRate / 1e18;
(,, data.BORROWED_INVARIANT) = IShortStrategy(params.shortStrategy).getLatestBalances(data.lastFeeIndex,
params.BORROWED_INVARIANT, params.LP_TOKEN_BALANCE, lastCFMMInvariant, lastCFMMTotalSupply);

(,, data.BORROWED_INVARIANT) = IShortStrategy(params.shortStrategy).getLatestBalances(data.lastFeeIndex,
params.BORROWED_INVARIANT, params.LP_TOKEN_BALANCE, lastCFMMInvariant, lastCFMMTotalSupply);
data.LP_INVARIANT = uint128(params.LP_TOKEN_BALANCE * lastCFMMInvariant / lastCFMMTotalSupply);

data.LP_INVARIANT = uint128(params.LP_TOKEN_BALANCE * lastCFMMInvariant / lastCFMMTotalSupply);
data.utilizationRate = _calcUtilizationRate(data.LP_INVARIANT, data.BORROWED_INVARIANT);
data.emaUtilRate = uint40(IShortStrategy(params.shortStrategy).calcUtilRateEma(data.utilizationRate, params.emaUtilRate,
GSMath.max(block.number - params.LAST_BLOCK_NUMBER, params.emaMultiplier)));
}

data.utilizationRate = _calcUtilizationRate(data.LP_INVARIANT, data.BORROWED_INVARIANT);
data.emaUtilRate = uint40(IShortStrategy(params.shortStrategy).calcUtilRateEma(data.utilizationRate, params.emaUtilRate,
GSMath.max(block.number - params.LAST_BLOCK_NUMBER, params.emaMultiplier)));
data.origFee = params.origFee;
data.feeDivisor = params.feeDivisor;
data.minUtilRate1 = params.minUtilRate1;
Expand Down Expand Up @@ -195,6 +207,9 @@ contract PoolViewer is IPoolViewer {
uint256 lastCFMMInvariant;
uint256 lastCFMMTotalSupply;
(data.CFMM_RESERVES, lastCFMMInvariant, lastCFMMTotalSupply) = IGammaPool(pool).getLatestCFMMBalances();
if(lastCFMMTotalSupply == 0) {
return data;
}

(data.borrowRate, data.utilizationRate) = AbstractRateModel(data.shortStrategy).calcBorrowRate(data.LP_INVARIANT,
data.BORROWED_INVARIANT, data.paramsStore, pool);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@gammaswap/v1-core",
"version": "1.1.21",
"version": "1.1.22",
"description": "Core smart contracts for the GammaSwap V1 protocol",
"homepage": "https://gammaswap.com",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion test/GammaPool.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ describe("GammaPool", function () {
gammaPool.address,
0
);
expect(res8).to.equal(0);
expect(res8).to.equal(10000);
});

it("Custom Fields Set & Get", async function () {
Expand Down

0 comments on commit 2611b17

Please sign in to comment.