${habrauser}, Привет!
Я — Старов Александр, сооснователь и главный разработчик в VOLT. В процессе создания собственной криптовалюты VOLT Coin (сейчас проводится аирдроп монеты, информацию можно найти на сайте volt-ink.com, поэтому можете присоединяться) мы столкнулись с достаточной нехваткой информации в интернете. Да, у Aptos зачётная документация, но некоторые моменты либо не указаны, либо неактуальны. Поэтому информацию пришлось собирать по кусочкам.
Данная статья — это пошаговое руководство по созданию собственного FA Asset (Fungible Asset) на основе блокчейна Aptos. Надеюсь, что эта информация будет для кого-нибудь полезной )

Установка Aptos CLI
Если вы всё-таки решились поработать с экосистемой Aptos, то самое первое, что стоит сделать, — это установить Aptos CLI. Ничего сложного нет, тут следуйте чётко по инструкции с сайта: https://aptos.dev/build/cli
Если вы — обладатель сея прекрасного дистрибутива Arch Linux, то команду установки Aptos CLI оставлю внизу:
git clone https://aur.archlinux.org/aptos-bin.git
cd aptos-bin
makepkg -si
Или с помощью AUR:
yay -S aptos-bin
Базовая структура проекта
Специально для этой статьи мы подготовили репозиторий на GitHub с шаблоном смарт-контракта по стандарту FA Asset: https://github.com/VOLT-Crypto/basic-aptos-fa-coin?tab=readme-ov-file. Клонируйте его, так как далее мы займёмся рассмотрением Move-модуля.
Но сперва создадим Aptos-аккаунт в сети Devnet в корне проекта с помощью команды:
aptos init
После того как вы получили адрес своего Aptos-аккаунта, измените адрес в этой строке файла Move.toml на текущий:
[addresses]
admin = "YOUR ADDRESS"
Последнее, что сделаем - это соберём и опубликуем монету в devnet, а также проведём тестовую транзакцию, отчеканив монету сразу на каком-нибудь другом кошельке (желателен Petra Wallet, потому что был разработан специально для экосистемы Aptos)
Собираем Move-модуль:
aptos move compile
Публикуем его:
aptos move publish
Теперь чеканим монету на Petra Wallet в сети devnet. Вместо Address Wallet впишите адрес вашего Petra или какого-нибудь другого кошелька.
aptos move run --function-id 'default::basic_fa_coin::mint' --args address:<Address Wallet> u64:100000000 --profile default
Вот для этой команды стоит оставить комментарий: если у вас Windows, то проблема может возникнуть в кавычках команды, просто уберите их. Да, это забавно, но именно из-за них мы потеряли полтора часа. Если на Arch Linux всё было GOOD, то на Windows — нет!
Если все эти этапы были успешно выполнены, то можно перейти к разбору самого смарт-контракта.
Смарт-контракт
Для Aptos он составляется на специальном языке Move, синтаксис которого отдаёт нотками Rust. Изначально он разрабатывался для блокчейна Diem от Meta, но теперь также используется и в других проектах. Смысла расписывать про него здесь я как такового не вижу, ибо тема довольно обширная.
Объектная модель и Инициализация
В отличие от старого стандарта FA Coin, где данные хранились в аккаунте создателя, этот контракт использует Aptos Object Model.
При инициализации создается именованный объект с детерминированным адресом, основанным на ASSET_SYMBOL ("BFC"). Это позволяет любому пользователю легко найти адрес метаданных токена, не зная адреса создателя.
Все критические ресурсы (ManagedFungibleAsset и TotalSupply) перемещаются внутрь этого созданного объекта (metadata_object_signer), а не на аккаунт администратора. Это чистый паттерн, отделяющий логику токена от личного кошелька разработчика.
Контракт активирует поддержку "первичного хранилища", что означает, что балансы пользователей привязываются к их адресам стандартным образом, обеспечивая совместимость с кошельками.
Управление возможностями
Стандарт FA Asset использует систему ссылок (Refs) для управления правами доступа. В структуре ManagedFungibleAsset хранятся три ключевые ссылки:
MintRef: Право на создание новых токенов.
TransferRef: Право на принудительное перемещение токенов (игнорируя заморозку) и заморозку аккаунтов.
BurnRef: Право на сжигание токенов с любого баланса.
Эти ссылки генерируются один раз при инициализации и "запираются" внутри объекта метаданных. Доступ к ним может получить только владелец объекта (администратор) через функцию-хелпер authorized_borrow_refs.
Реализация Hard Cap
Стандарт Fungible Asset по умолчанию не ограничивает максимальное предложение (Max Supply). Данный контракт реализует эту логику вручную: используется ресурс TotalSupply, хранящий текущее количество токенов.
Проверка при минте: В функции mint происходит проверка: assert!(supply.current + amount <= MAX_SUPPLY, ...). Если лимит превышен, транзакция отменяется с ошибкой E_SUPPLY_EXCEEDED.
Административные функции
Администратору предоставляется абсолютная власть над активом, что типично для централизованных стейблкоинов или корпоративных токенов:
Функция transfer использует transfer_ref администратора. Это позволяет перемещать средства между пользователями без их подписи.
Функции freeze_account и unfreeze_account переключают флаг заморозки на кошельке пользователя (primary_fungible_store). Замороженный пользователь не может отправлять или принимать токены стандартными методами.
Администратор может сжечь токены с баланса любого пользователя, используя burn_from, при этом корректно уменьшая счетчик TotalSupply.
Конец
Да, на этом, в принципе, всё. Если вдруг возникли какие-то вопросы, то жду ваш комментарий. Для тех, кого заинтересовал проект VOLT оставлю ссылочки на соц-сети ниже:
Telegram - Telegram
X - X (Twitter)
Спасибо за прочтение )
kerberos464
А зачем это нужно?