Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- GMCounter
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2025-09-03T14:04:31.575537Z
Constructor Arguments
0x00000000000000000000000021ad6ef3979638d8e73747f22b92c4aade145d8200000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000009c4
Arg [0] (address) : 0x21ad6ef3979638d8e73747f22b92c4aade145d82
Arg [1] (uint256) : 1600000000000000000
Arg [2] (uint256) : 2500
Contract source code
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.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.
*
* The initial owner is set to the address provided by the deployer. 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.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @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.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: contracts/GMCounter.sol
contract GMCounter is Ownable {
address public treasury;
uint256 public fee;
uint256 public referralFees;
uint256 public constant BASIS_POINTS = 10000;
mapping(address => uint256) public lastGM;
uint256 public totalGMs;
event GMSent(address indexed sender, address indexed referral);
error InsufficientETH();
error AlreadySentGM();
error ReferralTransferFailed();
error FeeTransferFailed();
error SelfReferral();
constructor(
address _treasury,
uint256 _fee,
uint256 _referralFees
) Ownable(msg.sender) {
treasury = _treasury;
fee = _fee;
referralFees = _referralFees;
}
function sayGM(address referral) external payable {
if (msg.value < fee) {
revert InsufficientETH();
}
if (referral == msg.sender) {
revert SelfReferral();
}
uint256 today = block.timestamp / 86400;
if (lastGM[msg.sender] == today) {
revert AlreadySentGM();
}
lastGM[msg.sender] = today;
totalGMs += 1;
uint256 referralAmount = 0;
if (referral != address(0)) {
referralAmount = (msg.value * referralFees) / BASIS_POINTS;
(bool refSuccess, ) = referral.call{value: referralAmount}("");
if (!refSuccess) {
revert ReferralTransferFailed();
}
}
uint256 remaining = msg.value - referralAmount;
(bool success, ) = treasury.call{value: remaining}("");
if (!success) {
revert FeeTransferFailed();
}
emit GMSent(msg.sender, referral);
}
function nextGMTimer(address user) external view returns (uint256) {
uint256 today = block.timestamp / 86400;
if (lastGM[user] < today) {
return 0;
}
uint256 nextDay = (today + 1) * 86400;
return nextDay - block.timestamp;
}
function setTreasury(address _treasury) external onlyOwner {
require(_treasury != address(0), "Invalid treasury address");
treasury = _treasury;
}
function setFee(uint256 _fee) external onlyOwner {
require(_fee > 0, "Invalid fee");
fee = _fee;
}
function setReferralFees(uint256 _referralFees) external onlyOwner {
require(_referralFees < BASIS_POINTS, "Invalid referral fees");
referralFees = _referralFees;
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_treasury","internalType":"address"},{"type":"uint256","name":"_fee","internalType":"uint256"},{"type":"uint256","name":"_referralFees","internalType":"uint256"}]},{"type":"error","name":"AlreadySentGM","inputs":[]},{"type":"error","name":"FeeTransferFailed","inputs":[]},{"type":"error","name":"InsufficientETH","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"ReferralTransferFailed","inputs":[]},{"type":"error","name":"SelfReferral","inputs":[]},{"type":"event","name":"GMSent","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"referral","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BASIS_POINTS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastGM","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nextGMTimer","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"referralFees","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"sayGM","inputs":[{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFee","inputs":[{"type":"uint256","name":"_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReferralFees","inputs":[{"type":"uint256","name":"_referralFees","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTreasury","inputs":[{"type":"address","name":"_treasury","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalGMs","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5060405161093f38038061093f83398101604081905261002f916100db565b338061005557604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61005e8161008b565b50600180546001600160a01b0319166001600160a01b03949094169390931790925560025560035561011e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000606084860312156100f057600080fd5b83516001600160a01b038116811461010757600080fd5b602085015160409095015190969495509392505050565b6108128061012d6000396000f3fe6080604052600436106100dd5760003560e01c8063cf5be0e01161007f578063e1f1c4a711610059578063e1f1c4a71461022e578063efdf07d514610244578063f0f442601461025a578063f2fde38b1461027a57600080fd5b8063cf5be0e0146101e5578063d371cd5014610205578063ddca3f431461021857600080fd5b806385f080c2116100bb57806385f080c2146101565780638da5cb5b1461019157806392630546146101af578063a29002ac146101cf57600080fd5b806361d027b3146100e257806369fe0e2d1461011f578063715018a614610141575b600080fd5b3480156100ee57600080fd5b50600154610102906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012b57600080fd5b5061013f61013a366004610718565b61029a565b005b34801561014d57600080fd5b5061013f6102ea565b34801561016257600080fd5b50610183610171366004610731565b60046020526000908152604090205481565b604051908152602001610116565b34801561019d57600080fd5b506000546001600160a01b0316610102565b3480156101bb57600080fd5b5061013f6101ca366004610718565b6102fe565b3480156101db57600080fd5b5061018360055481565b3480156101f157600080fd5b50610183610200366004610731565b610354565b61013f610213366004610731565b6103be565b34801561022457600080fd5b5061018360025481565b34801561023a57600080fd5b5061018361271081565b34801561025057600080fd5b5061018360035481565b34801561026657600080fd5b5061013f610275366004610731565b6105dd565b34801561028657600080fd5b5061013f610295366004610731565b61065d565b6102a261069b565b600081116102e55760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b60448201526064015b60405180910390fd5b600255565b6102f261069b565b6102fc60006106c8565b565b61030661069b565b612710811061034f5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420726566657272616c206665657360581b60448201526064016102dc565b600355565b6000806103646201518042610777565b6001600160a01b0384166000908152600460205260409020549091508111156103905750600092915050565b600061039d826001610799565b6103aa90620151806107b2565b90506103b642826107c9565b949350505050565b6002543410156103e157604051631a84bc4160e21b815260040160405180910390fd5b336001600160a01b0382160361040a57604051632af47b8760e11b815260040160405180910390fd5b60006104196201518042610777565b3360009081526004602052604090205490915081900361044c5760405163b899724f60e01b815260040160405180910390fd5b3360009081526004602052604081208290556005805460019290610471908490610799565b90915550600090506001600160a01b0383161561051b576127106003543461049991906107b2565b6104a39190610777565b90506000836001600160a01b03168260405160006040518083038185875af1925050503d80600081146104f2576040519150601f19603f3d011682016040523d82523d6000602084013e6104f7565b606091505b5050905080610519576040516387df070960e01b815260040160405180910390fd5b505b600061052782346107c9565b6001546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114610579576040519150601f19603f3d011682016040523d82523d6000602084013e61057e565b606091505b50509050806105a057604051634033e4e360e01b815260040160405180910390fd5b6040516001600160a01b0386169033907f1dae76dcd764555e67098f3d58983f26d8c514131cf517c44875f3a7a6745c8a90600090a35050505050565b6105e561069b565b6001600160a01b03811661063b5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642074726561737572792061646472657373000000000000000060448201526064016102dc565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b61066561069b565b6001600160a01b03811661068f57604051631e4fbdf760e01b8152600060048201526024016102dc565b610698816106c8565b50565b6000546001600160a01b031633146102fc5760405163118cdaa760e01b81523360048201526024016102dc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561072a57600080fd5b5035919050565b60006020828403121561074357600080fd5b81356001600160a01b038116811461075a57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b60008261079457634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107ac576107ac610761565b92915050565b80820281158282048414176107ac576107ac610761565b818103818111156107ac576107ac61076156fea2646970667358221220a0fecee458739cd764cfea2f84d845fcc2544ce02bd33f932262bd92389e453764736f6c6343000814003300000000000000000000000021ad6ef3979638d8e73747f22b92c4aade145d8200000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000009c4
Deployed ByteCode
0x6080604052600436106100dd5760003560e01c8063cf5be0e01161007f578063e1f1c4a711610059578063e1f1c4a71461022e578063efdf07d514610244578063f0f442601461025a578063f2fde38b1461027a57600080fd5b8063cf5be0e0146101e5578063d371cd5014610205578063ddca3f431461021857600080fd5b806385f080c2116100bb57806385f080c2146101565780638da5cb5b1461019157806392630546146101af578063a29002ac146101cf57600080fd5b806361d027b3146100e257806369fe0e2d1461011f578063715018a614610141575b600080fd5b3480156100ee57600080fd5b50600154610102906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012b57600080fd5b5061013f61013a366004610718565b61029a565b005b34801561014d57600080fd5b5061013f6102ea565b34801561016257600080fd5b50610183610171366004610731565b60046020526000908152604090205481565b604051908152602001610116565b34801561019d57600080fd5b506000546001600160a01b0316610102565b3480156101bb57600080fd5b5061013f6101ca366004610718565b6102fe565b3480156101db57600080fd5b5061018360055481565b3480156101f157600080fd5b50610183610200366004610731565b610354565b61013f610213366004610731565b6103be565b34801561022457600080fd5b5061018360025481565b34801561023a57600080fd5b5061018361271081565b34801561025057600080fd5b5061018360035481565b34801561026657600080fd5b5061013f610275366004610731565b6105dd565b34801561028657600080fd5b5061013f610295366004610731565b61065d565b6102a261069b565b600081116102e55760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b60448201526064015b60405180910390fd5b600255565b6102f261069b565b6102fc60006106c8565b565b61030661069b565b612710811061034f5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420726566657272616c206665657360581b60448201526064016102dc565b600355565b6000806103646201518042610777565b6001600160a01b0384166000908152600460205260409020549091508111156103905750600092915050565b600061039d826001610799565b6103aa90620151806107b2565b90506103b642826107c9565b949350505050565b6002543410156103e157604051631a84bc4160e21b815260040160405180910390fd5b336001600160a01b0382160361040a57604051632af47b8760e11b815260040160405180910390fd5b60006104196201518042610777565b3360009081526004602052604090205490915081900361044c5760405163b899724f60e01b815260040160405180910390fd5b3360009081526004602052604081208290556005805460019290610471908490610799565b90915550600090506001600160a01b0383161561051b576127106003543461049991906107b2565b6104a39190610777565b90506000836001600160a01b03168260405160006040518083038185875af1925050503d80600081146104f2576040519150601f19603f3d011682016040523d82523d6000602084013e6104f7565b606091505b5050905080610519576040516387df070960e01b815260040160405180910390fd5b505b600061052782346107c9565b6001546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114610579576040519150601f19603f3d011682016040523d82523d6000602084013e61057e565b606091505b50509050806105a057604051634033e4e360e01b815260040160405180910390fd5b6040516001600160a01b0386169033907f1dae76dcd764555e67098f3d58983f26d8c514131cf517c44875f3a7a6745c8a90600090a35050505050565b6105e561069b565b6001600160a01b03811661063b5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642074726561737572792061646472657373000000000000000060448201526064016102dc565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b61066561069b565b6001600160a01b03811661068f57604051631e4fbdf760e01b8152600060048201526024016102dc565b610698816106c8565b50565b6000546001600160a01b031633146102fc5760405163118cdaa760e01b81523360048201526024016102dc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561072a57600080fd5b5035919050565b60006020828403121561074357600080fd5b81356001600160a01b038116811461075a57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b60008261079457634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107ac576107ac610761565b92915050565b80820281158282048414176107ac576107ac610761565b818103818111156107ac576107ac61076156fea2646970667358221220a0fecee458739cd764cfea2f84d845fcc2544ce02bd33f932262bd92389e453764736f6c63430008140033