-
Notifications
You must be signed in to change notification settings - Fork 453
Open
Description
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function transfer(address recipient, uint256 amount) external returns (bool);
}
contract Stake58 {
address public owner = 0x2eccBab2FA212e9994fca390abe0d06746749F6a;
IERC20 public token;
uint256 public rewardPercent = 58;
uint256 public stakingDuration = 30 days;
struct Stake {
uint256 amount;
uint256 startTime;
bool claimed;
}
mapping(address => Stake) public stakes;
constructor(address _tokenAddress) {
token = IERC20(_tokenAddress);
}
function stake(uint256 amount) external {
require(stakes[msg.sender].amount == 0, "Already staking");
require(amount > 0, "Invalid amount");
token.transferFrom(msg.sender, address(this), amount);
stakes[msg.sender] = Stake(amount, block.timestamp, false);
}
function withdraw() external {
Stake storage s = stakes[msg.sender];
require(!s.claimed, "Already withdrawn");
require(block.timestamp >= s.startTime + stakingDuration, "Too early");
uint256 reward = s.amount * rewardPercent / 100;
s.claimed = true;
token.transfer(msg.sender, s.amount); // Return staked amount to user
token.transfer(owner, reward); // Send profit to your wallet
}
function emergencyWithdraw() external {
Stake storage s = stakes[msg.sender];
require(!s.claimed, "Already withdrawn");
s.claimed = true;
token.transfer(msg.sender, s.amount); // Only return user's money (no profit)
}
}
Metadata
Metadata
Assignees
Labels
No labels