Neler yeni
Türkiye’nin Lider Kripto Para Forumu

Blockchain dünyasının Türkçe Wikipedia'sına hoş geldiniz!

Hemen ücretsiz üye olun ve kayıt olduğunuz anda coin kazanmaya başlayın. Kendi konularınızı paylaşın, diğer üyelerle etkileşim kurun ve dilediğiniz zaman coinlerinizi çekin.

Katılmak için şimdi harekete geçin!

Akıllı Kontrat : Vergilendirme Sorunlarına Çözüm Arıyorum

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Kod:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

contract SavKripto is IERC20Metadata, ERC20Burnable, AccessControl {
    bytes32 public constant TAX_COLLECTOR_ROLE = keccak256("TAX_COLLECTOR_ROLE");
    bytes32 public constant BLACKLISTER_ROLE = keccak256("BLACKLISTER_ROLE");

    address public taxCollector;
    struct TaxRates {
        uint256 buyTaxRate;
        uint256 sellTaxRate;
    }
    TaxRates private _taxRates;
    mapping (address => bool) public isTaxed;
    mapping (address => bool) public isBlacklisted;

    uint256 public lastMintTime;
    uint256 public mintedAmountInPeriod;
    uint256 public constant MINT_PERIOD = 30 days; // 30 günlük periyot
    uint256 public constant MAX_MINT_RATIO = 10; // Maksimum mint oranı (%10)

    constructor() ERC20("SavKripto", "SVK") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(TAX_COLLECTOR_ROLE, msg.sender);
        _setupRole(BLACKLISTER_ROLE, msg.sender);

        uint256 initialSupply = 1_000_000_000_000 * (10 ** uint256(decimals()));
        _mint(msg.sender, initialSupply);
        taxCollector = 0x0850b582e65313fC08D0620D685FD5F4D2Db3633;
        _taxRates.buyTaxRate = 5;
        _taxRates.sellTaxRate = 8;
        isTaxed[msg.sender] = true;
    }

    function name() public view virtual override returns (string memory) {
        return "SavKripto";
    }

    function symbol() public view virtual override returns (string memory) {
        return "SVK";
    }

    uint8 private constant _decimals = 18;
    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }

    function setBlacklistStatus(address account, bool status) public onlyRole(BLACKLISTER_ROLE) {
        require(account != address(0), "Sifir adres kara listeye alinamaz.");
        require(account != msg.sender, "Sahip kendi kendini kara listeye alamaz.");
        isBlacklisted[account] = status;
        emit BlacklistStatusChanged(account, status);
    }

    function setTaxStatus(address account, bool status) public onlyRole(TAX_COLLECTOR_ROLE) {
        require(account != address(0), "Sifir adres vergilendirilemez.");
        require(account != msg.sender, "Sahip kendi kendini vergilendiremez.");
        isTaxed[account] = status;
        emit TaxStatusChanged(account, status);
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        require(!isBlacklisted[sender], "Gonderici kara listeye alinmis.");
        require(!isBlacklisted[recipient], "Alici kara listeye alinmis.");

        uint256 taxAmount = calculateTax(sender, recipient, amount);
        uint256 amountAfterTax = amount - taxAmount;

        super._transfer(sender, taxCollector, taxAmount);
        super._transfer(sender, recipient, amountAfterTax);
    }

    function calculateTax(
        address sender,
        address recipient,
        uint256 amount
    ) private view returns (uint256) {
        uint256 taxRate = 0;

        if(isTaxed[sender]) {
            taxRate = _taxRates.sellTaxRate;
        } else if(isTaxed[recipient]) {
            taxRate = _taxRates.buyTaxRate;
        }

        if(taxRate == 0) {
            return 0;
        }

        return (amount * taxRate) / 100;
    }

    function mint(address to, uint256 amount) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(to != address(0), "Sifir adresine mint yapilamaz.");
        require(amount > 0, "Mint miktari sifirda buyuk olmalidir.");
     
        if (block.timestamp >= lastMintTime + MINT_PERIOD) {
            mintedAmountInPeriod = 0;
            lastMintTime = block.timestamp;
        }
     
        uint256 maxMintAmount = (totalSupply() * MAX_MINT_RATIO) / 100;
        require(mintedAmountInPeriod + amount <= maxMintAmount, "Bu periyotta izin verilen maksimum mint miktarini astiniz.");

        mintedAmountInPeriod += amount;
        _mint(to, amount);
    }

    event BlacklistStatusChanged(address account, bool status);
    event TaxStatusChanged(address account, bool status);
    event TaxRateChanged(uint256 buyTaxRate, uint256 sellTaxRate);
}


Saygı değer hocam SatoshiTürk ve diğer kıymetli hocalarım.Sizlerin görsel ve yazılı içerikleriniz vasıtasıyla + biraz kendimce derlemeler ile bir kontrat yapmaya çalıştım.Ancak remix ide de bir çok hata aldım çoğunu düzeltmeme rağmen access ve vergilndirme sistemlerinde hata alıyorum ve her geçen saat dahada karmaşık hal aldı ve işin içinden çıkamadım. Birazda projenin tanımlamasını yapayım;

  1. Token Adı ve Sembolü: Token adı “SavKripto” ve sembolü “SVK” olarak ayarlanmış.
  2. Maksimum Mint Oranı: MAX_MINT_RATIO sabiti, toplam arzın %10’unu aşamayacak şekilde mint işlemlerini sınırlıyor.
  3. Vergilendirme ve Kara Liste: TAX_COLLECTOR_ROLE ve BLACKLISTER_ROLE rolleri, vergilendirme ve kara liste işlemlerini gerçekleştirmek için kullanılıyor.
  4. Transfer İşlemleri: _transfer fonksiyonu, gönderici ve alıcı arasındaki transfer işlemlerini yönetiyor. Vergi miktarı hesaplanıyor ve ilgili hesaplara transfer yapılıyor.
  5. Mint İşlemi: mint fonksiyonu, yalnızca yönetici rolüne sahip kişiler tarafından çağrılabiliyor ve belirli bir adrese yeni tokenler mint ediyor.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Forum istatistikleri

Konular
14.015
Mesajlar
69.943
Kullanıcılar
7.002
Son üye
KANZA35
Geri
Üst