39 lines
1.3 KiB
Plaintext
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))
|
|
};
|
|
};
|