ligo/src/test/contracts/pledge.religo
2020-03-05 00:24:55 -08:00

39 lines
1.3 KiB
Plaintext

(* Pledge-Distribute — Accept money from a number of contributors and then donate
to an address designated by an oracle *)
(* A lot of people (myself included) seem to expect an oracle to be more than it is.
That is, they expect it to be something complicated when it's actually pretty simple.
An oracle is just an authorized source of information external to the chain, like an
arbiter or moderator. For example, it's not possible to do an HTTP request to get
info from a weather site directly using a smart contract. So instead what you
do is make (or use) an oracle service which uploads the data to the chain so
that contracts can use it.
*)
type storage = address
type parameter =
| Donate(unit)
| Distribute((unit => list(operation)))
let donate = ((p,s): (unit, storage)) : (list(operation), storage) => {
(([]: list(operation)), s);
};
let distribute = ((p,s): ((unit => list(operation)), storage)) : (list(operation), storage) => {
if (Tezos.sender == s) {
(p(),s);
}
else {
(failwith("You're not the oracle for this distribution."):
(list(operation), storage));
};
};
let main = ((p,s): (parameter, storage)) : (list(operation), storage) => {
switch (p) {
| Donate => donate (((),s))
| Distribute msg => distribute ((msg,s))
};
};