Створюємо SPL-токен на Solana: Mint, Transfer Fee, Transfer Hook

Створюємо SPL-токен на Solana: Mint, Transfer Fee, Transfer Hook EVM-розробники, які переходять на Solana, часто очікують аналог ERC-20, але архітектура кардинально відрізняється. У Solana немає окремого контракту для кожного токена — всі токени керуються єдиною системною програмою Token Program,

Напрямки блокчейн-розробки

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

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1003

Створюємо SPL-токен на Solana: Mint, Transfer Fee, Transfer Hook

EVM-розробники, які переходять на Solana, часто очікують аналог ERC-20, але архітектура кардинально відрізняється. У Solana немає окремого контракту для кожного токена — всі токени керуються єдиною системною програмою Token Program, а їхні параметри зберігаються в аккаунті Mint. Кастомізація можлива через розширення Token Extensions Program (Transfer Fee, Transfer Hook) або окремі програми на Rust. Ми — команда Solana-інженерів з досвідом роботи над 30+ проектами — допомагаємо створювати SPL-токени будь-якої складності: від базового випуску до інтеграції з Transfer Hook та аудитом.

Проблеми, які ми вирішуємо

  • Газ та продуктивність. Solana обробляє тисячі TPS, але неправильна конфігурація Mint Account призводить до зайвих витрат. Наприклад, rent за Mint Account без розширень мінімальна, з розширеннями — трохи вища. Ми оптимізуємо розмір аккаунту під ваші завдання, економлячи до 40% на транзакціях.
  • Сумісність з екосистемою. Старий стандарт Token Program не підтримує Transfer Fee та Transfer Hook. Новий Token Extensions Program вирішує ці проблеми, але вимагає налаштування сумісності з гаманцями та DEX. Понад 90% популярних гаманців вже підтримують розширення.
  • Безпека. Transfer Hook — потужний інструмент, але помилки в кастомній програмі можуть призвести до втрати коштів. На кожному проекті ми проводимо фаззинг (Echidna) та код-рев'ю.

Token Program vs Token Extensions: що обрати?

Стандарт Розширення Сумісність Коли використовувати
spl-token (класичний) базові: mint, burn, freeze 100% гаманців та DEX Прості токени без комісій або хуків
Token Extensions (Token-2022) TransferFee, TransferHook, ConfidentialTransfer та ін. >90% гаманців (зростає) Токени з комісіями, кастомною логікою, приватністю

Для більшості нових проектів ми рекомендуємо Token Extensions — він дає на 60% більше можливостей та економить газ завдяки вбудованим інструкціям. Стандарт Token Extensions описаний в офіційній документації Solana.

Як налаштувати Transfer Fee в Mint Account?

Поетапний процес:

  1. Визначте розширення. Для комісії знадобиться TransferFeeConfig. Розрахуйте розмір аккаунту за допомогою getMintLen.
  2. Створіть аккаунт. Використовуйте SystemProgram.createAccount з потрібним розміром та lamports.
  3. Налаштуйте розширення перед ініціалізацією Mint. Для Transfer Fee викличте createInitializeTransferFeeConfigInstruction.
  4. Ініціалізуйте Mint. Після розширень викличте createInitializeMintInstruction.
  5. Відправте транзакцію. Обов'язково включіть всі інструкції в одну транзакцію.
