Source file bootstrap_storage.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
open Misc
let init_account ctxt
({public_key_hash; public_key; amount} : Parameters_repr.bootstrap_account)
=
let contract = Contract_repr.implicit_contract public_key_hash in
Contract_storage.credit ctxt contract amount >>=? fun ctxt ->
match public_key with
| Some public_key ->
Contract_storage.reveal_manager_key ctxt public_key_hash public_key
>>=? fun ctxt -> Delegate_storage.set ctxt contract (Some public_key_hash)
| None -> return ctxt
let init_contract ~typecheck ctxt
({delegate; amount; script} : Parameters_repr.bootstrap_contract) =
Contract_storage.fresh_contract_from_current_nonce ctxt
>>?= fun (ctxt, contract) ->
typecheck ctxt script >>=? fun (script, ctxt) ->
Contract_storage.raw_originate
ctxt
contract
~balance:amount
~prepaid_bootstrap_storage:true
~script
~delegate:(Some delegate)
let init ctxt ~typecheck ?ramp_up_cycles ?no_reward_cycles accounts contracts =
let nonce = Operation_hash.hash_string ["Un festival de GADT."] in
let ctxt = Raw_context.init_origination_nonce ctxt nonce in
List.fold_left_es init_account ctxt accounts >>=? fun ctxt ->
List.fold_left_es (init_contract ~typecheck) ctxt contracts >>=? fun ctxt ->
(match no_reward_cycles with
| None -> return ctxt
| Some cycles ->
let constants = Raw_context.constants ctxt in
Raw_context.patch_constants ctxt (fun c ->
{
c with
baking_reward_per_endorsement = [Tez_repr.zero];
endorsement_reward = [Tez_repr.zero];
})
>>= fun ctxt ->
Storage.Ramp_up.Rewards.init
ctxt
(Cycle_repr.of_int32_exn (Int32.of_int cycles))
(constants.baking_reward_per_endorsement, constants.endorsement_reward))
>>=? fun ctxt ->
match ramp_up_cycles with
| None -> return ctxt
| Some cycles ->
let constants = Raw_context.constants ctxt in
Tez_repr.(constants.block_security_deposit /? Int64.of_int cycles)
>>?= fun block_step ->
Tez_repr.(constants.endorsement_security_deposit /? Int64.of_int cycles)
>>?= fun endorsement_step ->
Raw_context.patch_constants ctxt (fun c ->
{
c with
block_security_deposit = Tez_repr.zero;
endorsement_security_deposit = Tez_repr.zero;
})
>>= fun ctxt ->
List.fold_left_es
(fun ctxt cycle ->
Tez_repr.(block_step *? Int64.of_int cycle)
>>?= fun block_security_deposit ->
Tez_repr.(endorsement_step *? Int64.of_int cycle)
>>?= fun endorsement_security_deposit ->
let cycle = Cycle_repr.of_int32_exn (Int32.of_int cycle) in
Storage.Ramp_up.Security_deposits.init
ctxt
cycle
(block_security_deposit, endorsement_security_deposit))
ctxt
(1 --> (cycles - 1))
>>=? fun ctxt ->
Storage.Ramp_up.Security_deposits.init
ctxt
(Cycle_repr.of_int32_exn (Int32.of_int cycles))
( constants.block_security_deposit,
constants.endorsement_security_deposit )
let cycle_end ctxt last_cycle =
let next_cycle = Cycle_repr.succ last_cycle in
(Storage.Ramp_up.Rewards.find ctxt next_cycle >>=? function
| None -> return ctxt
| Some (baking_reward_per_endorsement, endorsement_reward) ->
Storage.Ramp_up.Rewards.remove_existing ctxt next_cycle >>=? fun ctxt ->
Raw_context.patch_constants ctxt (fun c ->
{c with baking_reward_per_endorsement; endorsement_reward})
>|= ok)
>>=? fun ctxt ->
Storage.Ramp_up.Security_deposits.find ctxt next_cycle >>=? function
| None -> return ctxt
| Some (block_security_deposit, endorsement_security_deposit) ->
Storage.Ramp_up.Security_deposits.remove_existing ctxt next_cycle
>>=? fun ctxt ->
Raw_context.patch_constants ctxt (fun c ->
{c with block_security_deposit; endorsement_security_deposit})
>|= ok