🎯 Масштабний практичний вебінар #2

Створення токенів та NFT на Conflux

📅 25 червня 2025, 18:00 (EEST)

⏰ До початку вебінару залишилось:

00 днів
00 годин
00 хвилин
00 секунд

Найповніший практичний вебінар: від написання Solidity коду до деплою ERC-20 токенів та ERC-721 NFT у мережі Conflux. Створимо токен ConfluxUkraine та NFT колекцію разом, розберемо всі нюанси та підводні камені розробки!

⏱ 180 Хвилин практики
👥 100 Місць доступно
📊 Для всіх Рівень складності
🆓 0 ₴ Повністю безкоштовно
🎁 Матеріали Код + відео + гайди

📋 Детальна програма вебінару

18:00
18:15
👋

Привітання та знайомство

Початок та налаштування

Знайомимося з учасниками, перевіряємо готовність інструментів та озвучуємо план на 3 години.

Що робимо:
  • Швидкий check готовності учасників
  • Перевірка налаштування MetaMask/Fluent
  • Огляд програми та цілей вебінару
  • Відповіді на останні питання
18:15
18:30
📚

Теорія: ERC-20 стандарт

Основи токенів на блокчейні

Розбираємо стандарт ERC-20, його функції та особливості. Чому саме цей стандарт використовують для токенів.

Основні концепції:
  • Що таке ERC-20 та навіщо він потрібен
  • Обов'язкові та опціональні функції
  • Events та їх важливість
  • Безпека токенів та типові помилки
18:30
19:30
💰

Практика: ConfluxUkraine токен

Створення ERC-20 токена з нуля

Пишемо повноцінний смарт-контракт токена з розширеними функціями: mint, burn, pause та роль-система.

Що створюємо:
  • Базовий ERC-20 токен "ConfluxUkraine" (CFUKR)
  • Функції mint та burn для управління supply
  • Система ролей та дозволів
  • Функція паузи для екстрених ситуацій
  • Деплой у Conflux eSpace Testnet
19:30
19:45
🧪

Тестування токена

Перевірка функціональності

Тестуємо всі функції токена: transfer, mint, burn. Додаємо токен у гаманці та перевіряємо на ConfluxScan.

Що тестуємо:
  • Базові функції transfer та approve
  • Mint нових токенів
  • Burn та зменшення supply
  • Додавання у MetaMask та Fluent
19:45
20:00

Перерва та Q&A

Відпочинок та питання

Короткий перерва для відпочинку. Відповідаємо на питання по токенам та підготовлюємося до NFT частини.

20:00
20:15
🖼️

Теорія: ERC-721 та NFT

Світ унікальних токенів

Вивчаємо стандарт ERC-721, відмінності від ERC-20. Розбираємо метадані, IPFS та екосистему NFT.

Основні концепції:
  • ERC-721 стандарт та його особливості
  • Метадані NFT та JSON структура
  • IPFS та децентралізоване зберігання
  • Роялті та права власності
20:15
21:00
🎨

Практика: ConfluxUkraine NFT

Створення NFT колекції

Розробляємо повноцінний NFT контракт з можливістю mint, управління метаданими та інтеграцією з маркетплейсами.

Що створюємо:
  • ERC-721 контракт "ConfluxUkraine NFT"
  • Функції mint з кастомними URI
  • Підготовка метаданих та зображень
  • Деплой та тестування NFT
21:00
21:15

Верифікація контрактів

Публікація вихідного коду

Верифікуємо обидва контракти на ConfluxScan для прозорості та довіри. Розбираємо різні способи верифікації.

Способи верифікації:
  • Автоматична верифікація через Remix
  • Ручна верифікація через ConfluxScan
  • Flatten код та налаштування
  • Перевірка результатів
21:15
21:30
💬

Підсумки та Q&A

Завершення вебінару

Підводимо підсумки, відповідаємо на питання та обговорюємо наступні кроки у Web3 розробці.

Фінальні кроки:
  • Огляд створених контрактів
  • Ресурси для подальшого навчання
  • Запрошення до спільноти
  • Отримання сертифікатів участі

⚡ Підготовка до вебінару

⚠️ ОБОВ'ЯЗКОВО виконайте ці кроки ДО вебінару!

Це дозволить нам відразу перейти до практики та максимально ефективно використати час

1

🌐 Встановлення Fluent Wallet (РЕКОМЕНДУЄМО)

