Skip to content

Commit

Permalink
chore: natspec
Browse files Browse the repository at this point in the history
  • Loading branch information
junkim012 committed Apr 29, 2024
1 parent bef84b5 commit 0f78d89
Show file tree
Hide file tree
Showing 8 changed files with 454 additions and 231 deletions.
1 change: 1 addition & 0 deletions src/interfaces/IIonPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -233,4 +233,5 @@ interface IIonPool {

function getTotalUnderlyingClaims() external view returns (uint256);
function getUnderlyingClaimOf(address user) external view returns (uint256);
function extsload(bytes32 slot) external view returns (bytes32);
}
260 changes: 187 additions & 73 deletions src/vault/Vault.sol

Large diffs are not rendered by default.

6 changes: 2 additions & 4 deletions src/vault/VaultFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ pragma solidity 0.8.21;

import { Vault } from "./Vault.sol";
import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol";
import { IIonLens } from "./../interfaces/IIonLens.sol";

/**
* @title Ion Lending Vault Factory
Expand All @@ -27,7 +26,6 @@ contract VaultFactory {

/**
* @notice Deploys a new Ion Lending Vault.
* @param ionLens The IonLens contract for querying data.
* @param baseAsset The asset that is being lent out to IonPools.
* @param feeRecipient Address that receives the accrued manager fees.
* @param feePercentage Fee percentage to be set.
Expand All @@ -38,7 +36,6 @@ contract VaultFactory {
* @param salt The salt used for CREATE2 deployment.
*/
function createVault(
IIonLens ionLens,
IERC20 baseAsset,
address feeRecipient,
uint256 feePercentage,
Expand All @@ -51,8 +48,9 @@ contract VaultFactory {
external
returns (Vault vault)
{
// TODO use named args syntax
vault = new Vault{ salt: salt }(
ionLens, baseAsset, feeRecipient, feePercentage, name, symbol, initialDelay, initialDefaultAdmin
baseAsset, feeRecipient, feePercentage, name, symbol, initialDelay, initialDefaultAdmin
);

emit CreateVault(address(vault), baseAsset, feeRecipient, feePercentage, name, symbol, initialDefaultAdmin);
Expand Down
41 changes: 16 additions & 25 deletions test/fork/concrete/vault/VaultFactory.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,61 +24,52 @@ contract VaultFactoryTest is VaultSharedSetup {

function test_CreateVault() public {
bytes32 salt = keccak256("random salt");
Vault vault = factory.createVault(
ionLens, baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt
);
Vault vault =
factory.createVault(baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt);

assertEq(VAULT_ADMIN, vault.defaultAdmin(), "default admin");
assertEq(feeRecipient, vault.feeRecipient(), "fee recipient");
assertEq(address(baseAsset), address(vault.baseAsset()), "base asset");
assertEq(address(ionLens), address(vault.ionLens()), "ion lens");
assertEq(address(baseAsset), address(vault.BASE_ASSET()), "base asset");
}

function test_CreateVault_Twice() public {
bytes32 salt = keccak256("first random salt");
Vault vault = factory.createVault(
ionLens, baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt
);
Vault vault =
factory.createVault(baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt);

bytes32 salt2 = keccak256("second random salt");
Vault vault2 = factory.createVault(
ionLens, baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt2
);
Vault vault2 =
factory.createVault(baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt2);

assertEq(VAULT_ADMIN, vault.defaultAdmin(), "default admin");
assertEq(feeRecipient, vault.feeRecipient(), "fee recipient");
assertEq(address(baseAsset), address(vault.baseAsset()), "base asset");
assertEq(address(ionLens), address(vault.ionLens()), "ion lens");
assertEq(address(baseAsset), address(vault.BASE_ASSET()), "base asset");

assertEq(VAULT_ADMIN, vault2.defaultAdmin(), "default admin");
assertEq(feeRecipient, vault2.feeRecipient(), "fee recipient");
assertEq(address(baseAsset), address(vault2.baseAsset()), "base asset");
assertEq(address(ionLens), address(vault2.ionLens()), "ion lens");
assertEq(address(baseAsset), address(vault2.BASE_ASSET()), "base asset");
}

function test_Revert_CreateVault_SameSaltTwice() public {
bytes32 salt = keccak256("random salt");
Vault vault = factory.createVault(
ionLens, baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt
);
Vault vault =
factory.createVault(baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt);

vm.expectRevert();
Vault vault2 = factory.createVault(
ionLens, baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt
);
Vault vault2 =
factory.createVault(baseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt);
}

function test_CreateVault_SameSaltDifferentBytecode() public {
bytes32 salt = keccak256("random salt");

Vault vault = factory.createVault(
ionLens, BASE_ASSET, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt
);
Vault vault =
factory.createVault(BASE_ASSET, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt);

IERC20 diffBaseAsset = IERC20(address(new ERC20PresetMinterPauser("Another Wrapped Staked ETH", "wstETH2")));

Vault vault2 = factory.createVault(
ionLens, diffBaseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt
diffBaseAsset, feeRecipient, feePercentage, name, symbol, INITIAL_DELAY, VAULT_ADMIN, salt
);

require(address(vault) != address(vault2), "different deployment address");
Expand Down
30 changes: 13 additions & 17 deletions test/helpers/VaultSharedSetup.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { WadRayMath, RAY } from "./../../src/libraries/math/WadRayMath.sol";
import { Vault } from "./../../src/vault/Vault.sol";
import { IonPool } from "./../../src/IonPool.sol";
import { IIonPool } from "./../../src/interfaces/IIonPool.sol";
import { IonLens } from "./../../src/periphery/IonLens.sol";
import { GemJoin } from "./../../src/join/GemJoin.sol";
import { YieldOracle } from "./../../src/YieldOracle.sol";
import { IYieldOracle } from "./../../src/interfaces/IYieldOracle.sol";
Expand Down Expand Up @@ -33,7 +32,6 @@ contract VaultSharedSetup is IonPoolSharedSetup {
StdStorage stdstore1;

Vault vault;
IonLens ionLens;

// roles
address constant VAULT_ADMIN = address(uint160(uint256(keccak256("VAULT_ADMIN"))));
Expand Down Expand Up @@ -71,11 +69,7 @@ contract VaultSharedSetup is IonPoolSharedSetup {
rsEthIonPool = deployIonPool(BASE_ASSET, RSETH, address(this));
rswEthIonPool = deployIonPool(BASE_ASSET, RSWETH, address(this));

ionLens = new IonLens();

vault = new Vault(
ionLens, BASE_ASSET, FEE_RECIPIENT, ZERO_FEES, "Ion Vault Token", "IVT", INITIAL_DELAY, VAULT_ADMIN
);
vault = new Vault(BASE_ASSET, FEE_RECIPIENT, ZERO_FEES, "Ion Vault Token", "IVT", INITIAL_DELAY, VAULT_ADMIN);

vm.startPrank(vault.defaultAdmin());

Expand Down Expand Up @@ -220,12 +214,6 @@ contract VaultSharedSetup is IonPoolSharedSetup {
_vault.updateWithdrawQueue(queue);
}

// -- Queries ---

// function expectedSupplyAmounts(Vault _vault, uint256 assets) internal returns (uint256[]) {

// }

// -- Exact Rounding Error Equations ---

function postDepositClaimRE(uint256 depositAmount, uint256 supplyFactor) internal returns (uint256) {
Expand All @@ -242,10 +230,6 @@ contract VaultSharedSetup is IonPoolSharedSetup {
return (supplyFactor - withdrawAmount * RAY % supplyFactor) / RAY;
}

// Resulting vault shares?
// The difference between the expected max withdraw after withdrawal and the
// actual max withdraw after withdrawal.
// TODO: totalSupply needs to change when _decimalsOffset is added
function maxWithdrawREAfterWithdraw(
uint256 withdrawAmount,
uint256 totalAssets,
Expand Down Expand Up @@ -288,4 +272,16 @@ contract VaultSharedSetup is IonPoolSharedSetup {
function newAddress(bytes memory str) internal returns (address) {
return address(uint160(uint256(keccak256(str))));
}

function withSupplyFactor() internal {
IonPoolExposed(address(weEthIonPool)).setSupplyFactor(1.13131323e27);
IonPoolExposed(address(rsEthIonPool)).setSupplyFactor(1.1585678e27);
IonPoolExposed(address(rswEthIonPool)).setSupplyFactor(1.838194e27);
}

function withInflatedSupplyFactor() internal {
IonPoolExposed(address(weEthIonPool)).setSupplyFactor(5.1336673e27);
IonPoolExposed(address(rsEthIonPool)).setSupplyFactor(7.1336673e27);
IonPoolExposed(address(rswEthIonPool)).setSupplyFactor(10.1336673e27);
}
}
Loading

0 comments on commit 0f78d89

Please sign in to comment.