Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat/ui-stake-helpers #32

Closed
wants to merge 10 commits into from
Closed
Show file tree
Hide file tree
Changes from 8 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
20 changes: 20 additions & 0 deletions contracts/interfaces/IStakedToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,24 @@ interface IStakedToken {
function getTotalRewardsBalance(address user) external view returns (uint256);

function stakersCooldowns(address user) external view returns (uint256);

/**
* @dev Executes a slashing of the underlying of a certain amount, transferring the seized funds
* to destination. Decreasing the amount of underlying will automatically adjust the exchange rate.
* A call to `slash` will start a slashing event which has to be settled via `settleSlashing`.
* As long as the slashing event is ongoing, stake and slash are deactivated.
* - MUST NOT be called when a previous slashing is still ongoing
* @param destination the address where seized funds will be transferred
* @param amount the amount to be slashed
* - if the amount bigger than maximum allowed, the maximum will be slashed instead.
* @return amount the amount slashed
*/
function slash(address destination, uint256 amount) external returns (uint256);

/**
* @dev returns the exact amount of assets that would be redeemed for the provided number of shares
* @param shares the number of shares to redeem
* @return uint256 assets the number of assets that would be redeemed
*/
function previewRedeem(uint256 shares) external view returns (uint256);
}
56 changes: 56 additions & 0 deletions contracts/interfaces/IStakedTokenDataProvider.sol
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarify the format and unit denomination of oracles on every @param please.

Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ interface IStakedTokenDataProvider {
uint256 stakeApy;
uint128 distributionPerSecond;
uint256 distributionEnd;
bool inPostSlashingPeriod;
miguelmtzinf marked this conversation as resolved.
Show resolved Hide resolved
}