Офіційний гаманець Conflux з підтримкою eSpace та Core Space - найкращий вибір для роботи з Conflux

1.1
Встановлення:
  1. Відкрийте Chrome/Edge/Firefox
  2. Перейдіть на fluentwallet.com
  3. Натисніть "Add to Chrome" (або відповідну кнопку для вашого браузера)
  4. У магазині розширень натисніть "Додати розширення"
1.2
Перша настройка:
  1. Відкрийте Fluent (іконка в панелі браузера)
  2. Натисніть "Create Wallet" для нового гаманця
  3. Створіть надійний пароль (мін. 8 символів)
  4. ⚠️ ВАЖЛИВО: Збережіть seed фразу в безпечному місці
  5. Підтвердіть seed фразу
1.3
Налаштування тестової мережі:
  1. У правому верхньому куті Fluent натисніть меню з трьох горизонтальних ліній
  2. Оберіть "Advanced Settings"
  3. Увімкніть перемикач "Show Testnets"
  4. Поверніться назад (кнопка "←")
  5. Натисніть на назву мережі (зверху показано "Conflux Mainnet")
  6. Оберіть "eSpace Testnet" зі списку
  7. Ваша адреса зміниться з base32 (cfx:...) на hex40 (0x...)
✅ Перевірте встановлення:
  • У Fluent відображається баланс (0 CFX це нормально)
  • Обрана мережа "eSpace Testnet"
  • Адреса починається з "0x" (а не cfx:)
  • Можете переключатися між мережами
2

🦊 Підготовка: Налаштування MetaMask (за бажанням)

Встановлюємо та налаштовуємо MetaMask для роботи з Conflux eSpace Testnet

2.1
Встановлення MetaMask:
  1. Перейдіть на metamask.io
  2. Натисніть "Download" та оберіть ваш браузер
  3. У магазині розширень натисніть "Додати розширення"
  4. Створіть новий гаманець або імпортуйте існуючий
  5. ⚠️ ВАЖЛИВО: Збережіть seed фразу в безпечному місці
🦊 Додавання мережі Conflux eSpace Testnet в MetaMask:
  • Відкрийте MetaMask
  • Натисніть на назву мережі зверху
  • Натисніть "Add Network" → "Add a network manually"
  • Заповніть поля параметрами нижче
  • Натисніть "Save"

⚙️ Параметри Conflux eSpace Testnet:

Network name: Conflux eSpace Testnet
New RPC URL: https://evmtestnet.confluxrpc.com
Chain ID: 71
Currency symbol: CFX
Block explorer URL: https://evmtestnet.confluxscan.org
⚡ Швидке додавання:
3

💻 Знайомство з Remix IDE

Онлайн IDE для розробки смарт-контрактів - головний інструмент вебінару

🌐 Відкрити Remix IDE
🖱️ Що робити після відкриття:
  • Дочекайтеся завантаження Remix IDE
  • Ліворуч ви побачите FILE EXPLORER з папками
  • Якщо з'явиться вікно "Welcome to Remix IDE" - закрийте його
  • У лівому меню знайдіть папку "contracts"
  • Правий клік на папці "contracts" → "New File"
✅ Перевірте готовність Remix:
  • Remix повністю завантажився
  • Ви бачите структуру папок зліва
  • Можете створювати нові файли
  • Інтерфейс зрозумілий та доступний

🔍 Перевірка готовності до вебінару

Автоматична перевірка налаштувань та отримання тестових CFX для участі у вебінарі

?
Fluent Wallet
Встановлення та підключення
?
MetaMask
Альтернативний гаманець
?
Conflux eSpace Testnet
Правильна мережа підключена
?
Баланс CFX
Перевіряємо баланс...
💧
Статус отримання CFX
Готовий до отримання
💻
Remix IDE
Доступність та готовність
🌐 Доступні Conflux Faucets:
eSpace Testnet (РЕКОМЕНДУЄМО)
Для нашого вебінару
efaucet.confluxnetwork.org ↗
Core Space Testnet
Альтернативний faucet
faucet.confluxnetwork.org ↗
Mainnet Faucet
Для продакшн проектів
conflux-faucet.com ↗

🧪 Покроковий гайд створення контрактів

Детальні інструкції для кожного етапу створення ERC-20 токена та ERC-721 NFT на Conflux

