ligo/src/proto_alpha/lib_protocol/test/helpers/helpers_operation.ml
2018-02-06 17:04:49 +01:00

139 lines
3.9 KiB
OCaml

(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
open Proto_alpha
open Error_monad
open Tezos_context
let sourced ops = Sourced_operations ops
let manager (src : Helpers_account.t) ?(fee = Tez.zero) operations context =
Tezos_context.init ~level:0l ~timestamp:(Time.now ()) ~fitness:[] context >>=? fun context ->
Contract.get_counter context src.contract >>=? fun counter ->
let counter = Int32.succ counter in
return @@
Manager_operations {
source = src.contract ;
public_key = Some src.pub ;
fee ;
counter ;
operations
}
let manager_full src ?(fee = Tez.zero) ops context =
manager src ~fee ops context >>=? fun ops -> return @@ sourced ops
let transaction ?parameters amount destination =
Transaction {
amount ;
parameters ;
destination
}
let origination
?(delegatable = true) ?(script = None)
?(spendable = true) ?(delegate = None)
(manager: Helpers_account.t) credit
=
Origination {
manager = manager.hpub ;
delegate ;
spendable ;
delegatable ;
script ;
credit
}
let delegation delegate =
Delegation (Some delegate)
let delegation_full ?(fee = Tez.zero) src delegate context =
manager_full src ~fee [delegation delegate] context
let script_origination_full script src credit context =
manager_full src ~fee: Tez.zero [origination ~script src credit] context
let origination_full ?(spendable = true) ?(delegatable = true) ?(fee = Tez.zero) src credit context =
manager_full src ~fee [origination ~spendable ~delegatable src credit] context
let transaction_full ?(fee = Tez.zero) ?parameters src dst amount context =
manager src ~fee [transaction ?parameters amount dst] context
>>=? fun manager_op ->
return @@ sourced manager_op
let delegate (src: Helpers_account.t) operations =
Delegate_operations {
source = src.pub ;
operations
}
let endorsement ?(slot = 0) block =
Endorsement {
block ;
slot
}
let endorsement_full ?(slot = 0) src block =
sourced
@@ delegate
src
[endorsement block ~slot]
let sign src oph protop =
let signature_content = Operation.forge oph protop in
let signature = match src with
| None -> None
| Some(src: Helpers_account.t) -> Some (Ed25519.sign src.ppk signature_content) in
let open Data_encoding in
let signed_proto_operation_encoding =
Data_encoding.merge_objs
Operation.proto_operation_encoding
(obj1 @@ varopt "signature" Ed25519.Signature.encoding) in
let proto_bytes =
Data_encoding.Binary.to_bytes
signed_proto_operation_encoding
(protop, signature) in
(proto_bytes, signature)
let main_of_proto (src: Helpers_account.t) operation_header protocol_operation =
let (proto,_) = sign (Some src) operation_header protocol_operation in
let data_operation: Tezos_base.Operation.t =
{shell = operation_header ; proto} in
let hash = Tezos_base.Operation.hash data_operation in
Proto_alpha.Main.parse_operation hash data_operation >>? fun op ->
ok (op, hash)
let apply_of_proto
(source: Helpers_account.t option) operation_header protocol_operation =
let (proto, signature) = sign source operation_header protocol_operation in
let data_operation: Tezos_base.Operation.t =
{shell = operation_header ; proto} in
let hash = Tezos_base.Operation.hash data_operation in
{
hash ;
shell = operation_header ;
contents = protocol_operation ;
signature
}