Skip to content

Commit 22b3944

Browse files
committed
cleaner logic
1 parent 98cc3b3 commit 22b3944

File tree

2 files changed

+152
-197
lines changed

2 files changed

+152
-197
lines changed

contracts/src/Payer.sol

+68-88
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
3030
uint256 public constant MAX_TOLERABLE_DEBT_AMOUNT_MICRO_DOLLARS = 100_000_000;
3131
uint256 public constant DEFAULT_WITHDRAWAL_LOCK_PERIOD = 3 days;
3232
uint256 public constant ABSOLUTE_MINIMUM_WITHDRAWAL_LOCK_PERIOD = 1 days;
33-
uint256 public constant DEFAULT_MAX_BACKDATED_TIME = 1 days;
34-
uint256 public constant ABSOLUTE_MINIMUM_MAX_BACKDATED_TIME = 6 hours;
3533
string internal constant USDC_SYMBOL = "USDC";
3634

3735
/* ============ UUPS Storage ============ */
@@ -43,20 +41,16 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
4341
address distributionContract;
4442
address nodesContract;
4543
address payerReportContract;
46-
4744
/// @dev Configuration parameters
4845
uint256 minimumRegistrationAmountMicroDollars;
4946
uint256 minimumDepositAmountMicroDollars;
5047
uint256 maxTolerableDebtAmountMicroDollars;
5148
uint256 withdrawalLockPeriod;
52-
uint256 maxBackdatedTime;
53-
5449
/// @dev State variables
5550
uint256 lastFeeTransferTimestamp;
5651
uint256 pendingFees;
5752
uint256 totalAmountDeposited;
5853
uint256 totalDebtAmount;
59-
6054
/// @dev Mappings
6155
uint256 collectedFees;
6256
mapping(address => Payer) payers;
@@ -129,7 +123,6 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
129123
$.minimumRegistrationAmountMicroDollars = DEFAULT_MINIMUM_REGISTRATION_AMOUNT_MICRO_DOLLARS;
130124
$.minimumDepositAmountMicroDollars = DEFAULT_MINIMUM_DEPOSIT_AMOUNT_MICRO_DOLLARS;
131125
$.withdrawalLockPeriod = DEFAULT_WITHDRAWAL_LOCK_PERIOD;
132-
$.maxBackdatedTime = DEFAULT_MAX_BACKDATED_TIME;
133126

134127
_setUsdcTokenContract(_usdcToken);
135128
_setNodesContract(_nodesContract);
@@ -177,14 +170,19 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
177170
PayerStorage storage $ = _getPayerStorage();
178171

179172
require(amount >= $.minimumDepositAmountMicroDollars, InsufficientAmount());
180-
181-
if ($.withdrawals[msg.sender].requestTimestamp != 0) revert PayerInWithdrawal();
173+
require($.withdrawals[msg.sender].requestTimestamp == 0, PayerInWithdrawal());
182174

183175
_deposit(msg.sender, amount);
184176

185-
_updatePayerBalance(msg.sender, amount);
177+
// TODO: Extract this logic to a helper function.
178+
if ($.payers[msg.sender].debtAmount > 0) {
179+
_settleDebts(msg.sender, amount);
180+
} else {
181+
$.payers[msg.sender].balance += amount;
182+
_increaseTotalAmountDeposited(amount);
183+
}
186184

187-
$.payers[msg.sender].latestDepositTimestamp = block.timestamp;
185+
emit PayerBalanceUpdated(msg.sender, $.payers[msg.sender].balance, $.payers[msg.sender].debtAmount);
188186
}
189187

