// SPDX-License-Identifier: MIT pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract ArcEscrow { using SafeERC20 for IERC20;
address public immutable buyer;
address public immutable seller;
IERC20 public immutable usdcToken;
uint256 public immutable amount;
bool public isReleased;
bool public isDeposited;
constructor(address _usdcToken, uint256 _amount) {
buyer = 0x0814D1586F528db4023A6860cf9BE6EDDDE765d1;
seller = 0xeF2b94566BE5F10276042F7BaBB54985EE119C95;
usdcToken = IERC20(_usdcToken);
amount = _amount;
isReleased = false;
isDeposited = false;
}
// Buyer deposits funds
function deposit() external {
require(msg.sender == buyer, "Only buyer can deposit");
require(!isDeposited, "Already deposited");
isDeposited = true;
usdcToken.safeTransferFrom(buyer, address(this), amount);
}
// Buyer releases funds if the work is satisfactory
function releaseFund() external {
require(msg.sender == buyer, "Only buyer can release funds");
require(isDeposited, "No funds deposited yet");
require(!isReleased, "Funds already released");
isReleased = true;
usdcToken.safeTransfer(seller, amount);
}
// Buyer can refund if the deal is canceled
function refund() external {
require(msg.sender == buyer, "Only buyer can refund");
require(isDeposited, "No funds to refund");
require(!isReleased, "Funds already released to seller");
isDeposited = false;
usdcToken.safeTransfer(buyer, usdcToken.balanceOf(address(this)));
}
}