-
Notifications
You must be signed in to change notification settings - Fork 1
/
Escrow.sol
121 lines (91 loc) · 3.5 KB
/
Escrow.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
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
pragma solidity ^0.6.0;
contract Escrow{
enum JudgeFee {paid,unPaid}
Escrow.JudgeFee public buyerFeeStatus = JudgeFee.unPaid;
Escrow.JudgeFee public sellerFeeStatus = JudgeFee.unPaid;
enum Winner {seller, buyer, none}
Escrow.Winner public winner = Winner.none;
address payable public judge;
bool addressesSet = false;
address payable public buyer;
address payable public seller;
bool public buyerDispulte = false;
uint judgeFee = 0;
uint public buyerTimestamp;
uint public disputeTime = 30 * 1 seconds;
bool public buyerPaid = false;
modifier mustBeJudge(){
require(msg.sender == judge, "Must be Judge");
_;
}
modifier mustBeBuyer(){
require(msg.sender == buyer, "Must be buyer");
_;
}
modifier mustBeSeller(){
require(msg.sender == seller, "Must be seller");
_;
}
modifier buyerHasPaid(){
require(buyerPaid == true, "Buyer has not paid yet");
_;
}
modifier buyerHasDisputed(){
require(buyerDispulte == true, "Buyer is not Dispulted, Judge cannot take decision or fee");
_;
}
modifier underDisputedTime(){
require(now <= buyerTimestamp + disputeTime, "Cannot be processed after dispulted time");
_;
}
modifier winnerNotDeclare(){
require(winner == Winner.none, "Winner is declared, cannot pay judge now");
_;
}
constructor () public {
judge = msg.sender;
}
function judgeSetAddress(address payable _buyer, address payable _seller) public mustBeJudge{
require(!addressesSet,"Either Buyer and Seller are already set, or judge's fee is not zero");
addressesSet = true;
buyer = _buyer;
seller = _seller;
}
function buyerDeposite() public payable mustBeBuyer{
require(buyerPaid != true, "Buyer has already paid!");
buyerTimestamp = now;
buyerPaid = true;
}
function buyerRaiseDispute() public payable mustBeBuyer buyerHasPaid underDisputedTime winnerNotDeclare{
judgeFee = judgeFee+msg.value;
buyerDispulte = true;
}
function buyerWithdraw() public mustBeBuyer{
require(winner == Winner.buyer, "Buyer is not the winner");
buyer.transfer(address(this).balance-judgeFee);
}
function sellerWithdraw() public mustBeSeller buyerHasPaid{
require(buyerDispulte == false || winner == Winner.seller, "Buyer raised dispute, Please ask judge to resolve. Or Buyer is the winner");
require(now >= buyerTimestamp + disputeTime, "Try after disputed Time");
seller.transfer(address(this).balance-judgeFee);
}
function sellerPayJudgeFee() public payable mustBeSeller buyerHasPaid underDisputedTime winnerNotDeclare{
judgeFee = judgeFee+msg.value;
sellerFeeStatus = JudgeFee.paid;
}
function judgeDecision(address payable _to ) public mustBeJudge buyerHasDisputed{
require(_to == buyer || _to == seller, "This address does not match either buyer or seller");
if (sellerFeeStatus != JudgeFee.paid) {
judgeFee = 0;
winner = Winner.buyer;
}
else{
if (_to == seller) winner = Winner.seller;
else winner = Winner.buyer;
}
}
function judgeFeeCollection() public mustBeJudge buyerHasDisputed{
judge.transfer(judgeFee);
judgeFee = 0;
}
}