ligo/Tests/crowdfunding.ligo
Christian Rinderknecht c3b304db4a
I relaxed the extension to the grammar that enabled non-annotated
empty lists and None values as initial values in declarations.

Now, these values are accepted irrespective of the declared type. It
is up to the typechecker to validate them.
2019-03-19 11:54:23 +01:00

71 lines
1.9 KiB
Plaintext

type state is
record
goal : nat;
deadline : timestamp;
backers : map (address, nat);
funded : bool
end
entrypoint contribute (storage store : state;
const sender : address;
const amount : mutez)
: state * list (operation) is
var operations : list (operation) := []
begin
if now > store.deadline then
fail "Deadline passed"
else
case store.backers[sender] of
None ->
store :=
copy store with
record
backers = add_binding ((sender, amount), store.backers)
end
| _ -> skip
end
end with (store, operations)
entrypoint withdraw (storage store : state; const sender : address)
: state * list (operation) is
var operations : list (operation) := []
begin
if sender = owner then
if now >= store.deadline then
if balance >= store.goal then
begin
store := copy store with record funded = True end;
operations := [Transfer (owner, balance)]
end
else fail "Below target"
else fail "Too soon"
else skip
end with (store, operations)
entrypoint claim (storage store : state; const sender : address)
: state * list (operation) is
var operations : list (operation) := []
var amount : mutez := 0
begin
if now <= store.deadline then
fail "Too soon"
else
case store.backers[sender] of
None ->
fail "Not a backer"
| Some (amount) ->
if balance >= store.goal || store.funded then
fail "Cannot refund"
else
begin
amount := store.backers[sender];
store :=
copy store with
record
backers = remove_entry (sender, store.backers)
end;
operations := [Transfer (sender, amount)]
end
end
end with (store, operations)