diff --git a/src/proto_alpha/lib_protocol/storage.ml b/src/proto_alpha/lib_protocol/storage.ml index 68b2e06da7600d7120a1a345f024d124d47a6ccc..1d36525c5bebc8a5abac1655ede625ea256f9ebf 100644 --- a/src/proto_alpha/lib_protocol/storage.ml +++ b/src/proto_alpha/lib_protocol/storage.ml @@ -312,6 +312,8 @@ module Contract = struct let add ctxt contract value = consume_serialize_gas ctxt value >>?= fun ctxt -> I.add ctxt contract value + + let keys_unaccounted = I.keys_unaccounted end module Code = Make_carbonated_map_expr (struct @@ -535,6 +537,8 @@ module Big_map = struct | None -> ok (ctxt, None) | Some value -> consume_deserialize_gas ctxt value >|? fun ctxt -> (ctxt, value_opt) + + let keys_unaccounted = I.keys_unaccounted end end diff --git a/src/proto_alpha/lib_protocol/storage_functors.ml b/src/proto_alpha/lib_protocol/storage_functors.ml index c1d958612b36cb41b5805986b8b28cb021adeb2c..b07dcbe31d9ed40f66ca4e3306a54f8d9c3777e7 100644 --- a/src/proto_alpha/lib_protocol/storage_functors.ml +++ b/src/proto_alpha/lib_protocol/storage_functors.ml @@ -1073,6 +1073,18 @@ module Make_indexed_subcontext (C : Raw_context.T) (I : INDEX) : let add_or_remove s i v = match v with None -> remove s i | Some v -> add s i v + let mem_unaccounted s i = Raw_context.mem (pack s i) data_name + + let fold_keys_unaccounted s ~order ~init ~f = + fold_keys s ~order ~init ~f:(fun i acc -> + mem_unaccounted s i >>= function + | false -> Lwt.return acc + | true -> f i acc) + + let keys_unaccounted s = + fold_keys_unaccounted s ~order:`Sorted ~init:[] ~f:(fun p acc -> + Lwt.return (p :: acc)) + let () = let open Storage_description in let unpack = unpack I.args in diff --git a/src/proto_alpha/lib_protocol/storage_sigs.ml b/src/proto_alpha/lib_protocol/storage_sigs.ml index f1db042a94f136b114a99e1d1ca24fa00173ea1f..d6c0a2886083bc6ce72bf2782e1d894fbbd7c882 100644 --- a/src/proto_alpha/lib_protocol/storage_sigs.ml +++ b/src/proto_alpha/lib_protocol/storage_sigs.ml @@ -209,6 +209,10 @@ module type Non_iterable_indexed_carbonated_data_storage = sig Returns the freed size, and a boolean indicating if a value was already associated to this key. *) val remove : context -> key -> (Raw_context.t * int * bool) tzresult Lwt.t + + (** Returns the list of all storage bucket keys. + Not carbonated (i.e. gas is not consumed); use with care. *) + val keys_unaccounted : context -> key list Lwt.t end module type Non_iterable_indexed_carbonated_data_storage_with_values = sig