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
6 changes: 3 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[submodule "lib/forge-std"]
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
branch = v1.5.5
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
branch = v1.6.0
2 changes: 1 addition & 1 deletion contracts/strategies/ShortStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ abstract contract ShortStrategy is IShortStrategy, BaseStrategy {
function getLatestBalances(uint256 lastFeeIndex, uint256 borrowedInvariant, uint256 lpBalance, uint256 lastCFMMInvariant, uint256 lastCFMMTotalSupply) public virtual override view
returns(uint256 lastLPBalance, uint256 lastBorrowedLPBalance, uint256 lastBorrowedInvariant) {
lastBorrowedInvariant = accrueBorrowedInvariant(borrowedInvariant, lastFeeIndex);
lastBorrowedLPBalance = convertInvariantToLP(lastBorrowedInvariant, lastCFMMTotalSupply, lastCFMMInvariant);
lastBorrowedLPBalance = convertInvariantToLPRoundUp(lastBorrowedInvariant, lastCFMMTotalSupply, lastCFMMInvariant);
lastLPBalance = lpBalance + lastBorrowedLPBalance;
}

Expand Down
14 changes: 12 additions & 2 deletions contracts/strategies/base/BaseStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ abstract contract BaseStrategy is AppStorage, AbstractRateModel {
return borrowedInvariant * lastFeeIndex / 1e18;
}

/// @notice Convert CFMM LP tokens into liquidity invariant units.
/// @notice Convert liquidity invariant units into CFMM LP tokens.
/// @dev In case of CFMM where convertInvariantToLP calculation is different from convertLPToInvariant
/// @param liquidityInvariant - liquidity invariant borrowed in the GammaPool
/// @param lastCFMMTotalSupply - total supply of LP tokens issued by CFMM
Expand All @@ -181,6 +181,16 @@ abstract contract BaseStrategy is AppStorage, AbstractRateModel {
return lastCFMMInvariant == 0 ? 0 : (liquidityInvariant * lastCFMMTotalSupply) / lastCFMMInvariant;
}

/// @notice Convert liquidity invariant units into CFMM LP tokens rounded up.
/// @dev In case of CFMM where convertInvariantToLP calculation is different from convertLPToInvariant
/// @param liquidityInvariant - liquidity invariant borrowed in the GammaPool
/// @param lastCFMMTotalSupply - total supply of LP tokens issued by CFMM
/// @param lastCFMMInvariant - liquidity invariant in CFMM
/// @return lpTokens - liquidity invariant in terms of LP tokens
function convertInvariantToLPRoundUp(uint256 liquidityInvariant, uint256 lastCFMMTotalSupply, uint256 lastCFMMInvariant) internal virtual pure returns(uint256) {
return lastCFMMInvariant == 0 ? 0 : (liquidityInvariant * lastCFMMTotalSupply + (lastCFMMInvariant - 1)) / lastCFMMInvariant;
}

/// @notice Convert CFMM LP tokens into liquidity invariant units.
/// @dev In case of CFMM where convertLPToInvariant calculation is different from convertInvariantToLP
/// @param lpTokens - liquidity invariant borrowed in the GammaPool
Expand Down Expand Up @@ -215,7 +225,7 @@ abstract contract BaseStrategy is AppStorage, AbstractRateModel {
s.BORROWED_INVARIANT = uint128(newBorrowedInvariant);

// Convert borrowed liquidity to corresponding CFMM LP tokens using current conversion rate
s.LP_TOKEN_BORROWED_PLUS_INTEREST = convertInvariantToLP(newBorrowedInvariant, lastCFMMTotalSupply, lastCFMMInvariant);
s.LP_TOKEN_BORROWED_PLUS_INTEREST = convertInvariantToLPRoundUp(newBorrowedInvariant, lastCFMMTotalSupply, lastCFMMInvariant);
uint256 lpInvariant = convertLPToInvariant(s.LP_TOKEN_BALANCE, lastCFMMInvariant, lastCFMMTotalSupply);
s.LP_INVARIANT = uint128(lpInvariant);

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "@gammaswap/v1-core",
"version": "1.2.13",
"version": "1.2.14",
"description": "Core smart contracts for the GammaSwap V1 protocol",
"homepage": "https://gammaswap.com",
"scripts": {
"test": "hardhat test",
"fuzz": "forge test"
"fuzz": "forge test --via-ir"
},
"engines": {
"node": ">=18"
Expand Down
18 changes: 12 additions & 6 deletions test/foundry/RateParamsStore.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,22 @@ contract RateParamsStoreTest is Test {
TestLinearKinkedRateModel(address(rateModel2)).setRateParamsStore(address(paramsStore));
}

function testFailSetRateParams() public {
function testSetRateParamsError() public {
TestParams memory params = TestParams({ num1: 10, num2: 20, num3: 40 });
vm.prank(addr1);
vm.expectRevert("FORBIDDEN");
paramsStore.setRateParams(address(rateModel), abi.encode(params), false);
}

function testFailSetRateParams1() public {
function testSetRateParamsError1() public {
TestFailParams1 memory params = TestFailParams1({ num1: 12345 });
vm.expectRevert("VALIDATE");
paramsStore.setRateParams(address(rateModel), abi.encode(params), false);
}

function testFailSetRateParams2() public {
function testSetRateParamsError2() public {
TestFailParams2 memory params = TestFailParams2({ num1: 100, num2: 200, num3: 1e36 });
vm.expectRevert("VALIDATE");
paramsStore.setRateParams(address(rateModel), abi.encode(params), false);
}

Expand Down Expand Up @@ -118,19 +121,22 @@ contract RateParamsStoreTest is Test {
assertEq(maxApy, 40);
}

function testFailSetRate2Params() public {
function testSetRate2ParamsError() public {
TestParams2 memory params = TestParams2({ num1: 10, num2: 20, num3: 40 , num4: 50});
vm.prank(addr1);
vm.expectRevert("FORBIDDEN");
paramsStore.setRateParams(address(rateModel2), abi.encode(params), false);
}

function testFailSetRate2Params1() public {
function testSetRate2ParamsError1() public {
TestFail2Params1 memory params = TestFail2Params1({ num1: 12345 });
vm.expectRevert("VALIDATE");
paramsStore.setRateParams(address(rateModel2), abi.encode(params), false);
}

function testFailSetRate2Params2() public {
function testSetRate2ParamsError2() public {
TestFail2Params2 memory params = TestFail2Params2({ num1: 100, num2: 200, num3: 1e18, num4: 1e38 });
vm.expectRevert("VALIDATE");
paramsStore.setRateParams(address(rateModel2), abi.encode(params), false);
}

Expand Down
61 changes: 42 additions & 19 deletions test/foundry/TokenMetaData.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,25 @@ contract TokenMetaDataTest is Test {
Token2 token2 = new Token2();
Token3 token3 = new Token3();

function testFailDecimalsToken1() public {
GammaSwapLibrary.decimals(address(token1));
function testDecimalsToken1Error() public {
vm.expectRevert();
token1.getDecimals();
}

function testFailDecimals256() public {
function testDecimals256Error() public {
Token4 token = new Token4(256);
GammaSwapLibrary.decimals(address(token));
vm.expectRevert();
token.getDecimals();
}

function testFailTokenDecimalsToken1() public {
function testTokenDecimalsToken1Error() public {
vm.expectRevert();
viewer.getTokenDecimals(address(token1));
}

function testFailTokenDecimals256() public {
function testTokenDecimals256Error() public {
Token4 token = new Token4(256);
vm.expectRevert();
viewer.getTokenDecimals(address(token));
}

Expand All @@ -49,12 +53,14 @@ contract TokenMetaDataTest is Test {
assertEq(viewer.getTokenDecimals(address(token3)),6);
}

function testFailNameToken1() public {
GammaSwapLibrary.name(address(token1));
function testNameToken1Fail() public {
vm.expectRevert();
token1.getName();
}

function testFailNameToken3() public {
GammaSwapLibrary.name(address(token3));
function testNameToken3Fail() public {
vm.expectRevert();
token3.getName();
}

function testName() public {
Expand All @@ -67,12 +73,14 @@ contract TokenMetaDataTest is Test {
assertEq(viewer.getTokenName(address(token3)),'');
}

function testFailSymbolToken1() public {
GammaSwapLibrary.symbol(address(token1));
function testSymbolToken1Fail() public {
vm.expectRevert();
token1.getSymbol();
}

function testFailSymbolToken3() public {
GammaSwapLibrary.symbol(address(token3));
function testSymbolToken3Fail() public {
vm.expectRevert();
token3.getSymbol();
}

function testSymbol() external {
Expand All @@ -86,7 +94,22 @@ contract TokenMetaDataTest is Test {
}
}

contract Token0 {
abstract contract AbstractToken {

function getName() external view returns(string memory) {
return GammaSwapLibrary.name(address(this));
}

function getSymbol() external view returns(string memory) {
return GammaSwapLibrary.symbol(address(this));
}

function getDecimals() external view returns(uint8) {
return GammaSwapLibrary.decimals(address(this));
}
}

contract Token0 is AbstractToken {

string public name = 'Test Token0';
string public symbol = 'TERC0';
Expand All @@ -97,7 +120,7 @@ contract Token0 {

}

contract Token1 {
contract Token1 is AbstractToken {

bytes32 public name = 'Test Token1';
bytes32 public symbol = 'TERC1';
Expand All @@ -108,7 +131,7 @@ contract Token1 {

}

contract Token2 {
contract Token2 is AbstractToken {

bytes public name = 'Test Token2';
bytes public symbol = 'TERC2';
Expand All @@ -119,7 +142,7 @@ contract Token2 {

}

contract Token3 {
contract Token3 is AbstractToken {

uint256 public name = 513;
uint256 public symbol = 354;
Expand All @@ -130,7 +153,7 @@ contract Token3 {

}

contract Token4 {
contract Token4 is AbstractToken {

string public name = 'Test Token0';
string public symbol = 'TERC0';
Expand Down
2 changes: 1 addition & 1 deletion test/strategies/BaseStrategy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ describe("BaseStrategy", function () {
if (lastCFMMInvariant.eq(0)) {
return BigNumber.from(0);
}
return borrowedInvariant.mul(lastCFMMTotalSupply).div(lastCFMMInvariant);
return borrowedInvariant.mul(lastCFMMTotalSupply).add(lastCFMMInvariant.sub(1)).div(lastCFMMInvariant);
}

function calcLPInvariant(
Expand Down
2 changes: 1 addition & 1 deletion test/strategies/ShortStrategy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -849,7 +849,7 @@ describe("ShortStrategy", function () {
);

const expTotAssets = params1.lpBalance.add(
params1.borrowedInvariant.mul(cfmmTotalSupply1).div(cfmmInvariant1)
params1.borrowedInvariant.mul(cfmmTotalSupply1).add(cfmmInvariant1.sub(1)).div(cfmmInvariant1)
);

expect(cfmmTotalSupply1).to.equal(cfmmTotalSupply0);
Expand Down
Loading