-
Notifications
You must be signed in to change notification settings - Fork 0
/
LenderVaultFactory.sol
38 lines (33 loc) · 1.45 KB
/
LenderVaultFactory.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
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {Errors} from "../Errors.sol";
import {ILenderVaultImpl} from "./interfaces/ILenderVaultImpl.sol";
import {ILenderVaultFactory} from "./interfaces/ILenderVaultFactory.sol";
import {IAddressRegistry} from "./interfaces/IAddressRegistry.sol";
contract LenderVaultFactory is ILenderVaultFactory {
address public immutable addressRegistry;
address public immutable lenderVaultImpl;
constructor(address _addressRegistry, address _lenderVaultImpl) {
if (_addressRegistry == address(0) || _lenderVaultImpl == address(0)) {
revert Errors.InvalidAddress();
}
addressRegistry = _addressRegistry;
lenderVaultImpl = _lenderVaultImpl;
}
function createVault() external returns (address newLenderVaultAddr) {
uint256 numRegisteredVaults = IAddressRegistry(addressRegistry)
.registeredVaults()
.length;
bytes32 salt = keccak256(
abi.encodePacked(lenderVaultImpl, msg.sender, numRegisteredVaults)
);
newLenderVaultAddr = Clones.cloneDeterministic(lenderVaultImpl, salt);
ILenderVaultImpl(newLenderVaultAddr).initialize(
msg.sender,
addressRegistry
);
IAddressRegistry(addressRegistry).addLenderVault(newLenderVaultAddr);
emit NewVaultCreated(newLenderVaultAddr, msg.sender);
}
}