struct StakedTokenUserData {
Expand Down Expand Up @@ -46,6 +47,12 @@ interface IStakedTokenDataProvider {
*/
function BPT_PRICE_FEED() external returns (address);

/**
* @notice Return the address of the bptWstETH price feed, ETH denominated
* @return The address of the bptWstETH price feed, ETH denominated, expressed with 18 decimals
*/
function BPT_STETH_PRICE_FEED() external returns (address);

/**
* @notice Return the address of the AAVE token
* @return The address of the AAVE token
Expand All @@ -70,10 +77,17 @@ interface IStakedTokenDataProvider {
*/
function STAKED_BPT() external returns (address);

/**
* @notice Return the address of the bptWstETH token
* @return The address of the bptWstETH token
*/
function STAKED_BPT_WSTETH() external returns (address);

/**
* @notice Returns data of all Staked Tokens
* @return stkAaveData An object with StkAave data
* @return stkBptData An object with StkBpt data
* @return stkBptWstETHData An object with stkBptWstETHData data
* @return ethPrice The price of ETH, USD denominated (expressed with 8 decimals)
*/
function getAllStakedTokenData()
Expand All @@ -82,6 +96,7 @@ interface IStakedTokenDataProvider {
returns (
StakedTokenData memory stkAaveData,
StakedTokenData memory stkBptData,
StakedTokenData memory stkBptWstETHData,
uint256 ethPrice
);

Expand All @@ -104,6 +119,8 @@ interface IStakedTokenDataProvider {
* @return stkAaveUserData An object with user data of StkAave
* @return stkBptData An object with StkBpt data
* @return stkBptUserData An object with user data of StkBpt
* @return stkBptWstETHData An object with stkBptWstETHData data
* @return stkBptWstETHUserData An object with user data of StkBpt
* @return ethPrice The price of ETH, USD denominated (expressed with 8 decimals)
*/
function getAllStakedTokenUserData(address user)
Expand All @@ -114,6 +131,8 @@ interface IStakedTokenDataProvider {
StakedTokenUserData memory stkAaveUserData,
StakedTokenData memory stkBptData,
StakedTokenUserData memory stkBptUserData,
StakedTokenData memory stkBptWstETHData,
StakedTokenUserData memory stkBptWstETHUserData,
uint256 ethPrice
);

Expand All @@ -138,4 +157,41 @@ interface IStakedTokenDataProvider {
external
view
returns (StakedTokenData memory stkBptData, StakedTokenUserData memory stkBptUserData);

/**
* @notice Returns user data of Staked Bpt Aave
* @param user The address of the user
* @return stkBptWstETHData An object with StkBpt data
* @return stkBptWstETHUserData An object with user data of StkBpt
*/
function getStkBptWstETHUserData(address user)
external
view
returns (
StakedTokenData memory stkBptWstETHData,
StakedTokenUserData memory stkBptWstETHUserData
);

/**
* @notice Returns data of Staked assets
* @param stakedAsset The address of the stakedAsset
* @return stakedAssetData An object with staked asset data
*/

function getStakedAssetData(address stakedAsset)
external
view
returns (StakedTokenData memory stakedAssetData);

/**
* @notice Returns user data of Staked user
* @param user The address of the user
* @param stakedAsset The address of the staked asset
* @return stakedTokenData An object with staked token data
* @return stakedUserData An object with user data of staked token
*/
function getStakedUserData(address user, address stakedAsset)
external
view
returns (StakedTokenData memory stakedTokenData, StakedTokenUserData memory stakedUserData);
}
67 changes: 66 additions & 1 deletion contracts/misc/StakedTokenDataProvider.sol
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
/// @inheritdoc IStakedTokenDataProvider
address public immutable override STAKED_BPT;

/// @inheritdoc IStakedTokenDataProvider
address public immutable override STAKED_BPT_WSTETH;

/// @inheritdoc IStakedTokenDataProvider
address public immutable override BPT_STETH_PRICE_FEED;

uint256 private constant SECONDS_PER_YEAR = 365 days;

uint256 private constant APY_PRECISION = 10000;
Expand All @@ -47,6 +53,9 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
* @param ethUsdPriceFeed The address of ETH price feed (USD denominated, with 8 decimals)
* @param aavePriceFeed The address of AAVE price feed (ETH denominated, with 18 decimals)
* @param bptPriceFeed The address of StakedBpt price feed (ETH denominated, with 18 decimals)
* @param bptWstETH The address of stETH token
* @param bptWstETHPriceFeed The address of stEth price feed (ETH denominated, with 18 decimals)
miguelmtzinf marked this conversation as resolved.
Show resolved Hide resolved

miguelmtzinf marked this conversation as resolved.
Show resolved Hide resolved
*/
constructor(
address aave,
Expand All @@ -55,7 +64,9 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
address stkBpt,
address ethUsdPriceFeed,
address aavePriceFeed,
address bptPriceFeed
address bptPriceFeed,
address bptWstETH,
address bptWstETHPriceFeed
) public {
AAVE = aave;
STAKED_AAVE = stkAave;
Expand All @@ -64,6 +75,9 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
ETH_USD_PRICE_FEED = ethUsdPriceFeed;
AAVE_PRICE_FEED = aavePriceFeed;
BPT_PRICE_FEED = bptPriceFeed;

STAKED_BPT_WSTETH = bptWstETH;
BPT_STETH_PRICE_FEED = bptWstETHPriceFeed;
}

/// @inheritdoc IStakedTokenDataProvider
Expand All @@ -74,11 +88,13 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
returns (
StakedTokenData memory stkAaveData,
StakedTokenData memory stkBptData,
StakedTokenData memory stkBptWstETHData,
uint256 ethPrice
)
{
stkAaveData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_AAVE));
stkBptData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_BPT));
stkBptWstETHData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_BPT_WSTETH));
ethPrice = uint256(AggregatorInterface(ETH_USD_PRICE_FEED).latestAnswer());
}

Expand All @@ -92,6 +108,15 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
stkBptData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_BPT));
}

function getStakedAssetData(address stakedAsset)
external
view
override
returns (StakedTokenData memory)
{
return _getStakedTokenData(AggregatedStakedAaveV3(stakedAsset));
}

/// @inheritdoc IStakedTokenDataProvider
function getAllStakedTokenUserData(address user)
external
Expand All @@ -102,13 +127,19 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
StakedTokenUserData memory stkAaveUserData,
StakedTokenData memory stkBptData,
StakedTokenUserData memory stkBptUserData,
StakedTokenData memory stkBptWstETHData,
StakedTokenUserData memory stkBptWstETHUserData,
uint256 ethPrice
)
{
stkAaveData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_AAVE));
stkAaveUserData = _getStakedTokenUserData(AggregatedStakedAaveV3(STAKED_AAVE), user);
stkBptData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_BPT));
stkBptUserData = _getStakedTokenUserData(AggregatedStakedAaveV3(STAKED_BPT), user);

