Neler yeni
Türkiye’nin Lider Kripto Para Forumu

SatoshiTURK Ailesine Hoş Geldiniz!

Türkiye’nin en güvenilir kripto ve blockchain topluluğunu ziyaret ettiğiniz için mutluyuz. SatoshiTURK olarak, her seviyeden kripto meraklısı ve blockchain uzmanına bilgi paylaşımı, öğrenme ve kazanç fırsatları sunuyoruz. Amacımız, güncel ve bağımsız bilgiye kolayca ulaşmanızı sağlamak ve özgün içeriklerle kendinizi geliştirmenize olanak tanımaktır. Burada, kripto para dünyasının en yeni gelişmelerini takip edebilir, güncel analizlere ve rehberlere göz atabilir, blockchain teknolojisinin sunduğu fırsatları daha yakından keşfedebilirsiniz.

Topluluğumuza katılarak sadece bilgi edinmekle kalmaz, aynı zamanda katkılarınızın karşılığını BNB Coin ile alabilirsiniz. Forumumuzda, açtığınız her başlık, sorduğunuz her soru ve sağladığınız her faydalı bilgi, size SatoshiTURK kredi sistemi üzerinden BNB Coin kazandırır. Bu sayede, öğrenirken kazanma deneyimini yaşayacak ve topluluğumuza aktif bir şekilde katkıda bulunarak değerli bir üye olacaksınız.

Deneyimlerinizi, fikirlerinizi ve analizlerinizi paylaşarak hem kendinizi geliştirebilir hem de bu katkılarınızın ödüllerini kazanabilirsiniz. Kripto dünyasında güvenle ilerlemek, yeni insanlarla tanışmak ve sektör hakkında daha fazla bilgi edinmek için SatoshiTURK ailesine katılın. Hadi, birlikte öğrenelim, keşfedelim ve Türkiye'nin en güçlü kripto topluluğunda güvenle yol alalım!

Solidity Presale Kontratı

Selam arkadaşlar, daha önce konusunu açtığımız prsale kontrat artık hizmetinizde.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract SavKriptoPresale is Ownable, ReentrancyGuard {
IERC20 public token;
uint256 public price; // Price of 1 token (in BNB)
uint256 public tokensSold;

event TokensPurchased(address indexed buyer, uint256 amount);
event PresaleFunded(uint256 amount);

constructor() Ownable(msg.sender) {
token = IERC20(0x5fC457F7FE81868C960D9D47A6400B15c6bF5cbA); // token address
price = 0.000000001 ether; // Token price in BNB (1 token = 0.000000001 BNB)
}

function buyTokens() public payable nonReentrant {
require(msg.value > 0, "BNB amount cannot be 0");

// Calculate total tokens to buy (taking into account the decimals of the token)
uint256 amountToBuy = (msg.value * 10**18) / price;

// Check if there are enough tokens in the contract
require(token.balanceOf(address(this)) >= amountToBuy, "Not enough tokens available");

tokensSold += amountToBuy;
token.transfer(msg.sender, amountToBuy);

emit TokensPurchased(msg.sender, amountToBuy);
}

function fundPresale(uint256 _amount) external onlyOwner nonReentrant {
require(token.balanceOf(msg.sender) >= _amount, "Insufficient token balance");
token.transferFrom(msg.sender, address(this), _amount);

emit PresaleFunded(_amount);
}

function withdrawBNB() external onlyOwner nonReentrant {
uint256 balance = address(this).balance;
require(balance > 0, "No BNB to withdraw");
payable(owner()).transfer(balance);
}

function withdrawTokens(uint256 _amount) external onlyOwner nonReentrant {
require(token.balanceOf(address(this)) >= _amount, "Insufficient token balance");
token.transfer(owner(), _amount);
}

function updatePrice(uint256 _newPrice) external onlyOwner {
require(_newPrice > 0, "Price must be greater than 0");
price = _newPrice;
}
}
Yazdığım solidity kodlarının tüm testlerini tamamlayıp SatoshiTürk ailesine hediye ediyorum. Sıkıntısız çalışmaktadır. İlerleyen süreçte Web sayfasına entegre edip tekrardan sizlerin kullanımına sunmaya çalışacağım. Ancak bu işlerin her biri ayrı bir zaman istemekte. İşten güçten vakit buldukça bu aileye birşeyler kazandırmaya yardımcı olmaya çalışıyorum. Siz değerli hocalarımın da katkılarıyla çok daha iyi olacaktır prsale projemiz..
 
buyTokens : Kullanıcıların token satın almasını sağlar.Kullanıcının almak istediği token miktarı hesaplanır.Sözleşmede yeterli token olup olmadığı kontrol edilir.Token, alıcıya aktarılır ve TokensPurchased olayı t

