Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions contracts/strategies/vault/lending/VaultBorrowStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,8 @@ contract VaultBorrowStrategy is VaultBaseRebalanceStrategy, BorrowStrategy {

if(isRefType3) {
uint256 reservedLPTokens = s.getUint256(uint256(IVaultGammaPool.StorageIndexes.RESERVED_LP_TOKENS));
if(lpTokens >= reservedLPTokens) revert ExcessiveBorrowing();
unchecked {
reservedLPTokens = reservedLPTokens - lpTokens;
reservedLPTokens = reservedLPTokens - GSMath.min(reservedLPTokens, lpTokens);
}
s.setUint256(uint256(IVaultGammaPool.StorageIndexes.RESERVED_LP_TOKENS), reservedLPTokens);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ contract VaultExternalRebalanceStrategy is VaultBaseLongStrategy, ExternalRebala
// Get loan for tokenId, revert if not loan creator
LibStorage.Loan storage _loan = _getLoan(tokenId);

if(_loan.refType == 3) revert InvalidRefType();
if(_loan.refType != 3) revert InvalidRefType();

updateLoan(_loan);

Expand Down
3 changes: 2 additions & 1 deletion contracts/viewers/vault/VaultPoolViewer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ contract VaultPoolViewer is PoolViewer, IVaultPoolViewer {
if(_loanData.liquidity == 0) {
return false;
}
_loanData.accFeeIndex = _getLoanLastFeeIndex(_loanData);
address refAddr = address(0);
if(_loanData.refType == 3) {
refAddr = _loanData.refAddr;
Expand Down Expand Up @@ -165,7 +166,7 @@ contract VaultPoolViewer is PoolViewer, IVaultPoolViewer {
(,data.LP_TOKEN_BORROWED_PLUS_INTEREST, borrowedInvariant) = IShortStrategy(data.shortStrategy)
.getLatestBalances(data.lastFeeIndex, borrowedInvariant, data.LP_TOKEN_BALANCE, lastCFMMInvariant, lastCFMMTotalSupply);

data.LP_TOKEN_BORROWED_PLUS_INTEREST += lastCFMMFeeIndex * lastCFMMTotalSupply / lastCFMMInvariant;
data.LP_TOKEN_BORROWED_PLUS_INTEREST += (lastCFMMFeeIndex * lastCFMMTotalSupply + (lastCFMMInvariant - 1))/ lastCFMMInvariant;

data.BORROWED_INVARIANT = uint128(borrowedInvariant + lastCFMMFeeIndex);
data.LP_INVARIANT = uint128(data.LP_TOKEN_BALANCE * lastCFMMInvariant / lastCFMMTotalSupply);
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@gammaswap/v1-implementations",
"version": "1.2.13",
"version": "1.2.14",
"description": "Pool and strategies implementation contracts for GammaSwap V1 protocol",
"homepage": "https://gammaswap.com",
"scripts": {
Expand Down Expand Up @@ -71,7 +71,7 @@
"typescript": "^4.7.4"
},
"dependencies": {
"@gammaswap/v1-core": "^1.2.13",
"@gammaswap/v1-core": "^1.2.14",
"@openzeppelin/contracts": "^4.7.0"
}
}
84 changes: 60 additions & 24 deletions test/foundry/FullMath.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ import "@gammaswap/v1-core/contracts/libraries/GSMath.sol";
import "../../contracts/libraries/FullMath.sol";

contract FullMathTest is Test {
MathFunctions math;

function setUp() public {
math = new MathFunctions();
}

// Babylonian Method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint256 y) internal pure returns (uint256 z) {
Expand Down Expand Up @@ -132,32 +137,32 @@ contract FullMathTest is Test {
assertEq(a1, type(uint256).max);

vm.expectRevert("ADDITION_OVERFLOW");
(a0, a1) = FullMath.add512x512(1, 0, type(uint256).max, type(uint256).max);
(a0, a1) = math.add512x512(1, 0, type(uint256).max, type(uint256).max);
}

function testAdd512Revert() public {
vm.expectRevert("ADDITION_OVERFLOW");
FullMath.add512x512(type(uint256).max, type(uint256).max, 1, 0);
math.add512x512(type(uint256).max, type(uint256).max, 1, 0);
}

function testAdd512Revert2() public {
vm.expectRevert("ADDITION_OVERFLOW");
FullMath.add512x512(0, type(uint256).max, 0, 1);
math.add512x512(0, type(uint256).max, 0, 1);
}

function testAdd512Revert3() public {
vm.expectRevert("ADDITION_OVERFLOW");
FullMath.add512x512(0, 1, 0, type(uint256).max);
math.add512x512(0, 1, 0, type(uint256).max);
}

function testAdd512Revert4() public {
vm.expectRevert("ADDITION_OVERFLOW");
FullMath.add512x512(0, type(uint256).max, 0, type(uint256).max);
math.add512x512(0, type(uint256).max, 0, type(uint256).max);
}

function testAdd512Revert5() public {
vm.expectRevert("ADDITION_OVERFLOW");
(uint256 r0, uint256 r1) = FullMath.add512x512(type(uint256).max-2, type(uint256).max, 3, 0);
(uint256 r0, uint256 r1) = math.add512x512(type(uint256).max-2, type(uint256).max, 3, 0);
}

function testAddSubtract(uint256 num1, uint256 num2) public {
Expand Down Expand Up @@ -196,7 +201,7 @@ contract FullMathTest is Test {

if(hasHighBit) {
vm.expectRevert("ADDITION_OVERFLOW");
FullMath.add512x512(0, num1, 0, num2);
math.add512x512(0, num1, 0, num2);
}
}

Expand Down Expand Up @@ -242,22 +247,22 @@ contract FullMathTest is Test {
assertEq(a1, 0);

vm.expectRevert("SUBTRACTION_UNDERFLOW");
FullMath.sub512x512(0, 1, 1, 1);
math.sub512x512(0, 1, 1, 1);
}

function testSub512Revert() public {
vm.expectRevert("SUBTRACTION_UNDERFLOW");
FullMath.sub512x512(0, 0, 1, 0);
math.sub512x512(0, 0, 1, 0);
}

function testSub512Revert2() public {
vm.expectRevert("SUBTRACTION_UNDERFLOW");
FullMath.sub512x512(0, 0, 1, 0);
math.sub512x512(0, 0, 1, 0);
}

function testSub512Revert3() public {
vm.expectRevert("SUBTRACTION_UNDERFLOW");
FullMath.sub512x512(0, type(uint256).max, 1, type(uint256).max);
math.sub512x512(0, type(uint256).max, 1, type(uint256).max);
}

function testSub512(uint256 a0, uint256 a1, uint256 b0, uint256 b1) public {
Expand All @@ -267,12 +272,12 @@ contract FullMathTest is Test {
(c0, c1) = FullMath.sub512x512(a0, a1, b0, b1);
assertEq(FullMath.gt512(c0, c1, 0, 0), true);
vm.expectRevert("SUBTRACTION_UNDERFLOW");
FullMath.sub512x512(b0, b1, a0, a1);
math.sub512x512(b0, b1, a0, a1);
} else if(FullMath.lt512(a0, a1, b0, b1)) {
(c0, c1) = FullMath.sub512x512(b0, b1, a0, a1);
assertEq(FullMath.gt512(c0, c1, 0, 0), true);
vm.expectRevert("SUBTRACTION_UNDERFLOW");
FullMath.sub512x512(a0, a1, b0, b1);
math.sub512x512(a0, a1, b0, b1);
} else {
(c0, c1) = FullMath.sub512x512(a0, a1, b0, b1);
assertEq(FullMath.eq512(c0, c1, 0, 0), true);
Expand Down Expand Up @@ -622,7 +627,7 @@ contract FullMathTest is Test {

if(u1 > 0) {
vm.expectRevert("MULTIPLICATION_OVERFLOW");
(uint256 x0, uint256 x1) = FullMath.mul512x256(0, num1, num2);
(uint256 x0, uint256 x1) = math.mul512x256(0, num1, num2);
} else {
if(num2 > 0) {
(uint256 x0, uint256 x1) = FullMath.div512x256(v0, v1, num2);
Expand All @@ -646,7 +651,7 @@ contract FullMathTest is Test {
(uint256 y0, uint256 y1) = FullMath.add512x512(u0, 0, x1, 0);
if(y1 > 0) {
vm.expectRevert("MULTIPLICATION_OVERFLOW");
FullMath.mul512x256(num1, num2, num3);
math.mul512x256(num1, num2, num3);
}
}
}
Expand All @@ -656,7 +661,7 @@ contract FullMathTest is Test {
uint256 num2 = type(uint256).max;
uint256 num3 = 2;
vm.expectRevert("MULTIPLICATION_OVERFLOW");
FullMath.mul512x256(num1, num2, num3);
math.mul512x256(num1, num2, num3);
}

function testMul512x256Revert2() public {
Expand All @@ -671,7 +676,7 @@ contract FullMathTest is Test {

num1++;
vm.expectRevert("MULTIPLICATION_OVERFLOW");
FullMath.mul512x256(num1, num2, num3);
math.mul512x256(num1, num2, num3);
}

function testMul512x256Revert3() public {
Expand All @@ -686,7 +691,7 @@ contract FullMathTest is Test {

++num1;
vm.expectRevert("MULTIPLICATION_OVERFLOW");
FullMath.mul512x256(num1, num2, num3);
math.mul512x256(num1, num2, num3);
}

function testMul512x256Fixed() public {
Expand Down Expand Up @@ -726,7 +731,7 @@ contract FullMathTest is Test {
assertEq(v1, num2*num3);

vm.expectRevert("MULTIPLICATION_OVERFLOW");
FullMath.mul512x256(0, type(uint256).max, 2);
math.mul512x256(0, type(uint256).max, 2);
}

function testDivFixed512x256_128(uint128 num1, uint128 num2, uint128 num3) public {
Expand Down Expand Up @@ -892,10 +897,10 @@ contract FullMathTest is Test {
assertEq(u1, 0);

vm.expectRevert("DIVISION_BY_ZERO");
FullMath.div512x256(u0, u1, num3);
math.div512x256(u0, u1, num3);

vm.expectRevert("DIVISION_BY_ZERO");
FullMath.divRem512x256(u0, u1, num3);
math.divRem512x256(u0, u1, num3);
}

function testDiv512x256(uint256 num1, uint256 num2, uint256 num3) public {
Expand Down Expand Up @@ -930,7 +935,7 @@ contract FullMathTest is Test {
function testMulDiv512(uint256 num1, uint256 num2, uint256 num3) public {
if(num3 == 0) {
vm.expectRevert("MULDIV_ZERO_DIVISOR");
FullMath.mulDiv512(num1, num2, 0);
math.mulDiv512(num1, num2, 0);
return;
}

Expand All @@ -950,7 +955,7 @@ contract FullMathTest is Test {
function testMulDiv256(uint256 num1, uint256 num2, uint256 num3) public {
if(num3 == 0) {
vm.expectRevert("MULDIV_ZERO_DIVISOR");
FullMath.mulDiv512(num1, num2, num3);
math.mulDiv512(num1, num2, num3);
return;
}
if(num1 == 0 || num2 ==0) {
Expand All @@ -976,8 +981,39 @@ contract FullMathTest is Test {
assertEq(v1, 0);
} else {
vm.expectRevert("MULDIV_OVERFLOW");
FullMath.mulDiv256(num1, num2, num3);
math.mulDiv256(num1, num2, num3);
}
}
}
}

contract MathFunctions {

function add512x512(uint256 a0, uint256 a1, uint256 b0, uint256 b1) external pure returns (uint256, uint256) {
return FullMath.add512x512(a0, a1, b0, b1);
}

function sub512x512(uint256 a0, uint256 a1, uint256 b0, uint256 b1) external pure returns (uint256, uint256) {
return FullMath.sub512x512(a0, a1, b0, b1);
}

function mul512x256(uint256 a0, uint256 a1, uint256 b) external pure returns (uint256, uint256) {
return FullMath.mul512x256(a0, a1, b);
}

function div512x256(uint256 a0, uint256 a1, uint256 b) external pure returns(uint256, uint256) {
return FullMath.div512x256(a0, a1, b);
}

function divRem512x256(uint256 a0, uint256 a1, uint256 b) external pure returns(uint256) {
return FullMath.divRem512x256(a0, a1, b);
}

function mulDiv256(uint256 a, uint256 b, uint256 c) external pure returns(uint256) {
return FullMath.mulDiv256(a, b, c);
}

function mulDiv512(uint256 num1, uint256 num2, uint256 num3) external pure returns(uint256, uint256) {
return FullMath.mulDiv512(num1, num2, num3);
}
}
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -449,10 +449,10 @@
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"

"@gammaswap/v1-core@^1.2.13":
version "1.2.13"
resolved "https://npm.pkg.github.com/download/@gammaswap/v1-core/1.2.13/26f6719af9d6665640ade967b896fc2e3c0ec232#26f6719af9d6665640ade967b896fc2e3c0ec232"
integrity sha512-MqbWW584MMVmm6+iMToyxn7wp5F1dpwFohMp531qokrRHJ8qyC0Kj6l2v2klxsWvFHVe9qi9Vm3HeUFg7YuwoA==
"@gammaswap/v1-core@^1.2.14":
version "1.2.14"
resolved "https://npm.pkg.github.com/download/@gammaswap/v1-core/1.2.14/a282b6841d31b06e9625f5dc3b979668febf1b5b#a282b6841d31b06e9625f5dc3b979668febf1b5b"
integrity sha512-CwsxyLQZmSPKiXWNllyaVXC+xIoX7agcWOF99l6V0gJCKfsNZfzNmiZzGzLQG46sOxa2Se1NPey4o/lOH/TNQg==
dependencies:
"@openzeppelin/contracts" "^4.7.0"

Expand Down
Loading