Создаем 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?
Пошаговый процесс:
- Определите расширения. Для комиссии потребуется
TransferFeeConfig. Рассчитайте размер аккаунта с помощьюgetMintLen. - Создайте аккаунт. Используйте
SystemProgram.createAccountс нужным размером и lamports. - Настройте расширения перед инициализацией Mint. Для Transfer Fee вызовите
createInitializeTransferFeeConfigInstruction. - Инициализируйте Mint. После расширений вызовите
createInitializeMintInstruction. - Отправьте транзакцию. Обязательно включите все инструкции в одну транзакцию.
Пример кода на 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-токена — получите бесплатную консультацию.