🔧 Крок 1: Відкриття та налаштування Remix IDE

🌐 Відкрити Remix IDE
🖱️ Що робити після відкриття:
  • Дочекайтеся завантаження Remix IDE
  • Ліворуч ви побачите FILE EXPLORER з папками
  • Якщо з'явиться вікно "Welcome to Remix IDE" - закрийте його
  • У лівому меню знайдіть папку "contracts"
  • Правий клік на папці "contracts" → "New File"
1.1
📁 Створення файлів контрактів:
  1. Створіть файл: ConfluxUkraineToken.sol
  2. Створіть файл: ConfluxUkraineNFT.sol
  3. Натисніть Enter або клікніть поза полем
  4. Файли автоматично відкриються в редакторі

✅ Перевірте що все готово:

  • Remix повністю завантажився
  • Обидва файли створено
  • Файли відкриті в редакторі
  • Немає помилок завантаження

💰 Крок 2: Створення ERC-20 токена ConfluxUkraine

📝 Копіюємо код токена в Remix:
  • Натисніть кнопку "📋 Копіювати" нижче
  • Поверніться в Remix IDE
  • Відкрийте файл ConfluxUkraineToken.sol
  • Натисніть Ctrl+A (виділити все) потім Ctrl+V (вставити)
  • Збережіть файл: Ctrl+S
ConfluxUkraineToken.sol - Повний код токена
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

/**
 * @title ConfluxUkraine Token
 * @dev ERC20 token for Ukrainian Conflux community
 * @author Conflux Ukraine Team
 */
contract ConfluxUkraineToken is ERC20, ERC20Burnable, Ownable, Pausable {
    
    uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10**18; // 1 billion tokens
    uint256 public totalMinted;
    mapping(address => bool) public minters;
    
    event TokensMinted(address indexed to, uint256 amount, address indexed minter);
    event TokensBurned(address indexed from, uint256 amount);
    event MinterAdded(address indexed minter);
    event MinterRemoved(address indexed minter);
    
    modifier onlyMinter() {
        require(minters[msg.sender] || msg.sender == owner(), "ConfluxUkraine: not a minter");
        _;
    }
    
    modifier validAddress(address _address) {
        require(_address != address(0), "ConfluxUkraine: zero address");
        require(_address != address(this), "ConfluxUkraine: contract address");
        _;
    }
    
    constructor(uint256 initialSupply) ERC20("ConfluxUkraine", "CFUKR") Ownable(msg.sender) {
        require(initialSupply <= MAX_SUPPLY, "ConfluxUkraine: exceeds max supply");
        
        if (initialSupply > 0) {
            _mint(msg.sender, initialSupply);
            totalMinted = initialSupply;
        }
        
        minters[msg.sender] = true;
        emit MinterAdded(msg.sender);
    }
    
    function mint(address to, uint256 amount) 
        external 
        onlyMinter 
        validAddress(to)
        whenNotPaused 
    {
        require(amount > 0, "ConfluxUkraine: amount must be greater than 0");
        require(totalMinted + amount <= MAX_SUPPLY, "ConfluxUkraine: exceeds max supply");
        
        _mint(to, amount);
        totalMinted += amount;
        
        emit TokensMinted(to, amount, msg.sender);
    }
    
    function batchMint(address[] calldata recipients, uint256[] calldata amounts)
        external
        onlyMinter
        whenNotPaused
    {
        require(recipients.length == amounts.length, "ConfluxUkraine: arrays length mismatch");
        require(recipients.length > 0, "ConfluxUkraine: empty arrays");
        require(recipients.length <= 100, "ConfluxUkraine: too many recipients");
        
        uint256 totalAmount = 0;
        for (uint256 i = 0; i < amounts.length; i++) {
            require(amounts[i] > 0, "ConfluxUkraine: amount must be greater than 0");
            totalAmount += amounts[i];
        }
        
        require(totalMinted + totalAmount <= MAX_SUPPLY, "ConfluxUkraine: exceeds max supply");
        
        for (uint256 i = 0; i < recipients.length; i++) {
            require(recipients[i] != address(0), "ConfluxUkraine: zero address");
            require(recipients[i] != address(this), "ConfluxUkraine: contract address");
            
            _mint(recipients[i], amounts[i]);
            emit TokensMinted(recipients[i], amounts[i], msg.sender);
        }
        
        totalMinted += totalAmount;
    }
    
    function burn(uint256 amount) public override whenNotPaused {
        require(amount > 0, "ConfluxUkraine: amount must be greater than 0");
        require(balanceOf(msg.sender) >= amount, "ConfluxUkraine: insufficient balance");
        
        super.burn(amount);
        emit TokensBurned(msg.sender, amount);
    }
    
    function addMinter(address minter) external onlyOwner validAddress(minter) {
        require(!minters[minter], "ConfluxUkraine: already a minter");
        minters[minter] = true;
        emit MinterAdded(minter);
    }
    
    function removeMinter(address minter) external onlyOwner {
        require(minter != owner(), "ConfluxUkraine: cannot remove owner");
        require(minters[minter], "ConfluxUkraine: not a minter");
        minters[minter] = false;
        emit MinterRemoved(minter);
    }
    
    function pause() external onlyOwner {
        _pause();
    }
    
    function unpause() external onlyOwner {
        _unpause();
    }
    
    function _update(address from, address to, uint256 value) internal override whenNotPaused {
        super._update(from, to, value);
    }
    
    function isMinter(address account) external view returns (bool) {
        return minters[account] || account == owner();
    }
    
    function remainingSupply() external view returns (uint256) {
        return MAX_SUPPLY - totalMinted;
    }
    
    function canMint(uint256 amount) external view returns (bool) {
        return totalMinted + amount <= MAX_SUPPLY;
    }
    
    receive() external payable {}
}

