-
Notifications
You must be signed in to change notification settings - Fork 453
Open
Description
pragma solidity ^0.5.10;
interface ITRC20 {
function transferFrom(address from, address to, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
}
contract TronStaking {
ITRC20 public token;
address public owner;
uint256 public rewardPercent = 8102; // 81.02% reward
uint256 public stakingDuration = 30 * 86400; // 30 days in seconds
struct Stake {
uint256 amount;
uint256 startTime;
bool withdrawn;
}
mapping(address => Stake) public stakes;
constructor(address tokenAddress, address ownerAddress) public {
token = ITRC20(tokenAddress);
owner = ownerAddress;
}
function stake(uint256 amount) public {
require(amount > 0, "Amount must be greater than zero");
require(stakes[msg.sender].amount == 0, "Already staking");
require(token.transferFrom(msg.sender, address(this), amount), "Token transfer failed");
stakes[msg.sender] = Stake(amount, now, false);
}
function withdraw() public {
Stake storage userStake = stakes[msg.sender];
require(userStake.amount > 0, "No active stake");
require(!userStake.withdrawn, "Already withdrawn");
require(now >= userStake.startTime + stakingDuration, "Staking period not finished");
uint256 reward = (userStake.amount * rewardPercent) / 10000;
userStake.withdrawn = true;
require(token.transfer(msg.sender, userStake.amount + reward), "Token transfer failed");
}
function withdrawTokens(uint256 amount) public {
require(msg.sender == owner, "Only owner can withdraw");
require(token.transfer(owner, amount), "Token transfer failed");
}
}
Metadata
Metadata
Assignees
Labels
No labels