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
open Alpha_context
let parse_ticket ~consume_deserialization_gas ~ticketer ~contents ~ty ctxt =
Script.force_decode_in_context ~consume_deserialization_gas ctxt ty
>>?= fun (ty, ctxt) ->
Script.force_decode_in_context ~consume_deserialization_gas ctxt contents
>>?= fun (contents, ctxt) ->
Script_ir_translator.parse_comparable_ty ctxt (Micheline.root ty)
>>?= fun (Ex_comparable_ty contents_type, ctxt) ->
Script_ir_translator.parse_comparable_data
ctxt
contents_type
(Micheline.root contents)
>>=? fun (contents, ctxt) ->
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 ~source ~destination ~entrypoint ~amount ctxt =
parse_ticket ~consume_deserialization_gas ~ticketer ~contents ~ty ctxt
>>=? fun ( ctxt,
(Ticket_token.Ex_token {contents; contents_type; ticketer} as
token) ) ->
Script_typed_ir.ticket_t Micheline.dummy_location contents_type
>>?= fun ticket_ty ->
let ticket = Script_typed_ir.{ticketer; contents; amount} in
Script_ir_translator.unparse_data ctxt Optimized ticket_ty ticket
>>=? fun (unparsed_parameters, ctxt) ->
fresh_internal_nonce ctxt >>?= fun (ctxt, nonce) ->
let op =
Script_typed_ir.Internal_operation
{
source;
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 ~src_hash ~dst_hash (qty : Ticket_amount.t)
=
let qty = Script_int.(to_zint (qty :> n num)) in
Ticket_balance.adjust_balance ctxt src_hash ~delta:(Z.neg qty)
>>=? fun (src_storage_diff, ctxt) ->
Ticket_balance.adjust_balance ctxt dst_hash ~delta:qty
>>=? fun (dst_storage_diff, ctxt) ->
Ticket_balance.adjust_storage_space
ctxt
~storage_diff:(Z.add src_storage_diff dst_storage_diff)
>>=? fun (diff, ctxt) -> return (ctxt, diff)
let transfer_ticket ctxt ~src ~dst ex_token qty =
Ticket_balance_key.of_ex_token ctxt ~owner:src ex_token
>>=? fun (src_hash, ctxt) ->
Ticket_balance_key.of_ex_token ctxt ~owner:dst ex_token
>>=? fun (dst_hash, ctxt) ->
transfer_ticket_with_hashes ctxt ~src_hash ~dst_hash qty