✅ Перевірте, що код вставився правильно:

  • У Remix IDE файл має синій кружечок (означає зміни не збережені)
  • Натисніть Ctrl+S для збереження
  • Синій кружечок зникне
  • У коді не повинно бути червоних підкреслень (помилок)

🚀 Крок 3: Компіляція та деплой токена

🔨 Компілюємо токен контракт:
  • У лівому меню Remix натисніть "Solidity Compiler" (третя іконка)
  • Переконайтеся, що версія компілятора: 0.8.20 або новіша
  • Натисніть "Compile ConfluxUkraineToken.sol"
  • Зачекайте поки завершиться компіляція
  • Повинна з'явитися зелена галочка
🔗 Підключаємо Fluent Wallet до Remix (РЕКОМЕНДУЄМО):
  • Натисніть "Deploy & Run Transactions" (четверта іконка)
  • У "Environment" оберіть "WalletConnect"
  • WalletConnect відкриється - натисніть "Connect" та оберіть Fluent
  • При першому підключенні автоматично підключається до мережі Ethereum - переключіть у Fluent на мережу "eSpace Testnet"
  • Натисніть "Customize this list" внизу списку Environment
  • Активуйте перемикач біля "Injected Provider - Fluent"
  • Закрийте вікно налаштувань
  • У "Environment" оберіть "Injected Provider - Fluent"
  • Готово! Тепер ви підключені до Conflux eSpace Testnet через Fluent

⚠️ Важливо: Працює тільки в Chrome/Edge. У Firefox використовуйте "Custom - External Http Provider"

🔗 Альтернативно: Підключення MetaMask до Remix:
  • У "Environment" оберіть "Injected Provider - MetaMask"
  • MetaMask відкриється - натисніть "Connect"
  • Переконайтеся, що обрана мережа "Conflux eSpace Testnet"
Початковий supply (500 млн токенів): 500000000000000000000000000
🎯 Виконуємо деплой токена:
  • Вставте скопійоване число в поле конструктора
  • Натисніть помаранчеву кнопку "Deploy"
  • Підтвердіть транзакцію в MetaMask
  • Зачекайте на підтвердження (10-30 секунд)
📋 Після успішного деплою:

Ваш токен контракт з'явиться в розділі "Deployed Contracts" з адресою схожою на:

0x1234...5678

Перевірити можно створений конракт на https://evmtestnet.confluxscan.org/. Збережіть цю адресу - вона знадобиться пізніше!

🧪 Крок 4: Тестування функцій токена

🔍 Перевірка основних функцій:
  • У "Deployed Contracts" розгорніть ваш токен контракт
  • Натисніть "name" - повинно показати "ConfluxUkraine"
  • Натисніть "symbol" - повинно показати "CFUKR"
  • Натисніть "totalSupply" - покаже загальну кількість
  • У "balanceOf" вставте свою адресу, покаже баланс гаманця
