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
/
LMPVaultFactory.sol
106 lines (85 loc) · 3.8 KB
/
LMPVaultFactory.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
106
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2023 Tokemak Foundation. All rights reserved.
pragma solidity 0.8.17;
import { EnumerableSet } from "openzeppelin-contracts/utils/structs/EnumerableSet.sol";
import { ISystemRegistry } from "src/interfaces/ISystemRegistry.sol";
import { ILMPVaultFactory } from "src/interfaces/vault/ILMPVaultFactory.sol";
import { ILMPVaultRegistry } from "src/interfaces/vault/ILMPVaultRegistry.sol";
import { ILMPVault, LMPVault } from "src/vault/LMPVault.sol";
import { StrategyFactory } from "src/strategy/StrategyFactory.sol";
import { SecurityBase } from "src/security/SecurityBase.sol";
import { Clones } from "openzeppelin-contracts/proxy/Clones.sol";
import { MainRewarder } from "src/rewarders/MainRewarder.sol";
import { Roles } from "src/libs/Roles.sol";
import { Errors } from "src/utils/Errors.sol";
import { SystemComponent } from "src/SystemComponent.sol";
contract LMPVaultFactory is SystemComponent, ILMPVaultFactory, SecurityBase {
using Clones for address;
using EnumerableSet for EnumerableSet.Bytes32Set;
ILMPVaultRegistry public immutable vaultRegistry;
address public immutable template;
mapping(bytes32 => address) public vaultTypeToPrototype;
uint256 public defaultRewardRatio;
uint256 public defaultRewardBlockDuration;
modifier onlyVaultCreator() {
if (!_hasRole(Roles.CREATE_POOL_ROLE, msg.sender)) {
revert Errors.AccessDenied();
}
_;
}
event DefaultRewardRatioSet(uint256 rewardRatio);
event DefaultBlockDurationSet(uint256 blockDuration);
constructor(
ISystemRegistry _systemRegistry,
address _template,
uint256 _defaultRewardRatio,
uint256 _defaultRewardBlockDuration
) SystemComponent(_systemRegistry) SecurityBase(address(_systemRegistry.accessController())) {
Errors.verifyNotZero(_template, "template");
// slither-disable-next-line missing-zero-check
template = _template;
vaultRegistry = systemRegistry.lmpVaultRegistry();
// Zero is valid here
_setDefaultRewardRatio(_defaultRewardRatio);
_setDefaultRewardBlockDuration(_defaultRewardBlockDuration);
}
function setDefaultRewardRatio(uint256 rewardRatio) external onlyOwner {
_setDefaultRewardRatio(rewardRatio);
}
function setDefaultRewardBlockDuration(uint256 blockDuration) external onlyOwner {
_setDefaultRewardBlockDuration(blockDuration);
}
function createVault(
uint256 supplyLimit,
uint256 walletLimit,
string memory symbolSuffix,
string memory descPrefix,
bytes32 salt,
bytes calldata extraParams
) external onlyVaultCreator returns (address newVaultAddress) {
// verify params
Errors.verifyNotZero(salt, "salt");
address newToken = template.predictDeterministicAddress(salt);
MainRewarder mainRewarder = new MainRewarder{ salt: salt}(
systemRegistry,
newToken,
address(systemRegistry.toke()),
defaultRewardRatio,
defaultRewardBlockDuration,
true // allowExtraRewards
);
newVaultAddress = template.cloneDeterministic(salt);
LMPVault(newVaultAddress).initialize(supplyLimit, walletLimit, symbolSuffix, descPrefix, extraParams);
LMPVault(newVaultAddress).setRewarder(address(mainRewarder));
// add to VaultRegistry
vaultRegistry.addVault(newVaultAddress);
}
function _setDefaultRewardRatio(uint256 rewardRatio) private {
defaultRewardRatio = rewardRatio;
emit DefaultRewardRatioSet(rewardRatio);
}
function _setDefaultRewardBlockDuration(uint256 blockDuration) private {
defaultRewardBlockDuration = blockDuration;
emit DefaultBlockDurationSet(blockDuration);
}
}