// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)pragmasolidity ^0.8.0;/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/abstractcontractContext{
function_msgSender() internalviewvirtualreturns (address) {
returnmsg.sender;
}
function_msgData() internalviewvirtualreturns (bytescalldata) {
returnmsg.data;
}
function_contextSuffixLength() internalviewvirtualreturns (uint256) {
return0;
}
}
Contract Source Code
File 2 of 3: HologramCheckIn.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;import {Ownable} from"@openzeppelin/contracts/access/Ownable.sol";
contractHologramCheckInisOwnable{
// Mapping from address to number of check-insmapping(address=>uint256) public checkInCounts;
// Mapping from address to the last check-in timestampmapping(address=>uint256) public lastCheckInTimestamps;
// Mapping for daily operations countmapping(address=>uint256) public dailyOperationsCount;
// Protocol fee for daily operationsuint256public protocolFee;
// Event to emit when a check-in occurseventCheckedIn(addressindexed user, uint256 date);
// Event for daily operationseventDailyOperations(addressindexed user, uint256 date);
constructor() {
}
/**
* @dev Check in function for daily use.
*/functioncheckIn() public{
require(
!hasCheckedInToday(msg.sender),
"You have already checked in today."
);
// Update the last check-in timestamp to the start of today
lastCheckInTimestamps[msg.sender] =block.timestamp- (block.timestamp%86400);
// Increment the check-in count
checkInCounts[msg.sender] +=1;
emit CheckedIn(msg.sender, block.timestamp);
}
/**
* @dev Perform daily operations, subject to a protocol fee.
*/functiondailyOperations() publicpayable{
require(msg.value>= protocolFee, "Insufficient fee");
// Increment the daily operations count for sender
dailyOperationsCount[msg.sender] +=1;
emit DailyOperations(msg.sender, block.timestamp);
}
/**
* @dev Set the protocol fee for daily operations.
* @param _fee The new fee amount.
*/functionsetProtocolFee(uint256 _fee) publiconlyOwner{
protocolFee = _fee;
}
/**
* @dev Withdraw contract balance to the owner's address.
* Useful for withdrawing the accumulated protocol fees.
*/functionwithdraw() publiconlyOwner{
payable(owner()).transfer(address(this).balance);
}
/**
* @dev Function to check if the user has already checked in today.
* @return bool Returns true if the user has checked in today.
*/functionhasCheckedInToday(address user) publicviewreturns (bool) {
return lastCheckInTimestamps[user] ==block.timestamp- (block.timestamp%86400);
}
}
Contract Source Code
File 3 of 3: Ownable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)pragmasolidity ^0.8.0;import"../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/abstractcontractOwnableisContext{
addressprivate _owner;
eventOwnershipTransferred(addressindexed previousOwner, addressindexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/modifieronlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/functionowner() publicviewvirtualreturns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/function_checkOwner() internalviewvirtual{
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/functionrenounceOwnership() publicvirtualonlyOwner{
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/functiontransferOwnership(address newOwner) publicvirtualonlyOwner{
require(newOwner !=address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/function_transferOwnership(address newOwner) internalvirtual{
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}