Для переказу 1000 токенів: 1000000000000000000000
💸 Тестуємо transfer:
  • Знайдіть функцію "transfer"
  • У поле "to" вставте свою адресу, або іншу де тестування перказу
  • У поле "amount" вставте значення вище
  • Натисніть "transfer" та підтвердіть транзакцію

💰 Додавання токена в кошельки:

  • MetaMask: Import tokens → Custom token → адреса контракту
  • Fluent Wallet: Assets → + → Add Custom Token
  • Символ: CFUKR (автоматично заповниться)
  • Decimals: 18 (стандарт ERC-20)

🎨 Крок 5: Створення ERC-721 NFT контракту

📝 Копіюємо код NFT в Remix:
  • Натисніть кнопку "📋 Копіювати" нижче
  • Відкрийте файл ConfluxUkraineNFT.sol в Remix
  • Натисніть Ctrl+A потім Ctrl+V (вставити)
  • Збережіть файл: Ctrl+S
ConfluxUkraineNFT.sol - Повний код NFT
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

/**
 * @title ConfluxUkraine NFT
 * @dev ERC721 NFT collection for Ukrainian Conflux community
 * @author Conflux Ukraine Team
 */
contract ConfluxUkraineNFT is ERC721, ERC721URIStorage, ERC721Burnable, Ownable, Pausable {
    uint256 private _tokenIdCounter;
    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public mintPrice = 0.01 ether; // 0.01 CFX per NFT
    mapping(address => bool) public minters;
    
    event NFTMinted(address indexed to, uint256 indexed tokenId, string uri);
    event MintPriceUpdated(uint256 oldPrice, uint256 newPrice);
    event MinterAdded(address indexed minter);
    event MinterRemoved(address indexed minter);
    
    modifier onlyMinter() {
        require(minters[msg.sender] || msg.sender == owner(), "ConfluxUkraine: not a minter");
        _;
    }
    
    modifier validAddress(address _address) {
        require(_address != address(0), "ConfluxUkraine: zero address");
        _;
    }
    
    constructor() ERC721("ConfluxUkraine NFT", "CFUKRNFT") Ownable(msg.sender) {
        minters[msg.sender] = true;
        emit MinterAdded(msg.sender);
    }
    
    function mint(address to, string memory uri) 
        public 
        onlyMinter 
        validAddress(to)
        whenNotPaused 
        returns (uint256) 
    {
        require(_tokenIdCounter < MAX_SUPPLY, "ConfluxUkraine: max supply reached");
        
        uint256 tokenId = _tokenIdCounter;
        _tokenIdCounter++;
        
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
        
        emit NFTMinted(to, tokenId, uri);
        return tokenId;
    }
    
    function publicMint(string memory uri) 
        external 
        payable 
        whenNotPaused 
        returns (uint256) 
    {
        require(msg.value >= mintPrice, "ConfluxUkraine: insufficient payment");
        require(_tokenIdCounter < MAX_SUPPLY, "ConfluxUkraine: max supply reached");
        
        uint256 tokenId = _tokenIdCounter;
        _tokenIdCounter++;
        
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
        
        // Refund excess payment
        if (msg.value > mintPrice) {
            payable(msg.sender).transfer(msg.value - mintPrice);
        }
        
        emit NFTMinted(msg.sender, tokenId, uri);
        return tokenId;
    }
    
    function batchMint(address[] calldata recipients, string[] calldata uris)
        external
        onlyMinter
        whenNotPaused
    {
        require(recipients.length == uris.length, "ConfluxUkraine: arrays length mismatch");
        require(recipients.length > 0, "ConfluxUkraine: empty arrays");
        require(recipients.length <= 50, "ConfluxUkraine: too many recipients");
        require(_tokenIdCounter + recipients.length <= MAX_SUPPLY, "ConfluxUkraine: would exceed max supply");
        
        for (uint256 i = 0; i < recipients.length; i++) {
            require(recipients[i] != address(0), "ConfluxUkraine: zero address");
            
            uint256 tokenId = _tokenIdCounter;
            _tokenIdCounter++;
            
            _safeMint(recipients[i], tokenId);
            _setTokenURI(tokenId, uris[i]);
            
            emit NFTMinted(recipients[i], tokenId, uris[i]);
        }
    }
    
    function addMinter(address minter) external onlyOwner validAddress(minter) {
        require(!minters[minter], "ConfluxUkraine: already a minter");
        minters[minter] = true;
        emit MinterAdded(minter);
    }
    
    function removeMinter(address minter) external onlyOwner {
        require(minter != owner(), "ConfluxUkraine: cannot remove owner");
        require(minters[minter], "ConfluxUkraine: not a minter");
        minters[minter] = false;
        emit MinterRemoved(minter);
    }
    
    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        uint256 oldPrice = mintPrice;
        mintPrice = _mintPrice;
        emit MintPriceUpdated(oldPrice, _mintPrice);
    }
    
    function pause() external onlyOwner {
        _pause();
    }
    
    function unpause() external onlyOwner {
        _unpause();
    }
    
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "ConfluxUkraine: no funds to withdraw");
        payable(owner()).transfer(balance);
    }
    
    function totalSupply() external view returns (uint256) {
        return _tokenIdCounter;
    }
    
    function remainingSupply() external view returns (uint256) {
        return MAX_SUPPLY - _tokenIdCounter;
    }
    
    // Required overrides
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    function _update(address to, uint256 tokenId, address auth)
        internal
        override
        whenNotPaused
        returns (address)
    {
        return super._update(to, tokenId, auth);
    }
}

