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

Withdrawal fee #52

Merged
merged 9 commits into from
Feb 26, 2024
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
107 changes: 76 additions & 31 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
PufETHTest:testFail_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 627836, ~: 630088)
PufETHTest:testFail_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 633453, ~: 635382)
PufETHTest:testFail_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 627787, ~: 630010)
PufETHTest:testFail_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 633476, ~: 635685)
PufETHTest:test_RT_deposit_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2369, ~: 2369)
PufETHTest:test_RT_deposit_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2391, ~: 2391)
PufETHTest:test_RT_mint_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2347, ~: 2347)
Expand All @@ -8,33 +8,33 @@ PufETHTest:test_RT_redeem_deposit((address[4],uint256[4],uint256[4],int256),uint
PufETHTest:test_RT_redeem_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2346, ~: 2346)
PufETHTest:test_RT_withdraw_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2389, ~: 2389)
PufETHTest:test_RT_withdraw_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2347, ~: 2347)
PufETHTest:test_asset((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479503, ~: 483489)
PufETHTest:test_convertToAssets((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 489830, ~: 492125)
PufETHTest:test_convertToShares((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 489200, ~: 491796)
PufETHTest:test_deposit((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 531395, ~: 536001)
PufETHTest:test_asset((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479542, ~: 483496)
PufETHTest:test_convertToAssets((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 489542, ~: 492229)
PufETHTest:test_convertToShares((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 488969, ~: 491800)
PufETHTest:test_deposit((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 531477, ~: 536026)
PufETHTest:test_erc4626_interface() (gas: 238648)
PufETHTest:test_maxDeposit((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479486, ~: 483473)
PufETHTest:test_maxMint((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479422, ~: 483409)
PufETHTest:test_maxRedeem((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479635, ~: 483621)
PufETHTest:test_maxWithdraw((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 482889, ~: 486788)
PufETHTest:test_mint((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 537903, ~: 542179)
PufETHTest:test_previewDeposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 530409, ~: 532880)
PufETHTest:test_previewMint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 536949, ~: 539261)
PufETHTest:test_maxDeposit((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479526, ~: 483479)
PufETHTest:test_maxMint((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479462, ~: 483415)
PufETHTest:test_maxRedeem((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479675, ~: 483628)
PufETHTest:test_maxWithdraw((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 482918, ~: 486768)
PufETHTest:test_mint((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 537901, ~: 542159)
PufETHTest:test_previewDeposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 530119, ~: 532895)
PufETHTest:test_previewMint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 536462, ~: 539119)
PufETHTest:test_previewRedeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2390, ~: 2390)
PufETHTest:test_previewWithdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 2346, ~: 2346)
PufETHTest:test_redeem((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 2345, ~: 2345)
PufETHTest:test_roles_setup() (gas: 99794)
PufETHTest:test_totalAssets((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 481627, ~: 485612)
PufETHTest:test_totalAssets((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 481667, ~: 485618)
PufETHTest:test_withdraw((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 2369, ~: 2369)
PufferDepositorMainnetForkTest:test_stETH_approve_deposit() (gas: 321650)
PufferDepositorMainnetForkTest:test_stETH_approve_deposit_to_bob() (gas: 282603)
PufferDepositorMainnetForkTest:test_stETH_permit_deposit() (gas: 352339)
PufferDepositorMainnetForkTest:test_stETH_permit_deposit_to_bob() (gas: 314962)
PufferDepositorMainnetForkTest:test_wstETH_approve_deposit() (gas: 266346)
PufferDepositorMainnetForkTest:test_wstETH_approve_deposit_to_bob() (gas: 272144)
PufferDepositorMainnetForkTest:test_wstETH_permit_deposit() (gas: 291857)
PufferDepositorMainnetForkTest:test_wstETH_permit_deposit_to_bob() (gas: 301396)
PufferTest:test_1inch_complex_swap() (gas: 21829891)
PufferDepositorV2ForkTest:test_stETH_approve_deposit() (gas: 321650)
PufferDepositorV2ForkTest:test_stETH_approve_deposit_to_bob() (gas: 282603)
PufferDepositorV2ForkTest:test_stETH_permit_deposit() (gas: 352339)
PufferDepositorV2ForkTest:test_stETH_permit_deposit_to_bob() (gas: 314962)
PufferDepositorV2ForkTest:test_wstETH_approve_deposit() (gas: 266346)
PufferDepositorV2ForkTest:test_wstETH_approve_deposit_to_bob() (gas: 272144)
PufferDepositorV2ForkTest:test_wstETH_permit_deposit() (gas: 291857)
PufferDepositorV2ForkTest:test_wstETH_permit_deposit_to_bob() (gas: 301396)
PufferTest:test_1inch_complex_swap() (gas: 22091412)
PufferTest:test_ape_to_pufETH() (gas: 468864)
PufferTest:test_conversions_and_deposit_to_el() (gas: 1754220)
PufferTest:test_deposit_stETH_permit() (gas: 315987)
Expand All @@ -49,20 +49,65 @@ PufferTest:test_lido_withdrawal_dos() (gas: 696274)
PufferTest:test_minting_and_lido_rebasing() (gas: 1039391)
PufferTest:test_swap_1inch() (gas: 439801)
PufferTest:test_swap_1inch_permit() (gas: 431084)
PufferTest:test_upgrade_to_mainnet() (gas: 7110283)
PufferTest:test_usdc_permit_upgrade() (gas: 21626461)
PufferTest:test_upgrade_to_mainnet() (gas: 7411243)
PufferTest:test_usdc_permit_upgrade() (gas: 21887982)
PufferTest:test_usdc_to_pufETH() (gas: 513797)
PufferTest:test_usdc_to_pufETH_permit() (gas: 516169)
PufferTest:test_usdt_to_pufETH() (gas: 511286)
PufferTest:test_withdraw_from_eigenLayer() (gas: 659458)
PufferTest:test_withdraw_from_eigenLayer_dos() (gas: 888388)
PufferTest:test_zero_stETH_deposit() (gas: 225443)
PufferVaultV2ForkTest:test_deposit() (gas: 254761)
PufferVaultV2ForkTest:test_eth_weth_stETH_deposits() (gas: 426745)
PufferVaultV2ForkTest:test_max_deposit() (gas: 52161)
PufferVaultV2ForkTest:test_max_withdrawal() (gas: 252761)
PufferVaultV2ForkTest:test_mint() (gas: 274898)
PufferVaultV2ForkTest:test_sanity() (gas: 122645)
PufferVaultV2ForkTest:test_burn() (gas: 106659)
PufferVaultV2ForkTest:test_change_withdrawal_limit() (gas: 785551)
PufferVaultV2ForkTest:test_deposit() (gas: 318955)
PufferVaultV2ForkTest:test_deposit_fails_when_not_enough_funds() (gas: 298835)
PufferVaultV2ForkTest:test_eth_weth_stETH_deposits() (gas: 491344)
PufferVaultV2ForkTest:test_max_deposit() (gas: 52252)
PufferVaultV2ForkTest:test_max_withdrawal() (gas: 260397)
PufferVaultV2ForkTest:test_mint() (gas: 339225)
PufferVaultV2ForkTest:test_redeem_fails_if_no_eth_seeded() (gas: 212427)
PufferVaultV2ForkTest:test_redeem_fails_if_owner_is_not_caller() (gas: 723141)
PufferVaultV2ForkTest:test_redeem_succeeds_if_seeded_with_eth() (gas: 866934)
PufferVaultV2ForkTest:test_redeem_succeeds_with_allowance() (gas: 768074)
PufferVaultV2ForkTest:test_redeem_transfers_to_receiver() (gas: 740717)
PufferVaultV2ForkTest:test_redemption_fee() (gas: 925832)
PufferVaultV2ForkTest:test_sanity() (gas: 152728)
PufferVaultV2ForkTest:test_setDailyWithdrawalLimit() (gas: 247763)
PufferVaultV2ForkTest:test_set_exit_fee_change() (gas: 923090)
PufferVaultV2ForkTest:test_transferETH() (gas: 696772)
PufferVaultV2ForkTest:test_transferETH_with_weth_liquidity() (gas: 347144)
PufferVaultV2ForkTest:test_withdraw_fee() (gas: 893821)
PufferVaultV2ForkTest:test_withdrawal() (gas: 926616)
PufferVaultV2ForkTest:test_withdrawal_fails_if_owner_is_not_caller() (gas: 723192)
PufferVaultV2ForkTest:test_withdrawal_fails_when_exceeding_maximum() (gas: 682553)
PufferVaultV2ForkTest:test_withdrawal_succeeds_with_allowance() (gas: 768138)
PufferVaultV2ForkTest:test_withdrawal_transfers_to_receiver() (gas: 740805)
PufferVaultV2Property:testFail_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 647344, ~: 648411)
PufferVaultV2Property:testFail_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 655177, ~: 655297)
PufferVaultV2Property:test_RT_deposit_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 554145, ~: 554649)
PufferVaultV2Property:test_RT_deposit_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 554668, ~: 555210)
PufferVaultV2Property:test_RT_mint_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 561851, ~: 562312)
PufferVaultV2Property:test_RT_mint_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 561963, ~: 562441)
PufferVaultV2Property:test_RT_redeem_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 555072, ~: 555512)
PufferVaultV2Property:test_RT_redeem_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 556767, ~: 557294)
PufferVaultV2Property:test_RT_withdraw_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 561341, ~: 561517)
PufferVaultV2Property:test_RT_withdraw_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 562886, ~: 563065)
PufferVaultV2Property:test_asset((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 475534, ~: 475557)
PufferVaultV2Property:test_convertToAssets((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 486722, ~: 486684)
PufferVaultV2Property:test_convertToShares((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 486349, ~: 486577)
PufferVaultV2Property:test_deposit((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 528983, ~: 529152)
PufferVaultV2Property:test_maxDeposit((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 475509, ~: 475532)
PufferVaultV2Property:test_maxMint((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 475427, ~: 475450)
PufferVaultV2Property:test_maxRedeem((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 484392, ~: 484416)
PufferVaultV2Property:test_maxWithdraw((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 484485, ~: 484504)
PufferVaultV2Property:test_mint((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 536599, ~: 536658)
PufferVaultV2Property:test_previewDeposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 526837, ~: 527236)
PufferVaultV2Property:test_previewMint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 534587, ~: 534913)
PufferVaultV2Property:test_previewRedeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 546417, ~: 546820)
PufferVaultV2Property:test_previewWithdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 552694, ~: 552806)
PufferVaultV2Property:test_redeem((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 547967, ~: 548486)
PufferVaultV2Property:test_totalAssets((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 479051, ~: 479074)
PufferVaultV2Property:test_withdraw((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 554277, ~: 554418)
TimelockTest:test_cancel_reverts_if_caller_unauthorized(address) (runs: 256, μ: 11272, ~: 11272)
TimelockTest:test_cancel_transaction() (gas: 38801)
TimelockTest:test_change_pauser() (gas: 23527)
Expand Down
3 changes: 2 additions & 1 deletion docs/PufferVaultV2.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,13 @@ The PufferVault maintains the addresses of important contracts related to EigenL
* `uint256 lidoLockedETH`: The amount of ETH the Puffer Protocol has locked inside of Lido
* `uint256 eigenLayerPendingWithdrawalSharesAmount`: The amount of stETH shares the Puffer vault has pending for withdrawal from EigenLayer
* `bool isLidoWithdrawal`: Deprecated from PufferVault version 1
* `EnumerableSet.UintSet lidoWithdrawals`: Tracks the withdrawal request IDs from Lido
* `EnumerableSet.UintSet lidoWithdrawals`: Deprecated from PufferVault version 1
* `EnumerableSet.Bytes32Set eigenLayerWithdrawals`: Tracks withdrawalRoots from EigenLayer withdrawals
* `EnumerableMap.UintToUintMap lidoWithdrawalAmounts`: Tracks the amounts of corresponding to each Lido withdrawal
* `uint96 dailyAssetsWithdrawalLimit`: The maximum assets (wETH) that can be withdrawn from the vault per day
* `uint96 assetsWithdrawnToday`: The amount of assets (wETH) that has been withdrawn today
* `uint64 lastWithdrawalDay`: Tracks when the day ends to reset `assetsWithdrawnToday`
* `uint256 exitFeeBasisPoints`: Penalty when withdrawing to mitigate oracle sandwich attacks

#### PufferVaultV2
* `IWETH internal immutable _WETH`: Address of wrapped ETH contract (wETH)
Expand Down
7 changes: 2 additions & 5 deletions script/GenerateAccessManagerCallData.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@ import { PUBLIC_ROLE, ROLE_ID_DAO, ROLE_ID_PUFFER_PROTOCOL, ADMIN_ROLE, ROLE_ID_
* 3. timelock.executeTransaction(address(accessManager), encodedMulticall, 1)
*/
contract GenerateAccessManagerCallData is Script {
function run(address pufferVaultProxy, address pufferDepositorProxy, address pufferProtocolProxy)
public
pure
returns (bytes memory)
{
function run(address pufferVaultProxy, address pufferDepositorProxy) public pure returns (bytes memory) {
bytes[] memory calldatas = new bytes[](6);

// Combine the two calldatas
Expand Down Expand Up @@ -69,6 +65,7 @@ contract GenerateAccessManagerCallData is Script {

function _getProtocolSelectorsCalldata(address pufferVaultProxy) internal pure returns (bytes memory) {
// Puffer Protocol only
// PufferProtocol will get `ROLE_ID_PUFFER_PROTOCOL` when it's deployed
bytes4[] memory protocolSelectors = new bytes4[](2);
protocolSelectors[0] = PufferVaultV2.transferETH.selector;
protocolSelectors[1] = PufferVaultV2.burn.selector;
Expand Down
2 changes: 1 addition & 1 deletion src/NoImplementation.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
import { UUPSUpgradeable } from "@openzeppelin-contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";

contract NoImplementation is UUPSUpgradeable {
address immutable upgrader;

Check warning on line 7 in src/NoImplementation.sol

View workflow job for this annotation

GitHub Actions / solhint

Explicitly mark visibility of state

Check warning on line 7 in src/NoImplementation.sol

View workflow job for this annotation

GitHub Actions / solhint

Immutable variables name are set to be in capitalized SNAKE_CASE

constructor() {
upgrader = msg.sender;
}

function _authorizeUpgrade(address newImplementation) internal virtual override {
function _authorizeUpgrade(address) internal virtual override {
// solhint-disable-next-line custom-errors
require(msg.sender == upgrader, "Unauthorized");
// anybody can steal this proxy
Expand Down
6 changes: 4 additions & 2 deletions src/PufferVaultStorage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,16 @@ abstract contract PufferVaultStorage {
// 6 Slots for Redemption logic
uint256 lidoLockedETH;
uint256 eigenLayerPendingWithdrawalSharesAmount;
bool isLidoWithdrawal;
EnumerableSet.UintSet lidoWithdrawals;
bool isLidoWithdrawal; // Not in use in PufferVaultV2
EnumerableSet.UintSet lidoWithdrawals; // Not in use in PufferVaultV2
EnumerableSet.Bytes32Set eigenLayerWithdrawals;
EnumerableMap.UintToUintMap lidoWithdrawalAmounts;
// 1 Slot for daily withdrawal limits
uint96 dailyAssetsWithdrawalLimit;
uint96 assetsWithdrawnToday;
uint64 lastWithdrawalDay;
// 1 slot for withdrawal fee
uint256 exitFeeBasisPoints;
}

// keccak256(abi.encode(uint256(keccak256("puffervault.storage")) - 1)) & ~bytes32(uint256(0xff))
Expand Down
Loading
Loading