RewardContract

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20 {
    function transfer(address recipient, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}

contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == _owner, "Ownable: caller is not the owner");
        _;
    }

    function owner() external view returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Ownable: zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ReentrancyGuard {
    uint256 private _status = 1;

    modifier nonReentrant() {
        require(_status != 2, "ReentrancyGuard: reentrant call");
        _status = 2;
        _;
        _status = 1;
    }
}

contract RewardContract is Ownable, ReentrancyGuard {
    IERC20 public immutable rewardToken;

    struct RewardHistory {
        uint256 amount;
        uint256 timestamp;
    }

    mapping(address => uint256) public rewards;
    mapping(address => RewardHistory[]) public rewardHistory;

    uint256 public claimStartTime;

    event RewardAdded(address indexed user, uint256 amount);
    event RewardClaimed(address indexed user, uint256 amount);

    constructor(address _rewardToken) {
        require(_rewardToken != address(0), "Invalid token address");
        rewardToken = IERC20(_rewardToken);
    }

    
    function addReward(address user, uint256 amount) external onlyOwner {
        require(user != address(0), "Invalid user address");
        require(amount > 0, "Amount must be > 0");
        rewards[user] += amount;
        rewardHistory[user].push(RewardHistory(amount, block.timestamp));
        emit RewardAdded(user, amount);
    }

    /// @notice 사용자가 보상을 청구
    function claimReward() external nonReentrant {
        require(block.timestamp >= claimStartTime, "Claiming not started");
        uint256 reward = rewards[msg.sender];
        require(reward > 0, "No rewards available");

        uint256 contractBalance = rewardToken.balanceOf(address(this));
        require(contractBalance >= reward, "Insufficient contract balance");

        rewards[msg.sender] = 0;

        bool sent = rewardToken.transfer(msg.sender, reward);
        require(sent, "Transfer failed");

        emit RewardClaimed(msg.sender, reward);
    }

    
    function setClaimStartTime(uint256 _startTime) external onlyOwner {
        claimStartTime = _startTime;
    }

    
    function getPendingReward(address user) external view returns (uint256) {
        return rewards[user];
    }
}

Tags:
addr:0x2795717f2d0e9325b79fe1b7e22540a3e7dfa6e5|verified:true|block:23459690|tx:0xcc4be2f27493bf83a11df7252eeefdd94add03a3a1719aedb88c3b8dcfbd3e5f|first_check:1759052169

Submitted on: 2025-09-28 11:36:10

Comments

Log in to comment.

No comments yet.