diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py
index 6f5a4484dbe5ac51a2be78e0449468fe47a0e378..7ae60c34db3db2ce799f6d9cabfcb1da9db5e674 100644
--- a/src/_zkapauthorizer/_storage_server.py
+++ b/src/_zkapauthorizer/_storage_server.py
@@ -70,6 +70,7 @@ from .storage_common import (
     add_lease_message,
     renew_lease_message,
     slot_testv_and_readv_and_writev_message,
+    has_writes,
 )
 
 class MorePassesRequired(Exception):
@@ -274,20 +275,6 @@ class ZKAPAuthorizerStorageServer(Referenceable):
         return self._original.remote_slot_readv(*a, **kw)
 
 
-def has_writes(tw_vectors):
-    """
-    :param tw_vectors: See
-        ``allmydata.interfaces.TestAndWriteVectorsForShares``.
-
-    :return bool: ``True`` if any only if there are writes in ``tw_vectors``.
-    """
-    return any(
-        data
-        for (test, data, new_length)
-        in tw_vectors.values()
-    )
-
-
 def get_sharenums(tw_vectors):
     """
     :param tw_vectors: See
diff --git a/src/_zkapauthorizer/storage_common.py b/src/_zkapauthorizer/storage_common.py
index 43bc043d0932c3fa82cb4705543fa11902eabac7..5baacb22be69bb3e3473c3e7b8b22a7994320845 100644
--- a/src/_zkapauthorizer/storage_common.py
+++ b/src/_zkapauthorizer/storage_common.py
@@ -65,3 +65,17 @@ def required_passes(bytes_per_pass, share_nums, share_size):
             (len(share_nums) * share_size) / bytes_per_pass,
         ),
     )
+
+
+def has_writes(tw_vectors):
+    """
+    :param tw_vectors: See
+        ``allmydata.interfaces.TestAndWriteVectorsForShares``.
+
+    :return bool: ``True`` if any only if there are writes in ``tw_vectors``.
+    """
+    return any(
+        data
+        for (test, data, new_length)
+        in tw_vectors.values()
+    )