🎯 Особливості NFT контракту:

  • ERC-721 стандарт для унікальних токенів
  • URI Storage для метаданих кожного NFT
  • Mint функції для власника та публічні
  • Максимальний supply 10,000 NFT
  • Ціна mint 0.01 CFX за NFT

🚀 Крок 6: Деплой NFT контракту

🔨 Компілюємо NFT контракт:
  • Переконайтеся, що NFT код збережено
  • У Solidity Compiler натисніть "Compile ConfluxUkraineNFT.sol"
  • Зачекайте на завершення компіляції
  • Повинна з'явитися зелена галочка
🎯 Деплой NFT контракту:
  • У "Deploy & Run" оберіть контракт "ConfluxUkraineNFT"
  • NFT контракт не потребує параметрів конструктора
  • Натисніть помаранчеву кнопку "Deploy"
  • Підтвердіть транзакцію в MetaMask
  • Зачекайте на підтвердження
📋 Після успішного деплою NFT:

Ваш NFT контракт з'явиться в "Deployed Contracts" поруч з токен контрактом

ConfluxUkraineNFT at 0xABCD...1234

Тепер у вас є обидва контракти готові до тестування!

🎨 Крок 7: Взаємодія з NFT та створення першого NFT

📋 Підготовка метаданих для першого NFT:
  1. Завантаження зображення на Pinata
    • Перейдіть на https://app.pinata.cloud/
    • Натисніть "Add""File Upload"
    • Оберіть ваше зображення NFT
    • Важливо: Встановіть Privacy Settings: "Public"
    • Важливо: Оберіть CID Version: "IPFS v1"
    • Скопіюйте отриманий CID (наприклад: bafkreibuel3en6nl7pzrmjm5t4azvuwswyayeh4ekrqknbjmjvu2abhfoi)
  2. Створення JSON метаданих
confluxukraine-metadata.json - Готові метадані NFT
{
  "name": "ConfluxUkraine #1",
  "description": "Перший NFT української Conflux спільноти. Символізує єдність та інновації в Web3 просторі України.",
  "image": "https://teal-genetic-skink-879.mypinata.cloud/ipfs/bafkreibuel3en6nl7pzrmjm5t4azvuwswyayeh4ekrqknbjmjvu2abhfoi",
  "external_url": "https://confluxukraine.org",
  "attributes": [
    {
      "trait_type": "Edition",
      "value": "Genesis"
    },
    {
      "trait_type": "Community",
      "value": "Ukraine"
    },
    {
      "trait_type": "Network",
      "value": "Conflux"
    },
    {
      "trait_type": "Rarity",
      "value": "Legendary"
    }
  ]
}

💡 Порада:

Ви можете завантажити готовий файл метаданих натиснувши кнопку "💾 Завантажити файл" вище, або створити власний, скопіювавши та відредагувавши JSON.

Після завантаження файлу, просто завантажте його на Pinata як описано в наступному кроці.

⚠️ Важливо:

Використовуйте HTTPS посилання замість ipfs:// для кращої сумісності з ConfluxScan!

