-
Notifications
You must be signed in to change notification settings - Fork 0
/
MiniToken.etiml
42 lines (33 loc) · 1.61 KB
/
MiniToken.etiml
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
pragma etiml ^0.1
structure Pervasive = struct
fun addBy b a = a + b
fun subBy b a = a - b
fun orBy b a = a || b
(* fun waste_time () = 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 *)
fun require b = if b then (* waste_time (); *)() else (throw using _) end
end
contract MyToken = struct
(* This creates an array with all balances *)
state balanceOf : map address uint256
(* public state name : vector int = {10,} *)
(* Initializes contract with initial supply tokens to the creator of the contract *)
fun constructor (initialSupply : uint256) =
set balanceOf[msg.sender] initialSupply (* Give the creator all initial tokens *)
fun addBy b a = a + b
(* Send coins *)
fun transfer (_to : address, _value : uint256) =
require(balanceOf[msg.sender] >= _value); (* Check if the sender has enough *)
require(balanceOf[_to] + _value >= balanceOf[_to]); (* Check for overflows *)
modify balanceOf[msg.sender] -= _value; (* Subtract from the sender *)
modify balanceOf[_to] += _value (* Add the same to the recipient *)
(* ;(_to, _value, msg.sender, balanceOf[msg.sender], balanceOf[_to]) *)
val () = constructor 0xa0
(* val () = throw balanceOf[msg.sender] *)
(* val () = throw (balanceOf[msg.sender] >= 0x20) *)
(* val () = throw (2 >= 1) *)
(* val () = dispatch {transfer = transfer,} *)
(* val () = transfer (0x123, 0x20) *)
(* val () = halt balanceOf[msg.sender] *)
(* val () = halt balanceOf[0x123] *)
(* val () = throw msg.sender *)
end