Создаем 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-токена — получите бесплатную консультацию.







