// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract RugRunGame is Ownable {
IERC20 public apuToken;
uint256 public constant GAME_COST = 1000000 ether; // 1M APU (assuming 18 decimals)
event GameStarted(address indexed player, uint256 amount);
event TokensWithdrawn(address indexed owner, uint256 amount);
event RewardAdded(address indexed player, uint256 amount);
mapping(address => uint256) public pendingRewards;
constructor(address _apuToken) Ownable(msg.sender) {
apuToken = IERC20(_apuToken);
}
function startGame() external {
require(apuToken.transferFrom(msg.sender, address(this), GAME_COST), "Transfer failed");
emit GameStarted(msg.sender, GAME_COST);
}
function addReward(address player, uint256 reward) external onlyOwner {
pendingRewards[player] += reward;
emit RewardAdded(player, reward);
}
function claimRewards() external {
uint256 reward = pendingRewards[msg.sender];
require(reward > 0, "No rewards to claim");
pendingRewards[msg.sender] = 0;
require(apuToken.transfer(msg.sender, reward), "Reward transfer failed");
}
function withdrawTokens() external onlyOwner {
uint256 balance = apuToken.balanceOf(address(this));
require(balance > 0, "No tokens to withdraw");
require(apuToken.transfer(owner(), balance), "Withdrawal failed");
emit TokensWithdrawn(owner(), balance);
}
}
{
"compilationTarget": {
"contracts/game.sol": "RugRunGame"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/contracts/=./.deps/npm/@openzeppelin/contracts/",
":@uniswap/v3-core/=./.deps/npm/@uniswap/v3-core/"
]
}
[{"inputs":[{"internalType":"address","name":"_apuToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"inputs":[],"name":"GAME_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apuToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]