-
Notifications
You must be signed in to change notification settings - Fork 0
/
PayOrBurn.sol
87 lines (77 loc) · 2.38 KB
/
PayOrBurn.sol
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
pragma solidity 0.4.8;
contract payOrBurn {
address buyer;
address actor;
address constant burnAddress = 0xdead;
string buyerRequest;
uint deposit;
string actorData;
enum State {Requested, Committed}
State state;
modifier inState (State s) {if (state != s) throw; _;}
modifier condition(bool c) {if (!c) throw; _; }
modifier onlyBuyer() { if (msg.sender != buyer) throw; _;}
modifier onlyActor() { if (msg.sender != actor) throw; _;}
event RequestPosted (address requestedBy, string request, uint value, uint deposit);
event RequestUpdated (string request);
event ActorCommitted (address _actor, string answer, uint _depositAmount);
event ActorDataUpdated (string answer);
event ActorPaid(uint amount);
event FundsBurned(uint amount);
event RequestCanceled(uint amount);
function () payable {}
function payOrBurn(string _BuyerRequest, uint _depositInWei) payable {
buyer = msg.sender;
deposit = _depositInWei;
buyerRequest = _BuyerRequest;
RequestPosted(buyer, buyerRequest, msg.value, deposit);
}
function updateBuyerRequest(string _BuyerRequest)
onlyBuyer
condition(this.balance > 0)
{
buyerRequest = _BuyerRequest;
RequestUpdated(buyerRequest);
}
function cancelRequest()
onlyBuyer
inState(State.Requested)
{
RequestCanceled(this.balance);
selfdestruct(buyer);
}
function commitToFulfillRequest(string _ActorData)
payable
inState(State.Requested)
condition(msg.value == deposit)
{
actor = msg.sender;
actorData = _ActorData;
ActorCommitted(actor, actorData, msg.value);
state = State.Committed;
}
function updateActorData( string _ActorData)
inState(State.Committed)
onlyActor
condition(this.balance > 0)
{
actorData = _ActorData;
ActorDataUpdated(actorData);
}
function payActor(uint _amount)
onlyBuyer
inState(State.Committed)
condition(_amount <= this.balance)
{
if (!actor.send(_amount)) throw;
ActorPaid(_amount);
}
function burnFunds(uint _amount)
onlyBuyer
inState(State.Committed)
condition(_amount <= this.balance)
{
if (!burnAddress.send(_amount)) throw;
FundsBurned(_amount);
}
}