// SPDX-License-Identifier: MIT
/*
ArtPurchase 1.0.1 img.art
88
"" ,d
88
88 88,dPYba,,adPYba, ,adPPYb,d8 ,adPPYYba, 8b,dPPYba, MM88MMM
88 88P' "88" "8a a8" `Y88 "" `Y8 88P' "Y8 88
88 88 88 88 8b 88 ,adPPPPP88 88 88
88 88 88 88 "8a, ,d88 888 88, ,88 88 88,
88 88 88 88 `"YbbdP"Y8 888 `"8bbdP"Y8 88 "Y888
aa, ,88
"Y8bbdP"
*/
pragma solidity ^0.8.0;
contract ArtPurchase_1_0_1 {
address payable public owner;
uint256 public minimumPayment;
uint256 public totalPurchaseLimit;
uint256 public currentPurchases;
uint256 public userPurchaseLimit;
mapping(address => string[]) public userIDs; // Change to string array
mapping(address => uint256) public hasPurchased;
event Purchase(address indexed purchaser, uint256 value, uint256 purchaseCount, string userID);
modifier onlyOwner() {
require(msg.sender == owner, "Only the contract owner can call this function.");
_;
}
constructor(uint256 _minimumPaymentInWei, uint256 _totalPurchaseLimit, uint256 _userPurchaseLimit) {
owner = payable(msg.sender);
minimumPayment = _minimumPaymentInWei; // Wei
totalPurchaseLimit = _totalPurchaseLimit;
userPurchaseLimit = _userPurchaseLimit;
}
struct PurchaseStatus {
uint256 minimumPayment;
uint256 totalPurchaseLimit;
uint256 currentPurchases;
uint256 userPurchaseLimit;
uint256 hasPurchased;
}
function getPurchaseStatus(address user) public view returns (PurchaseStatus memory) {
return PurchaseStatus(minimumPayment, totalPurchaseLimit, currentPurchases, userPurchaseLimit, hasPurchased[user]);
}
function purchase(string memory userID, uint256 _purchaseCount) external payable {
require(_purchaseCount > 0, "Purchase count must be greater than 0.");
require(msg.value >= minimumPayment * _purchaseCount, "Total payment is below the minimum amount.");
require(hasPurchased[msg.sender] + _purchaseCount <= userPurchaseLimit, "User purchase limit exceeded.");
require(currentPurchases + _purchaseCount <= totalPurchaseLimit, "Total purchase limit reached.");
hasPurchased[msg.sender] += _purchaseCount;
userIDs[msg.sender].push(userID); // Add userID to the array for the sender's address
currentPurchases += _purchaseCount;
emit Purchase(msg.sender, msg.value, _purchaseCount, userID);
}
function updateMinimumPayment(uint256 _newMinimumPaymentInWei) external onlyOwner {
minimumPayment = _newMinimumPaymentInWei; // Wei
}
function setTotalPurchaseLimit(uint256 _totalPurchaseLimit) external onlyOwner {
totalPurchaseLimit = _totalPurchaseLimit;
}
function setUserPurchaseLimit(uint256 _userPurchaseLimit) external onlyOwner {
userPurchaseLimit = _userPurchaseLimit;
}
function withdrawFunds(address payable _to) external onlyOwner {
uint256 balance = address(this).balance;
_to.transfer(balance);
}
function withdrawTokens(address _tokenAddress, address _to, uint256 _amount) external onlyOwner {
IERC20 token = IERC20(_tokenAddress);
token.transfer(_to, _amount);
}
function getUserID(address _user, uint256 _index) public view returns (string memory) {
return userIDs[_user][_index];
}
function getUserIDCount(address _user) public view returns (uint256) {
return userIDs[_user].length;
}
}
interface IERC20 {
function transfer(address recipient, uint256 amount) external returns (bool);
}
{
"compilationTarget": {
"ArtPurchase_1_0_1.sol": "ArtPurchase_1_0_1"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"_minimumPaymentInWei","type":"uint256"},{"internalType":"uint256","name":"_totalPurchaseLimit","type":"uint256"},{"internalType":"uint256","name":"_userPurchaseLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"purchaseCount","type":"uint256"},{"indexed":false,"internalType":"string","name":"userID","type":"string"}],"name":"Purchase","type":"event"},{"inputs":[],"name":"currentPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getPurchaseStatus","outputs":[{"components":[{"internalType":"uint256","name":"minimumPayment","type":"uint256"},{"internalType":"uint256","name":"totalPurchaseLimit","type":"uint256"},{"internalType":"uint256","name":"currentPurchases","type":"uint256"},{"internalType":"uint256","name":"userPurchaseLimit","type":"uint256"},{"internalType":"uint256","name":"hasPurchased","type":"uint256"}],"internalType":"struct ArtPurchase_1_0_1.PurchaseStatus","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserIDCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"userID","type":"string"},{"internalType":"uint256","name":"_purchaseCount","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalPurchaseLimit","type":"uint256"}],"name":"setTotalPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_userPurchaseLimit","type":"uint256"}],"name":"setUserPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinimumPaymentInWei","type":"uint256"}],"name":"updateMinimumPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userIDs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userPurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]