📤 Завантаження JSON метаданих:
  • Завантажте JSON файл в Pinata
  • Privacy Settings: Public
  • CID Version: IPFS v1
  • Скопіюйте CID метаданих (наприклад: bafkreifrahfthgogod6ryaaj7vnjuweutfz3mzndvsjbazz2iwjrvw2yiq)
🎯 Mint першого NFT:

1. Підготовка в Remix

  • У розділі "Deploy & Run Transactions" знайдіть "Deployed Contracts"
  • Розгорніть ваш ConfluxUkraineNFT контракт
  • Знайдіть функцію "mint" (помаранчева кнопка)

2. Заповнення параметрів mint

  • to: адреса_отримувача (адреса кошелька користувача)
  • uri: https://teal-genetic-skink-879.mypinata.cloud/ipfs/bafkreifrahfthgogod6ryaaj7vnjuweutfz3mzndvsjbazz2iwjrvw2yiq
HTTPS URI (замініть на ваш hash): https://teal-genetic-skink-879.mypinata.cloud/ipfs/bafkreifrahfthgogod6ryaaj7vnjuweutfz3mzndvsjbazz2iwjrvw2yiq

⚠️ Критично важливо:

Використовуйте HTTPS посилання замість ipfs:// для правильного відображення в ConfluxScan!

🔥 Виконання mint:
  • Натисніть "transact"
  • Підтвердіть транзакцію в Fluent Wallet
  • Дочекайтеся підтвердження в блокчейні

🔍 Перевірка вашого NFT:

В Remix:

  • totalSupply() → покаже загальну кількість NFT
  • ownerOf(tokenId) → покаже власника конкретного токена
  • tokenURI(tokenId) → покаже метадані токена

В ConfluxScan:

  • Перейдіть на https://evmtestnet.confluxscan.org/
  • Знайдіть ваш контракт за адресою
  • Перегляньте створені NFT
  • При правильному налаштуванні: зображення, назва та атрибути відображатимуться коректно

Додавання в кошелек:

  • Відкрийте Fluent Wallet
  • Import NFT → введіть адресу контракту та Token ID
  • NFT з'явиться в колекції

🔧 Поради для успішного створення:

  1. Завжди використовуйте HTTPS посилання для image та uri
  2. Переконайтеся що файли Public в Pinata
  3. Тестуйте посилання в браузері перед mint
  4. Зберігайте CID файлів для майбутнього використання

✅ Результат: Повністю функціональний NFT з коректним відображенням в ConfluxScan!

✅ Крок 8: Верифікація обох контрактів

🎯 Верифікація через ConfluxScan

Верифікація робить ваші контракти прозорими та довіреними. Будемо використовувати офіційний ConfluxScan.

🌐 Верифікація через ConfluxScan:
  • В Remix правий клік на файлі контракту
  • Оберіть "Flatten" для отримання плоского коду
  • Скопіюйте flatten код (Ctrl+A, Ctrl+C)
  • Відкрийте evmtestnet.confluxscan.org
  • Вставте адресу контракту в пошук
  • Натисніть "Verify and Publish"
  • Заповніть форму з параметрами нижче

📋 Параметри для верифікації через ConfluxScan:

Contract Address: Ваша адреса контракту (з деплою)
Contract Name: ConfluxUkraineToken або ConfluxUkraineNFT
License: 3) MIT License
Compiler: v0.8.20+commit.a1b79de6
Optimization: No
Runs: 0
EVM Version to target: 1) default

🎉 Після успішної верифікації:

Ви побачите по середині екрана повідомлення "Verification Succeed", після чого:

  • З'явиться зелена галочка біля вкладки "Contract"
  • Ви побачите вкладки "Code", "Read Contract", "Write Contract"
  • Тепер кожен може переглянути код ваших контрактів
  • ConfluxScan буде показувати функції для взаємодії
  • Ваші контракти стануть довіреними в екосистемі
🎯 Приклад верифікованих контрактів:

Переглянути приклади з попередніх вебінарів:

🚀 Як зробити такий же контракт у Mainnet:

  1. Додайте Conflux eSpace Mainnet в MetaMask/Fluent:
    • Chain ID: 1030
    • RPC URL: https://evm.confluxrpc.com
    • Explorer: https://evm.confluxscan.org
  2. Купіть справжні CFX на біржах (Binance, OKEx, Gate.io)
  3. Повторіть всі кроки але в mainnet мережі
  4. Верифікуйте на evm.confluxscan.org
  5. ⚠️ Важливо: Спочатку добре протестуйте на testnet!

