2019-03-19 17:32:43 +04:00
|
|
|
type store is
|
2019-03-15 11:45:00 +04:00
|
|
|
record
|
|
|
|
goal : nat;
|
|
|
|
deadline : timestamp;
|
|
|
|
backers : map (address, nat);
|
|
|
|
funded : bool
|
|
|
|
end
|
|
|
|
|
2019-03-19 17:32:43 +04:00
|
|
|
entrypoint contribute (storage store : store;
|
2019-03-18 20:47:11 +04:00
|
|
|
const sender : address;
|
|
|
|
const amount : mutez)
|
2019-03-19 17:32:43 +04:00
|
|
|
: store * list (operation) is
|
2019-03-19 13:52:47 +04:00
|
|
|
var operations : list (operation) := []
|
2019-03-15 11:45:00 +04:00
|
|
|
begin
|
|
|
|
if now > store.deadline then
|
|
|
|
fail "Deadline passed"
|
|
|
|
else
|
2019-03-19 14:54:23 +04:00
|
|
|
case store.backers[sender] of
|
2019-03-18 20:47:11 +04:00
|
|
|
None ->
|
2019-03-19 17:32:43 +04:00
|
|
|
patch store with
|
|
|
|
record
|
|
|
|
backers = add_binding ((sender, amount), store.backers)
|
|
|
|
end
|
2019-03-18 21:09:15 +04:00
|
|
|
| _ -> skip
|
2019-03-18 20:47:11 +04:00
|
|
|
end
|
2019-03-15 11:45:00 +04:00
|
|
|
end with (store, operations)
|
|
|
|
|
2019-03-19 17:32:43 +04:00
|
|
|
entrypoint withdraw (storage store : store; const sender : address)
|
|
|
|
: store * list (operation) is
|
2019-03-19 13:52:47 +04:00
|
|
|
var operations : list (operation) := []
|
2019-03-15 11:45:00 +04:00
|
|
|
begin
|
|
|
|
if sender = owner then
|
|
|
|
if now >= store.deadline then
|
|
|
|
if balance >= store.goal then
|
|
|
|
begin
|
2019-03-19 17:32:43 +04:00
|
|
|
patch store with record funded = True end;
|
2019-03-15 11:45:00 +04:00
|
|
|
operations := [Transfer (owner, balance)]
|
|
|
|
end
|
|
|
|
else fail "Below target"
|
|
|
|
else fail "Too soon"
|
2019-03-18 21:09:15 +04:00
|
|
|
else skip
|
2019-03-15 11:45:00 +04:00
|
|
|
end with (store, operations)
|
|
|
|
|
2019-03-19 17:32:43 +04:00
|
|
|
entrypoint claim (storage store : store; const sender : address)
|
|
|
|
: store * list (operation) is
|
2019-03-19 13:52:47 +04:00
|
|
|
var operations : list (operation) := []
|
2019-03-15 11:45:00 +04:00
|
|
|
var amount : mutez := 0
|
|
|
|
begin
|
|
|
|
if now <= store.deadline then
|
|
|
|
fail "Too soon"
|
|
|
|
else
|
2019-03-19 14:54:23 +04:00
|
|
|
case store.backers[sender] of
|
2019-03-15 11:45:00 +04:00
|
|
|
None ->
|
|
|
|
fail "Not a backer"
|
2019-03-18 20:47:11 +04:00
|
|
|
| Some (amount) ->
|
2019-03-15 11:45:00 +04:00
|
|
|
if balance >= store.goal || store.funded then
|
|
|
|
fail "Cannot refund"
|
|
|
|
else
|
|
|
|
begin
|
2019-03-18 20:47:11 +04:00
|
|
|
amount := store.backers[sender];
|
2019-03-19 17:32:43 +04:00
|
|
|
patch store with
|
|
|
|
record
|
|
|
|
backers = remove_entry (sender, store.backers)
|
|
|
|
end;
|
2019-03-15 11:45:00 +04:00
|
|
|
operations := [Transfer (sender, amount)]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end with (store, operations)
|