1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use bitcoin::util::amount::CoinAmount;
use sapio::contract::*;
use sapio::*;
use sapio_base::timelocks::RelTime;
use sapio_base::Clause;
use schemars::*;
use serde::*;
use std::convert::TryFrom;
use std::convert::TryInto;
#[derive(JsonSchema, Serialize, Deserialize)]
pub struct PayToPublicKey {
key: bitcoin::PublicKey,
}
impl PayToPublicKey {
guard!(with_key | s, ctx | { Clause::Key(s.key) });
}
impl Contract for PayToPublicKey {
declare! {finish, Self::with_key}
declare! {non updatable}
}
#[derive(JsonSchema, Serialize, Deserialize)]
pub struct BasicEscrow {
alice: bitcoin::PublicKey,
bob: bitcoin::PublicKey,
escrow: bitcoin::PublicKey,
}
impl BasicEscrow {
guard!(
redeem | s,
ctx | {
Clause::Threshold(
1,
vec![
Clause::Threshold(2, vec![Clause::Key(s.alice), Clause::Key(s.bob)]),
Clause::And(vec![
Clause::Key(s.escrow),
Clause::Threshold(1, vec![Clause::Key(s.alice), Clause::Key(s.bob)]),
]),
],
)
}
);
}
impl Contract for BasicEscrow {
declare! {finish, Self::redeem}
declare! {non updatable}
}
#[derive(JsonSchema, Serialize, Deserialize)]
pub struct BasicEscrow2 {
alice: bitcoin::PublicKey,
bob: bitcoin::PublicKey,
escrow: bitcoin::PublicKey,
}
impl BasicEscrow2 {
guard!(
use_escrow | s,
ctx | {
Clause::And(vec![
Clause::Key(s.escrow),
Clause::Threshold(2, vec![Clause::Key(s.alice), Clause::Key(s.bob)]),
])
}
);
guard!(
cooperate | s,
ctx | { Clause::And(vec![Clause::Key(s.alice), Clause::Key(s.bob)]) }
);
}
impl Contract for BasicEscrow2 {
declare! {finish, Self::use_escrow, Self::cooperate}
declare! {non updatable}
}
#[derive(JsonSchema, Serialize, Deserialize)]
pub struct TrustlessEscrow {
alice: bitcoin::PublicKey,
bob: bitcoin::PublicKey,
alice_escrow: (CoinAmount, bitcoin::Address),
bob_escrow: (CoinAmount, bitcoin::Address),
}
impl TrustlessEscrow {
guard!(
cooperate | s,
ctx | { Clause::And(vec![Clause::Key(s.alice), Clause::Key(s.bob)]) }
);
then! {use_escrow |s, ctx| {
ctx.template()
.add_output(
s.alice_escrow.0.try_into()?,
&Compiled::from_address(s.alice_escrow.1.clone(), None),
None)?
.add_output(
s.bob_escrow.0.try_into()?,
&Compiled::from_address(s.bob_escrow.1.clone(), None),
None)?
.set_sequence(0, RelTime::try_from(std::time::Duration::from_secs(10*24*60*60))?.into())?.into()
}}
}
impl Contract for TrustlessEscrow {
declare! {finish, Self::cooperate}
declare! {then, Self::use_escrow}
declare! {non updatable}
}