ticket
let create: <a>(_: a) => (_: nat) => option<ticket<a>>
The call create(v, a) creates a ticket with value v and
amount a. If the creation is a success, the value Some(t) is
returned, where t is the ticket; otherwise, None() is the
result. Note: Tickets cannot be duplicated.
let split: <a>(_: ticket<a>) => (_: [nat, nat]) => option<[ticket<a>, ticket<a>]>
The call split(t, [a1, a2]) results in a pair of tickets
t1 and t2 such that the former owns the amount a1 and the
later a2. More precisely, the value of the call is
Some([t1, t2]) because signifying to the callee the failure of
the splitting is achieved by returning the value None().
let join: <a>(_: [ticket<a>, ticket<a>]) => option<ticket<a>>
The call join(t1, t2) joins the tickets t1 and
t2, which must have the same type of value.
let read: <a>(_: ticket<a>) => [[address, [a, nat]], ticket<a>]
The call read(t) returns t itself and the contents of
t which is a pair [address, [value, amount]], where address is
the address of the smart contract that created it.