Module Mina_wire_types.Currency

We follow the same structure from currency.ml

module Types : sig ... end
module type Concrete = Types.S with type Fee.V1.t = Unsigned.UInt64.t and type Amount.V1.t = Unsigned.UInt64.t and type Balance.V1.t = Unsigned.UInt64.t
module M : Types.S

Here, we hide the concrete type definitions from our module, which is the whole point of all this machinery.

module type Local_sig = Utils.Signature(Types).S
module Make (Signature : Local_sig) (_ : functor (A : Concrete) -> Signature(A).S) : Signature(M).S

Finally, we expose only the types from Types.S but we clarify that the types here are the same that those from M. In some cases this is equivalent to include M.

include Types.S with module Fee = M.Fee and module Amount = M.Amount and module Balance = M.Balance
module Fee = M.Fee
module Amount = M.Amount
module Balance = M.Balance