package tezos-protocol-alpha

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file frozen_staker_repr.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
(*****************************************************************************)
(*                                                                           *)
(* SPDX-License-Identifier: MIT                                              *)
(* Copyright (c) 2023 Nomadic Labs, <contact@nomadic-labs.com>               *)
(*                                                                           *)
(*****************************************************************************)

type t =
  | Baker of Signature.public_key_hash
  | Single_staker of {
      staker : Contract_repr.t;
      delegate : Signature.public_key_hash;
    }
  | Shared_between_stakers of {delegate : Signature.public_key_hash}
  | Baker_edge of Signature.public_key_hash

let baker pkh = Baker pkh

let baker_edge pkh = Baker_edge pkh

let single_staker ~staker ~delegate =
  match (staker : Contract_repr.t) with
  | Implicit pkh when Signature.Public_key_hash.(pkh = delegate) -> Baker pkh
  | _ -> Single_staker {staker; delegate}

let shared_between_stakers ~delegate = Shared_between_stakers {delegate}

let encoding =
  let open Data_encoding in
  let single_tag = 0 in
  let single_encoding =
    obj2
      (req "contract" Contract_repr.encoding)
      (req "delegate" Signature.Public_key_hash.encoding)
  in
  let shared_tag = 1 in
  let shared_encoding =
    obj1 (req "delegate" Signature.Public_key_hash.encoding)
  in
  let baker_tag = 2 in
  let baker_encoding =
    obj1 (req "baker_own_stake" Signature.Public_key_hash.encoding)
  in
  let baker_edge_tag = 3 in
  let baker_edge_encoding =
    obj1 (req "baker_edge" Signature.Public_key_hash.encoding)
  in
  def
    ~title:"frozen_staker"
    ~description:
      "Abstract notion of staker used in operation receipts for frozen \
       deposits, either a single staker or all the stakers delegating to some \
       delegate."
    "frozen_staker"
  @@ matching
       (function
         | Baker baker -> matched baker_tag baker_encoding baker
         | Single_staker {staker; delegate} ->
             matched single_tag single_encoding (staker, delegate)
         | Shared_between_stakers {delegate} ->
             matched shared_tag shared_encoding delegate
         | Baker_edge baker -> matched baker_edge_tag baker_edge_encoding baker)
       [
         case
           ~title:"Single"
           (Tag single_tag)
           single_encoding
           (function
             | Single_staker {staker; delegate} -> Some (staker, delegate)
             | _ -> None)
           (fun (staker, delegate) -> single_staker ~staker ~delegate);
         case
           ~title:"Shared"
           (Tag shared_tag)
           shared_encoding
           (function
             | Shared_between_stakers {delegate} -> Some delegate | _ -> None)
           (fun delegate -> Shared_between_stakers {delegate});
         case
           ~title:"Baker"
           (Tag baker_tag)
           baker_encoding
           (function Baker baker -> Some baker | _ -> None)
           (fun baker -> Baker baker);
         case
           ~title:"Baker_edge"
           (Tag baker_edge_tag)
           baker_edge_encoding
           (function Baker_edge baker -> Some baker | _ -> None)
           (fun baker -> Baker_edge baker);
       ]

let compare sa sb =
  match (sa, sb) with
  | Baker ba, Baker bb -> Signature.Public_key_hash.compare ba bb
  | Baker _, _ -> -1
  | _, Baker _ -> 1
  | ( Single_staker {staker = sa; delegate = da},
      Single_staker {staker = sb; delegate = db} ) ->
      Compare.or_else (Contract_repr.compare sa sb) (fun () ->
          Signature.Public_key_hash.compare da db)
  | ( Shared_between_stakers {delegate = da},
      Shared_between_stakers {delegate = db} ) ->
      Signature.Public_key_hash.compare da db
  | Single_staker _, Shared_between_stakers _ -> -1
  | Shared_between_stakers _, Single_staker _ -> 1
  | Baker_edge ba, Baker_edge bb -> Signature.Public_key_hash.compare ba bb
  | Baker_edge _, _ -> -1
  | _, Baker_edge _ -> 1
OCaml

Innovation. Community. Security.