Содержание
- 1. Что такое налог на токены в Solana?
- 2. Объяснение расширения комиссии за перевод Token-2022
- 3. Ключевые параметры: Базисные пункты, максимальная комиссия, полномочия
- 4. Налог на токены Solana против налога на покупку/продажу EVM — ключевые различия
- 5. Как установить налог на токены без кода (CreateMyCoin)
- 6. Как установить налог на токены с помощью SPL CLI
- 7. Как вывести собранные комиссии за перевод
- 8. Совместимость с DEX: Где торгуются токены Token-2022
- 9. Лучшие практики и распространенные ошибки
- 10. FAQ
Что такое налог на токены в Solana?
Налог на токены в Solana — также называемый комиссией за перевод или налогом на токены SPL — это автоматическое вычитание, применяемое каждый раз, когда ваш токен меняет владельца. Всякий раз, когда кто-то отправляет, покупает или продает ваш токен, процент от переводимой суммы удерживается и хранится на счете токена получателя. Проект токена может затем вывести эти удержанные комиссии на свой кошелек в любое время.
Это эквивалент того, что в цепочках EVM называется «налогом на покупку/продажу» или «налогом на отражение». Ключевое отличие: на Solana механизм комиссии находится в самой программе токена, а не в отдельном смарт-контракте. Это делает его дешевле, надежнее и сложнее обойти, чем реализации налога EVM.
- Распространенные варианты использования: Финансирование казначейства с автовыкупом, пулы вознаграждений сообщества, доход команды, механизмы сжигания через перенаправление комиссий
- Кто контролирует: Кошелек, обладающий полномочиями по настройке комиссии за перевод — устанавливается при создании токена
- Когда взимаются комиссии: При каждом переводе токенов SPL, автоматически, на уровне протокола
- Куда идут комиссии: Удерживаются на счете токена получателя до тех пор, пока орган по взиманию комиссий не соберет их
Объяснение расширения комиссии за перевод Token-2022
Solana имеет две программы токенов: оригинальную программу SPL Token (также называемую Token) и новую программу Token-2022 (также записываемую как Token Extensions или Token22). Комиссии за перевод являются функцией Token-2022 — они не доступны в оригинальной программе SPL Token.
| Функция | SPL Token (Оригинал) | Token-2022 (Расширения) |
|---|---|---|
| Комиссия за перевод / налог на токены | ❌ Не поддерживается | ✅ Встроенное расширение |
| Конфиденциальные переводы | ❌ Не поддерживается | ✅ Доступно |
| Непередаваемые токены | ❌ Не поддерживается | ✅ Доступно |
| Процентные токены | ❌ Не поддерживается | ✅ Доступно |
| Полномочия на закрытие минта | ❌ Не поддерживается | ✅ Доступно |
| Поддержка DEX (Raydium, Orca) | ✅ Полная поддержка | ✅ Растет (проверьте версию) |
| Поддержка кошельков (Phantom, Solflare) | ✅ Универсальная | ✅ Поддерживается |
Расширение Transfer Fee работает путем встраивания логики комиссии непосредственно в учетную запись минта токена. Когда вы создаете токен Token-2022 с включенным расширением комиссии за перевод, каждая инструкция по переводу проверяет параметры комиссии и удерживает правильную сумму — до того, как токены достигнут места назначения.
Важно: Расширение комиссии за перевод должно быть добавлено во время создания токена. Вы не можете добавить комиссию за перевод к существующему токену SPL или к существующему токену Token-2022 после развертывания. Это решение принимается один раз, навсегда, при создании минта.
Ключевые параметры: Базисные пункты, максимальная комиссия, полномочия
При установке налога на токены в Solana вы настраиваете четыре критически важных параметра. Понимание каждого из них перед развертыванием крайне важно — эти значения определяют, как ваш токен ведет себя экономически.
| Параметр | Тип | Описание | Пример |
|---|---|---|---|
feeBasisPoints |
u16 (0–10000) | Комиссия в базисных пунктах. 100 базисных пунктов = 1%. 500 = 5%. | 300 = 3% налог |
maxFee |
u64 | Максимальная комиссия за перевод в сырых единицах токена (с десятичными знаками). Ограничивает комиссию для очень больших переводов. | 1000000 = 1 токен (если 6 десятичных знаков) |
transferFeeConfigAuthority |
Pubkey | null | Кошелек, который может обновлять ставку комиссии и максимальную комиссию в будущем. Установите null, чтобы заблокировать навсегда. | Ваш проектный кошелек или null |
withdrawWithheldAuthority |
Pubkey | null | Кошелек, который может собирать удержанные комиссии со счетов токенов. Должен быть безопасным казначейским кошельком. | Ваш казначейский кошелек |
Понимание базисных пунктов
Базисные пункты (bps) — это стандартная единица для выражения процентных ставок комиссии в финансовых системах. Один базисный пункт равен 0,01%, поэтому:
- 50 bps = 0,5% налог за перевод
- 100 bps = 1% налог за перевод
- 300 bps = 3% налог за перевод
- 500 bps = 5% налог за перевод
- 1000 bps = 10% налог за перевод
- 10000 bps = 100% (каждый токен удерживается — фактически непередаваемый)
Понимание maxFee
Параметр maxFee ограничивает удерживаемую сумму при любом одиночном переводе. Это предотвращает чрезмерно высокое налогообложение при массивных транзакциях китов. Например, если вы установите 3% налог, но кит переводит 10 000 000 токенов, без ограничения он заплатит 300 000 токенов в виде комиссий. maxFee, скажем, 10 000 токенов (с 6 десятичными знаками: 10000000000) ограничивает максимальную комиссию за любой одиночный перевод.
Установка maxFee на максимальное значение (18446744073709551615, максимальное значение u64) фактически означает отсутствие ограничения — процент всегда применяется. Большинство проектов устанавливают разумное ограничение, чтобы не отпугивать крупных держателей.
Полномочия по настройке комиссии за перевод против полномочий по выводу удержанных средств
Это два отдельных полномочия, каждое со своими отличительными функциями:
- Transfer Fee Config Authority — Может обновлять
feeBasisPointsиmaxFeeв любое время с помощью инструкцииsetTransferFee. Это мощно: если вы сохраните это полномочие, вы сможете изменить ставку налога с 3% до 10% без согласия держателей токенов. Проекты, которые хотят завоевать доверие, должны либо отказаться от этого полномочия (установить null), либо публично объявить о процессе управления комиссиями. - Withdraw Withheld Authority — Может собирать комиссии, накопленные на счетах токенов и на счете минта. Это полномочие не может изменять ставку комиссии — оно только собирает уже заработанные комиссии. Оно всегда должно указывать на безопасный кошелек (в идеале мультисиг).
Налог на токены Solana против налога на покупку/продажу EVM — ключевые различия
Если вы создавали токены в Ethereum, BNB Chain или других цепочках EVM, концепция налога на покупку/продажу вам знакома — но Solana реализует ее очень по-другому. Вот что меняется:
| Аспект | Налог на покупку/продажу EVM | Комиссия за перевод Solana (Token-2022) |
|---|---|---|
| Реализация | Пользовательская логика контракта Solidity (например, переопределение ERC-20) | Встроенное расширение программы Token-2022 |
| Применяется к | Обычно только к покупкам/продажам на DEX (через обнаружение свопов) | Каждый перевод, включая кошелек-кошелек |
| Можно ли обойти? | Иногда (прямые вызовы контракта могут пропускать логику налога) | Нет — применяется на уровне выполнения |
| Куда идет комиссия | Обычно распределяется автоматически (отражение) или отправляется в контракт | Удерживается на счете получателя, собирается вручную |
| Гибкость обновления комиссии | Требует повторного развертывания или вызова функций владельца | Инструкция setTransferFee (если полномочия сохранены) |
| Требования к аудиту | Пользовательский код должен быть проверен на скрытые лазейки | Стандартная программа — для логики комиссии специальный аудит не требуется |
| Стоимость газа | Выше (дополнительная логика на каждый перевод) | Минимальна (несколько дополнительных вычислительных единиц на перевод) |
Самое важное отличие: комиссия за перевод Solana применяется ко всем переводам, а не только к свопам DEX. Это означает, что переводы между кошельками, аирдропы и внутренние перемещения команды также облагаются комиссией. Учитывайте это в своей токеномике — частые внутренние операции будут истощать ваше собственное казначейство, если вы не будете осторожны.
Как установить налог на токены с помощью SPL CLI
Для разработчиков, которым нужен полный контроль, spl-token CLI и библиотека @solana/spl-token TypeScript поддерживают создание токенов Token-2022 с комиссиями за перевод. Вот как это сделать через CLI и код.
Предварительные условия
- Установлен Solana CLI (
solana --version) - SPL-токен CLI обновлен до версии, поддерживающей Token-2022 (
spl-token --version≥ 3.0) - Финансируемая пара ключей Solana (mainnet или devnet)
- Node.js ≥ 18 при использовании TypeScript
Метод 1: SPL Token CLI
Создайте минт Token-2022 с расширением комиссии за перевод одной командой:
spl-token create-token \ --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \ --transfer-fee 300 1000000 \ --decimals 6
Разбор флагов:
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb— Это адрес программы Token-2022. Требуется для создания токена Token-2022.--transfer-fee 300 1000000— Устанавливает комиссию в 300 базисных пунктов (3%) с максимальной комиссией 1 000 000 сырых единиц. При 6 десятичных знаках это равно 1 токену максимум.--decimals 6— Стандарт для большинства токенов Solana (то же, что и USDC).
CLI выведет адрес вашего нового минта. Текущая пара ключей (ваш ~/.config/solana/id.json) становится полномочием по настройке комиссии за перевод и полномочием по выводу удержанных средств по умолчанию.
Метод 2: TypeScript (@solana/spl-token)
Для программного создания — полезно для скриптов, бэкендов или dApps:
import {
createInitializeMintInstruction,
createInitializeTransferFeeConfigInstruction,
ExtensionType,
getMintLen,
TOKEN_2022_PROGRAM_ID,
} from "@solana/spl-token";
import {
Connection, Keypair, SystemProgram,
Transaction, sendAndConfirmTransaction, clusterApiUrl
} from "@solana/web3.js";
const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
const payer = Keypair.fromSecretKey(/* ваш секретный ключ */);
const mintKeypair = Keypair.generate();
// Fee config
const feeBasisPoints = 300; // 3%
const maxFee = BigInt(1_000_000); // 1 токен (6 десятичных знаков)
const feeConfigAuthority = payer.publicKey;
const withdrawAuthority = payer.publicKey;
const decimals = 6;
// Calculate space needed for the mint + extension
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,
feeConfigAuthority,
withdrawAuthority,
feeBasisPoints,
maxFee,
TOKEN_2022_PROGRAM_ID
),
createInitializeMintInstruction(
mintKeypair.publicKey,
decimals,
payer.publicKey, // полномочие по минту
null, // полномочие по заморозке (null = нет)
TOKEN_2022_PROGRAM_ID
)
);
await sendAndConfirmTransaction(connection, transaction, [payer, mintKeypair]);
console.log("Адрес минта:", mintKeypair.publicKey.toBase58());
Порядок имеет значение: ИнструкцияcreateInitializeTransferFeeConfigInstructionдолжна предшествовать инструкцииcreateInitializeMintInstructionв транзакции. Инициализация расширения должна происходить до инициализации минта. Ошибка в этом порядке приведет к ошибке транзакции.
Как вывести собранные комиссии за перевод
После того как ваш токен запущен и передается, комиссии накапливаются в двух местах:
- Счета получателей токенов — Каждый счет, который получает токены с удержанной комиссией, хранит эту комиссию внутри.
- Сам счет минта — Комиссии могут быть опционально переведены с отдельных счетов на счет минта в первую очередь.
Для сбора этих комиссий полномочие по выводу удержанных средств выполняет двухэтапный процесс:
-
Сбор удержанных токенов на минт. Вызовите
harvestWithheldTokensToMintдля списка счетов токенов, хранящих удержанные комиссии. Это переводит все удержанные суммы с отдельных счетов на эскроу комиссий счета минта. -
Вывод из минта на ваш кошелек. Вызовите
withdrawWithheldTokensFromMintс вашим казначейским счетом токенов в качестве получателя. Это перемещает комиссии из эскроу комиссий минта на ваш счет токенов.
Вывод через CLI
# Шаг 1: Собрать комиссии со всех счетов токенов на минт spl-token harvest-withheld-tokens ВАШ_АДРЕС_МИНТА \ --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb # Шаг 2: Вывести комиссии с минта на ваш счет токенов spl-token withdraw-withheld-tokens ВАШ_АДРЕС_МИНТА ВАШ_СЧЕТ_ТОКЕНОВ \ --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
Кошелек, выполняющий эти команды, должен быть полномочием по выводу удержанных средств, установленным при создании минта. Любой другой, вызывающий эти инструкции, получит ошибку авторизации.
Совместимость с DEX: Где торгуются токены Token-2022
Один из самых важных практических вопросов для токена Solana с комиссией за перевод: какие DEX поддерживают Token-2022? Не все AMM обновили свои пулы для обработки учета удержанных комиссий, которые требуются Token-2022.
| DEX / Платформа | Поддержка Token-2022 | Обработка комиссии за перевод | Примечания |
|---|---|---|---|
| Raydium | ✅ Да | Поддерживается в пулах CPMM | Используйте тип пула CPMM для токенов Token-2022 |
| Orca | ✅ Да | Поддерживается (Whirlpools) | Whirlpool v2 поддерживает расширения Token-2022 |
| Jupiter | ✅ Да | Агрегатор маршрутизирует через совместимые пулы | Jupiter автоматически маршрутизирует к пулам Raydium/Orca |
| Meteora | ✅ Да | DLMM и динамические пулы | Проверьте совместимость типа пула перед созданием |
| DexScreener | ✅ Да (отображение) | Показывает пулы Token-2022 и цену | Графики цен и данные полностью поддерживаются |
| Phantom Wallet | ✅ Да | Отображает токены и информацию о комиссии | Показывает значок комиссии за перевод на токенах Token-2022 |
| Solflare | ✅ Да | Полная поддержка отображения Token-2022 | Показывает баланс удержанной комиссии в деталях счета |
Для новых проектов практический путь таков: создайте свой токен Token-2022 → добавьте ликвидность на Raydium CPMM → ваш токен появится на DexScreener и автоматически маршрутизируется через Jupiter. Это дает вам полный доступ к рынку без какой-либо дополнительной настройки.
Лучшие практики и распространенные ошибки
Лучшие практики
- Поддерживайте разумную комиссию. Комиссии выше 5% значительно снижают глубину ликвидности и интерес трейдеров. Большинство успешных проектов Solana с комиссиями за перевод используют 1–3%. Все, что выше 5%, помечается инструментами проверки «rug-pull» как «honeypot».
- Используйте аппаратный кошелек или мультисиг в качестве полномочий. Как полномочия по настройке комиссии, так и полномочия по выводу удержанных средств должны быть защищены. Мультисиг Squads является стандартом для команд проектов Solana.
- Публично раскрывайте информацию о комиссии. Добавьте отказ от ответственности о комиссии за перевод на свой веб-сайт, в Telegram и на все страницы листинга токенов. Информированные трейдеры с меньшей вероятностью почувствуют себя обманутыми, когда увидят комиссию в блокчейне.
- Установите разумное ограничение
maxFee. Разумное ограничение предотвращает уплату крупными держателями непропорциональных комиссий и делает ваш токен привлекательным для более крупных инвесторов. - Сначала протестируйте на devnet. Разверните свой токен на Solana devnet, выполните несколько тестовых переводов и убедитесь, что расчет комиссии верен, прежде чем запускать в основную сеть.
- Документируйте использование комиссии. Опубликуйте, куда идут собранные комиссии (выкуп, команда, вознаграждения за стейкинг). Прозрачность повышает доверие и снижает восприятие «rug-pull».
Распространенные ошибки, которых следует избегать
- Неправильная установка
feeBasisPoints. Ввод 3 вместо 300 приводит к комиссии 0,03% вместо 3%. Всегда перепроверяйте значение базисных пунктов. - Забывание единиц
maxFee.maxFeeуказывается в сырых единицах токена, а не в читаемых человеком суммах. Для токена с 6 десятичными знаками 1 токен = 1 000 000 сырых единиц.maxFee, равный1, ограничивает комиссию 0,000001 токена — по сути, нулем. - Использование одного и того же кошелька для обоих полномочий. Если ваш горячий кошелек будет скомпрометирован, вы потеряете контроль над ставкой комиссии и сбором комиссии одним махом.
- Неучет комиссий во внутренних переводах. Если вы отправляете свои токены по воздуху или перемещаете токены между кошельками команды, применяется комиссия за перевод. Планируйте бюджет соответственно.
- Попытка добавить расширение после развертывания. Расширение комиссии за перевод нельзя добавить к уже развернутому минту. Если вы забыли его включить, вам придется создать новый токен.
- Создание пула Raydium v4 (устаревшего). Устаревшие пулы Raydium не поддерживают Token-2022. Используйте CPMM.
FAQ
Нет. Расширение комиссии за перевод должно быть добавлено при создании минта. Вы не можете добавлять расширения к уже развернутому минту токена. Если вы хотите установить комиссию за перевод, вы должны создать новый токен Token-2022 с нуля.
Технически, до 10 000 базисных пунктов (100%) — это означает, что все переводимые токены удерживаются. На практике, все, что выше 5–10%, делает ваш токен неликвидным и будет отмечено сканерами. Большинство успешных проектов используют 1–3%. Комиссия в 100% фактически создает непередаваемый токен.
Да, комиссия применяется к каждому переводу токенов — включая свопы DEX. Когда покупатель приобретает ваш токен на Raydium, своп внутренне передает токены из пула на кошелек покупателя. Этот перевод вызывает комиссию. То же самое и для продаж. Комиссия применяется независимо от того, является ли перевод прямой отправкой или свопом DEX.
Если вы сохранили полномочия по настройке комиссии за перевод, вы можете вызвать setTransferFee с новыми значениями feeBasisPoints и maxFee в любое время. Через CLI: spl-token set-transfer-fee ВАШ_МИНТ НОВАЯ_СТАВКА НОВАЯ_МАКС_КОМИССИЯ --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb. Если вы отказались (установили null) от полномочий при создании, ставка комиссии будет заблокирована навсегда.
DexScreener показывает значки расширений Token-2022, включая информацию о комиссии за перевод, непосредственно на странице токена. Страницы листинга CoinGecko также могут отображать данные о расширениях токенов. Кошельки Phantom и Solflare показывают индикатор комиссии за перевод, когда пользователи просматривают ваш токен — таким образом, покупатели видят комиссию перед совершением транзакции.
Удержанные комиссии — это суммы, автоматически вычитаемые из переводов и хранящиеся на индивидуальных счетах получателей токенов. Они хранятся на условном депонировании и еще не доступны проекту. Сбор комиссий — это ручной процесс выполнения harvestWithheldTokensToMint, за которым следует withdrawWithheldTokensFromMint — это перемещает удержанные комиссии на ваш казначейский кошелек. Вы должны активно собирать комиссии; они не поступают автоматически.
Нет. Рефлексивный токен (распространенный в BNB Chain) автоматически перераспределяет комиссии всем существующим держателям пропорционально. Механизм комиссии за перевод Solana не делает этого изначально — комиссии удерживаются и поступают тому, кто контролирует полномочия по выводу удержанных средств. Вы можете имитировать рефлексию, вручную распределяя собранные комиссии держателям, но это требует дополнительной логики и не является автоматическим.
Комиссия вычитается из переводимой суммы. Если вы отправляете 1000 токенов с комиссией 3%, получатель получает 970 токенов, а 30 токенов удерживаются. Отправитель не платит дополнительно — получатель получает меньше. Это отличается от некоторых реализаций налога EVM, где комиссия добавляется к отправленной сумме.