This repository has been archived by the owner on Mar 3, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
LMPVaultRegistry.sol
105 lines (77 loc) · 3.77 KB
/
LMPVaultRegistry.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import { AccessControl } from "openzeppelin-contracts/access/AccessControl.sol";
import { EnumerableSet } from "openzeppelin-contracts/utils/structs/EnumerableSet.sol";
import { SecurityBase } from "src/security/SecurityBase.sol";
import { Roles } from "src/libs/Roles.sol";
import { VaultTypes } from "src/vault/VaultTypes.sol";
import { ILMPVaultRegistry } from "src/interfaces/vault/ILMPVaultRegistry.sol";
import { ILMPVault } from "src/interfaces/vault/ILMPVault.sol";
import { ISystemRegistry } from "src/interfaces/ISystemRegistry.sol";
import { Errors } from "src/utils/Errors.sol";
import { SystemComponent } from "src/SystemComponent.sol";
contract LMPVaultRegistry is SystemComponent, ILMPVaultRegistry, SecurityBase {
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet private _vaults;
EnumerableSet.AddressSet private _assets;
// registry of vaults for a given asset
mapping(address => EnumerableSet.AddressSet) private _vaultsByAsset;
// registry of vaults for a given type
mapping(bytes32 => EnumerableSet.AddressSet) private _vaultsByType;
constructor(ISystemRegistry _systemRegistry)
SystemComponent(_systemRegistry)
SecurityBase(address(_systemRegistry.accessController()))
{ }
modifier onlyUpdater() {
if (!_hasRole(Roles.REGISTRY_UPDATER, msg.sender)) revert Errors.AccessDenied();
_;
}
///////////////////////////////////////////////////////////////////
//
// Update Methods
//
///////////////////////////////////////////////////////////////////
function addVault(address vaultAddress) external onlyUpdater {
Errors.verifyNotZero(vaultAddress, "vaultAddress");
ILMPVault vault = ILMPVault(vaultAddress);
address asset = vault.asset();
bytes32 vaultType = vault.vaultType();
if (!_vaults.add(vaultAddress)) revert VaultAlreadyExists(vaultAddress);
//slither-disable-next-line unused-return
if (!_assets.contains(asset)) _assets.add(asset);
if (!_vaultsByAsset[asset].add(vaultAddress)) revert VaultAlreadyExists(vaultAddress);
if (!_vaultsByType[vaultType].add(vaultAddress)) revert VaultAlreadyExists(vaultAddress);
emit VaultAdded(asset, vaultAddress);
}
function removeVault(address vaultAddress) external onlyUpdater {
Errors.verifyNotZero(vaultAddress, "vaultAddress");
// remove from vaults list
if (!_vaults.remove(vaultAddress)) revert VaultNotFound(vaultAddress);
address asset = ILMPVault(vaultAddress).asset();
// remove from assets list if this was the last vault for that asset
if (_vaultsByAsset[asset].length() == 1) {
//slither-disable-next-line unused-return
_assets.remove(asset);
}
// remove from vaultsByAsset mapping
if (!_vaultsByAsset[asset].remove(vaultAddress)) revert VaultNotFound(vaultAddress);
emit VaultRemoved(asset, vaultAddress);
}
///////////////////////////////////////////////////////////////////
//
// Enumeration Methods
//
///////////////////////////////////////////////////////////////////
function isVault(address vaultAddress) external view override returns (bool) {
return _vaults.contains(vaultAddress);
}
function listVaults() external view returns (address[] memory) {
return _vaults.values();
}
function listVaultsForAsset(address asset) external view returns (address[] memory) {
return _vaultsByAsset[asset].values();
}
function listVaultsForType(bytes32 _vaultType) external view returns (address[] memory) {
return _vaultsByType[_vaultType].values();
}
}