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
let init_account (ctxt, balance_updates)
({public_key_hash; public_key; amount} : Parameters_repr.bootstrap_account)
=
let contract = Contract_repr.implicit_contract public_key_hash in
Token.transfer
~origin:Protocol_migration
ctxt
`Bootstrap
(`Contract contract)
amount
>>=? fun (ctxt, new_balance_updates) ->
(match public_key with
| Some public_key ->
Contract_manager_storage.reveal_manager_key
ctxt
public_key_hash
public_key
>>=? fun ctxt -> Delegate_storage.set ctxt contract (Some public_key_hash)
| None -> return ctxt)
>|=? fun ctxt -> (ctxt, new_balance_updates @ balance_updates)
let init_contract ~typecheck (ctxt, balance_updates)
({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
~prepaid_bootstrap_storage:true
contract
~script
>>=? fun ctxt ->
(match delegate with
| None -> return ctxt
| Some delegate -> Delegate_storage.init ctxt contract delegate)
>>=? fun ctxt ->
let origin = Receipt_repr.Protocol_migration in
Token.transfer ~origin ctxt `Bootstrap (`Contract contract) amount
>|=? fun (ctxt, new_balance_updates) ->
(ctxt, new_balance_updates @ balance_updates)
let init ctxt ~typecheck ?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, balance_updates) ->
List.fold_left_es (init_contract ~typecheck) (ctxt, balance_updates) contracts
>>=? fun (ctxt, balance_updates) ->
(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_fixed_portion = Tez_repr.zero;
baking_reward_bonus_per_slot = Tez_repr.zero;
endorsing_reward_per_slot = Tez_repr.zero;
})
>>= fun ctxt ->
Storage.Ramp_up.(
Rewards.init
ctxt
(Cycle_repr.of_int32_exn (Int32.of_int cycles))
{
baking_reward_fixed_portion = constants.baking_reward_fixed_portion;
baking_reward_bonus_per_slot =
constants.baking_reward_bonus_per_slot;
endorsing_reward_per_slot = constants.endorsing_reward_per_slot;
}))
>|=? fun ctxt -> (ctxt, balance_updates)
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
Storage.Ramp_up.
{
baking_reward_fixed_portion;
baking_reward_bonus_per_slot;
endorsing_reward_per_slot;
} ->
Storage.Ramp_up.Rewards.remove_existing ctxt next_cycle >>=? fun ctxt ->
Raw_context.patch_constants ctxt (fun c ->
{
c with
baking_reward_fixed_portion;
baking_reward_bonus_per_slot;
endorsing_reward_per_slot;
})
>|= ok