fundPresale : Sadece sözleşme sahibi tarafından çağrılabilir.Belirtilen miktarda token'ı sözleşmeye aktarır.PresaleFunded olayı tetiklenir.

withdrawBNB : Sadece sözleşme sahibi tarafından çağrılabilir.Sözleşmedeki BNB'yi sahibine çeker.

withdrawTokens : Sadece sözleşme sahibi tarafından çağrılabilir.Belirtilen miktarda token'ı sahibine çeker.

updatePrice : Sadece sözleşme sahibi tarafından çağrılabilir.Token fiyatını günceller.
 
ilk fıesatta eklemeler yapacağım teşekkürler ellerinize sağlık.
 
Ben teşekkür ederim hocam. Eklemelerinizi sabırsızlıkla bekliyorum. 🥰 SatoshiTürk ailesi olarak ekipce ortaya birşeyler koymaktan çok memnun olurum.
ilk fırsatta eklemeler yapacağım. sıraya aldım 🙂
 
Evet arkadaşlar Presale Kontratında ufak bir kaç güncelleme yaptım. Sırası ile neler eklendi onu aktarayım size. Katılımcı en az 0.01 bnb ile katılabir. En fazla 1 bnblik alım yapabilir. Akabinde eski sürümde tokenları hemen veriyordu. Artık 3 aşamalı şekilde veriyor. Ve gerekli fonksiyonu sözleşme sahibi çağırabilir. İster aydan aya isterseniz sizin belirlediğiniz periyotta tokenlarınızı dağıtabilirsiniz.. + Openzeppeline kütüphanesinden Pausable eklendi güvenlik amaçlı.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

contract SavKripto2 is Ownable, ReentrancyGuard, Pausable {
IERC20 public token;
uint256 public price; // Price of 1 token (in BNB)
uint256 public tokensSold;
uint256 public minContribution;
uint256 public maxContribution;
mapping(address => uint256) public contributions;
mapping(address => uint256) public vestedTokens;
mapping(address => uint256) public vestingStart;
mapping(address => uint256) public vestingStep;

event TokensPurchased(address indexed buyer, uint256 amount);
event PresaleFunded(uint256 amount);
event WithdrawBNB(address indexed owner, uint256 amount);
event WithdrawTokens(address indexed owner, uint256 amount);

constructor(address initialOwner) Ownable(initialOwner) {
token = IERC20(0x90E87c7ae88Ca1a95fFcC13f01Cc2cB391854aA2); // token address
price = 0.000000001 ether; // Token price in BNB (1 token = 0.000000001 BNB)
minContribution = 0.01 ether;
maxContribution = 1 ether;
}

function buyTokens() public payable nonReentrant whenNotPaused {
require(msg.value > 0, "BNB amount cannot be 0");
require(msg.value >= minContribution && msg.value <= maxContribution, "Contribution outside allowed range");

uint256 amountToBuy = (msg.value * 10**18) / price;
require(token.balanceOf(address(this)) >= amountToBuy, "Not enough tokens available");

contributions[msg.sender] += msg.value;
vestedTokens[msg.sender] += amountToBuy;
if (vestingStart[msg.sender] == 0) {
vestingStart[msg.sender] = block.timestamp;
}
tokensSold += amountToBuy;

emit TokensPurchased(msg.sender, amountToBuy);
}

function fundPresale(uint256 _amount) external onlyOwner nonReentrant {
require(token.balanceOf(msg.sender) >= _amount, "Insufficient token balance");
token.transferFrom(msg.sender, address(this), _amount);

emit PresaleFunded(_amount);
}

function withdrawBNB() external onlyOwner nonReentrant {
uint256 balance = address(this).balance;
require(balance > 0, "No BNB to withdraw");
payable(owner()).transfer(balance);

emit WithdrawBNB(owner(), balance);
}

function withdrawTokens(uint256 _amount) external onlyOwner nonReentrant {
require(token.balanceOf(address(this)) >= _amount, "Insufficient token balance");
token.transfer(owner(), _amount);

emit WithdrawTokens(owner(), _amount);
}

function updatePrice(uint256 _newPrice) external onlyOwner {
require(_newPrice > 0, "Price must be greater than 0");
price = _newPrice;
}

function pause() external onlyOwner {
_pause();
}

function unpause() external onlyOwner {
_unpause();
}

function distributeVestedTokens(address _beneficiary) external onlyOwner nonReentrant {
require(vestingStart[_beneficiary] > 0, "No vesting schedule for this address");

uint256 totalVested = vestedTokens[_beneficiary];
uint256 vestedAmount;

if (vestingStep[_beneficiary] == 0) {
vestedAmount = totalVested / 3;
vestingStep[_beneficiary] = 1;
} else if (vestingStep[_beneficiary] == 1) {
vestedAmount = totalVested / 3;
vestingStep[_beneficiary] = 2;
} else if (vestingStep[_beneficiary] == 2) {
vestedAmount = totalVested - (totalVested / 3) * 2; // Remaining tokens
vestingStep[_beneficiary] = 3;
} else {
revert("Vesting completed for this address");
}

token.transfer(_beneficiary, vestedAmount);
}
}
Fonksiyonlar
buyTokens: Token satın almak için kullanılır. Minimum ve maksimum katkı miktarlarına dikkat edilerek satın alma işlemi yapılır.

