Neler yeni
Misafir görüntüleme limiti aşıldı
  • İzin verilen maksimum misafir görüntüleme sayısına ulaştınız
  • Bu kısıtlamayı kaldırmak için lütfen aşağıdan kayıt olun
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!

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
14.181
Mesajlar
71.108
Kullanıcılar
7.169
Son üye
Abdü6757
Geri
Üst