Skip to content

Commit

Permalink
union vault
Browse files Browse the repository at this point in the history
  • Loading branch information
1kresh committed May 23, 2024
1 parent 3f5db99 commit 9550eaf
Show file tree
Hide file tree
Showing 7 changed files with 387 additions and 431 deletions.
4 changes: 2 additions & 2 deletions script/deploy/Vault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pragma solidity ^0.8.13;
import "forge-std/Script.sol";

import {IMigratablesRegistry} from "src/interfaces/base/IMigratablesRegistry.sol";
import {IVaultDelegation} from "src/interfaces/IVaultDelegation.sol";
import {IVault} from "src/interfaces/IVault.sol";

contract VaultScript is Script {
function run(
Expand All @@ -25,7 +25,7 @@ contract VaultScript is Script {
IMigratablesRegistry(vaultRegistry).create(
IMigratablesRegistry(vaultRegistry).lastVersion(),
abi.encode(
IVaultDelegation.InitParams({
IVault.InitParams({
owner: owner,
collateral: collateral,
epochDuration: epochDuration,
Expand Down
244 changes: 224 additions & 20 deletions src/contracts/Vault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,28 @@
pragma solidity 0.8.25;

import {IVault} from "src/interfaces/IVault.sol";
import {IRegistry} from "src/interfaces/base/IRegistry.sol";
import {IMigratableEntity} from "src/interfaces/base/IMigratableEntity.sol";
import {ICollateral} from "src/interfaces/base/ICollateral.sol";
import {IMiddlewarePlugin} from "src/interfaces/plugins/IMiddlewarePlugin.sol";
import {INetworkOptInPlugin} from "src/interfaces/plugins/INetworkOptInPlugin.sol";
import {IOperatorOptInPlugin} from "src/interfaces/plugins/IOperatorOptInPlugin.sol";

import {VaultDelegation} from "./VaultDelegation.sol";
import {VaultStorage} from "./VaultStorage.sol";
import {MigratableEntity} from "./base/MigratableEntity.sol";

import {ERC4626Math} from "./libraries/ERC4626Math.sol";
import {Checkpoints} from "./libraries/Checkpoints.sol";

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {Time} from "@openzeppelin/contracts/utils/types/Time.sol";
import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";

contract Vault is VaultDelegation, IVault {
contract Vault is VaultStorage, MigratableEntity, AccessControlUpgradeable, IVault {
using Checkpoints for Checkpoints.Trace256;
using Math for uint256;

constructor(
address networkRegistry,
address operatorRegistry,
address networkMiddlewarePlugin,
address networkVaultOptInPlugin,
address operatorVaultOptInPlugin,
address operatorNetworkOptInPlugin
)
VaultDelegation(
networkRegistry,
operatorRegistry,
networkMiddlewarePlugin,
networkVaultOptInPlugin,
operatorVaultOptInPlugin,
operatorNetworkOptInPlugin
)
{}

/**
* @inheritdoc IVault
*/
Expand Down Expand Up @@ -77,6 +63,77 @@ contract Vault is VaultDelegation, IVault {
return Math.min(totalSupply(), Math.min(networkLimit(network, resolver), operatorLimit(operator, network)));
}

/**
* @inheritdoc IVault
*/
function networkLimit(address network, address resolver) public view returns (uint256) {
return _getLimit(_networkLimit[network][resolver], nextNetworkLimit[network][resolver]);
}

/**
* @inheritdoc IVault
*/
function operatorLimit(address operator, address network) public view returns (uint256) {
return _getLimit(_operatorLimit[operator][network], nextOperatorLimit[operator][network]);
}

constructor(
address networkRegistry,
address operatorRegistry,
address networkMiddlewarePlugin,
address networkVaultOptInPlugin,
address operatorVaultOptInPlugin,
address operatorNetworkOptInPlugin
)
VaultStorage(
networkRegistry,
operatorRegistry,
networkMiddlewarePlugin,
networkVaultOptInPlugin,
operatorVaultOptInPlugin,
operatorNetworkOptInPlugin
)
{}

/**
* @inheritdoc IMigratableEntity
*/
function initialize(uint64 version_, bytes memory data) public override reinitializer(version_) {
(IVault.InitParams memory params) = abi.decode(data, (IVault.InitParams));

if (params.epochDuration == 0) {
revert InvalidEpochDuration();
}

if (params.vetoDuration + params.slashDuration > params.epochDuration) {
revert InvalidSlashDuration();
}

if (params.adminFee > ADMIN_FEE_BASE) {
revert InvalidAdminFee();
}

_initialize(params.owner);

collateral = params.collateral;

epochDurationInit = Time.timestamp();
epochDuration = params.epochDuration;

vetoDuration = params.vetoDuration;
slashDuration = params.slashDuration;

adminFee = params.adminFee;
depositWhitelist = params.depositWhitelist;

_grantRole(DEFAULT_ADMIN_ROLE, params.owner);
_grantRole(NETWORK_LIMIT_SET_ROLE, params.owner);
_grantRole(OPERATOR_LIMIT_SET_ROLE, params.owner);
if (params.depositWhitelist) {
_grantRole(DEPOSITOR_WHITELIST_ROLE, params.owner);
}
}

/**
* @inheritdoc IVault
*/
Expand Down Expand Up @@ -317,4 +374,151 @@ contract Vault is VaultDelegation, IVault {

emit VetoSlash(slashIndex);
}

/**
* @inheritdoc IVault
*/
function setMaxNetworkLimit(address resolver, uint256 amount) external {
if (maxNetworkLimit[msg.sender][resolver] == amount) {
revert AlreadySet();
}

if (!IRegistry(NETWORK_REGISTRY).isEntity(msg.sender)) {
revert NotNetwork();
}

maxNetworkLimit[msg.sender][resolver] = amount;

Limit storage limit = _networkLimit[msg.sender][resolver];
DelayedLimit storage nextLimit = nextNetworkLimit[msg.sender][resolver];

_updateLimit(limit, nextLimit);

if (limit.amount > amount) {
limit.amount = amount;
}
if (nextLimit.amount > amount) {
nextLimit.amount = amount;
}

emit SetMaxNetworkLimit(msg.sender, resolver, amount);
}

/**
* @inheritdoc IVault
*/
function setAdminFee(uint256 adminFee_) external onlyRole(ADMIN_FEE_SET_ROLE) {
if (adminFee == adminFee_) {
revert AlreadySet();
}

if (adminFee_ > ADMIN_FEE_BASE) {
revert InvalidAdminFee();
}

adminFee = adminFee_;

emit SetAdminFee(adminFee_);
}

/**
* @inheritdoc IVault
*/
function setDepositWhitelist(bool status) external onlyRole(DEPOSIT_WHITELIST_SET_ROLE) {
if (depositWhitelist == status) {
revert AlreadySet();
}

depositWhitelist = status;

emit SetDepositWhitelist(status);
}

/**
* @inheritdoc IVault
*/
function setDepositorWhitelistStatus(address account, bool status) external onlyRole(DEPOSITOR_WHITELIST_ROLE) {
if (isDepositorWhitelisted[account] == status) {
revert AlreadySet();
}

if (status && !depositWhitelist) {
revert NoDepositWhitelist();
}

isDepositorWhitelisted[account] = status;

emit SetDepositorWhitelistStatus(account, status);
}

/**
* @inheritdoc IVault
*/
function setNetworkLimit(
address network,
address resolver,
uint256 amount
) external onlyRole(NETWORK_LIMIT_SET_ROLE) {
if (amount > maxNetworkLimit[network][resolver]) {
revert ExceedsMaxNetworkLimit();
}

Limit storage limit = _networkLimit[network][resolver];
DelayedLimit storage nextLimit = nextNetworkLimit[network][resolver];

_setLimit(limit, nextLimit, amount);

emit SetNetworkLimit(network, resolver, amount);
}

/**
* @inheritdoc IVault
*/
function setOperatorLimit(
address operator,
address network,
uint256 amount
) external onlyRole(OPERATOR_LIMIT_SET_ROLE) {
Limit storage limit = _operatorLimit[operator][network];
DelayedLimit storage nextLimit = nextOperatorLimit[operator][network];

_setLimit(limit, nextLimit, amount);

emit SetOperatorLimit(operator, network, amount);
}

function _getLimit(Limit storage limit, DelayedLimit storage nextLimit) private view returns (uint256) {
if (nextLimit.timestamp == 0 || Time.timestamp() < nextLimit.timestamp) {
return limit.amount;
}
return nextLimit.amount;
}

function _setLimit(Limit storage limit, DelayedLimit storage nextLimit, uint256 amount) private {
_updateLimit(limit, nextLimit);

if (amount < limit.amount) {
nextLimit.amount = amount;
nextLimit.timestamp = currentEpochStart() + 2 * epochDuration;
} else {
limit.amount = amount;
nextLimit.amount = 0;
nextLimit.timestamp = 0;
}
}

function _updateLimit(Limit storage limit, DelayedLimit storage nextLimit) internal {
if (nextLimit.timestamp != 0 && nextLimit.timestamp <= Time.timestamp()) {
limit.amount = nextLimit.amount;
nextLimit.timestamp = 0;
nextLimit.amount = 0;
}
}

/**
* @inheritdoc IMigratableEntity
*/
function migrate(bytes memory) public override {
revert();
}
}
Loading

0 comments on commit 9550eaf

Please sign in to comment.