fundPresale: Sözleşmeye token yüklemek için kullanılır.withdrawBNB: Sahip tarafından sözleşmeden BNB çekmek için kullanılır.

withdrawTokens: Sahip tarafından sözleşmeden token çekmek için kullanılır.updatePrice: Token fiyatını günceller.pause: Sözleşmeyi duraklatır.unpause: Sözleşmeyi yeniden başlatır.

distributeVestedTokens: Vesting adımlarına göre token dağıtır.
 
Selam arkadaşlar, daha önce konusunu açtığımız prsale kontrat artık hizmetinizde.


Yazdığım solidity kodlarının tüm testlerini tamamlayıp SatoshiTürk ailesine hediye ediyorum. Sıkıntısız çalışmaktadır. İlerleyen süreçte Web sayfasına entegre edip tekrardan sizlerin kullanımına sunmaya çalışacağım. Ancak bu işlerin her biri ayrı bir zaman istemekte. İşten güçten vakit buldukça bu aileye birşeyler kazandırmaya yardımcı olmaya çalışıyorum. Siz değerli hocalarımın da katkılarıyla çok daha iyi olacaktır prsale projemiz..
Bekliyoruz
 
Evet Arkadaşlar sonunda projenin sonuna geldim. Videolu anlatım alttadır. Ses veremediğim için üzgünüm ortam pek müsait değildi. Ancak bu video rehberiniz olacaktır hiç şüpheniz olmasın.

VİDEO

WEB3 ARAYÜZ ( Sadece iskeletini veriyorum geliştirmek ve özelleştirme işini sizin hayal gücünüze bıraktım . )

HTML:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Presale</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #ffffff;
            margin: 0;
        }
        .container {
            text-align: center;
            background: #f0f0f0;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        button {
            display: block;
            width: 200px;
            margin: 10px auto;
            padding: 10px;
            font-size: 16px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        #connectButton {
            background-color: #007bff;
            color: #fff;
        }
        #buyButton {
            background-color: #28a745;
            color: #fff;
        }
        input {
            padding: 10px;
            font-size: 16px;
            margin-top: 10px;
            border-radius: 5px;
            border: 1px solid #ccc;
            width: calc(100% - 22px);
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>SavKripto Presale</h1>
        <input type="text" id="bnbAmount" placeholder="BNB miktarını girin">
        <button id="connectButton">Cüzdanı Bağla</button>
        <button id="buyButton" disabled>Token Satın Al</button>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
    <script>
       const contractABI = [
            {
            "constant": false,
            "inputs": [],
            "name": "buyTokens",
            "outputs": [],
            "payable": true,
            "stateMutability": "payable",
            "type": "function"
        }
                            ];
                            
        const contractAddress = '0x7dD3916d05f4A440Ed96FFFC97f8C61dFa5d070f';

        let web3;
        let contract;
        let accounts;

        async function connectWallet() {
            if (window.ethereum) {
                web3 = new Web3(window.ethereum);
                try {
                    accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
                    document.getElementById('connectButton').innerText = 'Cüzdan Bağlandı';
                    document.getElementById('buyButton').disabled = false;
                } catch (error) {
                    console.error(error);
                    alert('Cüzdan bağlantısı başarısız: ' + error.message);
                }
            } else {
                alert('Lütfen MetaMask kurun.');
            }
        }

        async function buyTokens() {
            const amount = document.getElementById('bnbAmount').value;
            contract = new web3.eth.Contract(contractABI, contractAddress);

            try {
                await contract.methods.buyTokens().send({
                    from: accounts[0],
                    value: web3.utils.toWei(amount, 'ether')
                });
                alert('İşlem başarılı!');
            } catch (error) {
                console.error(error);
                alert('İşlem başarısız: ' + error.message);
            }
        }

        document.getElementById('connectButton').addEventListener('click', connectWallet);
        document.getElementById('buyButton').addEventListener('click', buyTokens);
    </script>
</body>
</html>
 
ortada bir çaba var güzel bir çabaya benziyor en azından resimli olarak anlatsan daha güzel olurdu hocam.
yeni bir konuda bunu güzelce analtırsan daha sağlıklı olacğaına eminim.
 

Forum istatistikleri

Konular
13.635
Mesajlar
65.694
Kullanıcılar
6.884
Son üye
BlackHatSec
Geri
Üst