abstract contract WalletProxyBase is MinimalBeaconProxy {

    bytes32 internal constant _DAO_SLOT = 0x2a6cb721c141aca9a9ad80925a738db49772cafe7da767ae62299908d3d32d1c;
    bytes32 internal constant _MERGE_SLOT = 0x60ab9511b01b1ee756a19d64d798acec49593fec7b00c39ea6c9e8c0b459fa93;
    bytes32 internal constant _MANAGER_SLOT = 0x25b56d42a36e6932800bdf5cc9c56e8775f5792d702c21c4ef9a0c40a93bb009;

    /**
     * @dev Sets `DAO_`, `merge_`, and `manager_`.
     */
    constructor(address DAO_, address merge_, address manager_) {
        assert(_DAO_SLOT == bytes32(uint256(keccak256("eip1967.proxy.dao")) - 1));
        assert(_MERGE_SLOT == bytes32(uint256(keccak256("eip1967.proxy.merge")) - 1));
        assert(_MANAGER_SLOT == bytes32(uint256(keccak256("eip1967.proxy.manager")) - 1));
        _setDAO(DAO_);
        _setMerge(merge_);
        _setManager(manager_);
    }

    /**
     * @dev Sets the new DAO address `newDAO`.
     */
    function _setDAO(address DAO) internal {
        require(Address.isContract(DAO), "ERC1967: DAO is not a multisig wallet");
        StorageSlot.getAddressSlot(_DAO_SLOT).value = DAO;
    }

    /**
     * @dev Returns the DAO address.
     */
    function _getDAO() internal view returns (address) {
        return StorageSlot.getAddressSlot(_DAO_SLOT).value;
    }

    /**
     * @dev Sets the `newMerge` contract address.
     */
    function _setMerge(address merge) internal {
        require(Address.isContract(merge), "ERC1967: merge is not a smart contract.");
        StorageSlot.getAddressSlot(_MERGE_SLOT).value = merge;
    }

    /**
     * @dev Returns the Merge contract address.
     */
    function _getMerge() internal view returns (address) {
        return StorageSlot.getAddressSlot(_MERGE_SLOT).value;
    }

    /**
     * @dev Sets the new manager `manager` address.
     */
    function _setManager(address manager) internal {
        require(Address.isContract(manager), "ERC1967: Manager is not a smart contract.");
        StorageSlot.getAddressSlot(_MANAGER_SLOT).value = manager;
    }

    /**
     * @dev Returns the new manager address.
     */
    function _getManager() internal view returns (address) {
        return StorageSlot.getAddressSlot(_MANAGER_SLOT).value;
    }
}
function _getMerge() internal view returns (address) {
    return StorageSlot.getAddressSlot(_MERGE_SLOT).value;
}

/**
 * @dev Returns the Merge contract address.
 */