@@ -9,6 +9,7 @@ import "./PaymentInput.sol";
9
9
import "./IEscrowContract.sol " ;
10
10
import "@openzeppelin/contracts/token/ERC20/IERC20.sol " ;
11
11
import "./IPurchaseTracker.sol " ;
12
+ import "./PaymentEscrowAdmins.sol " ;
12
13
13
14
/**
14
15
* @title PaymentEscrow
@@ -19,11 +20,11 @@ import "./IPurchaseTracker.sol";
19
20
* @author John R. Kosinski
20
21
* LoadPipe 2024
21
22
*/
22
- contract PaymentEscrow is HasSecurityContext , IEscrowContract
23
+ contract PaymentEscrow is PaymentEscrowAdmins , HasSecurityContext , IEscrowContract
23
24
{
24
- ISystemSettings private settings;
25
- mapping (bytes32 => Payment) private payments;
26
- bool private autoReleaseFlag;
25
+ ISystemSettings public settings;
26
+ mapping (bytes32 => Payment) public payments;
27
+ bool public autoReleaseFlag;
27
28
bool public paused;
28
29
29
30
IPurchaseTracker public purchaseTracker;
@@ -40,7 +41,8 @@ contract PaymentEscrow is HasSecurityContext, IEscrowContract
40
41
event ReleaseAssentGiven (
41
42
bytes32 indexed paymentId ,
42
43
address assentingAddress ,
43
- uint8 assentType // 1 = payer, 2 = receiver, 3 = arbiter
44
+ //TODO: consider making this an enum
45
+ uint8 assentType // 1 = payer, 2 = receiver, 3 = arbiter, 4 = admin
44
46
);
45
47
46
48
event EscrowReleased (
@@ -184,29 +186,28 @@ contract PaymentEscrow is HasSecurityContext, IEscrowContract
184
186
185
187
if (msg .sender != payment.receiver &&
186
188
msg .sender != payment.payer &&
187
- ! securityContext.hasRole (Roles.ARBITER_ROLE, msg .sender ))
189
+ ! securityContext.hasRole (Roles.ARBITER_ROLE, msg .sender ) &&
190
+ ! this .hasAdminPermission (payment.receiver, msg .sender , PermissionRelease))
188
191
{
189
192
revert ("Unauthorized " );
190
193
}
191
194
192
195
if (payment.amount > 0 ) {
193
- if (payment.receiver == msg .sender ) {
194
- if (! payment.receiverReleased) {
195
- payment.receiverReleased = true ;
196
- emit ReleaseAssentGiven (paymentId, msg .sender , 1 );
197
- }
196
+ if (! payment.receiverReleased && payment.receiver == msg .sender ) {
197
+ payment.receiverReleased = true ;
198
+ emit ReleaseAssentGiven (paymentId, msg .sender , 1 );
198
199
}
199
- if (payment.payer == msg .sender ) {
200
- if (! payment.payerReleased) {
201
- payment.payerReleased = true ;
202
- emit ReleaseAssentGiven (paymentId, msg .sender , 2 );
203
- }
200
+ if (! payment.receiverReleased && this .hasAdminPermission (payment.receiver, msg .sender , PermissionRelease)) {
201
+ payment.receiverReleased = true ;
202
+ emit ReleaseAssentGiven (paymentId, msg .sender , 4 );
204
203
}
205
- if (securityContext.hasRole (Roles.ARBITER_ROLE, msg .sender )) {
206
- if (! payment.payerReleased) {
207
- payment.payerReleased = true ;
208
- emit ReleaseAssentGiven (paymentId, msg .sender , 3 );
209
- }
204
+ if (! payment.payerReleased && payment.payer == msg .sender ) {
205
+ payment.payerReleased = true ;
206
+ emit ReleaseAssentGiven (paymentId, msg .sender , 2 );
207
+ }
208
+ if (! payment.payerReleased && securityContext.hasRole (Roles.ARBITER_ROLE, msg .sender )) {
209
+ payment.payerReleased = true ;
210
+ emit ReleaseAssentGiven (paymentId, msg .sender , 3 );
210
211
}
211
212
212
213
_releaseEscrowPayment (paymentId);
@@ -233,10 +234,16 @@ contract PaymentEscrow is HasSecurityContext, IEscrowContract
233
234
function refundPayment (bytes32 paymentId , uint256 amount ) external whenNotPaused {
234
235
Payment storage payment = payments[paymentId];
235
236
require (payment.released == false , "Payment already released " );
237
+
236
238
if (payment.amount > 0 && payment.amountRefunded <= payment.amount) {
237
- if (payment.receiver != msg .sender && ! securityContext.hasRole (Roles.ARBITER_ROLE, msg .sender ))
239
+ //check permission to refund
240
+ if (payment.receiver != msg .sender &&
241
+ ! securityContext.hasRole (Roles.ARBITER_ROLE, msg .sender ) &&
242
+ ! this .hasAdminPermission (payment.receiver, msg .sender , PermissionRefund)
243
+ )
238
244
revert ("Unauthorized " );
239
245
246
+ //check amount to refund
240
247
uint256 activeAmount = payment.amount - payment.amountRefunded;
241
248
if (amount > activeAmount)
242
249
revert ("AmountExceeded " );
0 commit comments