stkBptWstETHData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_BPT_WSTETH));
stkBptWstETHUserData = _getStakedTokenUserData(AggregatedStakedAaveV3(STAKED_BPT_WSTETH), user);

ethPrice = uint256(AggregatorInterface(ETH_USD_PRICE_FEED).latestAnswer());
}

Expand All @@ -134,6 +165,32 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
stkBptUserData = _getStakedTokenUserData(AggregatedStakedAaveV3(STAKED_BPT), user);
}

/// @inheritdoc IStakedTokenDataProvider
function getStkBptWstETHUserData(address user)
external
view
override
returns (
StakedTokenData memory stkBptWstETHData,
StakedTokenUserData memory stkBptWstETHUserData
)
{
stkBptWstETHData = _getStakedTokenData(AggregatedStakedAaveV3(STAKED_BPT_WSTETH));
stkBptWstETHUserData = _getStakedTokenUserData(AggregatedStakedAaveV3(STAKED_BPT_WSTETH), user);
}

function getStakedUserData(address user, address stakedAsset)
external
view
override
returns (StakedTokenData memory, StakedTokenUserData memory)
{
return (
_getStakedTokenData(AggregatedStakedAaveV3(stakedAsset)),
_getStakedTokenUserData(AggregatedStakedAaveV3(stakedAsset), user)
);
}

