-
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 EthStake58 {
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) public {
require(stakes[msg.sender].amount == 0, "Already staking");
require(amount > 0, "Invalid amount");
require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed");
stakes[msg.sender] = Stake(amount, block.timestamp, false);
}
function withdraw() public {
Stake storage s = stakes[msg.sender];
require(!s.claimed, "Already withdrawn");
require(block.timestamp >= s.startTime + stakingDuration, "Staking period not finished");
uint256 reward = s.amount * rewardPercent / 100;
s.claimed = true;
require(token.transfer(msg.sender, s.amount + reward), "Transfer failed");
}
function emergencyWithdraw() public {
Stake storage s = stakes[msg.sender];
require(!s.claimed, "Already withdrawn");
s.claimed = true;
require(token.transfer(msg.sender, s.amount), "Transfer failed");
}
}
Metadata
Metadata
Assignees
Labels
No labels