190188
/**
@@ -196,14 +194,21 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
196194

197195
PayerStorage storage $ = _getPayerStorage();
198196

199-
if ($.withdrawals[payer].requestTimestamp != 0) revert PayerInWithdrawal();
197+
require($.withdrawals[payer].requestTimestamp == 0, PayerInWithdrawal());
200198

201199
_deposit(msg.sender, amount);
202200

203-
_updatePayerBalance(payer, amount);
201+
// TODO: Extract this logic to a helper function.
202+
if ($.payers[payer].debtAmount > 0) {
203+
_settleDebts(payer, amount);
204+
} else {
205+
$.payers[payer].balance += amount;
206+
_increaseTotalAmountDeposited(amount);
207+
}
204208

205209
$.payers[payer].latestDonationTimestamp = block.timestamp;
206210

211+
emit PayerBalanceUpdated(payer, $.payers[payer].balance, $.payers[payer].debtAmount);
207212
emit Donation(msg.sender, payer, amount);
208213
}
209214

@@ -224,12 +229,12 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
224229

225230
PayerStorage storage $ = _getPayerStorage();
226231

232+
require($.withdrawals[payer].requestTimestamp == 0, PayerInWithdrawal());
233+
227234
if ($.payers[payer].balance > 0 || $.payers[payer].debtAmount > 0) {
228235
revert PayerHasBalanceOrDebt();
229236
}
230237

231-
if ($.withdrawals[payer].requestTimestamp != 0) revert PayerInWithdrawal();
232-
233238
// Delete all payer data
234239
delete $.payers[payer];
235240
require($.totalPayers.remove(payer), FailedToDeletePayer());
@@ -253,7 +258,7 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
253258

254259
// Balance to be withdrawn is deducted from the payer's balance,
255260
// it can't be used to settle payments.
256-
_decreasePayerBalance(msg.sender, amount);
261+
$.payers[msg.sender].balance -= amount;
257262
_decreaseTotalAmountDeposited(amount);
258263

259264
uint256 withdrawableTimestamp = block.timestamp + $.withdrawalLockPeriod;
@@ -279,7 +284,8 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
279284

280285
delete $.withdrawals[msg.sender];
281286

282-
_updatePayerBalance(msg.sender, withdrawal.amount);
287+
$.payers[msg.sender].balance += withdrawal.amount;
288+
_increaseTotalAmountDeposited(withdrawal.amount);
283289

284290
emit WithdrawalCancelled(msg.sender, withdrawal.requestTimestamp);
285291
}
@@ -294,11 +300,13 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
294300

295301
Withdrawal memory withdrawal = $.withdrawals[msg.sender];
296302

297-
// TODO: A payer withdrawing funds can still incur debt.
298-
// We need to handle this case.
299-
// if ($.payers[msg.sender].debtAmount > 0) {}
303+
uint256 finalWithdrawalAmount = withdrawal.amount;
300304

301-
$.usdcToken.safeTransfer(msg.sender, withdrawal.amount);
305+
if ($.payers[msg.sender].debtAmount > 0) {
306+
finalWithdrawalAmount = _settleDebts(msg.sender, withdrawal.amount);
307+
}
308+
309+
$.usdcToken.safeTransfer(msg.sender, finalWithdrawalAmount);
302310

303311
delete $.withdrawals[msg.sender];
304312

@@ -319,37 +327,38 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
319327
/**
320328
* @inheritdoc IPayer
321329
*/
322-
function settleUsage(
323-
address[] calldata payerList,
324-
uint256[] calldata amountsList
325-
) external whenNotPaused onlyPayerReport {
330+
function settleUsage(uint256 originatorNode, address[] calldata payerList, uint256[] calldata amountsList)
331+
external
332+
whenNotPaused
333+
onlyPayerReport
334+
{
326335
require(payerList.length == amountsList.length, InvalidPayerListLength());
327336

328337
PayerStorage storage $ = _getPayerStorage();
329338

339+
uint256 fees = 0;
340+
330341
for (uint256 i = 0; i < payerList.length; i++) {
331342
address payer = payerList[i];
332343
uint256 amount = amountsList[i];
333344

334345
// This should never happen, as PayerReport has already verified the payers and amounts.
335346
// Payers in payerList should always exist and be active.
336-
if (!_payerExists(payer)) {
337-
_decreaseTotalAmountDeposited(amount);
338-
347+
if (!_payerExists(payer) || !_payerIsActive(payer)) {
339348
continue;
340349
}
341350

342-
if (!_payerIsActive(payer)) continue;
343-
344351
Payer memory storedPayer = $.payers[payer];
345352

346353
if (storedPayer.balance < amount) {
347354
uint256 debt = amount - storedPayer.balance;
348355

349356
$.collectedFees += storedPayer.balance;
357+
fees += storedPayer.balance;
350358

351359
storedPayer.balance = 0;
352360
storedPayer.debtAmount = debt;
361+
$.payers[payer] = storedPayer;
353362

354363
_addDebtor(payer);
355364
_increaseTotalDebtAmount(debt);
@@ -362,17 +371,24 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
362371
}
363372

364373
$.collectedFees += amount;
374+
fees += amount;
365375

366376
storedPayer.balance -= amount;
367377

378+
$.payers[payer] = storedPayer;
379+
368380
emit PayerBalanceUpdated(payer, storedPayer.balance, storedPayer.debtAmount);
369381
}
382+
383+
emit UsageSettled(originatorNode, block.timestamp, fees);
370384
}
371385

372386
/**
373387
* @inheritdoc IPayer
374388
*/
375-
function transferFeesToDistribution() external whenNotPaused onlyRole(ADMIN_ROLE) {
389+
function transferFeesToDistribution() external whenNotPaused onlyNodeOperator {
390+
// TODO: Should this be triggered by node operator?
391+
// Or by settleUsage?
376392
// TODO: Implement fee transfer logic
377393
// Update lastFeeTransferTimestamp
378394
// Update pendingFees
@@ -455,20 +471,6 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
455471
emit WithdrawalLockPeriodSet(oldWithdrawalLockPeriod, _newWithdrawalLockPeriod);
456472
}
457473

458-
/**
459-
* @inheritdoc IPayer
460-
*/
461-
function setMaxBackdatedTime(uint256 _newMaxBackdatedTime) external onlyRole(ADMIN_ROLE) {
462-
require(_newMaxBackdatedTime >= ABSOLUTE_MINIMUM_MAX_BACKDATED_TIME, InvalidMaxBackdatedTime());
463-
464-
PayerStorage storage $ = _getPayerStorage();
465-
466-
uint256 oldMaxBackdatedTime = $.maxBackdatedTime;
467-
$.maxBackdatedTime = _newMaxBackdatedTime;
468-
469-
emit MaxBackdatedTimeSet(oldMaxBackdatedTime, _newMaxBackdatedTime);
470-
}
471-
472474
/**
473475
* @inheritdoc IPayer
474476
*/
@@ -647,13 +649,6 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
647649
return _getPayerStorage().pendingFees;
648650
}
649651

650-
/**
651-
* @inheritdoc IPayer
652-
*/
653-
function getMaxBackdatedTime() external view returns (uint256 maxTime) {
654-
return _getPayerStorage().maxBackdatedTime;
655-
}
656-
657652
/* ============ Internal ============ */
658653

659654
function _deposit(address payer, uint256 amount) internal {
@@ -662,49 +657,34 @@ contract Payer is Initializable, AccessControlUpgradeable, UUPSUpgradeable, Paus
662657
$.usdcToken.safeTransferFrom(payer, address(this), amount);
663658
}
664659

665-
/**
666-
* @notice Updates a payer's balance by the specified amount.
667-
* If the payer has debt, the debt is subtracted from the amount.
668-
* If the payer has no debt, the amount is added to the balance.
669-
* @param payerAddress The address of the payer.
670-
* @param amount The amount to update by.
671-
*/
672-
function _updatePayerBalance(address payerAddress, uint256 amount) internal {
673-
// TODO: Remove this logic, in favor of settleDebts() or similar.
674-
Payer storage payer = _getPayerStorage().payers[payerAddress];
660+
function _settleDebts(address payer, uint256 amount) internal returns (uint256 amountAfterSettlement) {
661+
PayerStorage storage $ = _getPayerStorage();
662+
663+
Payer memory storedPayer = $.payers[payer];
675664

676-
if (payer.debtAmount == 0) {
677-
payer.balance += amount;
665+
if (storedPayer.debtAmount < amount) {
666+
uint256 debtToRemove = storedPayer.debtAmount;
667+
amount -= debtToRemove;
668+
669+
storedPayer.debtAmount = 0;
670+
storedPayer.balance += amount;
671+
672+
_removeDebtor(payer);
678673
_increaseTotalAmountDeposited(amount);
674+
_decreaseTotalDebtAmount(debtToRemove);
675+
676+
amountAfterSettlement = amount;
679677
} else {
680-
if (payer.debtAmount < amount) {
681-
uint256 debtToRemove = payer.debtAmount;
682-
amount -= debtToRemove;
683-
payer.debtAmount = 0;
684-
payer.balance += amount;
685-
_removeDebtor(payerAddress);
686-
_increaseTotalAmountDeposited(amount);
687-
_decreaseTotalDebtAmount(debtToRemove);
688-
} else {
689-
payer.debtAmount -= amount;
690-
_decreaseTotalDebtAmount(amount);
691-
}
692-
}
678+
storedPayer.debtAmount -= amount;
693679

694-
emit PayerBalanceUpdated(payerAddress, payer.balance, payer.debtAmount);
695-
}
680+
_decreaseTotalDebtAmount(amount);
696681

697-
/**
698-
* @notice Decreases a payer's balance by the specified amount.
699-
* @param payerAddress The address of the payer.
700-
* @param amount The amount to decrease by.
701-
*/
702-
function _decreasePayerBalance(address payerAddress, uint256 amount) internal {
703-
Payer storage payer = _getPayerStorage().payers[payerAddress];
682+
amountAfterSettlement = 0;
683+
}
704684

705-
payer.balance -= amount;
685+
$.payers[payer] = storedPayer;
706686

707-
emit PayerBalanceUpdated(payerAddress, payer.balance, payer.debtAmount);
687+
return amountAfterSettlement;
708688
}
709689

710690
/**

0 commit comments

Comments
 (0)