🎉 Вітаємо! Ваші токен та NFT повністю готові!

Ви успішно створили, розгорнули та верифікували ERC-20 токен та ERC-721 NFT на Conflux blockchain

Поділіться результатом в соціальних мережах з хештегом #ConfluxUkraine

🎬 Підготовчі відео та ресурси

Рекомендуємо переглянути ці відео перед вебінаром для кращого розуміння процесу розробки на Conflux

⏱ 12 хв

Перевірка смарт-контрактів на Conflux eSpace

Детальний гайд по верифікації смарт-контрактів через ConfluxScan. Дізнаєтеся, як правильно публікувати вихідний код ваших контрактів.

Верифікація ConfluxScan eSpace
⏱ 15 хв

Налаштування проекту Hardhat для Conflux eSpace 🚀🌐

Покрокове налаштування фреймворку Hardhat для розробки на Conflux eSpace. Ідеально для професійної розробки.

Hardhat Налаштування eSpace
⏱ 18 хв

Розробка на основі Conflux Core Space з використанням шаблонів Hardhat

Вивчаємо розробку для Core Space - унікальної частини екосистеми Conflux з власними особливостями та можливостями.

Core Space Hardhat Шаблони
⏱ 25 хв

Основи Solidity для початківців

Швидкий курс по основах мови Solidity. Якщо ви новачок у смарт-контрактах - цей відео обов'язковий до перегляду.

Solidity Початківці Основи
⏱ 22 хв

Безпека смарт-контрактів

Основні вразливості смарт-контрактів та способи їх уникнення. Важливі концепції для безпечної розробки.

Безпека Вразливості Best Practices
⏱ 16 хв

Conflux eSpace vs Core Space: в чому різниця?

Розбираємо архітектуру Conflux та відмінності між двома просторами. Коли використовувати кожен з них.

eSpace Core Space Архітектура

❓ Часті питання

Базове розуміння програмування буде корисним, але не обов'язковим. Ми пояснюємо всі концепції з нуля та надаємо готові приклади коду. Якщо ви новачок, рекомендуємо переглянути наші підготовчі матеріали перед вебінаром.
Так! Після вебінару ви матимете повний код NFT контракту та розумітимете принципи роботи з метаданими, IPFS та маркетплейсами. Зможете створювати власні колекції та налаштовувати їх під свої потреби.
Вебінар повністю безкоштовний! Це частина освітньої програми Conflux Ukraine для розвитку Web3 спільноти в Україні. Єдині витрати - це тестові CFX для експериментів (які також безкоштовні через faucet).
Так! Запис буде доступний усім зареєстрованим учасникам протягом 24 годин після завершення вебінару. Також ви отримаєте всі матеріали, код обох контрактів та додаткові ресурси на email.
Не хвилюйтеся! У нас є спеціальний Telegram чат для учасників, де можна поставити питання в режимі реального часу. Також після вебінару ви отримаєте весь код та зможете повторити все у своєму темпі з записом.
Ні! Ми працюємо виключно з testnet, де використовуються безкоштовні тестові CFX. Їх можна отримати через faucet. Це абсолютно безпечно та не потребує реальних коштів.
Для переходу на Conflux eSpace Mainnet потрібно: 1) Додати mainnet в MetaMask (Chain ID: 1030, RPC: https://evm.confluxrpc.com), 2) Купити справжні CFX на біржах (Binance, OKEx), 3) Повторити всі кроки деплою, але вже з реальними грошима. Рекомендуємо спочатку добре протестувати на testnet.
Так! Всі контракти мають MIT ліцензію та можуть бути використані для комерційних проектів. Ви можете модифікувати їх під свої потреби, створювати власні токени та NFT колекції для бізнесу.
Після вебінару ви зможете самостійно створювати токени та NFT, розумітимете основи DeFi та токеноміки. Ми також запросимо вас до приватної спільноти випускників для подальшого навчання, нетворкінгу та можливостей співпраці.

🚀 Реєстрація на вебінар

Заповніть форму нижче, щоб зареєструватися на безкоштовний практичний вебінар. Посилання та всі матеріали надішлемо на email за день до початку.

✅ Дякуємо за реєстрацію! Посилання на вебінар та всі матеріали надішлемо на ваш email за день до початку.
❌ Помилка реєстрації. Спробуйте ще раз або напишіть нам у Telegram.