Skip to content

Commit

Permalink
Merge pull request #109 from gammaswap/feat/upd-staking-functions
Browse files Browse the repository at this point in the history
publish package
  • Loading branch information
0xDanr committed May 6, 2024
2 parents 634acc9 + 88f2b22 commit c343061
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 14 deletions.
18 changes: 11 additions & 7 deletions contracts/PositionManagerWithStaking.sol
Expand Up @@ -22,28 +22,32 @@ contract PositionManagerWithStaking is PositionManager, IAutoStakable {
}

/// @dev See {IAutoStakable-depositReservesAndStake}.
function depositReservesAndStake(DepositReservesParams calldata params, address _stakingRouter) external isExpired(params.deadline) returns(uint256[] memory reserves, uint256 shares) {
function depositReservesAndStake(DepositReservesParams calldata params, address esToken) external isExpired(params.deadline) returns(uint256[] memory reserves, uint256 shares) {
if(address(stakingRouter) == address(0) && esToken != address(0)) revert StakingRouterNotSet();

address gammaPool = getGammaPoolAddress(params.cfmm, params.protocolId);
address receiver = _stakingRouter != address(0) ? _stakingRouter : params.to;
address receiver = esToken != address(0) ? address(stakingRouter) : params.to;
(reserves, shares) = IGammaPool(gammaPool)
.depositReserves(receiver, params.amountsDesired, params.amountsMin,
abi.encode(SendTokensCallbackData({cfmm: params.cfmm, protocolId: params.protocolId, payer: msg.sender})));

if(_stakingRouter != address(0)) {
IStakingPoolRouter(_stakingRouter).stakeLpForAccount(params.to, gammaPool, shares);
if(esToken != address(0)) {
stakingRouter.stakeLpForAccount(params.to, gammaPool, esToken, shares);
}

emit DepositReserve(gammaPool, reserves, shares);
}

/// @dev See {IAutoStakable-withdrawReservesAndUnstake}.
function withdrawReservesAndUnstake(WithdrawReservesParams calldata params, address _stakingRouter) external isExpired(params.deadline) returns (uint256[] memory reserves, uint256 assets) {
function withdrawReservesAndUnstake(WithdrawReservesParams calldata params, address esToken) external isExpired(params.deadline) returns (uint256[] memory reserves, uint256 assets) {
address user = msg.sender;

address gammaPool = getGammaPoolAddress(params.cfmm, params.protocolId);

if(_stakingRouter != address(0)) {
IStakingPoolRouter(_stakingRouter).unstakeLpForAccount(user, gammaPool, params.amount);
if(esToken != address(0)) {
if(address(stakingRouter) == address(0)) revert StakingRouterNotSet();

stakingRouter.unstakeLpForAccount(user, gammaPool, esToken, params.amount);
}

send(gammaPool, msg.sender, gammaPool, params.amount);
Expand Down
11 changes: 7 additions & 4 deletions contracts/interfaces/IAutoStakable.sol
Expand Up @@ -7,6 +7,9 @@ import "./IPositionManager.sol";
/// @author Simon Mall
/// @dev This should be used along with IPositionManager to define a contract
interface IAutoStakable {
/// @dev error to emit when trying to use staking router and router is not set
error StakingRouterNotSet();

/// @dev Set staking router contract address
/// @dev Requires admin permission
/// @param _stakingRouter Staking Router contract address
Expand All @@ -15,16 +18,16 @@ interface IAutoStakable {
/// @dev Deposit reserve tokens into a GammaPool and stake GS LP tokens
/// @dev See more {IPositionManager-depositReserves}
/// @param params - struct containing parameters to identify a GammaPool to deposit reserve tokens to
/// @param stakingRouter - address of router used for staking contracts
/// @param esToken - address of escrow token of staking contract
/// @return reserves - reserve tokens deposited into GammaPool
/// @return shares - GS LP token shares minted for depositing
function depositReservesAndStake(IPositionManager.DepositReservesParams calldata params, address stakingRouter) external returns(uint256[] memory reserves, uint256 shares);
function depositReservesAndStake(IPositionManager.DepositReservesParams calldata params, address esToken) external returns(uint256[] memory reserves, uint256 shares);

/// @dev Unstake GS LP tokens from staking router and withdraw reserve tokens from a GammaPool
/// @dev See more {IPositionManager-withdrawReserves}
/// @param params - struct containing parameters to identify a GammaPool to withdraw reserve tokens from
/// @param stakingRouter - address of router used for staking contracts
/// @param esToken - address of escrow token of staking contract
/// @return reserves - reserve tokens withdrawn from GammaPool
/// @return assets - CFMM LP token shares equivalent of reserves withdrawn from GammaPool
function withdrawReservesAndUnstake(IPositionManager.WithdrawReservesParams calldata params, address stakingRouter) external returns (uint256[] memory reserves, uint256 assets);
function withdrawReservesAndUnstake(IPositionManager.WithdrawReservesParams calldata params, address esToken) external returns (uint256[] memory reserves, uint256 assets);
}
6 changes: 4 additions & 2 deletions contracts/interfaces/IStakingPoolRouter.sol
Expand Up @@ -9,8 +9,9 @@ interface IStakingPoolRouter {
/// @dev Stake GS_LP tokens on behalf of user
/// @param _account User address for query
/// @param _gsPool GammaPool address
/// @param _esToken Escrow token address
/// @param _amount Amount of GS_LP tokens to stake
function stakeLpForAccount(address _account, address _gsPool, uint256 _amount) external;
function stakeLpForAccount(address _account, address _gsPool, address _esToken, uint256 _amount) external;

/// @dev Stake loan on behalf of user
/// @param _account User address for query
Expand All @@ -21,8 +22,9 @@ interface IStakingPoolRouter {
/// @dev Unstake GS_LP tokens on behalf of user
/// @param _account User address for query
/// @param _gsPool GammaPool address
/// @param _esToken Escrow token address
/// @param _amount Amount of GS_LP tokens to unstake
function unstakeLpForAccount(address _account, address _gsPool, uint256 _amount) external;
function unstakeLpForAccount(address _account, address _gsPool, address _esToken, uint256 _amount) external;

/// @dev Unstake loan on behalf of user
/// @param _account User address for query
Expand Down
6 changes: 6 additions & 0 deletions contracts/test/TestPositionManager.sol
Expand Up @@ -24,6 +24,12 @@ contract TestPositionManager is PositionManagerExternalWithStaking {
return "";
}

function transferOwnership(address newOwner) external virtual override {
}

function acceptOwnership() external virtual override {
}

}


2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "@gammaswap/v1-periphery",
"version": "1.2.9",
"version": "1.2.10",
"description": "Periphery contracts for the GammaSwap V1 protocol",
"homepage": "https://gammaswap.com",
"scripts": {
Expand Down

0 comments on commit c343061

Please sign in to comment.