marketplace: use SafeERC20 for transfers

This commit is contained in:
Mark Spanbroek 2025-02-24 16:32:13 +01:00
parent 9b42a4627f
commit 994e328b05

View File

@ -2,6 +2,7 @@
pragma solidity 0.8.28;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "./Configuration.sol";
@ -30,7 +31,6 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
error Marketplace_SlotNotFree();
error Marketplace_InvalidSlotHost();
error Marketplace_AlreadyPaid();
error Marketplace_TransferFailed();
error Marketplace_UnknownRequest();
error Marketplace_InvalidState();
error Marketplace_StartNotBeforeExpiry();
@ -40,6 +40,7 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
error Marketplace_NothingToWithdraw();
error Marketplace_DurationExceedsLimit();
using SafeERC20 for IERC20;
using EnumerableSet for EnumerableSet.Bytes32Set;
using EnumerableSet for EnumerableSet.AddressSet;
using Requests for Request;
@ -170,7 +171,7 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
uint256 amount = request.maxPrice();
_requestContexts[id].fundsToReturnToClient = amount;
_marketplaceTotals.received += amount;
_transferFrom(msg.sender, amount);
_token.safeTransferFrom(msg.sender, address(this), amount);
emit StorageRequested(id, request.ask, _requestContexts[id].expiresAt);
}
@ -230,7 +231,7 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
} else {
collateralAmount = collateralPerSlot;
}
_transferFrom(msg.sender, collateralAmount);
_token.safeTransferFrom(msg.sender, address(this), collateralAmount);
_marketplaceTotals.received += collateralAmount;
slot.currentCollateral = collateralPerSlot; // Even if he has collateral discounted, he is operating with full collateral
@ -343,7 +344,7 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
uint256 validatorRewardAmount = (slashedAmount *
_config.collateral.validatorRewardPercentage) / 100;
_marketplaceTotals.sent += validatorRewardAmount;
assert(_token.transfer(msg.sender, validatorRewardAmount));
_token.safeTransfer(msg.sender, validatorRewardAmount);
slot.currentCollateral -= slashedAmount;
if (missingProofs(slotId) >= _config.collateral.maxNumberOfSlashes) {
@ -409,13 +410,8 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
uint256 collateralAmount = slot.currentCollateral;
_marketplaceTotals.sent += (payoutAmount + collateralAmount);
slot.state = SlotState.Paid;
if (!_token.transfer(rewardRecipient, payoutAmount)) {
revert Marketplace_TransferFailed();
}
if (!_token.transfer(collateralRecipient, collateralAmount)) {
revert Marketplace_TransferFailed();
}
_token.safeTransfer(rewardRecipient, payoutAmount);
_token.safeTransfer(collateralRecipient, collateralAmount);
}
/**
@ -444,13 +440,8 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
uint256 collateralAmount = slot.currentCollateral;
_marketplaceTotals.sent += (payoutAmount + collateralAmount);
slot.state = SlotState.Paid;
if (!_token.transfer(rewardRecipient, payoutAmount)) {
revert Marketplace_TransferFailed();
}
if (!_token.transfer(collateralRecipient, collateralAmount)) {
revert Marketplace_TransferFailed();
}
_token.safeTransfer(rewardRecipient, payoutAmount);
_token.safeTransfer(collateralRecipient, collateralAmount);
}
/**
@ -517,9 +508,7 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
uint256 amount = context.fundsToReturnToClient;
_marketplaceTotals.sent += amount;
if (!_token.transfer(withdrawRecipient, amount)) {
revert Marketplace_TransferFailed();
}
_token.safeTransfer(withdrawRecipient, amount);
// We zero out the funds tracking in order to prevent double-spends
context.fundsToReturnToClient = 0;
@ -660,12 +649,6 @@ contract Marketplace is SlotReservations, Proofs, StateRetrieval, Endian {
(request.ask.proofProbability * (256 - _config.proofs.downtime)) / 256;
}
function _transferFrom(address sender, uint256 amount) internal {
address receiver = address(this);
if (!_token.transferFrom(sender, receiver, amount))
revert Marketplace_TransferFailed();
}
event StorageRequested(RequestId requestId, Ask ask, uint64 expiry);
event RequestFulfilled(RequestId indexed requestId);
event RequestFailed(RequestId indexed requestId);