idle_moloch/lib/Baal/contracts/higherOrderFactories/BaalAndVaultSummoner.sol
2024-11-01 11:55:27 +01:00

161 lines
4.4 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "../interfaces/IBaalSummoner.sol";
/*
Summon new 'non-ragequitable' treasury Safe (Vaults). (sidecar?)
Can summon a dao with a new Vault.
Can summon a new vault for a dao after initial dao setup.
Acts as a register and the owner of the contract or DAO can deactivate
register is primarily a helper for UIs
Owner of the contract can add new vaults, and set current vaults
Contract is upgradable and should be owned by a DAO
*/
contract BaalAndVaultSummoner is Initializable, OwnableUpgradeable, UUPSUpgradeable {
IBaalSummoner public _baalSummoner;
uint256 public vaultIdx;
struct Vault{
uint256 id;
bool active;
address daoAddress;
address vaultAddress;
string name;
}
mapping(uint256 => Vault) public vaults;
mapping(address => address) public delegates;
event SetVault(
Vault vault
);
event SetDelegate(
address daoAddress,
address delegate
);
event setSummoner(
address summoner
);
function initialize() initializer public {
__Ownable_init();
__UUPSUpgradeable_init();
vaultIdx = 0;
}
function setSummonerAddr(
address baalSummoner
) public onlyOwner {
require(baalSummoner != address(0), "zero address");
_baalSummoner = IBaalSummoner(baalSummoner);
emit setSummoner(baalSummoner);
}
/** Summon a new baal and add a Vault */
function summonBaalAndVault(
bytes calldata initializationParams,
bytes[] calldata initializationActions,
uint256 saltNonce,
bytes32 referrer,
string memory name
) external returns (address _daoAddress, address _vaultAddress) {
_daoAddress = _baalSummoner.summonBaalFromReferrer(
initializationParams,
initializationActions,
saltNonce,
referrer
);
_vaultAddress = summonVault(_daoAddress, name);
}
/** create and add a Vault(Safe) to an existing DAO */
function summonVault(
address daoAddress,
string memory name
) public returns (address _vaultAddress) {
_vaultAddress = _baalSummoner.deployAndSetupSafe(
daoAddress
);
_setNewVault(name, daoAddress, _vaultAddress);
}
/** set a Vault as active or not on existing dao (owner only) */
// Admin functions to help maintain the registry.
function setVault(
uint256 id,
bool active
) public onlyOwner
{
_setVault(id, active);
}
/** set a new Vault as active on existing dao (owner only) */
// Admin functions to help maintain the registry.
function setNewVault(
address daoAddress,
address vaultAddress,
string memory name
) public onlyOwner
{
_setNewVault(name, daoAddress, vaultAddress);
}
/**
A DAO can set a Vault as inactive
*/
function deactivateVaultAsDao(
uint256 id,
address daoAddress
) external
{
require(msg.sender == daoAddress || msg.sender == delegates[daoAddress], "not DAO or delegate");
require(vaults[id].daoAddress == daoAddress && vaults[id].active,"!not active DAO vault");
_setVault(id, false);
}
/** Allow a Dao to set a delegate that can manage vault enteries */
function setDelegate(
address daoAddress,
address delegate
) external
{
require(msg.sender == daoAddress, "!DAO");
delegates[daoAddress] = delegate;
emit SetDelegate(daoAddress, delegate);
}
function _setVault(
uint256 id,
bool active
) internal
{
vaults[id].active = active;
emit SetVault(vaults[id]);
}
function _setNewVault(
string memory name,
address daoAddress,
address vaultAddress
) internal
{
vaultIdx += 1;
vaults[vaultIdx] = Vault(vaultIdx, true, daoAddress, vaultAddress, name);
emit SetVault(vaults[vaultIdx]);
}
function _authorizeUpgrade(address newImplementation)
internal
onlyOwner
override
{}
}