// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {WardenVault} from "./WardenVault.sol"; /// @title WardenFactory /// @notice Anyone can raise a vault. The caller becomes its owner. Optional ETH is deposited at birth. contract WardenFactory { event VaultCreated(address indexed owner, address indexed vault, address indexed agent); mapping(address => address[]) internal _vaultsOf; address[] public allVaults; function createVault( address agent, WardenVault.Policy calldata policy, address[] calldata targets, bytes4[] calldata selectors ) external payable returns (address vault) { vault = address(new WardenVault(msg.sender, agent, policy, targets, selectors)); if (msg.value != 0) { (bool ok,) = vault.call{value: msg.value}(""); require(ok, "deposit"); } _vaultsOf[msg.sender].push(vault); allVaults.push(vault); emit VaultCreated(msg.sender, vault, agent); } function vaultsOf(address owner) external view returns (address[] memory) { return _vaultsOf[owner]; } function vaultCount() external view returns (uint256) { return allVaults.length; } }