Skip to content

Commit

Permalink
add rewardsDistributor
Browse files Browse the repository at this point in the history
  • Loading branch information
1kresh committed May 23, 2024
1 parent f3e7f6c commit d7ae88d
Show file tree
Hide file tree
Showing 29 changed files with 999 additions and 823 deletions.
2 changes: 0 additions & 2 deletions script/deploy/Core.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {MetadataPlugin} from "src/contracts/plugins/MetadataPlugin.sol";
import {MiddlewarePlugin} from "src/contracts/plugins/MiddlewarePlugin.sol";
import {NetworkOptInPlugin} from "src/contracts/plugins/NetworkOptInPlugin.sol";
import {OperatorOptInPlugin} from "src/contracts/plugins/OperatorOptInPlugin.sol";
import {RewardsPlugin} from "src/contracts/plugins/RewardsPlugin.sol";
import {Vault} from "src/contracts/Vault.sol";

contract CoreScript is Script {
Expand All @@ -31,7 +30,6 @@ contract CoreScript is Script {
new OperatorOptInPlugin(address(operatorRegistry), address(vaultRegistry));
OperatorOptInPlugin operatorNetworkOptInPlugin =
new OperatorOptInPlugin(address(operatorRegistry), address(networkRegistry));
RewardsPlugin operatorRewardsPlugin = new RewardsPlugin(address(networkRegistry), address(vaultRegistry));

vaultRegistry.whitelist(
address(
Expand Down
2 changes: 2 additions & 0 deletions script/deploy/Vault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ contract VaultScript is Script {
uint48 epochDuration,
uint48 vetoDuration,
uint48 slashDuration,
address rewardsDistributor,
uint256 adminFee,
bool depositWhitelist
) public {
Expand All @@ -31,6 +32,7 @@ contract VaultScript is Script {
epochDuration: epochDuration,
vetoDuration: vetoDuration,
slashDuration: slashDuration,
rewardsDistributor: rewardsDistributor,
adminFee: adminFee,
depositWhitelist: depositWhitelist
})
Expand Down
34 changes: 25 additions & 9 deletions src/contracts/Vault.sol
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
// SPDX-License-Identifier: MIT
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 {MigratableEntity} from "./base/MigratableEntity.sol";
import {VaultStorage} from "./VaultStorage.sol";

import {ICollateral} from "src/interfaces/base/ICollateral.sol";
import {IMiddlewarePlugin} from "src/interfaces/plugins/IMiddlewarePlugin.sol";
import {IMigratableEntity} from "src/interfaces/base/IMigratableEntity.sol";
import {INetworkOptInPlugin} from "src/interfaces/plugins/INetworkOptInPlugin.sol";
import {IOperatorOptInPlugin} from "src/interfaces/plugins/IOperatorOptInPlugin.sol";
import {IRegistry} from "src/interfaces/base/IRegistry.sol";
import {IVault} from "src/interfaces/IVault.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 {ERC4626Math} from "./libraries/ERC4626Math.sol";

import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.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 VaultStorage, MigratableEntity, AccessControlUpgradeable, IVault {
using Checkpoints for Checkpoints.Trace256;
Expand Down Expand Up @@ -95,7 +95,9 @@ contract Vault is VaultStorage, MigratableEntity, AccessControlUpgradeable, IVau
operatorVaultOptInPlugin,
operatorNetworkOptInPlugin
)
{}
{
_disableInitializers();
}

/**
* @inheritdoc IMigratableEntity
Expand Down Expand Up @@ -125,6 +127,7 @@ contract Vault is VaultStorage, MigratableEntity, AccessControlUpgradeable, IVau
vetoDuration = params.vetoDuration;
slashDuration = params.slashDuration;

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

Expand Down Expand Up @@ -403,6 +406,19 @@ contract Vault is VaultStorage, MigratableEntity, AccessControlUpgradeable, IVau
emit SetMaxNetworkResolverLimit(msg.sender, resolver, amount);
}

/**
* @inheritdoc IVault
*/
function setRewardsDistributor(address rewardsDistributor_) external onlyRole(REWARDS_DISTRIBUTOR_SET_ROLE) {
if (rewardsDistributor == rewardsDistributor_) {
revert AlreadySet();
}

rewardsDistributor = rewardsDistributor_;

emit SetRewardsDistributor(rewardsDistributor_);
}

/**
* @inheritdoc IVault
*/
Expand Down
20 changes: 15 additions & 5 deletions src/contracts/VaultStorage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,31 @@ contract VaultStorage is IVaultStorage {
/**
* @inheritdoc IVaultStorage
*/
bytes32 public constant NETWORK_RESOLVER_LIMIT_SET_ROLE = keccak256("NETWORK_RESOLVER_LIMIT_SET_ROLE");
bytes32 public constant REWARDS_DISTRIBUTOR_SET_ROLE = keccak256("REWARDS_DISTRIBUTOR_SET_ROLE");

/**
* @inheritdoc IVaultStorage
*/
bytes32 public constant OPERATOR_NETWORK_LIMIT_SET_ROLE = keccak256("OPERATOR_NETWORK_LIMIT_SET_ROLE");
bytes32 public constant ADMIN_FEE_SET_ROLE = keccak256("ADMIN_FEE_SET_ROLE");

/**
* @inheritdoc IVaultStorage
*/
bytes32 public constant ADMIN_FEE_SET_ROLE = keccak256("ADMIN_FEE_SET_ROLE");
bytes32 public constant DEPOSIT_WHITELIST_SET_ROLE = keccak256("DEPOSIT_WHITELIST_SET_ROLE");
/**
* @inheritdoc IVaultStorage
*/
bytes32 public constant DEPOSITOR_WHITELIST_ROLE = keccak256("DEPOSITOR_WHITELIST_ROLE");

/**
* @inheritdoc IVaultStorage
*/
bytes32 public constant DEPOSIT_WHITELIST_SET_ROLE = keccak256("DEPOSIT_WHITELIST_SET_ROLE");
bytes32 public constant NETWORK_RESOLVER_LIMIT_SET_ROLE = keccak256("NETWORK_RESOLVER_LIMIT_SET_ROLE");

/**
* @inheritdoc IVaultStorage
*/
bytes32 public constant DEPOSITOR_WHITELIST_ROLE = keccak256("DEPOSITOR_WHITELIST_ROLE");
bytes32 public constant OPERATOR_NETWORK_LIMIT_SET_ROLE = keccak256("OPERATOR_NETWORK_LIMIT_SET_ROLE");

/**
* @inheritdoc IVaultStorage
Expand Down Expand Up @@ -99,6 +104,11 @@ contract VaultStorage is IVaultStorage {
*/
uint48 public slashDuration;

/**
* @inheritdoc IVaultStorage
*/
address public rewardsDistributor;

/**
* @inheritdoc IVaultStorage
*/
Expand Down
2 changes: 1 addition & 1 deletion src/contracts/base/MigratableEntity.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ pragma solidity 0.8.25;
import {IMigratableEntityProxy} from "src/interfaces/base/IMigratableEntityProxy.sol";
import {IMigratableEntity} from "src/interfaces/base/IMigratableEntity.sol";

import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

abstract contract MigratableEntity is Initializable, OwnableUpgradeable, IMigratableEntity {
constructor() {
Expand Down
2 changes: 1 addition & 1 deletion src/contracts/base/MigratableEntityProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ pragma solidity 0.8.25;

import {IMigratableEntityProxy} from "src/interfaces/base/IMigratableEntityProxy.sol";

import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol";
import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol";

contract MigratableEntityProxy is ERC1967Proxy, IMigratableEntityProxy {
// An immutable address for the admin to avoid unnecessary SLOADs before each call.
Expand Down
10 changes: 5 additions & 5 deletions src/contracts/base/MigratablesRegistry.sol
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {IMigratablesRegistry} from "src/interfaces/base/IMigratablesRegistry.sol";
import {IMigratableEntity} from "src/interfaces/base/IMigratableEntity.sol";
import {IMigratableEntityProxy} from "src/interfaces/base/IMigratableEntityProxy.sol";

import {Registry} from "./Registry.sol";
import {MigratableEntityProxy} from "./MigratableEntityProxy.sol";
import {Registry} from "./Registry.sol";

import {IMigratableEntityProxy} from "src/interfaces/base/IMigratableEntityProxy.sol";
import {IMigratableEntity} from "src/interfaces/base/IMigratableEntity.sol";
import {IMigratablesRegistry} from "src/interfaces/base/IMigratablesRegistry.sol";

import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
Expand Down
4 changes: 2 additions & 2 deletions src/contracts/base/NonMigratablesRegistry.sol
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {INonMigratablesRegistry} from "src/interfaces/base/INonMigratablesRegistry.sol";

import {Registry} from "./Registry.sol";

import {INonMigratablesRegistry} from "src/interfaces/base/INonMigratablesRegistry.sol";

contract NonMigratablesRegistry is Registry, INonMigratablesRegistry {
/**
* @inheritdoc INonMigratablesRegistry
Expand Down
10 changes: 7 additions & 3 deletions src/contracts/base/Plugin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ abstract contract Plugin is IPlugin {
address public immutable REGISTRY;

modifier onlyEntity() {
if (!IRegistry(REGISTRY).isEntity(msg.sender)) {
revert NotEntity();
}
_checkEntity(msg.sender);
_;
}

constructor(address registry) {
REGISTRY = registry;
}

function _checkEntity(address account) internal view {
if (!IRegistry(REGISTRY).isEntity(account)) {
revert NotEntity();
}
}
}
12 changes: 8 additions & 4 deletions src/contracts/base/Registry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,8 @@ abstract contract Registry is IRegistry {

EnumerableSet.AddressSet private _entities;

modifier checkEntity(address entity_) {
if (!isEntity(entity_)) {
revert EntityNotExist();
}
modifier checkEntity(address account) {
_checkEntity(account);
_;
}

Expand Down Expand Up @@ -43,4 +41,10 @@ abstract contract Registry is IRegistry {

emit AddEntity(entity_);
}

function _checkEntity(address account) internal view {
if (!isEntity(account)) {
revert EntityNotExist();
}
}
}
23 changes: 23 additions & 0 deletions src/contracts/base/RewardsDistributor.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {RewardsDistributorBase} from "./RewardsDistributorBase.sol";

import {IRewardsDistributorBase} from "src/interfaces/base/IRewardsDistributorBase.sol";
import {IRewardsDistributor} from "src/interfaces/base/IRewardsDistributor.sol";

abstract contract RewardsDistributor is RewardsDistributorBase, IRewardsDistributor {
constructor(address networkRegistry) RewardsDistributorBase(networkRegistry) {}

/**
* @inheritdoc IRewardsDistributorBase
*/
function version() external pure override(RewardsDistributorBase, IRewardsDistributorBase) returns (uint64) {
return 1;
}

/**
* @inheritdoc IRewardsDistributor
*/
function distributeReward(address network, address token, uint256 amount, uint48 timestamp) external virtual {}
}
37 changes: 37 additions & 0 deletions src/contracts/base/RewardsDistributorBase.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {IRegistry} from "src/interfaces/base/IRegistry.sol";
import {IRewardsDistributorBase} from "src/interfaces/base/IRewardsDistributorBase.sol";

abstract contract RewardsDistributorBase is IRewardsDistributorBase {
/**
* @inheritdoc IRewardsDistributorBase
*/
address public immutable NETWORK_REGISTRY;

modifier checkNetwork(address account) {
_checkNetwork(account);
_;
}

constructor(address networkRegistry) {
NETWORK_REGISTRY = networkRegistry;
}

/**
* @inheritdoc IRewardsDistributorBase
*/
function VAULT() public view virtual override returns (address) {}

/**
* @inheritdoc IRewardsDistributorBase
*/
function version() external view virtual override returns (uint64) {}

function _checkNetwork(address account) internal view {
if (!IRegistry(NETWORK_REGISTRY).isEntity(account)) {
revert NotNetwork();
}
}
}
6 changes: 3 additions & 3 deletions src/contracts/defaultCollateral/DefaultCollateral.sol
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {IDefaultCollateral} from "src/interfaces/defaultCollateral/IDefaultCollateral.sol";
import {ICollateral} from "src/interfaces/base/ICollateral.sol";
import {IDefaultCollateral} from "src/interfaces/defaultCollateral/IDefaultCollateral.sol";
import {Permit2Lib} from "src/contracts/libraries/Permit2Lib.sol";

import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

contract DefaultCollateral is ERC20Upgradeable, ReentrancyGuardUpgradeable, IDefaultCollateral {
Expand Down
3 changes: 2 additions & 1 deletion src/contracts/defaultCollateral/DefaultCollateralFactory.sol
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {Registry} from "src/contracts/base/Registry.sol";
import {DefaultCollateral} from "./DefaultCollateral.sol";
import {Registry} from "src/contracts/base/Registry.sol";

import {IDefaultCollateralFactory} from "src/interfaces/defaultCollateral/IDefaultCollateralFactory.sol";

import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
Expand Down
Loading

0 comments on commit d7ae88d

Please sign in to comment.