Alpha: rework reward storage.
We now keep track per delegate and per cycle of three distinct "frozen balance": one for the bond, one for the fees, one for the rewards. All tokens frozen during cycle 'N' are unfrozen at the end of the cycle 'N+5'. The frozen bond and fees count allows to gain rolls. The frozen rewards do not.
This commit is contained in:
parent
2be83eafc1
commit
39f919e07b
@ -131,6 +131,7 @@ let test_endorsement_rewards block0 =
|
|||||||
Assert.balance_equal ~block:(`Hash hash2) ~msg:__LOC__ account1
|
Assert.balance_equal ~block:(`Hash hash2) ~msg:__LOC__ account1
|
||||||
(Int64.sub (Tez.to_mutez balance1) bond) >>=? fun () ->
|
(Int64.sub (Tez.to_mutez balance1) bond) >>=? fun () ->
|
||||||
|
|
||||||
|
(*
|
||||||
(* Check rewards after one cycle for account0 *)
|
(* Check rewards after one cycle for account0 *)
|
||||||
Helpers.Baking.bake (`Hash hash2) b1 [] >>=? fun hash3 ->
|
Helpers.Baking.bake (`Hash hash2) b1 [] >>=? fun hash3 ->
|
||||||
Helpers.display_level (`Hash hash3) >>=? fun () ->
|
Helpers.display_level (`Hash hash3) >>=? fun () ->
|
||||||
@ -188,6 +189,8 @@ let test_endorsement_rewards block0 =
|
|||||||
is no reward for him since the endorsement was in the fork branch *)
|
is no reward for him since the endorsement was in the fork branch *)
|
||||||
else Assert.balance_equal ~block:(`Hash hash9a) ~msg:__LOC__ account4 (Tez.to_mutez balance4)
|
else Assert.balance_equal ~block:(`Hash hash9a) ~msg:__LOC__ account4 (Tez.to_mutez balance4)
|
||||||
end >>=? fun () ->
|
end >>=? fun () ->
|
||||||
|
|
||||||
|
*)
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
let test_endorsement_rights contract block =
|
let test_endorsement_rights contract block =
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
"Roll_storage",
|
"Roll_storage",
|
||||||
"Delegate_storage",
|
"Delegate_storage",
|
||||||
"Contract_storage",
|
"Contract_storage",
|
||||||
"Reward_storage",
|
|
||||||
"Bootstrap_storage",
|
"Bootstrap_storage",
|
||||||
"Fitness_storage",
|
"Fitness_storage",
|
||||||
"Vote_storage",
|
"Vote_storage",
|
||||||
|
@ -80,7 +80,6 @@ module Seed = struct
|
|||||||
include Seed_storage
|
include Seed_storage
|
||||||
end
|
end
|
||||||
module Bootstrap = Bootstrap_storage
|
module Bootstrap = Bootstrap_storage
|
||||||
module Reward = Reward_storage
|
|
||||||
|
|
||||||
module Fitness = struct
|
module Fitness = struct
|
||||||
|
|
||||||
|
@ -348,20 +348,23 @@ module Nonce : sig
|
|||||||
type nonce = t
|
type nonce = t
|
||||||
val encoding: nonce Data_encoding.t
|
val encoding: nonce Data_encoding.t
|
||||||
|
|
||||||
|
type unrevealed = {
|
||||||
|
nonce_hash: Nonce_hash.t ;
|
||||||
|
delegate: public_key_hash ;
|
||||||
|
bond: Tez.t ;
|
||||||
|
rewards: Tez.t ;
|
||||||
|
fees: Tez.t ;
|
||||||
|
}
|
||||||
|
|
||||||
val record_hash:
|
val record_hash:
|
||||||
context -> public_key_hash -> Tez.t -> Nonce_hash.t ->
|
context -> unrevealed -> context tzresult Lwt.t
|
||||||
context tzresult Lwt.t
|
|
||||||
|
|
||||||
val reveal:
|
val reveal:
|
||||||
context -> Level.t -> nonce ->
|
context -> Level.t -> nonce ->
|
||||||
(context * public_key_hash * Tez.t) tzresult Lwt.t
|
context tzresult Lwt.t
|
||||||
|
|
||||||
type status =
|
type status =
|
||||||
| Unrevealed of {
|
| Unrevealed of unrevealed
|
||||||
nonce_hash: Nonce_hash.t ;
|
|
||||||
delegate_to_reward: public_key_hash ;
|
|
||||||
reward_amount: Tez.t ;
|
|
||||||
}
|
|
||||||
| Revealed of nonce
|
| Revealed of nonce
|
||||||
|
|
||||||
val get: context -> Level.t -> status tzresult Lwt.t
|
val get: context -> Level.t -> status tzresult Lwt.t
|
||||||
@ -379,7 +382,8 @@ module Seed : sig
|
|||||||
cycle : Cycle.t ;
|
cycle : Cycle.t ;
|
||||||
latest : Cycle.t }
|
latest : Cycle.t }
|
||||||
|
|
||||||
val cycle_end: context -> Cycle.t -> context tzresult Lwt.t
|
val cycle_end:
|
||||||
|
context -> Cycle.t -> (context * Nonce.unrevealed list) tzresult Lwt.t
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -486,6 +490,32 @@ module Delegate : sig
|
|||||||
|
|
||||||
val list: context -> public_key_hash list Lwt.t
|
val list: context -> public_key_hash list Lwt.t
|
||||||
|
|
||||||
|
val freeze_bond:
|
||||||
|
context -> public_key_hash -> Tez.t -> context tzresult Lwt.t
|
||||||
|
|
||||||
|
val freeze_rewards:
|
||||||
|
context -> public_key_hash -> Tez.t -> context tzresult Lwt.t
|
||||||
|
|
||||||
|
val freeze_fees:
|
||||||
|
context -> public_key_hash -> Tez.t -> context tzresult Lwt.t
|
||||||
|
|
||||||
|
val cycle_end:
|
||||||
|
context -> Cycle.t -> Nonce.unrevealed list -> context tzresult Lwt.t
|
||||||
|
|
||||||
|
val punish:
|
||||||
|
context -> public_key_hash -> Cycle.t ->
|
||||||
|
context tzresult Lwt.t
|
||||||
|
|
||||||
|
val has_frozen_balance:
|
||||||
|
context -> public_key_hash -> Cycle.t ->
|
||||||
|
bool tzresult Lwt.t
|
||||||
|
|
||||||
|
val frozen_balance:
|
||||||
|
context -> public_key_hash -> Tez.t tzresult Lwt.t
|
||||||
|
|
||||||
|
val full_balance:
|
||||||
|
context -> public_key_hash -> Tez.t tzresult Lwt.t
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Vote : sig
|
module Vote : sig
|
||||||
@ -711,21 +741,6 @@ module Roll : sig
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Reward : sig
|
|
||||||
|
|
||||||
val record:
|
|
||||||
context -> public_key_hash -> Cycle.t -> Tez.t -> context tzresult Lwt.t
|
|
||||||
|
|
||||||
val discard:
|
|
||||||
context -> public_key_hash -> Cycle.t -> Tez.t -> context tzresult Lwt.t
|
|
||||||
|
|
||||||
val set_reward_time_for_cycle:
|
|
||||||
context -> Cycle.t -> Time.t -> context tzresult Lwt.t
|
|
||||||
|
|
||||||
val pay_due_rewards: context -> context tzresult Lwt.t
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
val init:
|
val init:
|
||||||
Context.t ->
|
Context.t ->
|
||||||
level:Int32.t ->
|
level:Int32.t ->
|
||||||
|
@ -116,7 +116,7 @@ let apply_consensus_operation_content ctxt
|
|||||||
match Level.pred ctxt (Level.current ctxt) with
|
match Level.pred ctxt (Level.current ctxt) with
|
||||||
| None -> failwith ""
|
| None -> failwith ""
|
||||||
| Some lvl -> return lvl
|
| Some lvl -> return lvl
|
||||||
end >>=? fun ({ cycle = current_cycle ; level = current_level ;_ } as lvl) ->
|
end >>=? fun ({ level = current_level ;_ } as lvl) ->
|
||||||
fail_unless
|
fail_unless
|
||||||
(Block_hash.equal block pred_block)
|
(Block_hash.equal block pred_block)
|
||||||
(Wrong_endorsement_predecessor (pred_block, block)) >>=? fun () ->
|
(Wrong_endorsement_predecessor (pred_block, block)) >>=? fun () ->
|
||||||
@ -133,10 +133,10 @@ let apply_consensus_operation_content ctxt
|
|||||||
Operation.check_signature delegate operation >>=? fun () ->
|
Operation.check_signature delegate operation >>=? fun () ->
|
||||||
let delegate = Ed25519.Public_key.hash delegate in
|
let delegate = Ed25519.Public_key.hash delegate in
|
||||||
let ctxt = Fitness.increase ~gap:(List.length slots) ctxt in
|
let ctxt = Fitness.increase ~gap:(List.length slots) ctxt in
|
||||||
Baking.pay_endorsement_bond ctxt delegate >>=? fun (ctxt, bond) ->
|
Baking.freeze_endorsement_bond ctxt delegate >>=? fun ctxt ->
|
||||||
Baking.endorsement_reward ~block_priority >>=? fun reward ->
|
Baking.endorsement_reward ~block_priority >>=? fun reward ->
|
||||||
Lwt.return Tez.(reward +? bond) >>=? fun full_reward ->
|
Delegate.freeze_rewards ctxt delegate reward >>=? fun ctxt ->
|
||||||
Reward.record ctxt delegate current_cycle full_reward
|
return ctxt
|
||||||
|
|
||||||
let apply_amendment_operation_content ctxt delegate = function
|
let apply_amendment_operation_content ctxt delegate = function
|
||||||
| Proposals { period ; proposals } ->
|
| Proposals { period ; proposals } ->
|
||||||
@ -236,7 +236,7 @@ let apply_manager_operation_content
|
|||||||
return (ctxt, origination_nonce, None)
|
return (ctxt, origination_nonce, None)
|
||||||
|
|
||||||
let apply_sourced_operation
|
let apply_sourced_operation
|
||||||
ctxt baker_contract pred_block block_prio
|
ctxt pred_block block_prio
|
||||||
operation origination_nonce ops =
|
operation origination_nonce ops =
|
||||||
match ops with
|
match ops with
|
||||||
| Manager_operations { source ; fee ; counter ; operations = contents } ->
|
| Manager_operations { source ; fee ; counter ; operations = contents } ->
|
||||||
@ -251,10 +251,6 @@ let apply_sourced_operation
|
|||||||
Contract.check_counter_increment ctxt source counter >>=? fun () ->
|
Contract.check_counter_increment ctxt source counter >>=? fun () ->
|
||||||
Contract.increment_counter ctxt source >>=? fun ctxt ->
|
Contract.increment_counter ctxt source >>=? fun ctxt ->
|
||||||
Contract.spend ctxt source fee >>=? fun ctxt ->
|
Contract.spend ctxt source fee >>=? fun ctxt ->
|
||||||
(match baker_contract with
|
|
||||||
| None -> return ctxt
|
|
||||||
| Some contract ->
|
|
||||||
Contract.credit ctxt contract fee) >>=? fun ctxt ->
|
|
||||||
fold_left_s (fun (ctxt, origination_nonce, err) content ->
|
fold_left_s (fun (ctxt, origination_nonce, err) content ->
|
||||||
match err with
|
match err with
|
||||||
| Some _ -> return (ctxt, origination_nonce, err)
|
| Some _ -> return (ctxt, origination_nonce, err)
|
||||||
@ -263,91 +259,83 @@ let apply_sourced_operation
|
|||||||
apply_manager_operation_content
|
apply_manager_operation_content
|
||||||
ctxt origination_nonce source content)
|
ctxt origination_nonce source content)
|
||||||
(ctxt, origination_nonce, None) contents
|
(ctxt, origination_nonce, None) contents
|
||||||
|
>>=? fun (ctxt, origination_nonce, err) ->
|
||||||
|
return (ctxt, origination_nonce, err, fee, Tez.zero)
|
||||||
| Consensus_operation content ->
|
| Consensus_operation content ->
|
||||||
apply_consensus_operation_content ctxt
|
apply_consensus_operation_content ctxt
|
||||||
pred_block block_prio operation content >>=? fun ctxt ->
|
pred_block block_prio operation content >>=? fun ctxt ->
|
||||||
return (ctxt, origination_nonce, None)
|
return (ctxt, origination_nonce, None, Tez.zero, Tez.zero)
|
||||||
| Amendment_operation { source ; operation = content } ->
|
| Amendment_operation { source ; operation = content } ->
|
||||||
Roll.delegate_pubkey ctxt source >>=? fun delegate ->
|
Roll.delegate_pubkey ctxt source >>=? fun delegate ->
|
||||||
Operation.check_signature delegate operation >>=? fun () ->
|
Operation.check_signature delegate operation >>=? fun () ->
|
||||||
(* TODO, see how to extract the public key hash after this operation to
|
(* TODO, see how to extract the public key hash after this operation to
|
||||||
pass it to apply_delegate_operation_content *)
|
pass it to apply_delegate_operation_content *)
|
||||||
apply_amendment_operation_content ctxt source content >>=? fun ctxt ->
|
apply_amendment_operation_content ctxt source content >>=? fun ctxt ->
|
||||||
return (ctxt, origination_nonce, None)
|
return (ctxt, origination_nonce, None, Tez.zero, Tez.zero)
|
||||||
| Dictator_operation (Activate hash) ->
|
| Dictator_operation (Activate hash) ->
|
||||||
let dictator_pubkey = Constants.dictator_pubkey ctxt in
|
let dictator_pubkey = Constants.dictator_pubkey ctxt in
|
||||||
Operation.check_signature dictator_pubkey operation >>=? fun () ->
|
Operation.check_signature dictator_pubkey operation >>=? fun () ->
|
||||||
activate ctxt hash >>= fun ctxt ->
|
activate ctxt hash >>= fun ctxt ->
|
||||||
return (ctxt, origination_nonce, None)
|
return (ctxt, origination_nonce, None, Tez.zero, Tez.zero)
|
||||||
| Dictator_operation (Activate_testchain hash) ->
|
| Dictator_operation (Activate_testchain hash) ->
|
||||||
let dictator_pubkey = Constants.dictator_pubkey ctxt in
|
let dictator_pubkey = Constants.dictator_pubkey ctxt in
|
||||||
Operation.check_signature dictator_pubkey operation >>=? fun () ->
|
Operation.check_signature dictator_pubkey operation >>=? fun () ->
|
||||||
let expiration = (* in two days maximum... *)
|
let expiration = (* in two days maximum... *)
|
||||||
Time.add (Timestamp.current ctxt) (Int64.mul 48L 3600L) in
|
Time.add (Timestamp.current ctxt) (Int64.mul 48L 3600L) in
|
||||||
fork_test_chain ctxt hash expiration >>= fun ctxt ->
|
fork_test_chain ctxt hash expiration >>= fun ctxt ->
|
||||||
return (ctxt, origination_nonce, None)
|
return (ctxt, origination_nonce, None, Tez.zero, Tez.zero)
|
||||||
|
|
||||||
let apply_anonymous_operation ctxt baker_contract origination_nonce kind =
|
let apply_anonymous_operation ctxt delegate origination_nonce kind =
|
||||||
match kind with
|
match kind with
|
||||||
| Seed_nonce_revelation { level ; nonce } ->
|
| Seed_nonce_revelation { level ; nonce } ->
|
||||||
let level = Level.from_raw ctxt level in
|
let level = Level.from_raw ctxt level in
|
||||||
Nonce.reveal ctxt level nonce
|
Nonce.reveal ctxt level nonce >>=? fun ctxt ->
|
||||||
>>=? fun (ctxt, delegate_to_reward, reward_amount) ->
|
return (ctxt, origination_nonce,
|
||||||
Reward.record ctxt
|
Tez.zero, Constants.seed_nonce_revelation_tip)
|
||||||
delegate_to_reward level.cycle reward_amount >>=? fun ctxt ->
|
|
||||||
begin
|
|
||||||
match baker_contract with
|
|
||||||
| None -> return (ctxt, origination_nonce)
|
|
||||||
| Some contract ->
|
|
||||||
Contract.credit
|
|
||||||
ctxt contract Constants.seed_nonce_revelation_tip >>=? fun ctxt ->
|
|
||||||
return (ctxt, origination_nonce)
|
|
||||||
end
|
|
||||||
| Faucet { id = manager ; _ } ->
|
| Faucet { id = manager ; _ } ->
|
||||||
(* Free tez for all! *)
|
(* Free tez for all! *)
|
||||||
begin
|
|
||||||
match baker_contract with
|
|
||||||
| None -> return None
|
|
||||||
| Some contract -> Delegate.get ctxt contract
|
|
||||||
end >>=? fun delegate ->
|
|
||||||
if Compare.Int.(faucet_count ctxt < 5) then
|
if Compare.Int.(faucet_count ctxt < 5) then
|
||||||
let ctxt = incr_faucet_count ctxt in
|
let ctxt = incr_faucet_count ctxt in
|
||||||
Contract.originate ctxt
|
Contract.originate ctxt
|
||||||
origination_nonce
|
origination_nonce
|
||||||
~manager ~delegate ~balance:Constants.faucet_credit ?script:None
|
~manager ~delegate ~balance:Constants.faucet_credit ?script:None
|
||||||
~spendable:true ~delegatable:true >>=? fun (ctxt, _, origination_nonce) ->
|
~spendable:true ~delegatable:true >>=? fun (ctxt, _, origination_nonce) ->
|
||||||
return (ctxt, origination_nonce)
|
return (ctxt, origination_nonce, Tez.zero, Tez.zero)
|
||||||
else
|
else
|
||||||
fail Too_many_faucet
|
fail Too_many_faucet
|
||||||
|
|
||||||
let apply_operation
|
let apply_operation
|
||||||
ctxt baker_contract pred_block block_prio operation =
|
ctxt delegate pred_block block_prio operation =
|
||||||
match operation.contents with
|
match operation.contents with
|
||||||
| Anonymous_operations ops ->
|
| Anonymous_operations ops ->
|
||||||
let origination_nonce = Contract.initial_origination_nonce operation.hash in
|
let origination_nonce = Contract.initial_origination_nonce operation.hash in
|
||||||
fold_left_s
|
fold_left_s
|
||||||
(fun (ctxt, origination_nonce) ->
|
(fun (ctxt, origination_nonce, fees, rewards) op ->
|
||||||
apply_anonymous_operation ctxt baker_contract origination_nonce)
|
apply_anonymous_operation ctxt delegate origination_nonce op
|
||||||
(ctxt, origination_nonce) ops >>=? fun (ctxt, origination_nonce) ->
|
>>=? fun (ctxt, origination_nonce, fee, reward) ->
|
||||||
return (ctxt, Contract.originated_contracts origination_nonce, None)
|
return (ctxt, origination_nonce,
|
||||||
|
fees >>? Tez.(+?) fee,
|
||||||
|
rewards >>? Tez.(+?) reward))
|
||||||
|
(ctxt, origination_nonce, Ok Tez.zero, Ok Tez.zero) ops
|
||||||
|
>>=? fun (ctxt, origination_nonce, fees, rewards) ->
|
||||||
|
return (ctxt, Contract.originated_contracts origination_nonce, None,
|
||||||
|
fees, rewards)
|
||||||
| Sourced_operations op ->
|
| Sourced_operations op ->
|
||||||
let origination_nonce = Contract.initial_origination_nonce operation.hash in
|
let origination_nonce = Contract.initial_origination_nonce operation.hash in
|
||||||
apply_sourced_operation
|
apply_sourced_operation
|
||||||
ctxt baker_contract pred_block block_prio
|
ctxt pred_block block_prio
|
||||||
operation origination_nonce op >>=? fun (ctxt, origination_nonce, err) ->
|
operation origination_nonce op >>=? fun (ctxt, origination_nonce, err,
|
||||||
return (ctxt, Contract.originated_contracts origination_nonce, err)
|
fees, rewards) ->
|
||||||
|
return (ctxt, Contract.originated_contracts origination_nonce, err,
|
||||||
|
Ok fees, Ok rewards)
|
||||||
|
|
||||||
let may_start_new_cycle ctxt =
|
let may_start_new_cycle ctxt =
|
||||||
Baking.dawn_of_a_new_cycle ctxt >>=? function
|
Baking.dawn_of_a_new_cycle ctxt >>=? function
|
||||||
| None -> return ctxt
|
| None -> return ctxt
|
||||||
| Some last_cycle ->
|
| Some last_cycle ->
|
||||||
Seed.cycle_end ctxt last_cycle >>=? fun ctxt ->
|
Seed.cycle_end ctxt last_cycle >>=? fun (ctxt, unrevealed) ->
|
||||||
Roll.cycle_end ctxt last_cycle >>=? fun ctxt ->
|
Roll.cycle_end ctxt last_cycle >>=? fun ctxt ->
|
||||||
let timestamp = Timestamp.current ctxt in
|
Delegate.cycle_end ctxt last_cycle unrevealed >>=? fun ctxt ->
|
||||||
Lwt.return (Timestamp.(timestamp +? (Constants.time_before_reward ctxt)))
|
|
||||||
>>=? fun reward_date ->
|
|
||||||
Reward.set_reward_time_for_cycle
|
|
||||||
ctxt last_cycle reward_date >>=? fun ctxt ->
|
|
||||||
return ctxt
|
return ctxt
|
||||||
|
|
||||||
let begin_full_construction ctxt pred_timestamp protocol_data =
|
let begin_full_construction ctxt pred_timestamp protocol_data =
|
||||||
@ -355,11 +343,11 @@ let begin_full_construction ctxt pred_timestamp protocol_data =
|
|||||||
(Block_header.parse_unsigned_protocol_data
|
(Block_header.parse_unsigned_protocol_data
|
||||||
protocol_data) >>=? fun protocol_data ->
|
protocol_data) >>=? fun protocol_data ->
|
||||||
Baking.check_baking_rights
|
Baking.check_baking_rights
|
||||||
ctxt protocol_data pred_timestamp >>=? fun baker ->
|
ctxt protocol_data pred_timestamp >>=? fun delegate_pk ->
|
||||||
Baking.pay_baking_bond ctxt protocol_data
|
let delegate_pkh = Ed25519.Public_key.hash delegate_pk in
|
||||||
(Ed25519.Public_key.hash baker) >>=? fun ctxt ->
|
Baking.freeze_baking_bond ctxt protocol_data delegate_pkh >>=? fun (ctxt, bond) ->
|
||||||
let ctxt = Fitness.increase ctxt in
|
let ctxt = Fitness.increase ctxt in
|
||||||
return (ctxt, protocol_data, baker)
|
return (ctxt, protocol_data, delegate_pk, bond)
|
||||||
|
|
||||||
let begin_partial_construction ctxt =
|
let begin_partial_construction ctxt =
|
||||||
let ctxt = Fitness.increase ctxt in
|
let ctxt = Fitness.increase ctxt in
|
||||||
@ -370,10 +358,8 @@ let begin_application ctxt block_header pred_timestamp =
|
|||||||
Baking.check_proof_of_work_stamp ctxt block_header >>=? fun () ->
|
Baking.check_proof_of_work_stamp ctxt block_header >>=? fun () ->
|
||||||
Baking.check_fitness_gap ctxt block_header >>=? fun () ->
|
Baking.check_fitness_gap ctxt block_header >>=? fun () ->
|
||||||
Baking.check_baking_rights
|
Baking.check_baking_rights
|
||||||
ctxt block_header.protocol_data pred_timestamp >>=? fun baker ->
|
ctxt block_header.protocol_data pred_timestamp >>=? fun delegate_pk ->
|
||||||
Baking.check_signature block_header baker >>=? fun () ->
|
Baking.check_signature block_header delegate_pk >>=? fun () ->
|
||||||
Baking.pay_baking_bond ctxt block_header.protocol_data
|
|
||||||
(Ed25519.Public_key.hash baker) >>=? fun ctxt ->
|
|
||||||
let has_commitment =
|
let has_commitment =
|
||||||
match block_header.protocol_data.seed_nonce_hash with
|
match block_header.protocol_data.seed_nonce_hash with
|
||||||
| None -> false
|
| None -> false
|
||||||
@ -382,19 +368,24 @@ let begin_application ctxt block_header pred_timestamp =
|
|||||||
Compare.Bool.(has_commitment = current_level.expected_commitment)
|
Compare.Bool.(has_commitment = current_level.expected_commitment)
|
||||||
(Invalid_commitment
|
(Invalid_commitment
|
||||||
{ expected = current_level.expected_commitment }) >>=? fun () ->
|
{ expected = current_level.expected_commitment }) >>=? fun () ->
|
||||||
|
let delegate_pkh = Ed25519.Public_key.hash delegate_pk in
|
||||||
|
Baking.freeze_baking_bond ctxt
|
||||||
|
block_header.protocol_data delegate_pkh >>=? fun (ctxt, bond) ->
|
||||||
let ctxt = Fitness.increase ctxt in
|
let ctxt = Fitness.increase ctxt in
|
||||||
return (ctxt, baker)
|
return (ctxt, delegate_pk, bond)
|
||||||
|
|
||||||
let finalize_application ctxt block_protocol_data baker =
|
let finalize_application ctxt protocol_data delegate bond fees rewards =
|
||||||
(* end of level (from this point nothing should fail) *)
|
(* end of level (from this point nothing should fail) *)
|
||||||
let priority = block_protocol_data.Block_header.priority in
|
Lwt.return Tez.(rewards +? Constants.baking_reward) >>=? fun rewards ->
|
||||||
let reward = Baking.base_baking_reward ctxt ~priority in
|
Delegate.freeze_fees ctxt delegate fees >>=? fun ctxt ->
|
||||||
|
Delegate.freeze_rewards ctxt delegate rewards >>=? fun ctxt ->
|
||||||
begin
|
begin
|
||||||
match block_protocol_data.seed_nonce_hash with
|
match protocol_data.Block_header.seed_nonce_hash with
|
||||||
| None -> return ctxt
|
| None -> return ctxt
|
||||||
| Some nonce -> Nonce.record_hash ctxt baker reward nonce
|
| Some nonce_hash ->
|
||||||
|
Nonce.record_hash ctxt
|
||||||
|
{ nonce_hash ; delegate ; bond ; rewards ; fees }
|
||||||
end >>=? fun ctxt ->
|
end >>=? fun ctxt ->
|
||||||
Reward.pay_due_rewards ctxt >>=? fun ctxt ->
|
|
||||||
(* end of cycle *)
|
(* end of cycle *)
|
||||||
may_start_new_cycle ctxt >>=? fun ctxt ->
|
may_start_new_cycle ctxt >>=? fun ctxt ->
|
||||||
Amendment.may_start_new_voting_cycle ctxt >>=? fun ctxt ->
|
Amendment.may_start_new_voting_cycle ctxt >>=? fun ctxt ->
|
||||||
|
@ -14,10 +14,10 @@ open Misc
|
|||||||
type error += Invalid_fitness_gap of int64 * int64 (* `Permanent *)
|
type error += Invalid_fitness_gap of int64 * int64 (* `Permanent *)
|
||||||
type error += Invalid_endorsement_slot of int * int (* `Permanent *)
|
type error += Invalid_endorsement_slot of int * int (* `Permanent *)
|
||||||
type error += Timestamp_too_early of Timestamp.t * Timestamp.t (* `Permanent *)
|
type error += Timestamp_too_early of Timestamp.t * Timestamp.t (* `Permanent *)
|
||||||
|
type error += Cannot_freeze_baking_bond (* `Permanent *)
|
||||||
|
type error += Cannot_freeze_endorsement_bond (* `Permanent *)
|
||||||
type error += Inconsistent_endorsement of public_key_hash list (* `Permanent *)
|
type error += Inconsistent_endorsement of public_key_hash list (* `Permanent *)
|
||||||
type error += Empty_endorsement
|
type error += Empty_endorsement
|
||||||
type error += Cannot_pay_baking_bond (* `Permanent *)
|
|
||||||
type error += Cannot_pay_endorsement_bond (* `Permanent *)
|
|
||||||
type error += Invalid_block_signature of Block_hash.t * Ed25519.Public_key_hash.t (* `Permanent *)
|
type error += Invalid_block_signature of Block_hash.t * Ed25519.Public_key_hash.t (* `Permanent *)
|
||||||
|
|
||||||
|
|
||||||
@ -62,6 +62,26 @@ let () =
|
|||||||
(req "provided" int16))
|
(req "provided" int16))
|
||||||
(function Invalid_endorsement_slot (m, g) -> Some (m, g) | _ -> None)
|
(function Invalid_endorsement_slot (m, g) -> Some (m, g) | _ -> None)
|
||||||
(fun (m, g) -> Invalid_endorsement_slot (m, g)) ;
|
(fun (m, g) -> Invalid_endorsement_slot (m, g)) ;
|
||||||
|
register_error_kind
|
||||||
|
`Permanent
|
||||||
|
~id:"baking.cannot_freeze_baking_bond"
|
||||||
|
~title:"Cannot freeze baking bond"
|
||||||
|
~description:
|
||||||
|
"Impossible to debit the required tokens on the baker's contract"
|
||||||
|
~pp:(fun ppf () -> Format.fprintf ppf "Cannot freeze the baking bond")
|
||||||
|
Data_encoding.unit
|
||||||
|
(function Cannot_freeze_baking_bond -> Some () | _ -> None)
|
||||||
|
(fun () -> Cannot_freeze_baking_bond) ;
|
||||||
|
register_error_kind
|
||||||
|
`Permanent
|
||||||
|
~id:"baking.cannot_freeze_endorsement_bond"
|
||||||
|
~title:"Cannot freeze endorsement bond"
|
||||||
|
~description:
|
||||||
|
"Impossible to debit the required tokens on the endorser's contract"
|
||||||
|
~pp:(fun ppf () -> Format.fprintf ppf "Cannot freeze the endorsement bond")
|
||||||
|
Data_encoding.unit
|
||||||
|
(function Cannot_freeze_endorsement_bond -> Some () | _ -> None)
|
||||||
|
(fun () -> Cannot_freeze_endorsement_bond) ;
|
||||||
register_error_kind
|
register_error_kind
|
||||||
`Permanent
|
`Permanent
|
||||||
~id:"baking.inconsisten_endorsement"
|
~id:"baking.inconsisten_endorsement"
|
||||||
@ -75,26 +95,6 @@ let () =
|
|||||||
(req "delegates" (list Ed25519.Public_key_hash.encoding)))
|
(req "delegates" (list Ed25519.Public_key_hash.encoding)))
|
||||||
(function Inconsistent_endorsement l -> Some l | _ -> None)
|
(function Inconsistent_endorsement l -> Some l | _ -> None)
|
||||||
(fun l -> Inconsistent_endorsement l) ;
|
(fun l -> Inconsistent_endorsement l) ;
|
||||||
register_error_kind
|
|
||||||
`Permanent
|
|
||||||
~id:"baking.cannot_pay_baking_bond"
|
|
||||||
~title:"Cannot pay baking bond"
|
|
||||||
~description:
|
|
||||||
"Impossible to debit the required tokens on the baker's contract"
|
|
||||||
~pp:(fun ppf () -> Format.fprintf ppf "Cannot pay the baking bond")
|
|
||||||
Data_encoding.unit
|
|
||||||
(function Cannot_pay_baking_bond -> Some () | _ -> None)
|
|
||||||
(fun () -> Cannot_pay_baking_bond) ;
|
|
||||||
register_error_kind
|
|
||||||
`Permanent
|
|
||||||
~id:"baking.cannot_pay_endorsement_bond"
|
|
||||||
~title:"Cannot pay endorsement bond"
|
|
||||||
~description:
|
|
||||||
"Impossible to debit the required tokens on the endorser's contract"
|
|
||||||
~pp:(fun ppf () -> Format.fprintf ppf "Cannot pay the endorsement bond")
|
|
||||||
Data_encoding.unit
|
|
||||||
(function Cannot_pay_endorsement_bond -> Some () | _ -> None)
|
|
||||||
(fun () -> Cannot_pay_endorsement_bond) ;
|
|
||||||
register_error_kind
|
register_error_kind
|
||||||
`Permanent
|
`Permanent
|
||||||
~id:"baking.invalid_block_signature"
|
~id:"baking.invalid_block_signature"
|
||||||
@ -111,6 +111,7 @@ let () =
|
|||||||
(function Invalid_block_signature (block, pkh) -> Some (block, pkh) | _ -> None)
|
(function Invalid_block_signature (block, pkh) -> Some (block, pkh) | _ -> None)
|
||||||
(fun (block, pkh) -> Invalid_block_signature (block, pkh))
|
(fun (block, pkh) -> Invalid_block_signature (block, pkh))
|
||||||
|
|
||||||
|
|
||||||
let minimal_time c priority pred_timestamp =
|
let minimal_time c priority pred_timestamp =
|
||||||
let priority = Int32.of_int priority in
|
let priority = Int32.of_int priority in
|
||||||
let rec cumsum_slot_durations acc durations p =
|
let rec cumsum_slot_durations acc durations p =
|
||||||
@ -129,6 +130,20 @@ let minimal_time c priority pred_timestamp =
|
|||||||
(cumsum_slot_durations
|
(cumsum_slot_durations
|
||||||
pred_timestamp (Constants.slot_durations c) (Int32.succ priority))
|
pred_timestamp (Constants.slot_durations c) (Int32.succ priority))
|
||||||
|
|
||||||
|
let freeze_baking_bond ctxt { Block_header.priority ; _ } delegate =
|
||||||
|
if Compare.Int.(priority >= Constants.first_free_baking_slot ctxt)
|
||||||
|
then return (ctxt, Tez.zero)
|
||||||
|
else
|
||||||
|
let bond = Constants.baking_bond_cost in
|
||||||
|
Delegate.freeze_bond ctxt delegate bond
|
||||||
|
|> trace Cannot_freeze_baking_bond >>=? fun ctxt ->
|
||||||
|
return (ctxt, bond)
|
||||||
|
|
||||||
|
let freeze_endorsement_bond ctxt delegate =
|
||||||
|
let bond = Constants.endorsement_bond_cost in
|
||||||
|
Delegate.freeze_bond ctxt delegate bond
|
||||||
|
|> trace Cannot_freeze_endorsement_bond
|
||||||
|
|
||||||
let check_timestamp c priority pred_timestamp =
|
let check_timestamp c priority pred_timestamp =
|
||||||
minimal_time c priority pred_timestamp >>=? fun minimal_time ->
|
minimal_time c priority pred_timestamp >>=? fun minimal_time ->
|
||||||
let timestamp = Alpha_context.Timestamp.current c in
|
let timestamp = Alpha_context.Timestamp.current c in
|
||||||
@ -142,19 +157,6 @@ let check_baking_rights c { Block_header.priority ; _ }
|
|||||||
check_timestamp c priority pred_timestamp >>=? fun () ->
|
check_timestamp c priority pred_timestamp >>=? fun () ->
|
||||||
return delegate
|
return delegate
|
||||||
|
|
||||||
let pay_baking_bond c { Block_header.priority ; _ } id =
|
|
||||||
if Compare.Int.(priority >= Constants.first_free_baking_slot c)
|
|
||||||
then return c
|
|
||||||
else
|
|
||||||
Contract.spend c (Contract.implicit_contract id) Constants.baking_bond_cost
|
|
||||||
|> trace Cannot_pay_baking_bond
|
|
||||||
|
|
||||||
let pay_endorsement_bond c id =
|
|
||||||
let bond = Constants.endorsement_bond_cost in
|
|
||||||
Contract.spend c (Contract.implicit_contract id) bond
|
|
||||||
|> trace Cannot_pay_endorsement_bond >>=? fun c ->
|
|
||||||
return (c, bond)
|
|
||||||
|
|
||||||
let check_endorsements_rights c level slots =
|
let check_endorsements_rights c level slots =
|
||||||
map_p (fun slot ->
|
map_p (fun slot ->
|
||||||
fail_unless Compare.Int.(0 <= slot && slot <= Constants.max_signing_slot c)
|
fail_unless Compare.Int.(0 <= slot && slot <= Constants.max_signing_slot c)
|
||||||
@ -171,16 +173,6 @@ let check_endorsements_rights c level slots =
|
|||||||
let paying_priorities c =
|
let paying_priorities c =
|
||||||
0 --> (Constants.first_free_baking_slot c - 1)
|
0 --> (Constants.first_free_baking_slot c - 1)
|
||||||
|
|
||||||
let bond_and_reward =
|
|
||||||
match Tez.(Constants.baking_bond_cost +? Constants.baking_reward) with
|
|
||||||
| Ok v -> v
|
|
||||||
| Error _ -> assert false
|
|
||||||
|
|
||||||
let base_baking_reward c ~priority =
|
|
||||||
if Compare.Int.(priority < Constants.first_free_baking_slot c)
|
|
||||||
then bond_and_reward
|
|
||||||
else Constants.baking_reward
|
|
||||||
|
|
||||||
type error += Incorect_priority
|
type error += Incorect_priority
|
||||||
|
|
||||||
let endorsement_reward ~block_priority:prio =
|
let endorsement_reward ~block_priority:prio =
|
||||||
|
@ -15,8 +15,8 @@ type error += Invalid_fitness_gap of int64 * int64 (* `Permanent *)
|
|||||||
type error += Invalid_endorsement_slot of int * int (* `Permanent *)
|
type error += Invalid_endorsement_slot of int * int (* `Permanent *)
|
||||||
type error += Timestamp_too_early of Timestamp.t * Timestamp.t (* `Permanent *)
|
type error += Timestamp_too_early of Timestamp.t * Timestamp.t (* `Permanent *)
|
||||||
type error += Inconsistent_endorsement of public_key_hash list (* `Permanent *)
|
type error += Inconsistent_endorsement of public_key_hash list (* `Permanent *)
|
||||||
type error += Cannot_pay_baking_bond (* `Permanent *)
|
type error += Cannot_freeze_baking_bond (* `Permanent *)
|
||||||
type error += Cannot_pay_endorsement_bond (* `Permanent *)
|
type error += Cannot_freeze_endorsement_bond (* `Permanent *)
|
||||||
type error += Invalid_block_signature of Block_hash.t * Ed25519.Public_key_hash.t (* `Permanent *)
|
type error += Invalid_block_signature of Block_hash.t * Ed25519.Public_key_hash.t (* `Permanent *)
|
||||||
|
|
||||||
val paying_priorities: context -> int list
|
val paying_priorities: context -> int list
|
||||||
@ -28,26 +28,29 @@ val paying_priorities: context -> int list
|
|||||||
time cannot be computed. *)
|
time cannot be computed. *)
|
||||||
val minimal_time: context -> int -> Time.t -> Time.t tzresult Lwt.t
|
val minimal_time: context -> int -> Time.t -> Time.t tzresult Lwt.t
|
||||||
|
|
||||||
(** [pay_baking_bond: cxt baker] Debit the baking bond (See
|
(** [freeze_baking_bond: ctxt delegate priority]
|
||||||
!Constants.baking_bond_cost) from the default account of the
|
Freeze the baking bond (See !Constants.baking_bond_cost)
|
||||||
[baker]. No bond is debited if the baking priority of this block is
|
from a delegate account. No bond is frozen if the baking
|
||||||
greater than the maximum number of paying baking in the network
|
priority of this block is greater than the maximum number
|
||||||
(meaning that n. bakers skipped their turn).
|
of paying baking in the network (meaning that n. bakers
|
||||||
|
skipped their turn).
|
||||||
|
|
||||||
Raise an error if the baker account does not have enough
|
Raise an error if the delegate account does not have enough
|
||||||
funds to claim baking rights. *)
|
funds to claim baking rights. *)
|
||||||
val pay_baking_bond:
|
val freeze_baking_bond:
|
||||||
context ->
|
context ->
|
||||||
Block_header.protocol_data ->
|
Block_header.protocol_data ->
|
||||||
public_key_hash ->
|
public_key_hash ->
|
||||||
context tzresult Lwt.t
|
(context * Tez.t) tzresult Lwt.t
|
||||||
|
|
||||||
(** [pay_endorsement_bond: cxt baker] Debit the endorsement bond
|
(** [freeze_endorsement_bond: ctxt delegate]
|
||||||
(See !Constants.endorsement_bond_cost) from the default account
|
Freeze the endorsement bond (See !Constants.endorsement_bond_cost)
|
||||||
of the [baker]. Raise an error if the baker account does not
|
from the delegate account.
|
||||||
have enough funds to claim endorsement rights *)
|
|
||||||
val pay_endorsement_bond:
|
Raise an error if the baker account does not have enough
|
||||||
context -> public_key_hash -> (context * Tez.t) tzresult Lwt.t
|
funds to claim endorsement rights *)
|
||||||
|
val freeze_endorsement_bond:
|
||||||
|
context -> public_key_hash -> context tzresult Lwt.t
|
||||||
|
|
||||||
(** [check_baking_rights ctxt block pred_timestamp] verifies that:
|
(** [check_baking_rights ctxt block pred_timestamp] verifies that:
|
||||||
* the contract that owned the roll at cycle start has the block signer as delegate.
|
* the contract that owned the roll at cycle start has the block signer as delegate.
|
||||||
@ -65,10 +68,6 @@ val check_baking_rights:
|
|||||||
val check_endorsements_rights:
|
val check_endorsements_rights:
|
||||||
context -> Level.t -> int list -> public_key tzresult Lwt.t
|
context -> Level.t -> int list -> public_key tzresult Lwt.t
|
||||||
|
|
||||||
(** If this priority should have payed the bond it is the base baking
|
|
||||||
reward and the bond, or just the base reward otherwise *)
|
|
||||||
val base_baking_reward: context -> priority:int -> Tez.t
|
|
||||||
|
|
||||||
(** Returns the endorsement reward calculated w.r.t a given priotiry. *)
|
(** Returns the endorsement reward calculated w.r.t a given priotiry. *)
|
||||||
val endorsement_reward: block_priority:int -> Tez.t tzresult Lwt.t
|
val endorsement_reward: block_priority:int -> Tez.t tzresult Lwt.t
|
||||||
|
|
||||||
|
@ -152,7 +152,6 @@ let create_base c contract
|
|||||||
match delegate with
|
match delegate with
|
||||||
| None -> return c
|
| None -> return c
|
||||||
| Some delegate ->
|
| Some delegate ->
|
||||||
Storage.Contract.Delegate.init c contract delegate >>=? fun c ->
|
|
||||||
Delegate_storage.init c contract delegate
|
Delegate_storage.init c contract delegate
|
||||||
end >>=? fun c ->
|
end >>=? fun c ->
|
||||||
Storage.Contract.Spendable.set c contract spendable >>= fun c ->
|
Storage.Contract.Spendable.set c contract spendable >>= fun c ->
|
||||||
@ -182,7 +181,6 @@ let delete c contract =
|
|||||||
Delegate_storage.remove c contract >>=? fun c ->
|
Delegate_storage.remove c contract >>=? fun c ->
|
||||||
Storage.Contract.Balance.delete c contract >>=? fun c ->
|
Storage.Contract.Balance.delete c contract >>=? fun c ->
|
||||||
Storage.Contract.Manager.delete c contract >>=? fun c ->
|
Storage.Contract.Manager.delete c contract >>=? fun c ->
|
||||||
Storage.Contract.Delegate.remove c contract >>= fun c ->
|
|
||||||
Storage.Contract.Spendable.del c contract >>= fun c ->
|
Storage.Contract.Spendable.del c contract >>= fun c ->
|
||||||
Storage.Contract.Delegatable.del c contract >>= fun c ->
|
Storage.Contract.Delegatable.del c contract >>= fun c ->
|
||||||
Storage.Contract.Counter.delete c contract >>=? fun c ->
|
Storage.Contract.Counter.delete c contract >>=? fun c ->
|
||||||
@ -334,7 +332,7 @@ let spend_from_script c contract amount =
|
|||||||
else match Contract_repr.is_implicit contract with
|
else match Contract_repr.is_implicit contract with
|
||||||
| None -> return c (* Never delete originated contracts *)
|
| None -> return c (* Never delete originated contracts *)
|
||||||
| Some pkh ->
|
| Some pkh ->
|
||||||
Storage.Contract.Delegate.get_option c contract >>=? function
|
Delegate_storage.get c contract >>=? function
|
||||||
| Some pkh' ->
|
| Some pkh' ->
|
||||||
(* Don't delete "delegate" contract *)
|
(* Don't delete "delegate" contract *)
|
||||||
assert (Ed25519.Public_key_hash.equal pkh pkh') ;
|
assert (Ed25519.Public_key_hash.equal pkh pkh') ;
|
||||||
|
@ -18,8 +18,6 @@ type error +=
|
|||||||
| Missing_public_key of Ed25519.Public_key_hash.t (* `Permanent *)
|
| Missing_public_key of Ed25519.Public_key_hash.t (* `Permanent *)
|
||||||
| Failure of string (* `Permanent *)
|
| Failure of string (* `Permanent *)
|
||||||
|
|
||||||
val delete: Raw_context.t -> Contract_repr.t -> Raw_context.t tzresult Lwt.t
|
|
||||||
|
|
||||||
val exists: Raw_context.t -> Contract_repr.t -> bool tzresult Lwt.t
|
val exists: Raw_context.t -> Contract_repr.t -> bool tzresult Lwt.t
|
||||||
val must_exist: Raw_context.t -> Contract_repr.t -> unit tzresult Lwt.t
|
val must_exist: Raw_context.t -> Contract_repr.t -> unit tzresult Lwt.t
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ let registered c delegate =
|
|||||||
c (Contract_repr.implicit_contract delegate)
|
c (Contract_repr.implicit_contract delegate)
|
||||||
|
|
||||||
let init ctxt contract delegate =
|
let init ctxt contract delegate =
|
||||||
|
Storage.Contract.Delegate.init ctxt contract delegate >>=? fun ctxt ->
|
||||||
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
||||||
link ctxt contract delegate balance
|
link ctxt contract delegate balance
|
||||||
|
|
||||||
@ -113,7 +114,7 @@ let set c contract delegate =
|
|||||||
link c contract delegate balance >>=? fun c ->
|
link c contract delegate balance >>=? fun c ->
|
||||||
begin
|
begin
|
||||||
if self_delegation then
|
if self_delegation then
|
||||||
Storage.Delegate.add c delegate
|
Storage.Delegates.add c delegate
|
||||||
else
|
else
|
||||||
Lwt.return c
|
Lwt.return c
|
||||||
end >>= fun c ->
|
end >>= fun c ->
|
||||||
@ -123,5 +124,176 @@ let remove ctxt contract =
|
|||||||
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
||||||
unlink ctxt contract balance
|
unlink ctxt contract balance
|
||||||
|
|
||||||
let fold = Storage.Delegate.fold
|
let fold = Storage.Delegates.fold
|
||||||
let list = Storage.Delegate.elements
|
let list = Storage.Delegates.elements
|
||||||
|
|
||||||
|
|
||||||
|
let get_frozen_bond ctxt contract cycle =
|
||||||
|
Storage.Contract.Frozen_bonds.get_option (ctxt, contract) cycle >>=? function
|
||||||
|
| None -> return Tez_repr.zero
|
||||||
|
| Some frozen -> return frozen
|
||||||
|
|
||||||
|
let credit_frozen_bond ctxt contract cycle amount =
|
||||||
|
get_frozen_bond ctxt contract cycle >>=? fun old_amount ->
|
||||||
|
Lwt.return Tez_repr.(old_amount +? amount) >>=? fun new_amount ->
|
||||||
|
Storage.Contract.Frozen_bonds.init_set
|
||||||
|
(ctxt, contract) cycle new_amount >>= fun ctxt ->
|
||||||
|
return ctxt
|
||||||
|
|
||||||
|
let freeze_bond ctxt delegate amount =
|
||||||
|
let { Level_repr.cycle ; _ } = Level_storage.current ctxt in
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
||||||
|
Lwt.return Tez_repr.(balance -? amount) >>=? fun new_balance ->
|
||||||
|
Storage.Contract.Balance.set ctxt contract new_balance >>=? fun ctxt ->
|
||||||
|
credit_frozen_bond ctxt contract cycle amount
|
||||||
|
|
||||||
|
let burn_bond ctxt delegate cycle amount =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
get_frozen_bond ctxt contract cycle >>=? fun old_amount ->
|
||||||
|
Roll_storage.Delegate.remove_amount ctxt delegate amount >>=? fun ctxt ->
|
||||||
|
Lwt.return Tez_repr.(old_amount -? amount) >>=? fun new_amount ->
|
||||||
|
Storage.Contract.Frozen_bonds.set (ctxt, contract) cycle new_amount
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let get_frozen_fees ctxt contract cycle =
|
||||||
|
Storage.Contract.Frozen_fees.get_option (ctxt, contract) cycle >>=? function
|
||||||
|
| None -> return Tez_repr.zero
|
||||||
|
| Some frozen -> return frozen
|
||||||
|
|
||||||
|
let credit_frozen_fees ctxt contract cycle amount =
|
||||||
|
get_frozen_fees ctxt contract cycle >>=? fun old_amount ->
|
||||||
|
Lwt.return Tez_repr.(old_amount +? amount) >>=? fun new_amount ->
|
||||||
|
Storage.Contract.Frozen_fees.init_set
|
||||||
|
(ctxt, contract) cycle new_amount >>= fun ctxt ->
|
||||||
|
return ctxt
|
||||||
|
|
||||||
|
let freeze_fees ctxt delegate amount =
|
||||||
|
let { Level_repr.cycle ; _ } = Level_storage.current ctxt in
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
Roll_storage.Delegate.add_amount ctxt delegate amount >>=? fun ctxt ->
|
||||||
|
credit_frozen_fees ctxt contract cycle amount
|
||||||
|
|
||||||
|
let burn_fees ctxt delegate cycle amount =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
get_frozen_fees ctxt contract cycle >>=? fun old_amount ->
|
||||||
|
Roll_storage.Delegate.remove_amount ctxt delegate amount >>=? fun ctxt ->
|
||||||
|
Lwt.return Tez_repr.(old_amount -? amount) >>=? fun new_amount ->
|
||||||
|
Storage.Contract.Frozen_fees.set (ctxt, contract) cycle new_amount
|
||||||
|
|
||||||
|
|
||||||
|
let get_frozen_rewards ctxt contract cycle =
|
||||||
|
Storage.Contract.Frozen_rewards.get_option (ctxt, contract) cycle >>=? function
|
||||||
|
| None -> return Tez_repr.zero
|
||||||
|
| Some frozen -> return frozen
|
||||||
|
|
||||||
|
let credit_frozen_rewards ctxt contract cycle amount =
|
||||||
|
get_frozen_rewards ctxt contract cycle >>=? fun old_amount ->
|
||||||
|
Lwt.return Tez_repr.(old_amount +? amount) >>=? fun new_amount ->
|
||||||
|
Storage.Contract.Frozen_rewards.init_set
|
||||||
|
(ctxt, contract) cycle new_amount >>= fun ctxt ->
|
||||||
|
return ctxt
|
||||||
|
|
||||||
|
let freeze_rewards ctxt delegate amount =
|
||||||
|
let { Level_repr.cycle ; _ } = Level_storage.current ctxt in
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
credit_frozen_rewards ctxt contract cycle amount
|
||||||
|
|
||||||
|
let burn_rewards ctxt delegate cycle amount =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
get_frozen_rewards ctxt contract cycle >>=? fun old_amount ->
|
||||||
|
Lwt.return Tez_repr.(old_amount -? amount) >>=? fun new_amount ->
|
||||||
|
Storage.Contract.Frozen_rewards.set (ctxt, contract) cycle new_amount
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let unfreeze ctxt delegate cycle =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
get_frozen_bond ctxt contract cycle >>=? fun bond ->
|
||||||
|
get_frozen_fees ctxt contract cycle >>=? fun fees ->
|
||||||
|
get_frozen_rewards ctxt contract cycle >>=? fun rewards ->
|
||||||
|
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
||||||
|
Lwt.return Tez_repr.(balance +? bond) >>=? fun balance ->
|
||||||
|
Lwt.return Tez_repr.(balance +? fees) >>=? fun balance ->
|
||||||
|
Lwt.return Tez_repr.(balance +? rewards) >>=? fun balance ->
|
||||||
|
Storage.Contract.Balance.set ctxt contract balance >>=? fun ctxt ->
|
||||||
|
Roll_storage.Delegate.add_amount ctxt delegate rewards >>=? fun ctxt ->
|
||||||
|
return ctxt
|
||||||
|
|
||||||
|
let cycle_end ctxt last_cycle unrevealed =
|
||||||
|
let preserved = Constants_storage.preserved_cycles ctxt in
|
||||||
|
begin
|
||||||
|
match Cycle_repr.pred last_cycle with
|
||||||
|
| None -> return ctxt
|
||||||
|
| Some revealed_cycle ->
|
||||||
|
List.fold_left
|
||||||
|
(fun ctxt (u : Nonce_storage.unrevealed) ->
|
||||||
|
ctxt >>=? fun ctxt ->
|
||||||
|
burn_bond
|
||||||
|
ctxt u.delegate revealed_cycle u.bond >>=? fun ctxt ->
|
||||||
|
burn_fees
|
||||||
|
ctxt u.delegate revealed_cycle u.fees >>=? fun ctxt ->
|
||||||
|
burn_rewards
|
||||||
|
ctxt u.delegate revealed_cycle u.rewards >>=? fun ctxt ->
|
||||||
|
return ctxt)
|
||||||
|
(return ctxt) unrevealed
|
||||||
|
end >>=? fun ctxt ->
|
||||||
|
match Cycle_repr.sub last_cycle preserved with
|
||||||
|
| None -> return ctxt
|
||||||
|
| Some unfrozen_cycle ->
|
||||||
|
fold ctxt
|
||||||
|
~init:(Ok ctxt)
|
||||||
|
~f:(fun delegate ctxt ->
|
||||||
|
Lwt.return ctxt >>=? fun ctxt ->
|
||||||
|
unfreeze ctxt delegate unfrozen_cycle)
|
||||||
|
|
||||||
|
|
||||||
|
let punish ctxt delegate cycle =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
get_frozen_bond ctxt contract cycle >>=? fun bond ->
|
||||||
|
get_frozen_fees ctxt contract cycle >>=? fun fees ->
|
||||||
|
Roll_storage.Delegate.remove_amount ctxt delegate bond >>=? fun ctxt ->
|
||||||
|
Roll_storage.Delegate.remove_amount ctxt delegate fees >>=? fun ctxt ->
|
||||||
|
Storage.Contract.Frozen_bonds.remove (ctxt, contract) cycle >>= fun ctxt ->
|
||||||
|
Storage.Contract.Frozen_fees.remove (ctxt, contract) cycle >>= fun ctxt ->
|
||||||
|
Storage.Contract.Frozen_rewards.remove (ctxt, contract) cycle >>= fun ctxt ->
|
||||||
|
return ctxt
|
||||||
|
|
||||||
|
|
||||||
|
let has_frozen_balance ctxt delegate cycle =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
get_frozen_bond ctxt contract cycle >>=? fun bond ->
|
||||||
|
if Tez_repr.(bond <> zero) then return true
|
||||||
|
else
|
||||||
|
get_frozen_fees ctxt contract cycle >>=? fun fees ->
|
||||||
|
if Tez_repr.(fees <> zero) then return true
|
||||||
|
else
|
||||||
|
get_frozen_rewards ctxt contract cycle >>=? fun rewards ->
|
||||||
|
return Tez_repr.(rewards <> zero)
|
||||||
|
|
||||||
|
let frozen_balance ctxt delegate =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
let balance = Ok Tez_repr.zero in
|
||||||
|
Storage.Contract.Frozen_bonds.fold
|
||||||
|
(ctxt, contract) ~init:balance
|
||||||
|
~f:(fun _cycle amount acc ->
|
||||||
|
Lwt.return acc >>=? fun acc ->
|
||||||
|
Lwt.return (Tez_repr.(acc +? amount))) >>= fun balance ->
|
||||||
|
Storage.Contract.Frozen_fees.fold
|
||||||
|
(ctxt, contract) ~init:balance
|
||||||
|
~f:(fun _cycle amount acc ->
|
||||||
|
Lwt.return acc >>=? fun acc ->
|
||||||
|
Lwt.return (Tez_repr.(acc +? amount))) >>= fun balance ->
|
||||||
|
Storage.Contract.Frozen_rewards.fold
|
||||||
|
(ctxt, contract) ~init:balance
|
||||||
|
~f:(fun _cycle amount acc ->
|
||||||
|
Lwt.return acc >>=? fun acc ->
|
||||||
|
Lwt.return (Tez_repr.(acc +? amount))) >>= fun balance ->
|
||||||
|
Lwt.return balance
|
||||||
|
|
||||||
|
let full_balance ctxt delegate =
|
||||||
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
frozen_balance ctxt delegate >>=? fun frozen_balance ->
|
||||||
|
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
||||||
|
Lwt.return Tez_repr.(frozen_balance +? balance)
|
||||||
|
@ -7,29 +7,90 @@
|
|||||||
(* *)
|
(* *)
|
||||||
(**************************************************************************)
|
(**************************************************************************)
|
||||||
|
|
||||||
type error +=
|
(** Is the contract eligible to delegation ? *)
|
||||||
| Non_delegatable_contract of Contract_repr.contract (* `Permanent *)
|
|
||||||
|
|
||||||
val is_delegatable:
|
val is_delegatable:
|
||||||
Raw_context.t -> Contract_repr.t -> bool tzresult Lwt.t
|
Raw_context.t -> Contract_repr.t -> bool tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Allow to register a delegate when creating an account. *)
|
||||||
val init:
|
val init:
|
||||||
Raw_context.t -> Contract_repr.t -> Ed25519.Public_key_hash.t ->
|
Raw_context.t -> Contract_repr.t -> Ed25519.Public_key_hash.t ->
|
||||||
Raw_context.t tzresult Lwt.t
|
Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Cleanup delegation when deleting a contract. *)
|
||||||
|
val remove:
|
||||||
|
Raw_context.t -> Contract_repr.t -> Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Reading the current delegate of a contract. *)
|
||||||
val get:
|
val get:
|
||||||
Raw_context.t -> Contract_repr.t ->
|
Raw_context.t -> Contract_repr.t ->
|
||||||
Ed25519.Public_key_hash.t option tzresult Lwt.t
|
Ed25519.Public_key_hash.t option tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Updating the delegate of a contract.
|
||||||
|
|
||||||
|
When calling this function on an "implicit contract" this function
|
||||||
|
fails, unless when the registred delegate is the contract manager.
|
||||||
|
In the that case, the manager is now registred as a delegate. One
|
||||||
|
cannot unregister a delegate for now. The associate contract is
|
||||||
|
now 'undeletable'. *)
|
||||||
val set:
|
val set:
|
||||||
Raw_context.t -> Contract_repr.t -> Ed25519.Public_key_hash.t option ->
|
Raw_context.t -> Contract_repr.t -> Ed25519.Public_key_hash.t option ->
|
||||||
Raw_context.t tzresult Lwt.t
|
Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
val remove: Raw_context.t -> Contract_repr.t -> Raw_context.t tzresult Lwt.t
|
type error +=
|
||||||
|
| Non_delegatable_contract of Contract_repr.contract (* `Permanent *)
|
||||||
|
|
||||||
|
(** Iterate on all registred delegates. *)
|
||||||
val fold:
|
val fold:
|
||||||
Raw_context.t ->
|
Raw_context.t ->
|
||||||
init:'a ->
|
init:'a ->
|
||||||
f:(Ed25519.Public_key_hash.t -> 'a -> 'a Lwt.t) -> 'a Lwt.t
|
f:(Ed25519.Public_key_hash.t -> 'a -> 'a Lwt.t) -> 'a Lwt.t
|
||||||
|
|
||||||
|
(** List all registred delegates. *)
|
||||||
val list: Raw_context.t -> Ed25519.Public_key_hash.t list Lwt.t
|
val list: Raw_context.t -> Ed25519.Public_key_hash.t list Lwt.t
|
||||||
|
|
||||||
|
(** Various functions to 'freeze' tokens. A frozen 'bond' keeps its
|
||||||
|
associated rolls. When frozen, 'fees' may trigger new rolls
|
||||||
|
allocation. Rewards won't trigger new rolls allocation until
|
||||||
|
unfrozen. *)
|
||||||
|
val freeze_bond:
|
||||||
|
Raw_context.t -> Ed25519.Public_key_hash.t -> Tez_repr.t ->
|
||||||
|
Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
val freeze_fees:
|
||||||
|
Raw_context.t -> Ed25519.Public_key_hash.t -> Tez_repr.t ->
|
||||||
|
Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
val freeze_rewards:
|
||||||
|
Raw_context.t -> Ed25519.Public_key_hash.t -> Tez_repr.t ->
|
||||||
|
Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Trigger the context maintenance at the end of cycle 'n', i.e.:
|
||||||
|
unfroze bond/fees/rewards from 'n - preserved_cycle' ; punish the
|
||||||
|
provided unrevealed seeds (tipically seed from from cycle 'n -
|
||||||
|
1'). *)
|
||||||
|
val cycle_end:
|
||||||
|
Raw_context.t -> Cycle_repr.t -> Nonce_storage.unrevealed list ->
|
||||||
|
Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Burn all then frozen bond/fees/rewards for a delegate at a given
|
||||||
|
cycle. *)
|
||||||
|
val punish:
|
||||||
|
Raw_context.t -> Ed25519.Public_key_hash.t -> Cycle_repr.t ->
|
||||||
|
Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Has the given key some frozen tokens in its implicit contract? *)
|
||||||
|
val has_frozen_balance:
|
||||||
|
Raw_context.t -> Ed25519.Public_key_hash.t -> Cycle_repr.t ->
|
||||||
|
bool tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Returns the amount of frozen tokens associated to a given key. *)
|
||||||
|
val frozen_balance:
|
||||||
|
Raw_context.t -> Ed25519.Public_key_hash.t ->
|
||||||
|
Tez_repr.t tzresult Lwt.t
|
||||||
|
|
||||||
|
(** Returns the full 'balance' of the implicit contract associated to
|
||||||
|
a given key, i.e. the sum of the spendable balance and of the
|
||||||
|
frozen balance. *)
|
||||||
|
val full_balance:
|
||||||
|
Raw_context.t -> Ed25519.Public_key_hash.t ->
|
||||||
|
Tez_repr.t tzresult Lwt.t
|
||||||
|
@ -136,13 +136,12 @@ module I = struct
|
|||||||
let level = Alpha_context.Level.current ctxt in
|
let level = Alpha_context.Level.current ctxt in
|
||||||
Baking.baking_priorities ctxt level >>=? fun (Misc.LCons (baker_pk, _)) ->
|
Baking.baking_priorities ctxt level >>=? fun (Misc.LCons (baker_pk, _)) ->
|
||||||
let baker_pkh = Ed25519.Public_key.hash baker_pk in
|
let baker_pkh = Ed25519.Public_key.hash baker_pk in
|
||||||
let baker_contract = Contract.implicit_contract baker_pkh in
|
|
||||||
let block_prio = 0 in
|
let block_prio = 0 in
|
||||||
Apply.apply_operation
|
Apply.apply_operation
|
||||||
ctxt (Some baker_contract) pred_block block_prio operation
|
ctxt (Some baker_pkh) pred_block block_prio operation
|
||||||
>>=? function
|
>>=? function
|
||||||
| (_ctxt, _, Some script_err) -> Lwt.return (Error script_err)
|
| (_ctxt, _, Some script_err, _, _) -> Lwt.return (Error script_err)
|
||||||
| (_ctxt, contracts, None) -> Lwt.return (Ok contracts)
|
| (_ctxt, contracts, None,_ , _) -> Lwt.return (Ok contracts)
|
||||||
|
|
||||||
|
|
||||||
let run_parameters ctxt (script, storage, input, amount, contract, origination_nonce) =
|
let run_parameters ctxt (script, storage, input, amount, contract, origination_nonce) =
|
||||||
|
@ -12,7 +12,6 @@ let initialize ctxt =
|
|||||||
Roll_storage.init ctxt >>=? fun ctxt ->
|
Roll_storage.init ctxt >>=? fun ctxt ->
|
||||||
Seed_storage.init ctxt >>=? fun ctxt ->
|
Seed_storage.init ctxt >>=? fun ctxt ->
|
||||||
Contract_storage.init ctxt >>=? fun ctxt ->
|
Contract_storage.init ctxt >>=? fun ctxt ->
|
||||||
Reward_storage.init ctxt >>=? fun ctxt ->
|
|
||||||
Bootstrap_storage.init ctxt >>=? fun ctxt ->
|
Bootstrap_storage.init ctxt >>=? fun ctxt ->
|
||||||
Roll_storage.init_first_cycles ctxt >>=? fun ctxt ->
|
Roll_storage.init_first_cycles ctxt >>=? fun ctxt ->
|
||||||
Vote_storage.init ctxt >>=? fun ctxt ->
|
Vote_storage.init ctxt >>=? fun ctxt ->
|
||||||
|
@ -41,7 +41,11 @@ type validation_mode =
|
|||||||
type validation_state =
|
type validation_state =
|
||||||
{ mode : validation_mode ;
|
{ mode : validation_mode ;
|
||||||
ctxt : Alpha_context.t ;
|
ctxt : Alpha_context.t ;
|
||||||
op_count : int }
|
op_count : int ;
|
||||||
|
bond : Alpha_context.Tez.t ;
|
||||||
|
fees : Alpha_context.Tez.t ;
|
||||||
|
rewards : Alpha_context.Tez.t ;
|
||||||
|
}
|
||||||
|
|
||||||
let current_context { ctxt ; _ } =
|
let current_context { ctxt ; _ } =
|
||||||
return (Alpha_context.finalize ctxt).context
|
return (Alpha_context.finalize ctxt).context
|
||||||
@ -65,9 +69,11 @@ let begin_application
|
|||||||
let timestamp = block_header.shell.timestamp in
|
let timestamp = block_header.shell.timestamp in
|
||||||
Alpha_context.init ~level ~timestamp ~fitness ctxt >>=? fun ctxt ->
|
Alpha_context.init ~level ~timestamp ~fitness ctxt >>=? fun ctxt ->
|
||||||
Apply.begin_application
|
Apply.begin_application
|
||||||
ctxt block_header pred_timestamp >>=? fun (ctxt, baker) ->
|
ctxt block_header pred_timestamp >>=? fun (ctxt, baker, bond) ->
|
||||||
let mode = Application { block_header ; baker = Ed25519.Public_key.hash baker } in
|
let mode = Application { block_header ; baker = Ed25519.Public_key.hash baker } in
|
||||||
return { mode ; ctxt ; op_count = 0 }
|
return { mode ; ctxt ; op_count = 0 ; bond ;
|
||||||
|
fees = Alpha_context.Tez.zero ;
|
||||||
|
rewards = Alpha_context.Tez.zero }
|
||||||
|
|
||||||
let begin_construction
|
let begin_construction
|
||||||
~predecessor_context:ctxt
|
~predecessor_context:ctxt
|
||||||
@ -86,20 +92,22 @@ let begin_construction
|
|||||||
| None ->
|
| None ->
|
||||||
Apply.begin_partial_construction ctxt >>=? fun ctxt ->
|
Apply.begin_partial_construction ctxt >>=? fun ctxt ->
|
||||||
let mode = Partial_construction { predecessor } in
|
let mode = Partial_construction { predecessor } in
|
||||||
return (mode, ctxt)
|
return (mode, ctxt, Alpha_context.Tez.zero)
|
||||||
| Some proto_header ->
|
| Some proto_header ->
|
||||||
Apply.begin_full_construction
|
Apply.begin_full_construction
|
||||||
ctxt pred_timestamp
|
ctxt pred_timestamp
|
||||||
proto_header >>=? fun (ctxt, protocol_data, baker) ->
|
proto_header >>=? fun (ctxt, protocol_data, baker, bond) ->
|
||||||
let mode =
|
let mode =
|
||||||
let baker = Ed25519.Public_key.hash baker in
|
let baker = Ed25519.Public_key.hash baker in
|
||||||
Full_construction { predecessor ; baker ; protocol_data } in
|
Full_construction { predecessor ; baker ; protocol_data } in
|
||||||
return (mode, ctxt)
|
return (mode, ctxt, bond)
|
||||||
end >>=? fun (mode, ctxt) ->
|
end >>=? fun (mode, ctxt, bond) ->
|
||||||
return { mode ; ctxt ; op_count = 0 }
|
return { mode ; ctxt ; op_count = 0 ; bond ;
|
||||||
|
fees = Alpha_context.Tez.zero ;
|
||||||
|
rewards = Alpha_context.Tez.zero }
|
||||||
|
|
||||||
let apply_operation ({ mode ; ctxt ; op_count } as data) operation =
|
let apply_operation ({ mode ; ctxt ; op_count ; _ } as data) operation =
|
||||||
let pred_block, block_prio, baker_contract =
|
let pred_block, block_prio, baker =
|
||||||
match mode with
|
match mode with
|
||||||
| Partial_construction { predecessor } ->
|
| Partial_construction { predecessor } ->
|
||||||
predecessor, 0, None
|
predecessor, 0, None
|
||||||
@ -109,21 +117,24 @@ let apply_operation ({ mode ; ctxt ; op_count } as data) operation =
|
|||||||
| Full_construction { predecessor ; protocol_data ; baker } ->
|
| Full_construction { predecessor ; protocol_data ; baker } ->
|
||||||
predecessor,
|
predecessor,
|
||||||
protocol_data.priority,
|
protocol_data.priority,
|
||||||
Some (Alpha_context.Contract.implicit_contract baker) in
|
Some baker in
|
||||||
Apply.apply_operation
|
Apply.apply_operation ctxt baker pred_block block_prio operation
|
||||||
ctxt baker_contract pred_block block_prio operation
|
>>=? fun (ctxt, _contracts, _ignored_script_error, fees, rewards) ->
|
||||||
>>=? fun (ctxt, _contracts, _ignored_script_error) ->
|
|
||||||
let op_count = op_count + 1 in
|
let op_count = op_count + 1 in
|
||||||
return { data with ctxt ; op_count }
|
Lwt.return Alpha_context.Tez.(fees >>? (+?) data.fees) >>=? fun fees ->
|
||||||
|
Lwt.return Alpha_context.Tez.(rewards >>? (+?) data.rewards) >>=? fun rewards ->
|
||||||
|
return { data with ctxt ; op_count ; fees ; rewards }
|
||||||
|
|
||||||
let finalize_block { mode ; ctxt ; op_count } = match mode with
|
let finalize_block { mode ; ctxt ; op_count ; bond ; fees ; rewards } =
|
||||||
|
match mode with
|
||||||
| Partial_construction _ ->
|
| Partial_construction _ ->
|
||||||
let ctxt = Alpha_context.finalize ctxt in
|
let ctxt = Alpha_context.finalize ctxt in
|
||||||
return ctxt
|
return ctxt
|
||||||
| Application
|
| Application
|
||||||
{ baker ; block_header = { protocol_data ; _ } }
|
{ baker ; block_header = { protocol_data ; _ } }
|
||||||
| Full_construction { protocol_data ; baker ; _ } ->
|
| Full_construction { protocol_data ; baker ; _ } ->
|
||||||
Apply.finalize_application ctxt protocol_data baker >>=? fun ctxt ->
|
Apply.finalize_application
|
||||||
|
ctxt protocol_data baker bond fees rewards >>=? fun ctxt ->
|
||||||
let { level ; _ } : Alpha_context.Level.t =
|
let { level ; _ } : Alpha_context.Level.t =
|
||||||
Alpha_context. Level.current ctxt in
|
Alpha_context. Level.current ctxt in
|
||||||
let priority = protocol_data.priority in
|
let priority = protocol_data.priority in
|
||||||
|
@ -26,7 +26,11 @@ type validation_mode =
|
|||||||
type validation_state =
|
type validation_state =
|
||||||
{ mode : validation_mode ;
|
{ mode : validation_mode ;
|
||||||
ctxt : Alpha_context.t ;
|
ctxt : Alpha_context.t ;
|
||||||
op_count : int }
|
op_count : int ;
|
||||||
|
bond : Alpha_context.Tez.t ;
|
||||||
|
fees : Alpha_context.Tez.t ;
|
||||||
|
rewards : Alpha_context.Tez.t ;
|
||||||
|
}
|
||||||
|
|
||||||
include Updater.PROTOCOL with type operation = Alpha_context.Operation.t
|
include Updater.PROTOCOL with type operation = Alpha_context.Operation.t
|
||||||
and type validation_state := validation_state
|
and type validation_state := validation_state
|
||||||
|
@ -30,35 +30,32 @@ let get_unrevealed c level =
|
|||||||
Raw_level_repr.(level.level < cur_level.level)
|
Raw_level_repr.(level.level < cur_level.level)
|
||||||
Too_early_revelation >>=? fun () ->
|
Too_early_revelation >>=? fun () ->
|
||||||
Storage.Seed.Nonce.get c level >>=? function
|
Storage.Seed.Nonce.get c level >>=? function
|
||||||
| Revealed _ ->
|
| Revealed _ -> fail Previously_revealed_nonce
|
||||||
fail Previously_revealed_nonce
|
| Unrevealed status -> return status
|
||||||
| Unrevealed { nonce_hash; delegate_to_reward ; reward_amount } ->
|
|
||||||
return (nonce_hash, delegate_to_reward, reward_amount)
|
|
||||||
|
|
||||||
(* let get_unrevealed_hash c level = *)
|
let record_hash c unrevealed =
|
||||||
(* get_unrevealed c level >>=? fun (nonce_hash, _) -> *)
|
|
||||||
(* return nonce_hash *)
|
|
||||||
|
|
||||||
let record_hash c delegate_to_reward reward_amount nonce_hash =
|
|
||||||
let level = Level_storage.current c in
|
let level = Level_storage.current c in
|
||||||
Storage.Seed.Nonce.init c level
|
Storage.Seed.Nonce.init c level (Unrevealed unrevealed)
|
||||||
(Unrevealed { nonce_hash; delegate_to_reward ; reward_amount })
|
|
||||||
|
|
||||||
let reveal c level nonce =
|
let reveal c level nonce =
|
||||||
get_unrevealed c level >>=? fun (nonce_hash, delegate_to_reward, reward_amount) ->
|
get_unrevealed c level >>=? fun unrevealed ->
|
||||||
fail_unless
|
fail_unless
|
||||||
(Seed_repr.check_hash nonce nonce_hash)
|
(Seed_repr.check_hash nonce unrevealed.nonce_hash)
|
||||||
Unexpected_nonce >>=? fun () ->
|
Unexpected_nonce >>=? fun () ->
|
||||||
Storage.Seed.Nonce.set c level (Revealed nonce) >>=? fun c ->
|
Storage.Seed.Nonce.set c level (Revealed nonce) >>=? fun c ->
|
||||||
return (c, delegate_to_reward, reward_amount)
|
return c
|
||||||
|
|
||||||
|
type unrevealed = Storage.Seed.unrevealed_nonce = {
|
||||||
|
nonce_hash: Nonce_hash.t ;
|
||||||
|
delegate: Ed25519.Public_key_hash.t ;
|
||||||
|
bond: Tez_repr.t ;
|
||||||
|
rewards: Tez_repr.t ;
|
||||||
|
fees: Tez_repr.t ;
|
||||||
|
}
|
||||||
|
|
||||||
type status = Storage.Seed.nonce_status =
|
type status = Storage.Seed.nonce_status =
|
||||||
| Unrevealed of {
|
| Unrevealed of unrevealed
|
||||||
nonce_hash: Nonce_hash.t ;
|
| Revealed of Seed_repr.nonce
|
||||||
delegate_to_reward: Ed25519.Public_key_hash.t ;
|
|
||||||
reward_amount: Tez_repr.t ;
|
|
||||||
}
|
|
||||||
| Revealed of nonce
|
|
||||||
|
|
||||||
let get c level = Storage.Seed.Nonce.get c level
|
let get c level = Storage.Seed.Nonce.get c level
|
||||||
|
|
||||||
|
@ -17,25 +17,26 @@ type t = Seed_repr.nonce
|
|||||||
type nonce = t
|
type nonce = t
|
||||||
val encoding: nonce Data_encoding.t
|
val encoding: nonce Data_encoding.t
|
||||||
|
|
||||||
val record_hash:
|
type unrevealed = Storage.Seed.unrevealed_nonce = {
|
||||||
Raw_context.t ->
|
nonce_hash: Nonce_hash.t ;
|
||||||
Ed25519.Public_key_hash.t -> Tez_repr.t ->
|
delegate: Ed25519.Public_key_hash.t ;
|
||||||
Nonce_hash.t -> Raw_context.t tzresult Lwt.t
|
bond: Tez_repr.t ;
|
||||||
|
rewards: Tez_repr.t ;
|
||||||
val reveal:
|
fees: Tez_repr.t ;
|
||||||
Raw_context.t -> Level_repr.t -> nonce ->
|
}
|
||||||
(Raw_context.t * Ed25519.Public_key_hash.t * Tez_repr.t) tzresult Lwt.t
|
|
||||||
|
|
||||||
type status =
|
type status =
|
||||||
| Unrevealed of {
|
| Unrevealed of unrevealed
|
||||||
nonce_hash: Nonce_hash.t ;
|
| Revealed of Seed_repr.nonce
|
||||||
delegate_to_reward: Ed25519.Public_key_hash.t ;
|
|
||||||
reward_amount: Tez_repr.t ;
|
|
||||||
}
|
|
||||||
| Revealed of nonce
|
|
||||||
|
|
||||||
val get: Raw_context.t -> Level_repr.t -> status tzresult Lwt.t
|
val get: Raw_context.t -> Level_repr.t -> status tzresult Lwt.t
|
||||||
|
|
||||||
|
val record_hash:
|
||||||
|
Raw_context.t -> unrevealed -> Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
|
val reveal:
|
||||||
|
Raw_context.t -> Level_repr.t -> nonce -> Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
val of_bytes: MBytes.t -> nonce tzresult
|
val of_bytes: MBytes.t -> nonce tzresult
|
||||||
val hash: nonce -> Nonce_hash.t
|
val hash: nonce -> Nonce_hash.t
|
||||||
val check_hash: nonce -> Nonce_hash.t -> bool
|
val check_hash: nonce -> Nonce_hash.t -> bool
|
||||||
|
@ -1,75 +0,0 @@
|
|||||||
(**************************************************************************)
|
|
||||||
(* *)
|
|
||||||
(* Copyright (c) 2014 - 2018. *)
|
|
||||||
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
|
||||||
(* *)
|
|
||||||
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
|
||||||
(* *)
|
|
||||||
(**************************************************************************)
|
|
||||||
|
|
||||||
type error +=
|
|
||||||
| Too_late_reward_recording
|
|
||||||
| Too_late_reward_discarding
|
|
||||||
| Incorrect_discard
|
|
||||||
|
|
||||||
let record c delegate cycle amount =
|
|
||||||
Storage.Rewards.Next.get c >>=? fun min_cycle ->
|
|
||||||
fail_unless Cycle_repr.(min_cycle <= cycle)
|
|
||||||
Too_late_reward_recording >>=? fun () ->
|
|
||||||
Storage.Rewards.Amount.get_option (c, cycle) delegate >>=? function
|
|
||||||
| None ->
|
|
||||||
Storage.Rewards.Amount.init (c, cycle) delegate amount
|
|
||||||
| Some previous_amount ->
|
|
||||||
Lwt.return Tez_repr.(previous_amount +? amount) >>=? fun amount ->
|
|
||||||
Storage.Rewards.Amount.set (c, cycle) delegate amount
|
|
||||||
|
|
||||||
let discard c delegate cycle amount =
|
|
||||||
Storage.Rewards.Next.get c >>=? fun min_cycle ->
|
|
||||||
fail_unless Cycle_repr.(min_cycle <= cycle)
|
|
||||||
Too_late_reward_discarding >>=? fun () ->
|
|
||||||
Storage.Rewards.Amount.get_option (c, cycle) delegate >>=? function
|
|
||||||
| None ->
|
|
||||||
fail Incorrect_discard
|
|
||||||
| Some previous_amount ->
|
|
||||||
match Tez_repr.(previous_amount -? amount) with
|
|
||||||
| Ok amount ->
|
|
||||||
if Tez_repr.(amount = zero) then
|
|
||||||
Storage.Rewards.Amount.remove (c, cycle) delegate >>= fun ctxt ->
|
|
||||||
return ctxt
|
|
||||||
else
|
|
||||||
Storage.Rewards.Amount.set (c, cycle) delegate amount
|
|
||||||
| Error _ ->
|
|
||||||
fail Incorrect_discard
|
|
||||||
|
|
||||||
let pay_rewards_for_cycle c cycle =
|
|
||||||
Storage.Rewards.Amount.fold (c, cycle) ~init:(Ok c)
|
|
||||||
~f:(fun delegate amount c ->
|
|
||||||
match c with
|
|
||||||
| Error _ -> Lwt.return c
|
|
||||||
| Ok c ->
|
|
||||||
Contract_storage.credit c
|
|
||||||
(Contract_repr.implicit_contract delegate)
|
|
||||||
amount) >>=? fun c ->
|
|
||||||
Storage.Rewards.Amount.clear (c, cycle) >>= fun c ->
|
|
||||||
return c
|
|
||||||
|
|
||||||
let pay_due_rewards c =
|
|
||||||
let timestamp = Raw_context.current_timestamp c in
|
|
||||||
let rec loop c cycle =
|
|
||||||
Storage.Rewards.Date.get_option c cycle >>=? function
|
|
||||||
| None ->
|
|
||||||
Storage.Rewards.Next.set c cycle
|
|
||||||
| Some reward_time ->
|
|
||||||
if Time_repr.(reward_time > timestamp)
|
|
||||||
then
|
|
||||||
Storage.Rewards.Next.set c cycle
|
|
||||||
else
|
|
||||||
pay_rewards_for_cycle c cycle >>=? fun c ->
|
|
||||||
loop c (Cycle_repr.succ cycle) in
|
|
||||||
Storage.Rewards.Next.get c >>=? fun cycle ->
|
|
||||||
loop c cycle
|
|
||||||
|
|
||||||
let set_reward_time_for_cycle = Storage.Rewards.Date.init
|
|
||||||
|
|
||||||
let init c =
|
|
||||||
Storage.Rewards.Next.init c Cycle_repr.root
|
|
@ -1,21 +0,0 @@
|
|||||||
(**************************************************************************)
|
|
||||||
(* *)
|
|
||||||
(* Copyright (c) 2014 - 2018. *)
|
|
||||||
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
|
||||||
(* *)
|
|
||||||
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
|
||||||
(* *)
|
|
||||||
(**************************************************************************)
|
|
||||||
|
|
||||||
val record:
|
|
||||||
Raw_context.t -> Ed25519.Public_key_hash.t -> Cycle_repr.t -> Tez_repr.t -> Raw_context.t tzresult Lwt.t
|
|
||||||
|
|
||||||
val discard:
|
|
||||||
Raw_context.t -> Ed25519.Public_key_hash.t -> Cycle_repr.t -> Tez_repr.t -> Raw_context.t tzresult Lwt.t
|
|
||||||
|
|
||||||
val pay_due_rewards: Raw_context.t -> Raw_context.t tzresult Lwt.t
|
|
||||||
|
|
||||||
val set_reward_time_for_cycle:
|
|
||||||
Raw_context.t -> Cycle_repr.t -> Time.t -> Raw_context.t tzresult Lwt.t
|
|
||||||
|
|
||||||
val init: Raw_context.t -> Raw_context.t tzresult Lwt.t
|
|
@ -47,19 +47,19 @@ let compute_for_cycle c ~revealed cycle =
|
|||||||
| None -> assert false (* should not happen *)
|
| None -> assert false (* should not happen *)
|
||||||
| Some previous_cycle ->
|
| Some previous_cycle ->
|
||||||
let levels = Level_storage.levels_with_commitments_in_cycle c revealed in
|
let levels = Level_storage.levels_with_commitments_in_cycle c revealed in
|
||||||
let combine (c, random_seed) level =
|
let combine (c, random_seed, unrevealed) level =
|
||||||
Storage.Seed.Nonce.get c level >>=? function
|
Storage.Seed.Nonce.get c level >>=? function
|
||||||
| Revealed nonce ->
|
| Revealed nonce ->
|
||||||
Storage.Seed.Nonce.delete c level >>=? fun c ->
|
Storage.Seed.Nonce.delete c level >>=? fun c ->
|
||||||
return (c, Seed_repr.nonce random_seed nonce)
|
return (c, Seed_repr.nonce random_seed nonce, unrevealed)
|
||||||
| Unrevealed _ ->
|
| Unrevealed u ->
|
||||||
Storage.Seed.Nonce.delete c level >>=? fun c ->
|
Storage.Seed.Nonce.delete c level >>=? fun c ->
|
||||||
return (c, random_seed)
|
return (c, random_seed, u :: unrevealed)
|
||||||
in
|
in
|
||||||
Storage.Seed.For_cycle.get c previous_cycle >>=? fun seed ->
|
Storage.Seed.For_cycle.get c previous_cycle >>=? fun seed ->
|
||||||
fold_left_s combine (c, seed) levels >>=? fun (c, seed) ->
|
fold_left_s combine (c, seed, []) levels >>=? fun (c, seed, unrevealed) ->
|
||||||
Storage.Seed.For_cycle.init c cycle seed >>=? fun c ->
|
Storage.Seed.For_cycle.init c cycle seed >>=? fun c ->
|
||||||
return c
|
return (c, unrevealed)
|
||||||
|
|
||||||
let for_cycle ctxt cycle =
|
let for_cycle ctxt cycle =
|
||||||
let preserved = Constants_storage.preserved_cycles ctxt in
|
let preserved = Constants_storage.preserved_cycles ctxt in
|
||||||
@ -97,7 +97,7 @@ let cycle_end ctxt last_cycle =
|
|||||||
clear_cycle ctxt cleared_cycle
|
clear_cycle ctxt cleared_cycle
|
||||||
end >>=? fun ctxt ->
|
end >>=? fun ctxt ->
|
||||||
match Cycle_repr.pred last_cycle with
|
match Cycle_repr.pred last_cycle with
|
||||||
| None -> return ctxt
|
| None -> return (ctxt, [])
|
||||||
| Some revealed ->
|
| Some revealed ->
|
||||||
let inited_seed_cycle = Cycle_repr.add last_cycle (preserved+1) in
|
let inited_seed_cycle = Cycle_repr.add last_cycle (preserved+1) in
|
||||||
compute_for_cycle ctxt ~revealed inited_seed_cycle
|
compute_for_cycle ctxt ~revealed inited_seed_cycle
|
||||||
|
@ -19,4 +19,5 @@ val for_cycle:
|
|||||||
Raw_context.t -> Cycle_repr.t -> Seed_repr.seed tzresult Lwt.t
|
Raw_context.t -> Cycle_repr.t -> Seed_repr.seed tzresult Lwt.t
|
||||||
|
|
||||||
val cycle_end:
|
val cycle_end:
|
||||||
Raw_context.t -> Cycle_repr.t -> Raw_context.t tzresult Lwt.t
|
Raw_context.t -> Cycle_repr.t ->
|
||||||
|
(Raw_context.t * Nonce_storage.unrevealed list) tzresult Lwt.t
|
||||||
|
@ -49,6 +49,28 @@ module Contract = struct
|
|||||||
(struct let name = ["balance"] end)
|
(struct let name = ["balance"] end)
|
||||||
(Make_value(Tez_repr))
|
(Make_value(Tez_repr))
|
||||||
|
|
||||||
|
module Frozen_balance_index =
|
||||||
|
Make_indexed_subcontext
|
||||||
|
(Make_subcontext
|
||||||
|
(Indexed_context.Raw_context)
|
||||||
|
(struct let name = ["frozen_balance"] end))
|
||||||
|
(Cycle_repr.Index)
|
||||||
|
|
||||||
|
module Frozen_bonds =
|
||||||
|
Frozen_balance_index.Make_map
|
||||||
|
(struct let name = ["bonds"] end)
|
||||||
|
(Make_value(Tez_repr))
|
||||||
|
|
||||||
|
module Frozen_fees =
|
||||||
|
Frozen_balance_index.Make_map
|
||||||
|
(struct let name = ["fees"] end)
|
||||||
|
(Make_value(Tez_repr))
|
||||||
|
|
||||||
|
module Frozen_rewards =
|
||||||
|
Frozen_balance_index.Make_map
|
||||||
|
(struct let name = ["rewards"] end)
|
||||||
|
(Make_value(Tez_repr))
|
||||||
|
|
||||||
module Manager =
|
module Manager =
|
||||||
Indexed_context.Make_map
|
Indexed_context.Make_map
|
||||||
(struct let name = ["manager"] end)
|
(struct let name = ["manager"] end)
|
||||||
@ -129,7 +151,7 @@ module Contract = struct
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Delegate =
|
module Delegates =
|
||||||
Make_data_set_storage
|
Make_data_set_storage
|
||||||
(Make_subcontext(Raw_context)(struct let name = ["delegates"] end))
|
(Make_subcontext(Raw_context)(struct let name = ["delegates"] end))
|
||||||
(Ed25519.Public_key_hash)
|
(Ed25519.Public_key_hash)
|
||||||
@ -148,28 +170,34 @@ module Cycle = struct
|
|||||||
(struct let name = ["last_roll"] end)
|
(struct let name = ["last_roll"] end)
|
||||||
(Make_value(Roll_repr))
|
(Make_value(Roll_repr))
|
||||||
|
|
||||||
|
type unrevealed_nonce = {
|
||||||
|
nonce_hash: Nonce_hash.t ;
|
||||||
|
delegate: Ed25519.Public_key_hash.t ;
|
||||||
|
bond: Tez_repr.t ;
|
||||||
|
rewards: Tez_repr.t ;
|
||||||
|
fees: Tez_repr.t ;
|
||||||
|
}
|
||||||
|
|
||||||
type nonce_status =
|
type nonce_status =
|
||||||
| Unrevealed of {
|
| Unrevealed of unrevealed_nonce
|
||||||
nonce_hash: Nonce_hash.t ;
|
|
||||||
delegate_to_reward: Ed25519.Public_key_hash.t ;
|
|
||||||
reward_amount: Tez_repr.t ;
|
|
||||||
}
|
|
||||||
| Revealed of Seed_repr.nonce
|
| Revealed of Seed_repr.nonce
|
||||||
|
|
||||||
let nonce_status_encoding =
|
let nonce_status_encoding =
|
||||||
let open Data_encoding in
|
let open Data_encoding in
|
||||||
union [
|
union [
|
||||||
case (Tag 0)
|
case (Tag 0)
|
||||||
(tup3
|
(tup5
|
||||||
Nonce_hash.encoding
|
Nonce_hash.encoding
|
||||||
Ed25519.Public_key_hash.encoding
|
Ed25519.Public_key_hash.encoding
|
||||||
|
Tez_repr.encoding
|
||||||
|
Tez_repr.encoding
|
||||||
Tez_repr.encoding)
|
Tez_repr.encoding)
|
||||||
(function
|
(function
|
||||||
| Unrevealed { nonce_hash ; delegate_to_reward ; reward_amount } ->
|
| Unrevealed { nonce_hash ; delegate ; bond ; rewards ; fees } ->
|
||||||
Some (nonce_hash, delegate_to_reward, reward_amount)
|
Some (nonce_hash, delegate, bond, rewards, fees)
|
||||||
| _ -> None)
|
| _ -> None)
|
||||||
(fun (nonce_hash, delegate_to_reward, reward_amount) ->
|
(fun (nonce_hash, delegate, bond, rewards, fees) ->
|
||||||
Unrevealed { nonce_hash ; delegate_to_reward ; reward_amount }) ;
|
Unrevealed { nonce_hash ; delegate ; bond ; rewards ; fees }) ;
|
||||||
case (Tag 1)
|
case (Tag 1)
|
||||||
Seed_repr.nonce_encoding
|
Seed_repr.nonce_encoding
|
||||||
(function
|
(function
|
||||||
@ -197,19 +225,6 @@ module Cycle = struct
|
|||||||
let encoding = Seed_repr.seed_encoding
|
let encoding = Seed_repr.seed_encoding
|
||||||
end))
|
end))
|
||||||
|
|
||||||
module Reward_date =
|
|
||||||
Indexed_context.Make_map
|
|
||||||
(struct let name = [ "reward_date" ] end)
|
|
||||||
(Make_value(Time_repr))
|
|
||||||
|
|
||||||
module Reward_amount =
|
|
||||||
Make_indexed_data_storage
|
|
||||||
(Make_subcontext
|
|
||||||
(Indexed_context.Raw_context)
|
|
||||||
(struct let name = [ "rewards" ] end))
|
|
||||||
(Ed25519.Public_key_hash)
|
|
||||||
(Make_value(Tez_repr))
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Roll = struct
|
module Roll = struct
|
||||||
@ -326,12 +341,16 @@ end
|
|||||||
|
|
||||||
module Seed = struct
|
module Seed = struct
|
||||||
|
|
||||||
|
type unrevealed_nonce = Cycle.unrevealed_nonce = {
|
||||||
|
nonce_hash: Nonce_hash.t ;
|
||||||
|
delegate: Ed25519.Public_key_hash.t ;
|
||||||
|
bond: Tez_repr.t ;
|
||||||
|
rewards: Tez_repr.t ;
|
||||||
|
fees: Tez_repr.t ;
|
||||||
|
}
|
||||||
|
|
||||||
type nonce_status = Cycle.nonce_status =
|
type nonce_status = Cycle.nonce_status =
|
||||||
| Unrevealed of {
|
| Unrevealed of unrevealed_nonce
|
||||||
nonce_hash: Nonce_hash.t ;
|
|
||||||
delegate_to_reward: Ed25519.Public_key_hash.t ;
|
|
||||||
reward_amount: Tez_repr.t ;
|
|
||||||
}
|
|
||||||
| Revealed of Seed_repr.nonce
|
| Revealed of Seed_repr.nonce
|
||||||
|
|
||||||
module Nonce = struct
|
module Nonce = struct
|
||||||
@ -351,21 +370,6 @@ module Seed = struct
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
(** Rewards *)
|
|
||||||
|
|
||||||
module Rewards = struct
|
|
||||||
|
|
||||||
module Next =
|
|
||||||
Make_single_data_storage
|
|
||||||
(Raw_context)
|
|
||||||
(struct let name = ["next_cycle_to_be_rewarded"] end)
|
|
||||||
(Make_value(Cycle_repr))
|
|
||||||
|
|
||||||
module Date = Cycle.Reward_date
|
|
||||||
module Amount = Cycle.Reward_amount
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
(** Resolver *)
|
(** Resolver *)
|
||||||
|
|
||||||
let () =
|
let () =
|
||||||
|
@ -64,8 +64,7 @@ module Roll : sig
|
|||||||
and type value = Tez_repr.t
|
and type value = Tez_repr.t
|
||||||
and type t := Raw_context.t
|
and type t := Raw_context.t
|
||||||
|
|
||||||
(** Frozen rolls per cycle *)
|
(** Last roll in the snapshoted roll allocation of a given cycle. *)
|
||||||
|
|
||||||
module Last_for_cycle : Indexed_data_storage
|
module Last_for_cycle : Indexed_data_storage
|
||||||
with type key = Cycle_repr.t
|
with type key = Cycle_repr.t
|
||||||
and type value = Roll_repr.t
|
and type value = Roll_repr.t
|
||||||
@ -96,6 +95,22 @@ module Contract : sig
|
|||||||
and type value = Tez_repr.t
|
and type value = Tez_repr.t
|
||||||
and type t := Raw_context.t
|
and type t := Raw_context.t
|
||||||
|
|
||||||
|
(** Frozen balance, see 'delegate_storage.mli' for more explanation *)
|
||||||
|
module Frozen_bonds : Indexed_data_storage
|
||||||
|
with type key = Cycle_repr.t
|
||||||
|
and type value = Tez_repr.t
|
||||||
|
and type t = Raw_context.t * Contract_repr.t
|
||||||
|
|
||||||
|
module Frozen_fees : Indexed_data_storage
|
||||||
|
with type key = Cycle_repr.t
|
||||||
|
and type value = Tez_repr.t
|
||||||
|
and type t = Raw_context.t * Contract_repr.t
|
||||||
|
|
||||||
|
module Frozen_rewards : Indexed_data_storage
|
||||||
|
with type key = Cycle_repr.t
|
||||||
|
and type value = Tez_repr.t
|
||||||
|
and type t = Raw_context.t * Contract_repr.t
|
||||||
|
|
||||||
(** The manager of a contract *)
|
(** The manager of a contract *)
|
||||||
module Manager : Indexed_data_storage
|
module Manager : Indexed_data_storage
|
||||||
with type key = Contract_repr.t
|
with type key = Contract_repr.t
|
||||||
@ -154,7 +169,8 @@ module Contract : sig
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Delegate : Data_set_storage
|
(** Set of all registred delegates. *)
|
||||||
|
module Delegates : Data_set_storage
|
||||||
with type t := Raw_context.t
|
with type t := Raw_context.t
|
||||||
and type elt = Ed25519.Public_key_hash.t
|
and type elt = Ed25519.Public_key_hash.t
|
||||||
|
|
||||||
@ -201,12 +217,16 @@ module Seed : sig
|
|||||||
(** Storage from this submodule must only be accessed through the
|
(** Storage from this submodule must only be accessed through the
|
||||||
module `Seed`. *)
|
module `Seed`. *)
|
||||||
|
|
||||||
|
type unrevealed_nonce = {
|
||||||
|
nonce_hash: Nonce_hash.t ;
|
||||||
|
delegate: Ed25519.Public_key_hash.t ;
|
||||||
|
bond: Tez_repr.t ;
|
||||||
|
rewards: Tez_repr.t ;
|
||||||
|
fees: Tez_repr.t ;
|
||||||
|
}
|
||||||
|
|
||||||
type nonce_status =
|
type nonce_status =
|
||||||
| Unrevealed of {
|
| Unrevealed of unrevealed_nonce
|
||||||
nonce_hash: Nonce_hash.t ;
|
|
||||||
delegate_to_reward: Ed25519.Public_key_hash.t ;
|
|
||||||
reward_amount: Tez_repr.t ;
|
|
||||||
}
|
|
||||||
| Revealed of Seed_repr.nonce
|
| Revealed of Seed_repr.nonce
|
||||||
|
|
||||||
module Nonce : Non_iterable_indexed_data_storage
|
module Nonce : Non_iterable_indexed_data_storage
|
||||||
@ -221,23 +241,3 @@ module Seed : sig
|
|||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
(** Rewards *)
|
|
||||||
|
|
||||||
module Rewards : sig
|
|
||||||
|
|
||||||
module Next : Single_data_storage
|
|
||||||
with type value = Cycle_repr.t
|
|
||||||
and type t := Raw_context.t
|
|
||||||
|
|
||||||
module Date : Indexed_data_storage
|
|
||||||
with type key = Cycle_repr.t
|
|
||||||
and type value = Time.t
|
|
||||||
and type t := Raw_context.t
|
|
||||||
|
|
||||||
module Amount : Indexed_data_storage
|
|
||||||
with type key = Ed25519.Public_key_hash.t
|
|
||||||
and type value = Tez_repr.t
|
|
||||||
and type t = Raw_context.t * Cycle_repr.t
|
|
||||||
|
|
||||||
end
|
|
||||||
|
@ -15,10 +15,11 @@ let operation
|
|||||||
return @@ Helpers_operation.apply_of_proto src op_sh proto_op >>=? fun operation ->
|
return @@ Helpers_operation.apply_of_proto src op_sh proto_op >>=? fun operation ->
|
||||||
Proto_alpha.Apply.apply_operation
|
Proto_alpha.Apply.apply_operation
|
||||||
tc
|
tc
|
||||||
(Option.map ~f:(fun x -> x.Helpers_account.contract) baker)
|
(Option.map ~f:(fun x -> x.Helpers_account.hpub) baker)
|
||||||
pred_block_hash
|
pred_block_hash
|
||||||
0
|
0
|
||||||
operation >>=? fun (tc, contracts, err) -> return ((contracts, err), tc)
|
operation >>=? fun (tc, contracts, err, _fees, _rewards) ->
|
||||||
|
return ((contracts, err), tc)
|
||||||
|
|
||||||
|
|
||||||
let transaction ~tc ?(fee = 0) ?baker
|
let transaction ~tc ?(fee = 0) ?baker
|
||||||
|
Loading…
Reference in New Issue
Block a user