Source file ticket_transfer.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
open Alpha_context
let parse_ticket ~consume_deserialization_gas ~ticketer ~contents ~ty ctxt =
let open Lwt_result_syntax in
let*? ty, ctxt =
Script.force_decode_in_context ~consume_deserialization_gas ctxt ty
in
let*? contents, ctxt =
Script.force_decode_in_context ~consume_deserialization_gas ctxt contents
in
let*? Ex_comparable_ty contents_type, ctxt =
Script_ir_translator.parse_comparable_ty ctxt (Micheline.root ty)
in
let* contents, ctxt =
Script_ir_translator.parse_comparable_data
ctxt
contents_type
(Micheline.root contents)
in
let token = Ticket_token.Ex_token {ticketer; contents_type; contents} in
return (ctxt, token)
let parse_ticket_and_operation ~consume_deserialization_gas ~ticketer ~contents
~ty ~sender ~destination ~entrypoint ~amount ctxt =
let open Lwt_result_syntax in
let* ( ctxt,
(Ticket_token.Ex_token {contents; contents_type; ticketer} as token) )
=
parse_ticket ~consume_deserialization_gas ~ticketer ~contents ~ty ctxt
in
let*? ticket_ty =
Script_typed_ir.ticket_t Micheline.dummy_location contents_type
in
let ticket = Script_typed_ir.{ticketer; contents; amount} in
let* unparsed_parameters, ctxt =
Script_ir_translator.unparse_data ctxt Optimized ticket_ty ticket
in
let*? ctxt, nonce = fresh_internal_nonce ctxt in
let op =
Script_typed_ir.Internal_operation
{
sender;
nonce;
operation =
Transaction_to_smart_contract
{
amount = Tez.zero;
unparsed_parameters;
destination;
entrypoint;
location = Micheline.dummy_location;
parameters_ty = ticket_ty;
parameters = ticket;
};
}
in
return (ctxt, token, op)
let transfer_ticket_with_hashes ctxt ~sender_hash ~dst_hash
(qty : Ticket_amount.t) =
let qty = Script_int.(to_zint (qty :> n num)) in
let open Lwt_result_syntax in
let* sender_storage_diff, ctxt =
Ticket_balance.adjust_balance ctxt sender_hash ~delta:(Z.neg qty)
in
let* dst_storage_diff, ctxt =
Ticket_balance.adjust_balance ctxt dst_hash ~delta:qty
in
let* diff, ctxt =
Ticket_balance.adjust_storage_space
ctxt
~storage_diff:(Z.add sender_storage_diff dst_storage_diff)
in
return (ctxt, diff)
let transfer_ticket ctxt ~sender ~dst ex_token qty =
let open Lwt_result_syntax in
let* sender_hash, ctxt =
Ticket_balance_key.of_ex_token ctxt ~owner:sender ex_token
in
let* dst_hash, ctxt =
Ticket_balance_key.of_ex_token ctxt ~owner:dst ex_token
in
transfer_ticket_with_hashes ctxt ~sender_hash ~dst_hash qty