tx_rollup_message_repr.ml
(*****************************************************************************)
(* *)
(* Open Source License *)
(* Copyright (c) 2022 Marigold <contact@marigold.dev> *)
(* Copyright (c) 2022 Nomadic Labs <contact@nomadic-labs.com> *)
(* Copyright (c) 2022 Oxhead Alpha <info@oxhead-alpha.com> *)
(* *)
(* Permission is hereby granted, free of charge, to any person obtaining a *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)
(* and/or sell copies of the Software, and to permit persons to whom the *)
(* Software is furnished to do so, subject to the following conditions: *)
(* *)
(* The above copyright notice and this permission notice shall be included *)
(* in all copies or substantial portions of the Software. *)
(* *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)
(* DEALINGS IN THE SOFTWARE. *)
(* *)
(*****************************************************************************)
type deposit = {
sender : Signature.Public_key_hash.t;
destination : Tx_rollup_l2_address.Indexable.value;
ticket_hash : Ticket_hash_repr.t;
amount : Tx_rollup_l2_qty.t;
}
let deposit_encoding =
let open Data_encoding in
conv
(fun {sender; destination; ticket_hash; amount} ->
(sender, destination, ticket_hash, amount))
(fun (sender, destination, ticket_hash, amount) ->
{sender; destination; ticket_hash; amount})
@@ obj4
(req "sender" Signature.Public_key_hash.encoding)
(req "destination" Tx_rollup_l2_address.Indexable.value_encoding)
(req "ticket_hash" Ticket_hash_repr.encoding)
(req "amount" Tx_rollup_l2_qty.encoding)
let batch_encoding =
let open Data_encoding in
let json = conv Bytes.of_string Bytes.to_string bytes in
splitted ~json ~binary:string
type t = Batch of string | Deposit of deposit
let encoding =
let open Data_encoding in
union
~tag_size:`Uint8
[
case
(Tag 0)
~title:"Batch"
(obj1 (req "batch" batch_encoding))
(function Batch batch -> Some batch | _ -> None)
(fun batch -> Batch batch);
case
(Tag 1)
~title:"Deposit"
(obj1 (req "deposit" deposit_encoding))
(function Deposit deposit -> Some deposit | _ -> None)
(fun deposit -> Deposit deposit);
]
let pp fmt =
let open Format in
function
| Batch str ->
let subsize = 10 in
let str, ellipsis =
if Compare.Int.(subsize < String.length str) then
let substring = String.sub str 0 subsize in
(substring, "...")
else (str, "")
in
fprintf
fmt
"@[<hov 2>Batch:@ %s%s@]"
(Hex.of_string str |> Hex.show)
ellipsis
| Deposit {sender; destination; ticket_hash; amount} ->
fprintf
fmt
"@[<hov 2>Deposit:@ sender=%a,@ destination=%a,@ ticket_hash=%a,@ \
amount:%a@]"
Signature.Public_key_hash.pp
sender
Tx_rollup_l2_address.Indexable.pp
destination
Ticket_hash_repr.pp
ticket_hash
Tx_rollup_l2_qty.pp
amount
let size = function
| Batch batch -> String.length batch
| Deposit {sender = _; destination = d; ticket_hash = _; amount = _} ->
(* Size of a BLS public key, that is the underlying type of a
l2 address. See [Tx_rollup_l2_address] *)
let sender_size = Signature.Public_key_hash.size in
(* Size of a BLS public key, that is the underlying type of a
l2 address. See [Tx_rollup_l2_address] *)
let destination_size = Tx_rollup_l2_address.Indexable.size d in
(* Size of a [Script_expr_hash.t], that is the underlying type
of [Ticket_hash_repr.t]. *)
let key_hash_size = 32 in
(* [int64] *)
let amount_size = 8 in
sender_size + destination_size + key_hash_size + amount_size