-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalisma4.editedEscrow.sol
170 lines (136 loc) · 9.45 KB
/
calisma4.editedEscrow.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
/*
Escrow çalışmasının bir farklı gösterimi de burada bulunmaktadır. Bu çalışmada farklı olarak döngü yapıları kullanılmıştır.
Bu döngülerin kullanım amacı, kullanımlarının nasıl değişikliklere yol açtığını veya nasıl daha stabil hale getirdiğini gösterebilmektir.
Yorum satırları ile açıklama yaparak karmaşık gelebilecek satırları daha anlaşılır hale getirmeye çalıştım.
*/
contract escrow2{
mapping (uint => address) transaction_receivers_list; // kullanıcının yaptığı transaction(işlem) yaptığında bu işlemler satıcı(reveicer) gider. Yani paranın kime gideceği
mapping (uint => address) transaction_owners_list; // burası ise transaction yapan kişinin adresi
mapping (uint => uint) transaction_payment_list; // transaction(işlem) boyutunun ne kadar olacağı
mapping (uint => bool) transaction_status_list; // işlemin durumunun ne olduğunu gösteren adres
uint transaction_count = 0; // işlem sayısının kayıt ediyoruz
address admin;
uint commission_percent = 0;
uint collected_commission = 0;
constructor(uint _commission_percent){
admin = msg.sender;
commission_percent = _commission_percent;
}
modifier onlyAdmin(){
require(msg.sender == admin);
_; // alt tire ve noktalı virgül, require'yi kontrol et ve işlemlere olduğu gibi devam et anlamına gelir
}
modifier onlyTransactionOwner(uint _transaction_id){
require(transaction_payment_list[_transaction_id] != 0);
_; // alt tire ve noktalı virgül, require'yi kontrol et ve işlemlere olduğu gibi devam et anlamına gelir
}
modifier CheckIfTransactionNotZero(uint _transaction_id){
require(transaction_payment_list[_transaction_id] != 0);
_; // alt tire ve noktalı virgül, require'yi kontrol et ve işlemlere olduğu gibi devam et anlamına gelir
}
modifier CheckIfTransactionActive(uint _transaction_id){
require(transaction_status_list[_transaction_id] == false);
_; // alt tire ve noktalı virgül, require'yi kontrol et ve işlemlere olduğu gibi devam et anlamına gelir
}
// user(buyur) functions
function createTransaction(address _transaction_receiver) external payable{ // bu kısımda kullanıcı bir işlem oluşturmakta
require(msg.value >= 1 ether); // göndeirlen ether en az 1 olmalı
require(_transaction_receiver != address(0)); // işlemi göndereceğimiz kişinin adresi boş olmamalı ki işlem gönderilsin
// solidity'de eğer bir kullanıcı adres tipinde paramaetre alan bir fonksiyon varsa ve kullanıcı onu set etmeden fonksiyonu çağırırsa adres otomotik olarak 0 a eşitlenir. bu da çeşitli sıkıntılara yol açabiliyordu
transaction_receivers_list[transaction_count] = _transaction_receiver; // gerekli eşitlemeleri yapıyoruz
transaction_payment_list[transaction_count] += msg.value; // burada payment_list gönderilen value'ye eşitleniyor. Yani gönderilen ether değeri
transaction_owners_list[transaction_count] = msg.sender;// owner_list bu transaction'u kim çağırıyorsa ona eşitleniyor
transaction_status_list[transaction_count] = false; //
transaction_count += 1; // her işlemde 1 artıyoruz
}
//bu fonksiyonun amacı önceden oluşturulmuş bir transaction'a sonradan ether eklemek. Fakat sadece transaction'u oluşturan kullanıcı ekleme yapabiliyor
function addEtherToTransaction(uint _transaction_id) external payable onlyTransactionOwner(_transaction_id) CheckIfTransactionNotZero(_transaction_id) CheckIfTransactionActive(_transaction_id){
transaction_payment_list[_transaction_id] += msg.value;
// burada payment_list gönderilen value'ye eşitleniyor. Yani gönderilen ether değeri
// burada ekleme işlemini sadece işlemi oluşturan kişi yapabiliyor dedik lakin bunun bir require durumu yok
// bunun için ise modifier kullandık. mesela burada onlyTransactionOwner modifier'i var ve o modifer'de, _transaction_id gönderir.
// onlyTransactionOwner da ise işlemi yapan kişinin olup olmadığı gerekliliği göz önünde bulundurularak işlem yapılıyor.
// yani burada dışarıdan gönderilen transaction(işlem)'ın, owner'a eşit olup olmadığını kontrol ediyoruz.
}
function cancelTransaction(uint _transaction_id) external onlyTransactionOwner(_transaction_id) CheckIfTransactionNotZero(_transaction_id) CheckIfTransactionActive(_transaction_id){
TransferPayment(transaction_owners_list[_transaction_id], transaction_payment_list[_transaction_id]);
transaction_payment_list[_transaction_id] = 0;
transaction_owners_list[_transaction_id] = address(0);
transaction_receivers_list[_transaction_id] = address(0);
}
function confirmTransaction(uint _transaction_id) external onlyTransactionOwner(_transaction_id) CheckIfTransactionNotZero(_transaction_id) CheckIfTransactionActive(_transaction_id){
transaction_status_list[_transaction_id] = true; //burada da transaction doğrulanıyor. Ama bunu fonksiyon her döndüğünde ayrı ayrı yapıyor
// confirm edildiğinde satıcı parayı çekebiliyor.
}
// User(seller) functions
// burada satıcı kendisi için oluşturulmul transaction parasını çekebiliyor. Tabi kontrol edilmiş ve onaylanmış ise
function withDrawtransaction(uint _transaction_id) external payable returns(string memory){ // fonksiyonu, satıcının hesabından ödeme çekmesini sağlar. İşlemi onaylamış olan satıcı, ödeme miktarını alırken belirli bir komisyon yüzdesi (commission_percent) hesabına aktarılır.
require(transaction_receivers_list[_transaction_id] == msg.sender); // _transaction_id'deki receiver'in doğru gönderen kişi olup olmadığı kontrol edilir
require(transaction_status_list[_transaction_id] == true);
if(transaction_payment_list[_transaction_id] > 10 ether){ // burada normalde komisyon alma işlemi var. Fakat buna bir zorunluluk getirdik ve gönderilen ether miktarı 10 dan büyük ise komisyon alınabileceğini yazdık
collected_commission += transaction_payment_list[_transaction_id] / 100 * commission_percent;
TransferPayment(msg.sender, transaction_payment_list[_transaction_id] - transaction_payment_list[_transaction_id] / 100 * commission_percent);
transaction_payment_list[_transaction_id] = 0;
return "withDrawtransaction with commission";
}
else{
TransferPayment(msg.sender, transaction_payment_list[_transaction_id]);
transaction_payment_list[_transaction_id] = 0;
return "withDrawtransaction no commission";
}
}
function TransferPayment(address _receiver, uint _amount) internal{
payable(_receiver).transfer(_amount);
}
// Admin functions
function setAdmin(address _newAdmin) external onlyAdmin{
require (_newAdmin != address(0));
admin = _newAdmin;
// fonksiyonu, sözleşmenin yönetici adresini değiştirmek için kullanılır.
//Bu işlemi sadece mevcut yönetici yapabilir.
}
function collectedCommission() external payable onlyAdmin{ //fonksiyonu, hesapta biriken komisyonu yöneticiye aktarır.
TransferPayment(admin, collected_commission);
collected_commission = 0;
}
function forceConfirmAllTransactions() external onlyAdmin{
for(uint i = 0; i <= transaction_count; i++){
transaction_status_list[i] = true;
}
//fonksiyonu, yönetici tarafından çağrıldığında tüm işlemleri zorla onaylamak için kullanılır.
// Fonksiyon, for döngüsü aracılığıyla tüm işlem listesini dolaşır ve her bir işlemin durumunu true olarak günceller, yani tüm işlemleri onaylar.
}
function forceCancelTransaction(uint _transaction_id) external payable onlyAdmin{
TransferPayment(transaction_owners_list[_transaction_id], transaction_payment_list[_transaction_id]);
transaction_payment_list[_transaction_id];
transaction_owners_list[_transaction_id] = address(0);
transaction_receivers_list[_transaction_id] = address(0);
// fonksiyonu, yöneticinin bir işlemi zorla iptal etmesini sağlar. İşlemi iptal eden kullanıcıya ödeme iade edilir ve ilgili işlem kayıtları sıfırlanır.
}
function forceConfirmTransaction(uint _transaction_id) external payable onlyAdmin{
transaction_status_list[_transaction_id] = true;
// fonksiyonu, yöneticinin bir işlemi zorla onaylamasını sağlar.
}
//Getter Functions
// Bu fonksiyonlar, işlemlerin durumunu ve ilgili bilgileri almak için kullanılabilir.
function getTransactionStatus(uint _transaction_id) external view returns(bool){
return transaction_status_list[_transaction_id];
}
function getTransactionReceiver(uint _transaction_id) external view returns(address){
return transaction_receivers_list[_transaction_id];
}
function getTransactionOwner(uint _transaction_id) external view returns(address){
return transaction_owners_list[_transaction_id];
}
function getTransactionPaymnetAmount(uint _transaction_id) external view returns(uint){
return transaction_payment_list[_transaction_id];
}
function getCollectedCommission() external view returns(uint){
return collected_commission;
}
}
/*
Author Muhammed Akıncı
*/