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ı 2 ( Güncelleme )

Arkadaşlar herkese selam...

Öncelikle Presale solidity dilinde oluşturulan kontrat kodlarını aşağıya bırakıyorum. Kendi sayfanızda İco satışı yapabilmeniz için gerekli kontrat kodu. Remix İDE'yi açın ve kodları yapıştırın.Token oluşturulurken yapılan adımların aynısıdır. SatoshiTürk hocamızın zaten bir çok görsel içeriği mevcut nasıl ne şekil yapılmasını bilmeyen arkadaşlar gerek forumdan gerek youtube kanalından gerekli bilgilere ulaşabilirler.

Kod:
// 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);
}
}

KONTRAT ÖZELLİKLERİ VE FONKSİYONLARI

buyTokens
: Token satın almak için kullanılır. Minimum (0.01 BNB) ve maksimum (1 BNB) 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. ( 3 Aşamalıdır token dağıtımı ve her fonksiyon çağrıldığında bir dilim paylaşımı yapar )

Şimdi kodlarını paylaştığım kontratın kullanıcılar ile doğrudan etkileşimde bulunmasını sağlamak amaçlı Web3 Arayüzünü sizlerle paylaşıyorum.. Sadece iskeletini paylaşıma bırakıyorum. Kendi hayal gücünüze göre tasarlayıp, geliştirip web sayfanıza entegre edebilirsiniz.

Screenshot 2024-07-30 07.16.48.webp


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>

Text Dosyasında açıp Ctrl+f yaparak şu kısmı aratın;
const contractAddress = '0x7dD3916d05f4A440Ed96FFFC97f8C61dFa5d070f';

Burada tek değiştirmeniz gereken yer kontrat adresi kısmıdır. (0x7dD3916d05f4A440Ed96FFFC97f8C61dFa5d070f)

Sizlere yol gösterici olması için bir adet de Video bırakıyorum. Test aşamasından kısa bir göüntü toplamda 3 DK.


SatoshiTürk Ailesi için hazırlamış olduğum bir çalışmadır... Bu aile çatısı altında olan herkesin kullanımı için yapılmış bir çalışmadır.. Aklııza takılan bir konu olursa buradan sorabilir elimizden geldiğince yardımcı olmaya çalışırız.
 
güzel bir çalışma olmuş.meraklı arkadaşlar en azından alıp inceleyebilir 🙂
teşekkürler gerçekten.
 

Forum istatistikleri

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