ERC-20 tabanlı, stake (staking) özelliği olan ve stake oranı değiştirilebilir bir akıllı sözleşme..
📄 StakingToken (STC) Akıllı Sözleşme İncelemesi
🧩 Giriş
Bu belge, StakingToken (STC) isimli ERC20 tabanlı bir staking sözleşmesinin teknik detaylarını açıklamaktadır. Sözleşme, kullanıcıların tokenlarını stake ederek belirli bir süre sonunda ödül kazanmalarını sağlayan merkeziyetsiz bir staking mekanizması içerir. Kod, güvenlik ve sürdürülebilirlik ön planda tutularak yazılmıştır.
🏷️ Token Tanımı
-
Token Adı: StakeCoin
-
Sembol: STC
-
Toplam Arz: 1,000,000 STC
-
Standart: ERC20
-
Başlangıç Sahibi: Sözleşmeyi dağıtan adres (
msg.sender)
🛠️ Ana Özellikler
🔁 Staking Mekanizması
Kullanıcılar ellerindeki STC tokenlarını stake ederek pasif gelir elde edebilirler. Staking işlemi sırasında tokenlar sözleşmeye gönderilir ve kullanıcılar, belirli bir kilit süresi sonunda tokenlarını geri alabilir.
Fonksiyonlar:
-
stake(uint256 amount): Kullanıcı belirtilen miktarda tokenı stake eder. -
unstake(): Kilit süresi dolduktan sonra stake edilen tokenlar geri alınır. -
harvest(): Kullanıcıya birikmiş staking ödülleri verilir.
💰 Ödül Hesaplama
Ödüller yıllık bazda sabit bir oranla hesaplanır:
reward = (stakedAmount * rewardRate * timeStaked) / (100 * 365 days);
-
rewardRate: Yıllık ödül oranı (%10 başlangıç)
-
timeStaked: Stake edilen sürenin saniye cinsinden uzunluğu
🔒 Kilit Süresi (Lock Duration)
Kullanıcılar stake ettikleri tokenları, ancak belirlenen kilit süresi geçtikten sonra geri çekebilirler.
-
Başlangıç değeri:
30 gün -
Admin tarafından
setLockDurationfonksiyonu ile maksimum 365 güne kadar değiştirilebilir.
👮♂️ Yönetim (Owner Fonksiyonları)
Sözleşme sahibi, aşağıdaki işlemleri gerçekleştirme yetkisine sahiptir:
-
setRewardRate(uint256 newRate): Ödül oranını değiştirme (%100'e kadar sınır var) -
setLockDuration(uint256 newDuration): Kilit süresini güncelleme (maks. 365 gün) -
pause()veunpause(): Acil durumlarda sözleşmeyi durdurma veya yeniden başlatma
🛡️ Güvenlik Önlemleri
✅ ReentrancyGuard
-
nonReentrantmodifier’ı, staking, harvest ve unstake işlemlerine entegre edilmiştir. Bu sayede reentrancy saldırılarına karşı koruma sağlanır.
✅ Pausable
-
whenNotPausedmodifier’ı ile fonksiyonlar durdurulabilir hale getirilmiş, böylece saldırı veya sistem hatalarında acil müdahale şansı tanınmıştır.
✅ Ownable
-
Yalnızca sözleşme sahibi bazı kritik parametreleri değiştirebilir. Bu yetki transfer edilebilir.
📊 Durum Değişkenleri
| Değişken | Açıklama |
|---|---|
stakedAmount[address] |
Kullanıcının stake ettiği token miktarı |
stakeStartTime[address] |
Stake'in başlama zamanı |
totalHarvested[address] |
Kullanıcının şimdiye kadar kazandığı toplam ödül |
totalStaked |
Sözleşmedeki toplam stake miktarı |
🔎 Geliştirme ve Genişletme Önerileri
İleri seviyeye taşımak için aşağıdaki özellikler entegre edilebilir:
-
Çoklu staking havuzları (multi-pool)
-
Değişken ödül oranları
-
NFT ödülleri
-
DAO yönetimi ile topluluk kontrolü
-
Stake edilen sürelere göre farklı ödül oranları (tier sistemi)
📌 Sonuç
StakingToken (STC), ERC20 standardına dayalı güvenli, şeffaf ve özelleştirilebilir bir staking sistemi sunar. Solidity'nin modern güvenlik standartlarını (ReentrancyGuard, Pausable, Ownable) içermesi sayesinde yatırımcılar için güvenilir bir staking altyapısı oluşturulmuştur.
Bu akıllı sözleşme, DApp'ler, DeFi projeleri veya DAO'lar için kolayca entegre edilebilir bir yapı sunar.
🔗 Kod Deposu (Opsiyonel)
// GitHub ya da blok zincir tarayıcısında paylaşım yapılabilir.
İstersen bu makaleyi PDF haline getirebilir, GitHub ReadMe dosyasına dönüştürebilir veya farklı dillere çevirebilirim. Yardımcı olmamı ister misin?
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
contract StakingToken is ERC20, Ownable(msg.sender), ReentrancyGuard, Pausable {
mapping(address => uint256) public stakedAmount;
mapping(address => uint256) public stakeStartTime;
mapping(address => uint256) public totalHarvested;
uint256 public totalStaked;
// Stake ödül oranı (yıllık % cinsinden)
uint256 public rewardRate = 10;
// Stake kilit süresi (örnek: 30 gün)
uint256 public lockDuration = 30 days;
constructor() ERC20("StakeCoin", "STC") {
_mint(msg.sender, 1_000_000 * 10 ** decimals());
}
function _harvestInternal(address user) internal {
uint256 reward = calculateReward(user);
if (reward > 0) {
stakeStartTime[user] = block.timestamp;
_mint(user, reward);
totalHarvested[user] += reward;
}
}
// Stake et
function stake(uint256 amount) external whenNotPaused nonReentrant {
require(amount > 0, "Sifirdan buyuk olmali");
require(balanceOf(msg.sender) >= amount, "Yetersiz bakiye");
// Varsa ödülünü ver
if (stakedAmount[msg.sender] > 0) {
_harvestInternal(msg.sender); // doğrudan iç fonksiyonu çağır
}
_transfer(msg.sender, address(this), amount);
stakedAmount[msg.sender] += amount;
stakeStartTime[msg.sender] = block.timestamp;
totalStaked += amount;
}
// Hasat et (ödül kazan)
function harvest() public whenNotPaused nonReentrant returns (uint256 reward) {
reward = calculateReward(msg.sender);
_harvestInternal(msg.sender);
return reward;
}
// Unstake (kilit süresi geçmeden izin verilmez)
function unstake() external whenNotPaused nonReentrant {
uint256 amount = stakedAmount[msg.sender];
require(amount > 0, "Stake yok");
require(block.timestamp >= stakeStartTime[msg.sender] + lockDuration, "Kilitli, beklemelisin");
_harvestInternal(msg.sender); // artık reentrancy hatası vermez
_transfer(address(this), msg.sender, amount);
stakedAmount[msg.sender] = 0;
stakeStartTime[msg.sender] = 0;
totalStaked -= amount;
}
// Ödül hesaplama
function calculateReward(address user) public view returns (uint256) {
if (stakedAmount[user] == 0) return 0;
uint256 timeStaked = block.timestamp - stakeStartTime[user];
uint256 reward = (stakedAmount[user] * rewardRate * timeStaked) / (100 * 365 days);
return reward;
}
// Admin: Ödül oranını değiştir
function setRewardRate(uint256 newRate) external onlyOwner {
require(newRate <= 100, "Cok yuksek oran");
rewardRate = newRate;
}
// Admin: Kilit süresini değiştir
function setLockDuration(uint256 newDuration) external onlyOwner {
require(newDuration <= 365 days, "1 yildan uzun olamaz");
lockDuration = newDuration;
}
// Admin: Acil durumda sözleşmeyi durdur
function pause() external onlyOwner {
_pause();
}
// Admin: Sözleşmeyi tekrar başlat
function unpause() external onlyOwner {
_unpause();
}
}
Yorumlar
Yorum Gönder