Тонна переработки Jetton
Для ясного понимания читатель должен быть знаком с основными принципами обработки активов, описанными в разделе обработки платежей нашей документации.
Джеттоны - это токены на блокчейне TON - их можно рассматривать аналогично токенам ERC-20 на Ethereum.
В этом анализе мы глубже погружаемся в формальные стандарты, подробно описывающие [поведение] (https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md) и [метаданные] (https://github.com/ton-blockchain/TEPs/blob/master/text/0064-token-data-standard.md) jetton. Менее формальный обзор архитектуры jetton, ориентированный на шардинг, можно найти в нашем блоге анатомия jettons.
Также Вам следует помнить, что существует два подхода к работе с выводами средств из jetton:
- Memo Deposits - Это позволяет Вам держать один депозитный кошелек, а пользователи добавляют в него памятку, чтобы быть идентифицированными Вашей системой. Это означает, что Вам не нужно сканировать весь блокчейн, но это немного менее удобно для пользователей.
- Депозиты без мемо - Это решение также существует, но его сложнее интегрировать. Тем не менее, мы можем помочь Вам, если Вы хотите пойти этим путем. Пожалуйста, уведомите нас, прежде чем принять решение о применении этого подхода.
Jetton Architecture
Стандартизированные токены TON реализуются с помощью набора смарт-контрактов, включая:
- Jetton master смарт-контракт
- Кошелек Jetton смарт-контракты
Главный смарт-контракт Jetton
Главный смарт-контракт jetton хранит общую информацию о джеттоне (включая общий запас, ссылку на метаданные или сами метаданные).
Джеттоны с символом
==TON
или те, которые содержат системные уведомления, такие как:
ERROR
, SYSTEM
и другие. Обязательно проверьте, что джеттоны отображаются в Вашем интерфейсе таким образом, чтобы их нельзя было
смешать с передачей TON, системными уведомлениями и т.д.. Иногда даже symbol
, name
и image
создаются так, чтобы выглядеть почти идентично оригиналу, в надежде ввести пользователей в заблуждение.
Чтобы исключить возможность мошенничества для пользователей TON, пожалуйста, посмотрите оригинальный адрес джеттона (Jetton master contract) для конкретных типов джеттонов или следуйте за официальным каналом проекта в социальных сетях или веб-сайтом, чтобы найти корректную информацию. Проверьте активы, чтобы исключить возможность мошенничества, с помощью Tonkeeper ton-assets list.
Извлечение данных Jetton
Чтобы получить более конкретные данные Jetton, используйте метод get контракта get_jetton_data()
.
Этот метод возвращает следующие данные:
Имя | Тип | Описание |
---|---|---|
total_supply | int | общее количество выпущенных джеттонов, измеренное в неделимых единицах. |
mintable | int | Подробно описывает, можно ли чеканить новые джеттоны или нет. Это значение равно либо -1 (можно чеканить), либо 0 (нельзя чеканить). |
admin_address | slice | |
jetton_content | ячейка | Данные в соответствии с TEP-64, подробнее смотрите на странице jetton metadata parsing page. |
jetton_wallet_code | ячейка |
Вы можете вызвать его через Toncenter API или один из SDK.
- API
- js
Запустите метод
jetton/masters
из [Toncenter API] (https://toncenter.com/api/v3/#/default/get_jetton_masters_api_v3_jetton_masters_get)
import TonWeb from "tonweb";
const tonweb = new TonWeb();
const jettonMinter = new TonWeb.token.jetton.JettonMinter(tonweb.provider, {address: "<JETTON_MASTER_ADDRESS>"});
const data = await jettonMinter.getJettonData();
console.log('Total supply:', data.totalSupply.toString());
console.log('URI to off-chain metadata:', data.jettonContentUri);
Джеттон минтер
Как уже упоминалось, джеттоны могут быть как мятными
, так и немятными
.
Если они не чеканятся, логика становится простой - нет возможности чеканить дополнительные жетоны. Для первой чеканки джеттонов обратитесь к странице Mint your first jetton.
Если джеттоны можно чеканить, в контракте minter contract есть специальная функция для чеканки дополнительных джеттонов. Эту функцию можно вызвать, отправив с адреса администратора внутреннее сообщение
с указанны м опкодом.
Если администратор jetton хочет ограничить создание jetton, есть три способа сделать это:
- Если Вы не можете или не хотите обновлять код контракта, администратору необходимо передать право собственности от текущего администратора на нулевой адрес. В результате контракт останется без действующего администратора, что не позволит никому чеканить джеттоны. Однако это также предотвратит любые изменения в метаданных джеттона.
- Если у Вас есть доступ к исходному коду и Вы можете его изменить, Вы можете создать метод в контракте, который устанавливает флаг для прерывания любого процесса чеканки после его вызова, и добавить оператор для проверки этого флага в функцию mint.
- Если Вы можете обновить код контракта, Вы можете добавить ограничения, обновив код уже развернутого контракта.
Смарт-контракт для кошелька Jetton
Контракты Jetton wallet
используются для отправки, получения и сжигания джеттонов. Каждый контракт кошелька джеттона хранит информацию о балансе кошелька для конкретных пользователей.
В отдельных случаях джеттоновые кошельки используются для отдельных держателей джеттонов каждого типа.
Джеттон-кошельки
не следует путать с кошельками, предназначенными для взаимодействия с блокчейном и хранения
только актива Toncoin (например, кошельки v3R2, highload-кошельки и другие),
которые отвечают за поддержку и управление только определенным типом джеттона.
Развертывание кошелька Jetton
При передаче джеттонов
между кошельками транзакции (сообщения) требуют определенного количества TON
в качестве оплаты сетевых газовых сборов и выполнения действий в соответствии с кодом контракта кошелька Jetton.
Это означает, что получателю не нужно разворачивать кошелек jetton перед получени ем джеттонов.
Кошелек Jetton получателя будет развернут автоматически, пока отправитель имеет в кошельке достаточное количество TON
, чтобы оплатить необходимые сборы за газ.
Получение адресов кошельков Jetton для данного пользователя
Чтобы получить адрес
кошелька jetton
с помощью адреса владельца
(адреса кошелька TON),
главный контракт Jetton
предоставляет метод get get_wallet_address(slice owner_address)
.
- API
- js
Запустите
get_wallet_address(slice owner_address)
через метод/runGetMethod
из Toncenter API.
import TonWeb from "tonweb";
const tonweb = new TonWeb();
const jettonMinter = new TonWeb.token.jetton.JettonMinter(tonweb.provider, {address: "<JETTON_MASTER_ADDRESS>"});
const address = await jettonMinter.getJettonWalletAddress(new TonWeb.utils.Address("<OWNER_WALLET_ADDRESS>"));
// It is important to always check that wallet indeed is attributed to desired Jetton Master:
const jettonWallet = new TonWeb.token.jetton.JettonWallet(tonweb.provider, {
address: jettonWalletAddress
});
const jettonData = await jettonWallet.getData();
if (jettonData.jettonMinterAddress.toString(false) !== new TonWeb.utils.Address(info.address).toString(false)) {
throw new Error('jetton minter address from jetton wallet doesnt match config');
}
console.log('Jetton wallet address:', address.toString(true, true, true));