2019-03-19 14:32:43 +01:00
|
|
|
type store is
|
2019-03-15 08:45:00 +01:00
|
|
|
record
|
|
|
|
goal : nat;
|
|
|
|
deadline : timestamp;
|
|
|
|
backers : map (address, nat);
|
2019-03-21 21:34:22 +01:00
|
|
|
funded : bool;
|
2019-03-15 08:45:00 +01:00
|
|
|
end
|
|
|
|
|
2019-03-19 14:32:43 +01:00
|
|
|
entrypoint contribute (storage store : store;
|
2019-03-18 17:47:11 +01:00
|
|
|
const sender : address;
|
|
|
|
const amount : mutez)
|
2019-03-19 14:32:43 +01:00
|
|
|
: store * list (operation) is
|
2019-03-26 10:31:55 +01:00
|
|
|
var operations : list (operation) := nil
|
|
|
|
const s : list (int) = list [1; 2; 3]
|
|
|
|
const t : set (int) = set []
|
2019-03-25 16:38:07 +01:00
|
|
|
block {
|
2019-03-15 08:45:00 +01:00
|
|
|
if now > store.deadline then
|
2019-03-22 14:11:32 +01:00
|
|
|
fail "Deadline passed";
|
2019-03-15 08:45:00 +01:00
|
|
|
else
|
2019-03-19 11:54:23 +01:00
|
|
|
case store.backers[sender] of
|
2019-03-20 14:57:55 +01:00
|
|
|
None -> store.backers[sender] := Some (amount)
|
2019-03-20 16:31:33 +01:00
|
|
|
// None -> patch store.backers with map sender -> amount end
|
2019-03-20 09:45:32 +01:00
|
|
|
| _ -> skip
|
2019-03-18 17:47:11 +01:00
|
|
|
end
|
2019-03-25 16:38:07 +01:00
|
|
|
} with (store, operations)
|
2019-03-15 08:45:00 +01:00
|
|
|
|
2019-03-19 14:32:43 +01:00
|
|
|
entrypoint withdraw (storage store : store; const sender : address)
|
|
|
|
: store * list (operation) is
|
2019-03-26 10:31:55 +01:00
|
|
|
var operations : list (operation) := list end
|
2019-03-15 08:45:00 +01:00
|
|
|
begin
|
|
|
|
if sender = owner then
|
2019-03-25 16:38:07 +01:00
|
|
|
if now (Unit) >= store.deadline then
|
2019-03-25 17:14:35 +01:00
|
|
|
if balance >= store.goal then {
|
2019-03-20 13:27:55 +01:00
|
|
|
store.funded := True;
|
2019-03-20 16:31:33 +01:00
|
|
|
// patch store with record funded = True end;
|
2019-03-26 10:31:55 +01:00
|
|
|
operations := list [Transfer (owner, balance)];
|
2019-03-25 17:14:35 +01:00
|
|
|
};
|
2019-03-15 08:45:00 +01:00
|
|
|
else fail "Below target"
|
2019-03-25 17:25:10 +01:00
|
|
|
else { fail "Too soon"; }
|
2019-03-18 18:09:15 +01:00
|
|
|
else skip
|
2019-03-15 08:45:00 +01:00
|
|
|
end with (store, operations)
|
|
|
|
|
2019-03-19 14:32:43 +01:00
|
|
|
entrypoint claim (storage store : store; const sender : address)
|
|
|
|
: store * list (operation) is
|
2019-03-26 10:31:55 +01:00
|
|
|
var operations : list (operation) := list []
|
2019-03-15 08:45:00 +01:00
|
|
|
var amount : mutez := 0
|
|
|
|
begin
|
|
|
|
if now <= store.deadline then
|
|
|
|
fail "Too soon"
|
|
|
|
else
|
2019-03-19 11:54:23 +01:00
|
|
|
case store.backers[sender] of
|
2019-03-15 08:45:00 +01:00
|
|
|
None ->
|
|
|
|
fail "Not a backer"
|
2019-03-18 17:47:11 +01:00
|
|
|
| Some (amount) ->
|
2019-03-20 12:28:25 +01:00
|
|
|
if balance >= store.goal or store.funded then
|
2019-03-15 08:45:00 +01:00
|
|
|
fail "Cannot refund"
|
|
|
|
else
|
|
|
|
begin
|
2019-03-26 10:31:55 +01:00
|
|
|
operations := list [Transfer (sender, amount)];
|
2019-03-22 14:11:32 +01:00
|
|
|
remove sender from map store.backers
|
2019-03-15 08:45:00 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end with (store, operations)
|