/**
* @notice Returns data of the Staked Token passed as parameter
* @param stakedToken The address of the StakedToken (eg. stkAave, stkBptAave)
Expand All @@ -150,6 +207,7 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
data.stakeUnstakeWindow = stakedToken.UNSTAKE_WINDOW();
data.rewardTokenPriceEth = uint256(AggregatorInterface(AAVE_PRICE_FEED).latestAnswer());
data.distributionEnd = stakedToken.DISTRIBUTION_END();
data.inPostSlashingPeriod = stakedToken.inPostSlashingPeriod();

data.distributionPerSecond = block.timestamp < data.distributionEnd
? stakedToken.assets(address(stakedToken)).emissionPerSecond
Expand All @@ -168,6 +226,13 @@ contract StakedTokenDataProvider is IStakedTokenDataProvider {
data.distributionPerSecond * data.rewardTokenPriceEth,
data.stakedTokenTotalSupply * data.stakedTokenPriceEth
);
} else if (address(stakedToken) == STAKED_BPT_WSTETH) {
// stkBptWstETH
data.stakedTokenPriceEth = uint256(AggregatorInterface(BPT_STETH_PRICE_FEED).latestAnswer());
data.stakeApy = _calculateApy(
data.distributionPerSecond * data.rewardTokenPriceEth,
data.stakedTokenTotalSupply * data.stakedTokenPriceEth
);
}
}

Expand Down
1 change: 1 addition & 0 deletions hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ const config: HardhatUserConfig = {
ropsten: getCommonNetworkConfig(eEthereumNetwork.ropsten, 3),
goerli: getCommonNetworkConfig(eEthereumNetwork.goerli, 5),
main: getCommonNetworkConfig(eEthereumNetwork.main, 1),
sepolia: getCommonNetworkConfig(eEthereumNetwork.sepolia, 11155111),
hardhat: {
hardfork: 'london',
blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT,
Expand Down
12 changes: 12 additions & 0 deletions helpers/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ export const PROXY_CRP_ADMIN = SHORT_EXECUTOR;
export const RESERVE_CONTROLER = '0x1E506cbb6721B83B1549fa1558332381Ffa61A93';
export const ZERO_ADDRESS: tEthereumAddress = '0x0000000000000000000000000000000000000000';

export const STK_BPT = '0xa1116930326d21fb917d5a27f1e9943a9595fb47';
export const AAVE_BPT_POOL_TOKEN = '0x41a08648c3766f9f9d85598ff102a08f4ef84f84';
export const STK_WSTEH = '0xa1116930326d21fb917d5a27f1e9943a9595fb47'; // TODO change for actual token
export const STAKED_AAVE = '0x4da27a545c0c5b758a6ba100e3a049001de870f5';
export const ETH_USD_PRICE_FEED = '0x5f4ec3df9cbd43714fe2740f5e3616155c5b8419';
export const AAVE_ORACLE = '0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012';
export const BPT_PRICE_FEED = '0x0De156f178a20114eeec0eBF71d7772064476b0D';
export const STK_WHALE = '0xaFDAbFb6227507fF6522b8a242168F6b5F353a6E';
export const BPT_WHALE = '0x741AA7CFB2c7bF2A1E7D4dA2e3Df6a56cA4131F3';
export const STK_WSTEH_WHALE = '0x741AA7CFB2c7bF2A1E7D4dA2e3Df6a56cA4131F3';
export const COLLECTOR = '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c';

// PEI constants
export const PSM_STAKER_PREMIUM = '2';

Expand Down
50 changes: 50 additions & 0 deletions helpers/contracts-accessors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { StakedTokenV2 } from '../types/StakedTokenV2';
import { StakedTokenV3 } from '../types/StakedTokenV3';
import { AaveStakingHelper } from '../types/AaveStakingHelper';
import { StakeUiHelper } from '../types/StakeUiHelper';
import { StakedTokenDataProvider } from '../types/StakedTokenDataProvider';
import { Ierc20Detailed } from '../types/Ierc20Detailed';
import { InitializableAdminUpgradeabilityProxy } from '../types/InitializableAdminUpgradeabilityProxy';
import { AaveIncentivesController } from '../types/AaveIncentivesController';
Expand Down Expand Up @@ -470,3 +471,52 @@ export const deployStakeUIHelper = async (
}
return instance;
};

export const getStakedTokenDataProvider = getContractFactory<StakedTokenDataProvider>(
eContractid.StakedTokenDataProvider
);

export const deployStakedTokenDataProvider = async (
[
aaveToken,
stkAaveAddress,
bptToken,
stkBptToken,
ethUsdPriceFeed,
aaveOracleAddress,
bptPriceFeed,

bptWstETH,
bptWstETHPriceFeed,
]: [
tEthereumAddress,
tEthereumAddress,
tEthereumAddress,
tEthereumAddress,
tEthereumAddress,
tEthereumAddress,
tEthereumAddress,
tEthereumAddress,
tEthereumAddress
],
verify?: boolean
) => {
const id = eContractid.StakedTokenDataProvider;
const args: string[] = [
aaveToken,
stkAaveAddress,
bptToken,
stkBptToken,
ethUsdPriceFeed,
aaveOracleAddress,
bptPriceFeed,

bptWstETH,
bptWstETHPriceFeed,
];
const instance = await deployContract<StakedTokenDataProvider>(id, args);
if (verify) {
await verifyContract(instance.address, args);
}
return instance;
};
2 changes: 2 additions & 0 deletions helpers/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export enum eEthereumNetwork {
main = 'main',
tenderly = 'tenderly',
goerli = 'goerli',
sepolia = 'sepolia',
}

export enum eContractid {
Expand Down Expand Up @@ -35,6 +36,7 @@ export enum eContractid {
StakedTokenBptRev2 = 'StakedTokenBptRev2',
AaveStakingHelper = 'AaveStakingHelper',
StakeUIHelper = 'StakeUIHelper',
StakedTokenDataProvider = 'StakedTokenDataProvider',
}

export type tEthereumAddress = string;
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"test-pei": "npm run test test/__setup.spec.ts test/AaveIncentivesController/*.spec.ts",
"test-psi": "npm run test test/__setup.spec.ts test/StakedAave/*.spec.ts",
"test-psi2": "npm run test test/__setup.spec.ts test/StakedAaveV2/*.spec.ts",
"test-data-providers": "hardhat test test/Misc/stakedTokenDataProvider.spec.ts",
"test-bpt": "npm run compile:force:quiet && FORKING_BLOCK=11730175 MAINNET_FORK=true hardhat test test/StakedBPT/create-bpt-and-stakebpt.fork.ts",
"test-proposal": "MAINNET_FORK=true hardhat test ./test-fork/stakingExtensionProposal.spec.ts",
"test-proposal:tenderly": "TENDERLY=true npm run hardhat:tenderly -- test ./test-fork/stakingExtensionProposal.spec.ts",
Expand Down
Loading
Loading