@@ -10,7 +10,7 @@ pragma solidity 0.8.18;
1010import {IArbitrableV2, IArbitratorV2} from "../interfaces/IArbitrableV2.sol " ;
1111import "../interfaces/IDisputeTemplateRegistry.sol " ;
1212
13- /// @title Escrow
13+ /// @title Escrow for a sale paid in ETH and no fees.
1414/// @dev MultipleArbitrableTransaction contract that is compatible with V2.
1515/// Adapted from https://github.com/kleros/kleros-interaction/blob/master/contracts/standard/arbitration/MultipleArbitrableTransaction.sol
1616contract Escrow is IArbitrableV2 {
@@ -20,34 +20,34 @@ contract Escrow is IArbitrableV2 {
2020
2121 enum Party {
2222 None,
23- Sender,
24- Receiver
23+ Buyer, // Makes a purchase in ETH.
24+ Seller // Provides a good or service in exchange for ETH.
2525 }
2626
2727 enum Status {
2828 NoDispute,
29- WaitingSender ,
30- WaitingReceiver ,
29+ WaitingBuyer ,
30+ WaitingSeller ,
3131 DisputeCreated,
3232 TransactionResolved
3333 }
3434
3535 enum Resolution {
3636 TransactionExecuted,
37- TimeoutBySender ,
38- TimeoutByReceiver ,
37+ TimeoutByBuyer ,
38+ TimeoutBySeller ,
3939 RulingEnforced
4040 }
4141
4242 struct Transaction {
43- address payable sender ;
44- address payable receiver ;
43+ address payable buyer ;
44+ address payable seller ;
4545 uint256 amount;
4646 uint256 deadline; // Timestamp at which the transaction can be automatically executed if not disputed.
4747 uint256 disputeID; // If dispute exists, the ID of the dispute.
48- uint256 senderFee ; // Total fees paid by the sender .
49- uint256 receiverFee ; // Total fees paid by the receiver .
50- uint256 lastInteraction ; // Last interaction for the dispute procedure .
48+ uint256 buyerFee ; // Total fees paid by the buyer .
49+ uint256 sellerFee ; // Total fees paid by the seller .
50+ uint256 lastFeePaymentTime ; // Last time the dispute fees were paid by either party .
5151 string templateData;
5252 string templateDataMappings;
5353 Status status;
@@ -84,13 +84,13 @@ contract Escrow is IArbitrableV2 {
8484
8585 /// @dev Emitted when a transaction is created.
8686 /// @param _transactionID The index of the transaction.
87- /// @param _sender The address of the sender .
88- /// @param _receiver The address of the receiver .
87+ /// @param _buyer The address of the buyer .
88+ /// @param _seller The address of the seller .
8989 /// @param _amount The initial amount in the transaction.
9090 event TransactionCreated (
9191 uint256 indexed _transactionID ,
92- address indexed _sender ,
93- address indexed _receiver ,
92+ address indexed _buyer ,
93+ address indexed _seller ,
9494 uint256 _amount
9595 );
9696
@@ -166,152 +166,152 @@ contract Escrow is IArbitrableV2 {
166166
167167 /// @dev Create a transaction.
168168 /// @param _timeoutPayment Time after which a party can automatically execute the arbitrable transaction.
169- /// @param _receiver The recipient of the transaction.
169+ /// @param _seller The recipient of the transaction.
170170 /// @param _templateData The dispute template data.
171171 /// @param _templateDataMappings The dispute template data mappings.
172172 /// @return transactionID The index of the transaction.
173173 function createTransaction (
174174 uint256 _timeoutPayment ,
175- address payable _receiver ,
175+ address payable _seller ,
176176 string memory _templateData ,
177177 string memory _templateDataMappings
178178 ) external payable returns (uint256 transactionID ) {
179179 Transaction storage transaction = transactions.push ();
180- transaction.sender = payable (msg .sender );
181- transaction.receiver = _receiver ;
180+ transaction.buyer = payable (msg .sender );
181+ transaction.seller = _seller ;
182182 transaction.amount = msg .value ;
183183 transaction.deadline = block .timestamp + _timeoutPayment;
184184 transaction.templateData = _templateData;
185185 transaction.templateDataMappings = _templateDataMappings;
186186
187187 transactionID = transactions.length - 1 ;
188188
189- emit TransactionCreated (transactionID, msg .sender , _receiver , msg .value );
189+ emit TransactionCreated (transactionID, msg .sender , _seller , msg .value );
190190 }
191191
192- /// @dev Pay receiver . To be called if the good or service is provided.
192+ /// @dev Pay seller . To be called if the good or service is provided.
193193 /// @param _transactionID The index of the transaction.
194194 /// @param _amount Amount to pay in wei.
195195 function pay (uint256 _transactionID , uint256 _amount ) external {
196196 Transaction storage transaction = transactions[_transactionID];
197- if (transaction.sender != msg .sender ) revert SenderOnly ();
197+ if (transaction.buyer != msg .sender ) revert BuyerOnly ();
198198 if (transaction.status != Status.NoDispute) revert TransactionDisputed ();
199199 if (_amount > transaction.amount) revert MaximumPaymentAmountExceeded ();
200200
201- transaction.receiver .send (_amount); // It is the user responsibility to accept ETH.
201+ transaction.seller .send (_amount); // It is the user responsibility to accept ETH.
202202 transaction.amount -= _amount;
203203
204204 emit Payment (_transactionID, _amount, msg .sender );
205205 }
206206
207- /// @dev Reimburse sender . To be called if the good or service can't be fully provided.
207+ /// @dev Reimburse buyer . To be called if the good or service can't be fully provided.
208208 /// @param _transactionID The index of the transaction.
209209 /// @param _amountReimbursed Amount to reimburse in wei.
210210 function reimburse (uint256 _transactionID , uint256 _amountReimbursed ) external {
211211 Transaction storage transaction = transactions[_transactionID];
212- if (transaction.receiver != msg .sender ) revert ReceiverOnly ();
212+ if (transaction.seller != msg .sender ) revert SellerOnly ();
213213 if (transaction.status != Status.NoDispute) revert TransactionDisputed ();
214214 if (_amountReimbursed > transaction.amount) revert MaximumPaymentAmountExceeded ();
215215
216- transaction.sender .send (_amountReimbursed); // It is the user responsibility to accept ETH.
216+ transaction.buyer .send (_amountReimbursed); // It is the user responsibility to accept ETH.
217217 transaction.amount -= _amountReimbursed;
218218
219219 emit Payment (_transactionID, _amountReimbursed, msg .sender );
220220 }
221221
222- /// @dev Transfer the transaction's amount to the receiver if the timeout has passed.
222+ /// @dev Transfer the transaction's amount to the seller if the timeout has passed.
223223 /// @param _transactionID The index of the transaction.
224224 function executeTransaction (uint256 _transactionID ) external {
225225 Transaction storage transaction = transactions[_transactionID];
226226 if (block .timestamp < transaction.deadline) revert DeadlineNotPassed ();
227227 if (transaction.status != Status.NoDispute) revert TransactionDisputed ();
228228
229- transaction.receiver .send (transaction.amount); // It is the user responsibility to accept ETH.
229+ transaction.seller .send (transaction.amount); // It is the user responsibility to accept ETH.
230230 transaction.amount = 0 ;
231231 transaction.status = Status.TransactionResolved;
232232
233233 emit TransactionResolved (_transactionID, Resolution.TransactionExecuted);
234234 }
235235
236- /// @dev Pay the arbitration fee to raise a dispute. To be called by the sender .
236+ /// @dev Pay the arbitration fee to raise a dispute. To be called by the buyer .
237237 /// Note that the arbitrator can have createDispute throw, which will make
238238 /// this function throw and therefore lead to a party being timed-out.
239239 /// This is not a vulnerability as the arbitrator can rule in favor of one party anyway.
240240 /// @param _transactionID The index of the transaction.
241- function payArbitrationFeeBySender (uint256 _transactionID ) external payable {
241+ function payArbitrationFeeByBuyer (uint256 _transactionID ) external payable {
242242 Transaction storage transaction = transactions[_transactionID];
243243 if (transaction.status >= Status.DisputeCreated) revert DisputeAlreadyCreatedOrTransactionAlreadyExecuted ();
244- if (msg .sender != transaction.sender ) revert SenderOnly ();
244+ if (msg .sender != transaction.buyer ) revert BuyerOnly ();
245245
246- transaction.senderFee += msg .value ;
246+ transaction.buyerFee += msg .value ;
247247 uint256 arbitrationCost = arbitrator.arbitrationCost (arbitratorExtraData);
248- if (transaction.senderFee < arbitrationCost) revert SenderFeeNotCoverArbitrationCosts ();
248+ if (transaction.buyerFee < arbitrationCost) revert BuyerFeeNotCoverArbitrationCosts ();
249249
250- transaction.lastInteraction = block .timestamp ;
250+ transaction.lastFeePaymentTime = block .timestamp ;
251251
252- if (transaction.receiverFee < arbitrationCost) {
253- // The receiver still has to pay. This can also happen if he has paid, but arbitrationCost has increased.
254- transaction.status = Status.WaitingReceiver ;
255- emit HasToPayFee (_transactionID, Party.Receiver );
252+ if (transaction.sellerFee < arbitrationCost) {
253+ // The seller still has to pay. This can also happen if he has paid, but arbitrationCost has increased.
254+ transaction.status = Status.WaitingSeller ;
255+ emit HasToPayFee (_transactionID, Party.Seller );
256256 } else {
257- // The receiver has also paid the fee. We create the dispute.
257+ // The seller has also paid the fee. We create the dispute.
258258 raiseDispute (_transactionID, arbitrationCost);
259259 }
260260 }
261261
262- /// @dev Pay the arbitration fee to raise a dispute. To be called by the receiver .
263- /// Note that this function mirrors payArbitrationFeeBySender .
262+ /// @dev Pay the arbitration fee to raise a dispute. To be called by the seller .
263+ /// Note that this function mirrors payArbitrationFeeByBuyer .
264264 /// @param _transactionID The index of the transaction.
265- function payArbitrationFeeByReceiver (uint256 _transactionID ) external payable {
265+ function payArbitrationFeeBySeller (uint256 _transactionID ) external payable {
266266 Transaction storage transaction = transactions[_transactionID];
267267 if (transaction.status >= Status.DisputeCreated) revert DisputeAlreadyCreatedOrTransactionAlreadyExecuted ();
268- if (msg .sender != transaction.receiver ) revert ReceiverOnly ();
268+ if (msg .sender != transaction.seller ) revert SellerOnly ();
269269
270- transaction.receiverFee += msg .value ;
270+ transaction.sellerFee += msg .value ;
271271 uint256 arbitrationCost = arbitrator.arbitrationCost (arbitratorExtraData);
272- if (transaction.receiverFee < arbitrationCost) revert ReceiverFeeNotCoverArbitrationCosts ();
272+ if (transaction.sellerFee < arbitrationCost) revert SellerFeeNotCoverArbitrationCosts ();
273273
274- transaction.lastInteraction = block .timestamp ;
274+ transaction.lastFeePaymentTime = block .timestamp ;
275275
276- if (transaction.senderFee < arbitrationCost) {
277- // The sender still has to pay. This can also happen if he has paid, but arbitrationCost has increased.
278- transaction.status = Status.WaitingSender ;
279- emit HasToPayFee (_transactionID, Party.Sender );
276+ if (transaction.buyerFee < arbitrationCost) {
277+ // The buyer still has to pay. This can also happen if he has paid, but arbitrationCost has increased.
278+ transaction.status = Status.WaitingBuyer ;
279+ emit HasToPayFee (_transactionID, Party.Buyer );
280280 } else {
281- // The sender has also paid the fee. We create the dispute.
281+ // The buyer has also paid the fee. We create the dispute.
282282 raiseDispute (_transactionID, arbitrationCost);
283283 }
284284 }
285285
286- /// @dev Reimburse sender if receiver fails to pay the fee.
286+ /// @dev Reimburse buyer if seller fails to pay the fee.
287287 /// @param _transactionID The index of the transaction.
288- function timeOutBySender (uint256 _transactionID ) external {
288+ function timeOutByBuyer (uint256 _transactionID ) external {
289289 Transaction storage transaction = transactions[_transactionID];
290- if (transaction.status != Status.WaitingReceiver ) revert NotWaitingForReceiverFees ();
291- if (block .timestamp - transaction.lastInteraction < feeTimeout) revert TimeoutNotPassed ();
290+ if (transaction.status != Status.WaitingSeller ) revert NotWaitingForSellerFees ();
291+ if (block .timestamp - transaction.lastFeePaymentTime < feeTimeout) revert TimeoutNotPassed ();
292292
293- if (transaction.receiverFee != 0 ) {
294- transaction.receiver .send (transaction.receiverFee ); // It is the user responsibility to accept ETH.
295- transaction.receiverFee = 0 ;
293+ if (transaction.sellerFee != 0 ) {
294+ transaction.seller .send (transaction.sellerFee ); // It is the user responsibility to accept ETH.
295+ transaction.sellerFee = 0 ;
296296 }
297- executeRuling (_transactionID, uint256 (Party.Sender ));
298- emit TransactionResolved (_transactionID, Resolution.TimeoutBySender );
297+ executeRuling (_transactionID, uint256 (Party.Buyer ));
298+ emit TransactionResolved (_transactionID, Resolution.TimeoutByBuyer );
299299 }
300300
301- /// @dev Pay receiver if sender fails to pay the fee.
301+ /// @dev Pay seller if buyer fails to pay the fee.
302302 /// @param _transactionID The index of the transaction.
303- function timeOutByReceiver (uint256 _transactionID ) external {
303+ function timeOutBySeller (uint256 _transactionID ) external {
304304 Transaction storage transaction = transactions[_transactionID];
305- if (transaction.status != Status.WaitingSender ) revert NotWaitingForSenderFees ();
306- if (block .timestamp - transaction.lastInteraction < feeTimeout) revert TimeoutNotPassed ();
305+ if (transaction.status != Status.WaitingBuyer ) revert NotWaitingForBuyerFees ();
306+ if (block .timestamp - transaction.lastFeePaymentTime < feeTimeout) revert TimeoutNotPassed ();
307307
308- if (transaction.senderFee != 0 ) {
309- transaction.sender .send (transaction.senderFee ); // It is the user responsibility to accept ETH.
310- transaction.senderFee = 0 ;
308+ if (transaction.buyerFee != 0 ) {
309+ transaction.buyer .send (transaction.buyerFee ); // It is the user responsibility to accept ETH.
310+ transaction.buyerFee = 0 ;
311311 }
312312
313- executeRuling (_transactionID, uint256 (Party.Receiver ));
314- emit TransactionResolved (_transactionID, Resolution.TimeoutByReceiver );
313+ executeRuling (_transactionID, uint256 (Party.Seller ));
314+ emit TransactionResolved (_transactionID, Resolution.TimeoutBySeller );
315315 }
316316
317317 /// @dev Give a ruling for a dispute. Must be called by the arbitrator to enforce the final ruling.
@@ -348,41 +348,41 @@ contract Escrow is IArbitrableV2 {
348348 disputeIDtoTransactionID[transaction.disputeID] = _transactionID;
349349 emit DisputeRequest (arbitrator, transaction.disputeID, _transactionID, templateId, "" );
350350
351- // Refund sender if he overpaid.
352- if (transaction.senderFee > _arbitrationCost) {
353- uint256 extraFeeSender = transaction.senderFee - _arbitrationCost;
354- transaction.senderFee = _arbitrationCost;
355- transaction.sender .send (extraFeeSender ); // It is the user responsibility to accept ETH.
351+ // Refund buyer if he overpaid.
352+ if (transaction.buyerFee > _arbitrationCost) {
353+ uint256 extraFeeBuyer = transaction.buyerFee - _arbitrationCost;
354+ transaction.buyerFee = _arbitrationCost;
355+ transaction.buyer .send (extraFeeBuyer ); // It is the user responsibility to accept ETH.
356356 }
357357
358- // Refund receiver if he overpaid.
359- if (transaction.receiverFee > _arbitrationCost) {
360- uint256 extraFeeReceiver = transaction.receiverFee - _arbitrationCost;
361- transaction.receiverFee = _arbitrationCost;
362- transaction.receiver .send (extraFeeReceiver ); // It is the user responsibility to accept ETH.
358+ // Refund seller if he overpaid.
359+ if (transaction.sellerFee > _arbitrationCost) {
360+ uint256 extraFeeSeller = transaction.sellerFee - _arbitrationCost;
361+ transaction.sellerFee = _arbitrationCost;
362+ transaction.seller .send (extraFeeSeller ); // It is the user responsibility to accept ETH.
363363 }
364364 }
365365
366366 /// @dev Execute a ruling of a dispute. It reimburses the fee to the winning party.
367367 /// @param _transactionID The index of the transaction.
368- /// @param _ruling Ruling given by the arbitrator. 1 : Reimburse the receiver . 2 : Pay the sender .
368+ /// @param _ruling Ruling given by the arbitrator. 1 : Reimburse the seller . 2 : Pay the buyer .
369369 function executeRuling (uint256 _transactionID , uint256 _ruling ) internal {
370370 Transaction storage transaction = transactions[_transactionID];
371371 // Give the arbitration fee back.
372372 // Note that we use send to prevent a party from blocking the execution.
373- if (_ruling == uint256 (Party.Sender )) {
374- transaction.sender .send (transaction.senderFee + transaction.amount);
375- } else if (_ruling == uint256 (Party.Receiver )) {
376- transaction.receiver .send (transaction.receiverFee + transaction.amount);
373+ if (_ruling == uint256 (Party.Buyer )) {
374+ transaction.buyer .send (transaction.buyerFee + transaction.amount);
375+ } else if (_ruling == uint256 (Party.Seller )) {
376+ transaction.seller .send (transaction.sellerFee + transaction.amount);
377377 } else {
378- uint256 splitAmount = (transaction.senderFee + transaction.amount) / 2 ;
379- transaction.sender .send (splitAmount);
380- transaction.receiver .send (splitAmount);
378+ uint256 splitAmount = (transaction.buyerFee + transaction.amount) / 2 ;
379+ transaction.buyer .send (splitAmount);
380+ transaction.seller .send (splitAmount);
381381 }
382382
383383 transaction.amount = 0 ;
384- transaction.senderFee = 0 ;
385- transaction.receiverFee = 0 ;
384+ transaction.buyerFee = 0 ;
385+ transaction.sellerFee = 0 ;
386386 transaction.status = Status.TransactionResolved;
387387
388388 emit TransactionResolved (_transactionID, Resolution.RulingEnforced);
@@ -403,17 +403,17 @@ contract Escrow is IArbitrableV2 {
403403 // ************************************* //
404404
405405 error GovernorOnly ();
406- error SenderOnly ();
407- error ReceiverOnly ();
406+ error BuyerOnly ();
407+ error SellerOnly ();
408408 error ArbitratorOnly ();
409409 error TransactionDisputed ();
410410 error MaximumPaymentAmountExceeded ();
411411 error DisputeAlreadyCreatedOrTransactionAlreadyExecuted ();
412412 error DeadlineNotPassed ();
413- error SenderFeeNotCoverArbitrationCosts ();
414- error ReceiverFeeNotCoverArbitrationCosts ();
415- error NotWaitingForReceiverFees ();
416- error NotWaitingForSenderFees ();
413+ error BuyerFeeNotCoverArbitrationCosts ();
414+ error SellerFeeNotCoverArbitrationCosts ();
415+ error NotWaitingForSellerFees ();
416+ error NotWaitingForBuyerFees ();
417417 error TimeoutNotPassed ();
418418 error InvalidRuling ();
419419 error DisputeAlreadyResolved ();
0 commit comments