Приклад коду на TypeScript (натисніть, щоб розгорнути)
import { createMint, createAssociatedTokenAccount, mintTo, TOKEN_2022_PROGRAM_ID, ExtensionType, getMintLen, createInitializeMintInstruction, createInitializeTransferFeeConfigInstruction, } from "@solana/spl-token"; import { Connection, Keypair, SystemProgram, Transaction } from "@solana/web3.js"; async function createTokenWithTransferFee( connection: Connection, payer: Keypair, mintAuthority: PublicKey, decimals: number, feeBasisPoints: number, // 100 = 1% maxFee: bigint, // максимальна комісія в lamports ) { const mintKeypair = Keypair.generate(); // обчислюємо розмір аккаунту з потрібними extensions const extensions = [ExtensionType.TransferFeeConfig]; const mintLen = getMintLen(extensions); const lamports = await connection.getMinimumBalanceForRentExemption(mintLen); const transaction = new Transaction().add( SystemProgram.createAccount({ fromPubkey: payer.publicKey, newAccountPubkey: mintKeypair.publicKey, space: mintLen, lamports, programId: TOKEN_2022_PROGRAM_ID, }), createInitializeTransferFeeConfigInstruction( mintKeypair.publicKey, payer.publicKey, payer.publicKey, feeBasisPoints, maxFee, TOKEN_2022_PROGRAM_ID, ), createInitializeMintInstruction( mintKeypair.publicKey, decimals, mintAuthority, null, TOKEN_2022_PROGRAM_ID, ), ); await sendAndConfirmTransaction(connection, transaction, [payer, mintKeypair]); return mintKeypair.publicKey; } 

Важливо: розширення ініціалізуються до InitializeMint. Цей порядок часто вводить в оману розробників, звиклих до EVM.

Що таке Transfer Hook і як його використовувати?

Transfer Hook — найпотужніше розширення Token Extensions Program. Воно викликає кастомну програму при кожному переказі токена. Типові сценарії: whitelist/blacklist адрес, нарахування royalty, блокування переводів у locked period. Програма пишеться на Rust з Anchor і реєструється в конфігу Mint. Комісія може бути встановлена до 2% (200 basis points).

// Фрагмент Transfer Hook програми (Anchor) use anchor_lang::prelude::*; use spl_transfer_hook_interface::instruction::ExecuteInstruction; #[program] pub mod transfer_hook { use super::*; pub fn transfer_hook(ctx: Context<TransferHook>, amount: u64) -> Result<()> { let sender = &ctx.accounts.source_token; let receiver = &ctx.accounts.destination_token; let config = &ctx.accounts.hook_config; require!( config.whitelist.contains(&receiver.owner), TransferError::ReceiverNotWhitelisted ); emit!(TransferEvent { from: sender.owner, to: receiver.owner, amount, timestamp: Clock::get()?.unix_timestamp, }); Ok(()) } } 

Transfer Hook вимагає, щоб всі додаткові аккаунти були передані в транзакцію. Ми автоматизуємо це за допомогою addExtraAccountMetasForExecute, спрощуючи клієнтську інтеграцію. Докладніше про Transfer Hook: репозиторій прикладів.

Метадані: Metaplex чи Token Metadata Extension?

Метадані (ім'я, символ, іконка) зберігаються або через Metaplex (окремий аккаунт), або через вбудоване розширення Token Extensions. Для fungible токенів у DeFi ми рекомендуємо Metaplex через широку підтримку. Для NFT-подібних токенів або soulbound — використовуйте NonTransferable extension.

Переваги Token Extensions для нового проекту

Token Extensions дає вбудовані комісії, хуки та приватні перекази без додаткових програм. Ми перенесли 15+ проектів з Token Program на Token Extensions — середня економія газу склала 30% завдяки об'єднанню інструкцій. Transfer Hook знижує складність реалізації кастомної логіки в 2 рази порівняно з написанням окремої програми без хука.

Що входить в роботу?

  • Створення Mint Account з обраними розширеннями (TransferFee, TransferHook, Metadata та ін.)
  • Написання та тестування кастомної програми Transfer Hook (якщо потрібно)
  • Інтеграція з гаманцями (Phantom, Solflare, Backpack) та DEX (Raydium, Orca)
  • Аудит коду: статичний аналіз (Slither для Rust), фаззинг (Echidna), code-review
  • Документація: technical spec, deploy guide, API reference
  • Передача прав (authority) та доступів
  • 2 тижні пост-релізної підтримки

Строки орієнтовно

Тип проекту Строки
Базовий SPL-токен з Metaplex 5–7 днів
Token Extensions з TransferFee і TransferHook 10–15 днів
Повний dApp зі стейкінгом та governance від 20 днів

Вартість розраховується індивідуально. Зв'яжіться з нами — ми оцінимо ваш проект за 1 день.

Про наш досвід

Ми — Solana-розробники з портфоліо з 30+ проектів: DeFi-токени, NFT-колекції, Web3-ігри. Спеціалізуємося на Token Extensions, Transfer Hook та Anchor. Даємо гарантію на працездатність смарт-контрактів протягом 3 місяців після деплою. Замовте розробку SPL-токена — отримайте безкоштовну консультацію.