Принимайте платежи в сети TRON через отдельные адреса счетов, не передавая сервису приватные ключи от средств.
Главный принцип
Сервис следит за платежами и координирует работу, а финансовые операции выполняются смарт-контрактами по правилам вашей фабрики.
Для чего нужен проект
Обычная схема приема криптовалюты часто требует создавать множество кошельков и хранить их приватные ключи. Это усложняет инфраструктуру и создает дополнительную точку риска.
Merchant Receipt назначает каждому счету отдельный расчетный адрес без приватного ключа. Сервис обнаруживает платежи, ведет историю, запускает проверки и автоматизацию, но не хранит ключи, с помощью которых можно вывести поступившие средства.
Что это дает мерчанту
Нет хранилища приватных ключей
Компрометация сервиса не раскрывает ключи от адресов счетов: таких ключей не существует.
Предсказуемые правила обработки
Ключевые правила задаются фабрикой, а перевод средств выполняют смарт-контракты.
Отдельный адрес для каждого счета
Платеж легко связать с заказом без общего адреса и назначения перевода.
Автоматизация с контролем
Штатные платежи обрабатываются автоматически, а отклонения останавливаются для решения мерчанта.
Что понадобится для начала
✓
Кошелек в сети TRONОн используется для входа, подтверждения прав владельца и управления фабриками.
Вход в кабинет выполняется подписью сообщения. Это не транзакция: при авторизации средства не переводятся и разрешения на их списание не выдаются.
Когда потребуются сетевые расходы
Просмотр данных, создание счетов, получение уведомлений и штатные сервисные запросы не отправляют транзакцию от кошелька мерчанта.
Реальная транзакция может понадобиться при первичной регистрации фабрики, изменении ее сетевых параметров и ручном решении нештатной ситуации, например при возврате, переводе произвольному получателю или управлении кошельком фабрики.
Единое рабочее пространство для настройки приема платежей, наблюдения за счетами и решения ситуаций, требующих участия мерчанта.
Кабинет управляет процессом, но не хранит приватные ключи от платежных адресов.
Он объединяет данные сервиса и состояние контрактов в понятный интерфейс, а подключенный кошелек подтверждает права владельца.
Для чего предназначен кабинет
Merchant UI рассчитан на ежедневный контроль платежной инфраструктуры. Здесь удобно подготовить фабрику к работе, проверить ее состояние, наблюдать за оплатами и принимать решения там, где автоматическая обработка была остановлена правилами.
Управлять фабрикамиСоздавать проекты, задавать параметры приема платежей, получателей, AML и webhook.
Работать со счетамиИскать счета, отслеживать оплату, изучать журнал и выполнять разрешенные ручные действия.
Следить за событиямиПолучать уведомления о важных этапах и видеть историю действий в одном месте.
Настраивать интеграцииУправлять интерфейсом, уведомлениями, API-ключами и подключением внешних систем.
Основные разделы
Фабрики
Главный экран проекта. Показывает готовность фабрики, оборот, платежи, активные счета, баланс TMR и настройки обработки.
Счета
Общий список счетов всех фабрик с поиском, фильтрами, статусами и подробной карточкой каждого платежа.
Проверка адреса
Бесплатная предварительная оценка будущего плательщика по известным меткам и прямым связям.
События
Уведомления, новости сервиса и журнал операций. Помогает восстановить последовательность событий и не пропустить важное действие.
Настройки
Общие параметры кабинета, персонализация интерфейса, управление уведомлениями и ключами серверного API.
Предварительная проверка адреса
Инструмент помогает оценить адрес будущего плательщика до приема платежа. Проверка ищет известные метки самого адреса и анализирует его непосредственные входящие и исходящие взаимодействия на глубину одного уровня.
Предварительные и полноценные проверки учитываются отдельно
Для предварительной оценки доступно 100 бесплатных запросов в сутки. Полноценные AML-проверки хранятся на отдельном накопительном балансе и расходуются только по вашему подтверждению.
Уровень рискаОценка по шкале от минимального до высокого риска и краткий прогноз прохождения основной AML-проверки.
Известные меткиКатегории, которыми адрес отмечен в аналитической базе: тип сервиса, принадлежность или известный источник риска.
Индикаторы рискаКонкретные признаки, повлиявшие на оценку: санкционные связи, опасные категории, повышенный юрисдикционный или иной выявленный риск.
Прямые связи и операцииАдреса непосредственных рискованных контрагентов и связанные с ними операции, если такие данные обнаружены.
Кошелек и подтверждение действий
Кабинет открывается после подключения кошелька владельца. Для входа достаточно подписать сообщение: авторизация не переводит средства и не отправляет транзакцию в сеть.
Во время работы встречаются два типа подтверждений. Подпись сообщения передает поручение сервису без сетевой комиссии. Реальная транзакция изменяет состояние в сети TRON и может потребовать TRX, Bandwidth или Energy. Перед каждым подтверждением кабинет явно показывает тип операции и ее назначение.
Подпись сообщенияПодтверждает запрос сервису. Транзакция от кошелька не отправляется.
Транзакция в сетьВыполняется от имени владельца и использует ресурсы сети TRON.
Кабинет для управления, SDK для потока счетов
Создать отдельный счет вручную можно и в кабинете. Для интернет-магазина, приложения или другого production-сервиса рекомендуем формировать счета через Node.js SDK на собственном сервере мерчанта.
1
Ваш сервер резервирует номерSDK получает безопасную последовательность для новой фабричной записи.
2
Адрес рассчитывается локальноБудущий платежный адрес формируется внутри SDK на стороне мерчанта.
3
Результат проверяется независимоSDK сверяет адрес через выбранный мерчантом TRON-узел.
4
Сервис повторяет проверкуТолько после совпадения параметров счет принимается на мониторинг и обработку.
На каких устройствах работать
Интерфейс адаптируется к разной ширине, однако подробные таблицы, настройки и ручные операции удобнее выполнять на компьютере или планшете. Пока отдельное мобильное приложение находится в планах, для полноценной работы рекомендуем экран не меньше планшетного.
КомпьютерОптимально для настройки и анализа
ПланшетПодходит для контроля и большинства операций
Мобильное приложениеЗапланировано для оперативного контроля
Дополнительная проверка интерфейса
В дальнейшем мы планируем выпустить расширение для Google Chrome как дополнительный защитный слой. Оно не будет обязательным для входа и обычной работы.
Расширение сможет контролировать важные процессы внутри кабинета, проверять источники загруженного контента и предупреждать, если версия интерфейса неизвестна или изменена. Для платежных адресов также планируется независимая сверка с данными фабрики в сети.
Функция запланированаТочные возможности и требования расширения будут опубликованы перед выпуском.
Рекомендуемая схема работы
MERCHANT UIНастройка, наблюдение и ручные решения
SERVER SDKАвтоматическое создание и проверка счетов
Персональный смарт-контракт мерчанта, который определяет правила обработки счетов и защищает критические параметры приема платежей.
Одна фабрика — один проект, одна монета и собственные правила.
Счета получают отдельные платежные адреса, но при обработке обращаются к настройкам своей фабрики.
Что такое фабрика
После одобрения заявки в сети TRON создается отдельный контракт MerchantFactory. Он навсегда связывается с кошельком владельца и выбранной монетой. Фабрика рассчитывает адреса будущих счетов, хранит сетевые настройки и оплачивает их обработку из собственного баланса TMR.
Фабрика не является общим кошельком покупателей. В штатном сценарии средства со счета направляются прямо на адрес выплат, заданный мерчантом. Разные проекты, монеты или модели приема платежей удобно разделять по разным фабрикам.
1ВладелецУправляет критическими настройками
→
2ФабрикаХранит правила и рассчитывает счета
→
3ПолучательПринимает штатно обработанные платежи
Какие настройки есть у фабрики
Настройки разделены по назначению. Сетевые параметры записываются в контракт и влияют на движение средств. Профиль помогает организовать работу в кабинете и не меняет контрактную логику.
Сетевые параметры
Монета фабрикиАктив, который принимают счета. Фиксируется при создании фабрики и затем не подменяется сервисом.
ФИКСИРОВАНО
Адрес выплатПолучатель штатно обработанных платежей. Изменить его может только владелец фабрики.
ВЛАДЕЛЕЦ
Максимальная комиссияВерхний предел комиссии в TMR, которую контракт разрешает списать с фабрики при активации одного счета.
ВЛАДЕЛЕЦ
Минимальный баланс счетаМинимальная сумма монеты на адресе счета, при которой разрешена штатная обработка.
ВЛАДЕЛЕЦ
AML-проверкаОпределяет, должна ли активация счета учитывать полноценную проверку источника средств. При включенной AML-проверке владелец также может настроить AMLback.
ВЛАДЕЛЕЦ
Автопополнение TMRРазрешает автоматически обменивать поступившие на фабрику USDT на TMR в соотношении 1:1.
ВЛАДЕЛЕЦ
Остаток USDT на фабрикеСумма USDT, которая остается на адресе фабрики и не участвует в автоматической конвертации в TMR. Ненулевой остаток помогает снизить расход энергии отправителя при последующих переводах USDT на фабрику.
ВЛАДЕЛЕЦ
AMLbackИспользует подходящий прошлый AML-результат с высоким риском при активации счета. Неизрасходованная новая проверка зачисляется на баланс мерчанта.
ВЛАДЕЛЕЦ
Порог риска AMLbackМинимальный риск прошлого результата, при котором разрешено повторное использование: от 60% до 100%.
ВЛАДЕЛЕЦ
Срок результата AMLbackДопустимый возраст прошлой проверки: 7, 30, 90 дней или без ограничения.
ВЛАДЕЛЕЦ
10 полноценных AML-проверок при активации каждой фабрики
Это разовое начисление, а не лимит. Проверки накапливаются на балансе владельца и доступны для самостоятельного использования.
Профиль и интеграции
Название проектаПонятное имя фабрики в кабинете, журнале и уведомлениях.
ОписаниеВнутренняя заметка о назначении фабрики и ее платежном сценарии.
Префикс счетовКороткий префикс отображаемых номеров, например SHOP-0000000001.
Получатель на странице счетаНазвание магазина, компании или получателя, которое видит покупатель. Это подпись, а не адрес выплат.
Логотип на странице счетаИзображение JPEG, PNG или WebP размером до 5 МБ. Встроенный редактор сохраняет выбранную квадратную область.
Контакт администратораСлужебный контакт для связи по вопросам работы фабрики.
Webhook URL и событияАдрес интеграции и набор событий, которые Merchant Receipt отправляет системе мерчанта.
Публичная страница счета использует актуальные название получателя и логотип из профиля фабрики. Эти внесетевые данные не меняют монету, адрес выплат, сумму счета или контрактные правила движения средств.
Кто чем управляет
Полномочия намеренно разделены. Сервис координирует обработку, но не получает возможность переписать финансовые условия мерчанта.
ТОЛЬКО ВЛАДЕЛЕЦКритические настройки
адрес выплат;
максимальная допустимая комиссия;
минимальный баланс счета;
AML, автоматическое пополнение TMR и остаток USDT;
ручные решения по счетам и активам фабрики.
СЕРВИСОперационные параметры
действующая и будущая комиссия с обязательной задержкой повышения;
размер скидки при отключенной AML-проверке;
активный или приостановленный статус фабрики;
мониторинг и запуск штатной обработки счетов.
СЕРВИС НЕ МОЖЕТОбойти ограничения
сменить монету фабрики;
назначить другой адрес выплат;
списать при активации комиссию выше одобренного максимума;
вывести TMR-обеспечение на произвольный адрес.
Как согласуется комиссия
Комиссия списывается в TMR только при активации счета. Контракт фабрики отдельно хранит действующие и запланированные условия: повышение не может вступить в силу раньше чем через 201 600 блоков TRON, что составляет примерно 7 дней.
1
Стартовые условияПри создании фабрики предложенная комиссия становится действующей ставкой и начальным approvedMaxFee.
2
Предел задает владелецТолько кошелек владельца может изменить approvedMaxFee сетевой транзакцией. Новое ограничение действует сразу.
3
Повышение объявляется заранееСервис может снизить тариф сразу, но повышение вступает в силу только после 201 600 блоков. До этого контракт сохраняет прежнюю ставку.
4
Переходное окно защищает счетаЕсли будущая комиссия выше approvedMaxFee, новые счета не создаются, а уже выданные можно активировать по прежней ставке до блока изменения.
Контракт не спишет больше одобренного максимумаЕсли к моменту смены тарифа approvedMaxFee остается ниже действующей комиссии, активация приостанавливается. Она возобновится после повышения лимита владельцем или снижения тарифа сервисом.
Скидка при отключении AML
Если мерчант отключает штатную AML-проверку, фактическая комиссия за обработку счета уменьшается на установленную для фабрики скидку.
В первые 7 дней после запуска фабрики действует стартовая скидка 0,5 TMR за счет. Этот льготный период позволяет протестировать фабрику без штатной AML-проверки с меньшими расходами.
После стартового периода скидка составляет 0,2 TMR за счет. Основная комиссия при этом не меняется — изменяется только размер скидки. Действующие условия всегда отображаются в кабинете.
Размер скидки задает сервис, но контракт требует, чтобы она была меньше основной комиссии. Решение об отключении AML принимает только владелец. Снижение стоимости означает принятие дополнительных рисков, которые подробно рассматриваются в отдельном разделе об AML.
Что такое TMR
TMR — служебная расчетная монета Merchant Receipt в сети TRON. Она используется только для оплаты обработки счетов фабрики и позволяет заранее отделить сервисные расходы от средств покупателей.
Рабочий выпуск ограничен 1 000 000 000 TMR с точностью 6 знаков и при запуске целиком передается главному контракту. В обычной модели TMR движется только между главной и персональными фабриками.
ПополнениеМерчант переводит USDT на свою фабрику.
→
Обмен 1:1Фабрика получает столько же TMR, а USDT формирует резерв.
→
Обработка счетовКомиссия списывается с TMR-баланса фабрики.
→
Обратный обменНеиспользованный TMR возвращается в USDT владельцу.
Как защищено обеспечение
TMR вне главного контракта=зарезервированный USDT
Когда TMR передается фабрике, равная сумма USDT поступает в главный контракт в той же операции. Если одна из частей обмена не выполняется, вся транзакция откатывается.
Прибыль отделена от резерваШтатный вывод сервиса разрешает забрать только USDT сверх обязательств по TMR.
USDT закрыт для аварийного механизмаУниверсальный аварийный вызов главного контракта технически не может обратиться к контракту USDT.
Возврат только владельцуПри обмене TMR обратно в USDT получатель берется из реестра фабрики и не может быть подменен сервисом.
Обмен выполняется целикомTMR и USDT не могут переместиться только с одной стороны неудачной операции.
Безопасность средств мерчанта
Смарт-контракт фабрики не обновляется сервисом и не получает новые полномочия после публикации. Финансово значимые ограничения можно проверить непосредственно в сети.
Сервис может остановить фабрику, чтобы прекратить новую обработку, но не может перенаправить уже принятые средства себе. Адрес выплат и ручные решения остаются под контролем кошелька владельца.
Приоритет Merchant ReceiptБезопасность средств мерчанта и его клиентов важнее операционного удобства сервиса. Поэтому административные возможности заранее ограничены контрактами.
Когда фабрика готова к работе
Активной считается фабрика, которая разрешена сервисом, имеет корректную монету и адрес выплат, а получатель готов принять выбранный токен. Кабинет показывает причины неготовности отдельно и не маскирует их общим статусом.
Прогретым считается адрес, который уже активирован в сети TRON и имеет ненулевой остаток принимаемой TRC20-монеты. При переводе токена на пустой баланс контракту обычно требуется создать новую запись состояния, поэтому такая операция расходует больше Energy. Для ранее неактивного адреса также могут потребоваться дополнительные сетевые ресурсы.
Поддерживайте адрес выплат прогретымДо запуска фабрики активируйте адрес. Для фабрики с TRC20-монетой получите на него небольшую сумму принимаемого токена и в дальнейшем не выводите ее полностью: ненулевой остаток снижает расход ресурсов при следующих выплатах и делает их стоимость более предсказуемой.
Сервис может предоставить Energy и Bandwidth для отдельной сетевой операции мерчанта и учесть фактический расход в его суточном лимите.
Плательщик сетевых расходов определяется отдельно перед каждой транзакцией.
Актуальный результат всегда отображается в строке «Оплата сети» до открытия кошелька и подписи.
Что покрывает сервис
Для отдельных мерчантов сервис может предоставлять ресурсы, необходимые для выполнения транзакций в сети TRON. В этом случае конкретная операция не расходует Energy и Bandwidth владельца: фактическое потребление учитывается в суточном лимите покрытия.
Покрытие может применяться к изменению параметров фабрики, ручной активации и установке плана счёта, операциям с кошельками фабрики и счетов, а также к другим действиям, которые владелец подтверждает сетевой транзакцией.
Лимит и доступность ресурсов
Суточный лимит показывает максимальный объём ресурсов, доступный учётной записи в течение текущего расчётного дня. Остаток отображается в карточке учётной записи и повторно проверяется перед каждой операцией.
Лимит и текущий запас ресурсов сервиса — разные показатели. Положительный остаток лимита не означает, что соответствующий объём Energy и Bandwidth постоянно зарезервирован за мерчантом.
1
Покрытие действуетУчётная запись подключена к программе поддержки.
2
Лимита достаточноПредварительный расчёт помещается в доступный суточный остаток.
3
Ресурсы доступныСервис может обеспечить транзакцию Energy и Bandwidth в данный момент.
Что проверить перед подписью
Проверьте пункт «Оплата сети» в окне подтверждения. Он показывает решение для текущей попытки, поэтому ориентироваться только на общий статус учётной записи не следует.
Статус оплаты определяется отдельно перед каждой транзакцией. Наличие общего лимита само по себе не заменяет эту проверку.
Покрывает сервисОперация прошла предварительную проверку. После выполнения фактический расход будет вычтен из показанного суточного остатка.
За счёт владельца фабрикиПокрытие к этой попытке не применяется. Транзакция использует ресурсы или TRX подключённого кошелька обычным способом.
Как выполняется покрытая операция
1
Предварительный расчётКабинет определяет требуемые Energy и Bandwidth.
2
Проверка условийСервис проверяет лимит и доступность ресурсов.
3
Отображение плательщикаПеред подписью интерфейс показывает, кто покрывает сеть.
4
Подпись владельцаМерчант проверяет назначение и подтверждает транзакцию кошельком.
5
Обеспечение ресурсамиСервис отправляет транзакцию только после успешной подготовки ресурсов.
6
Учёт расходаФактическое потребление сети вычитается из суточного лимита.
Если покрытие недоступно
Если проверка заранее показывает недостаток лимита или ресурсов сервиса, кабинет не блокирует действие. В окне подтверждения указывается оплата за счёт владельца фабрики, и применяется обычный механизм TRON.
Если подготовить ресурсы не удалось уже после подтверждения покрытой операции, транзакция мерчанта не отправляется. Кабинет сообщает об ошибке, при повторной попытке выполняется новый расчёт и заново определяется плательщик сети.
Неуспешная подготовка не превращается в неожиданное списание.Если интерфейс указал, что сетевые расходы покрывает сервис, но сервис не смог подготовить необходимые ресурсы, транзакция не будет отправлена за счёт владельца. Операция завершится ошибкой, и её можно будет повторить после нового расчёта.
Условия предоставления
Наличие лимита в кабинете не создаёт обязательства покрыть все последующие операции и не означает предварительного резервирования ресурсов. Для срочной операции учитывайте возможность её выполнения за счёт собственного кошелька, если покрытие временно недоступно.
Отдельный расчетный адрес для каждого заказа, который принимает оплату без приватного ключа и становится смарт-контрактным кошельком только во время активации.
До активации счет — это рассчитанный адрес, а не заранее созданный кошелек.
Он однозначно относится к конкретной фабрике и номеру счета, но приватный ключ для него никогда не создается и нигде не хранится.
Счет до активации
Когда мерчант создает счет, Merchant Receipt резервирует его последовательный номер и рассчитывает будущий адрес оплаты. В этот момент по адресу еще нет кода смарт-контракта. Тем не менее это полноценный адрес TRON, на который покупатель уже может отправить выбранную монету.
Адрес выводится по неизменным правилам из фабрики, номера счета и кода будущего кошелька. Один и тот же набор данных всегда дает один и тот же результат, а счет не может принадлежать другой фабрике.
1ФабрикаОпределяет монету и правила
→
2Номер счетаУникален внутри фабрики
→
3Адрес оплатыРассчитывается заранее
Почему приватного ключа нет
Адрес счета не создается из новой ключевой пары. Поэтому у Merchant Receipt нет базы приватных ключей платежных адресов, у мерчанта нет отдельного секрета для каждого заказа, а покупателю не приходится доверять хранение средств серверному кошельку.
Даже если серверы Merchant Receipt будут скомпрометированы, ключ от счета раскрыть невозможно: его просто нет. Пока контракт не активирован, переместить средства с адреса обычной подписью невозможно. Во время активации заранее известный код кошелька появляется точно на рассчитанном адресе и исполняет установленные правила.
Нет хранилища ключейСервису нечего потерять или передать злоумышленнику.
Нет ключа у мерчантаНе нужно создавать, архивировать и защищать секрет для каждого счета.
Адрес нельзя подменитьЛокальный расчет связывает его с выбранной фабрикой и номером.
Код известен заранееПри активации публикуется проверяемый кошелек с ожидаемым поведением.
Локальный расчет на стороне мерчанта
При создании счетов через Node.js SDK адрес рассчитывается внутри инфраструктуры мерчанта и проверяется через выбранный им TRON-узел. Наш сервер повторяет расчет перед постановкой счета на мониторинг, но не может незаметно заменить результат произвольным адресом: несовпадение останавливает создание счета.
Взлом сервера не превращает адрес оплаты в адрес злоумышленникаSDK самостоятельно сверяет рассчитанный адрес с контрактом фабрики через TRON-сеть. Для production-потока счетов это безопаснее, чем безусловно принимать адрес из ответа одного сервера.
Создание счета
Счет можно создать вручную в кабинете или автоматически через SDK. В обоих случаях до начала мониторинга фиксируются параметры, по которым сервис будет распознавать оплату и принимать решение об автоматической обработке.
ФабрикаОпределяет принимаемую монету, адрес выплат и сетевые ограничения.
СуммаОжидаемая сумма платежа в монете фабрики.
Срок действияПериод, в течение которого оплата считается своевременной.
НазначениеПонятное мерчанту описание заказа или операции.
Режим активацииАвтоматическое выполнение при соблюдении правил либо решение мерчанта вручную.
Правила остановкиУсловия, при которых автоматическая обработка уступает место ручной проверке.
Путь от счета до кошелька
1
Адрес рассчитанСчет сохранен и поставлен на мониторинг.
2
Оплата обнаруженаСервис подтверждает перевод в сети и обновляет полученную сумму.
3
Правила провереныОцениваются сумма, отправители, срок и AML, если он включен.
4
Выбран сценарийШтатная обработка продолжается автоматически либо счет ожидает мерчанта.
5
Кошелек активированНа адресе публикуется контракт и сразу выполняет выбранный план.
6
Результат зафиксированПереводы, остаток и итоговый статус появляются в журнале.
Автоматическая и ручная активация
При автоматической активации сервис сам продолжает обработку, когда платеж подтвержден и все заданные условия выполнены. При ручном режиме счет принимает и учитывает платежи, но не превращается в контракт до решения мерчанта.
Автоактивацию можно временно выключить в карточке счета. Если ее остановило одно из защитных правил, включить ее обратно без разбора причины нельзя: счет остается в зоне внимания.
СУММАНе меньше суммы счета
недоплата ожидает продолжения оплаты;
можно принять любой положительный платеж, если заранее выбрано соответствующее правило.
ПЛАТЕЖОтклонения от сценария
остановка при переплате;
остановка при нескольких отправителях.
РИСКAML-порог
высокий или заданный мерчантом уровень риска;
ожидание ручного решения вместо автоматической выплаты.
AML-проверка перед выплатой
Если AML включен для фабрики и счета, сервис проверяет источник средств до штатной автоматической выплаты. Результат сравнивается с выбранным порогом риска: допустимый платеж продолжает обработку, повышенный риск переводит счет в ручной режим.
В ручной активации кабинет отдельно напоминает выполнить AML-проверку, когда выбранный план отправляет хотя бы часть средств обычному получателю фабрики. Для возврата плательщику, другого произвольного адреса или сохранения средств на счете решение остается за мерчантом.
1
Проверка выполняется до активацииТак потенциально рискованные средства не попадают на основной адрес выплат автоматически.
Что происходит при активации
Фабрика публикует на заранее рассчитанном адресе компактный смарт-контракт. Во время создания он читает разрешенный план, проверяет баланс монеты фабрики и сразу выполняет переводы. Если обязательная часть операции завершается неуспешно, активация откатывается целиком.
Штатно весь текущий баланс монеты фабрики выметается на адрес выплат. Для исключения мерчант заранее выбирает один из ограниченных сценариев, произвольный программный код в план передать нельзя.
Штатная активация
Весь баланс принимаемой монеты отправляется получателю из настроек фабрики.
Возврат
До трех получателей и точные суммы; доступны готовые схемы возврата плательщикам и переплаты.
Произвольный получатель
Весь баланс принимаемой монеты отправляется на один адрес, подтвержденный владельцем.
Оставить на счете
Сухая активация создает контракт-кошелек без перевода монеты фабрики. Средства разбираются владельцем позднее.
После активации: кошелек счета
После публикации адрес становится смарт-контрактным кошельком. Он может хранить TRX, монету фабрики и другие обнаруженные TRC20-активы. Кабинет показывает остатки и историю движений, позволяет добавить токен для наблюдения, отправить актив или выдать разрешение на его использование.
Ручные действия не выполняются обычной серверной командой. Кошелек владельца фабрики отправляет реальную транзакцию в сеть, а контур исполнения проверяет связь счета с этой фабрикой и ее владельцем. Перед подписью кабинет отдельно показывает, покрывает ли сетевые расходы сервис или используются ресурсы владельца.
Отправить активПеревод TRX или выбранного токена с кошелька счета.
Разрешить использованиеСетевое разрешение для выбранного TRC20-токена.
ИсторияВходящие и исходящие движения отдельно по каждому активу.
Обнаруженные активыОстатки монеты фабрики, TRX и сторонних токенов.
Что находится в карточке счета
Заголовок карточки всегда показывает номер, актуальное состояние активации и полный адрес с копированием. Остальная информация разделена по рабочим задачам.
АктивацияАвтоактивация, четыре сценария ручной обработки, итоговые получатели и суммы до подтверждения.
КошелекСостояние контракта, балансы, отправка, разрешения и история активов.
AMLЗапуск доступной проверки и сохраненный отчет по выбранному адресу или плательщику.
ИнформацияОсновные параметры, адреса, статусы оплаты и активации, правила остановки, срок и назначение.
ПредупрежденияПоявляются только при отклонениях: нескольких отправителях, сторонней монете и других обстоятельствах, требующих внимания.
Граница доверия
Сессия кабинета, API-ключ и webhook-секрет не заменяют кошелек владельца для ручного движения средств. Интерфейс заранее показывает, будет ли отправлена транзакция, что именно она выполнит и кто оплачивает сетевые ресурсы.
Главная гарантия счетаПриватного ключа от адреса счета не существует ни до, ни после его активации. После активации управлять кошельком счета и находящимися на нем средствами может только владелец соответствующей фабрики. Связь с реестром владельцев фиксируется необратимо, сервис не может заменить реестр или выполнить операцию вместо владельца.
Инструмент помогает оценить адрес будущего плательщика до приема платежа. Проверка ищет известные метки самого адреса и анализирует его непосредственные входящие и исходящие взаимодействия на глубину одного уровня.
Предварительные и полноценные проверки учитываются отдельно
Для предварительной оценки доступно 100 бесплатных запросов в сутки. Полноценные AML-проверки хранятся на отдельном накопительном балансе и расходуются только по вашему подтверждению.
Что входит в отчет
Уровень рискаОценка по шкале от минимального до высокого риска и краткий прогноз прохождения основной AML-проверки.
Известные меткиКатегории, которыми адрес отмечен в аналитической базе: тип сервиса, принадлежность или известный источник риска.
Индикаторы рискаКонкретные признаки, повлиявшие на оценку: санкционные связи, опасные категории, повышенный юрисдикционный или иной выявленный риск.
Прямые связи и операцииАдреса непосредственных рискованных контрагентов и связанные с ними операции, если такие данные обнаружены.
Полноценный AML-результатЕсли по адресу уже есть полноценная проверка, отчет показывает ее уровень, дату, категории риска и итоговую оценку без раскрытия того, кто выполнил проверку.
Категории рискаДоли и шкалы категорий из полноценной AML-проверки помогают понять, какие источники сформировали риск.
Как читать индикаторы
Собственный риск
Признак относится непосредственно к проверяемому адресу или к известной информации о его владельце.
Риск прямой связи
Признак возник из непосредственного взаимодействия проверяемого адреса с отмеченным контрагентом. Это не означает, что все его транзакции рискованные.
Метки не найдены
В доступной базе нет известных меток. Это снижает количество обнаруженных признаков, но само по себе не подтверждает чистоту адреса.
Как дополнить отчет полноценной AML-проверкой
Если полноценного результата еще нет, его можно запросить прямо из предварительного отчета. Если результат уже отображается, его можно обновить, чтобы получить актуальные данные. В обоих случаях списывается одна проверка с накопительного баланса.
1
Оцените предварительный отчетИзучите метки, прямые связи и операции адреса до приема платежа.
2
Запустите или обновите AMLКнопка полноценной проверки доступна в том же отчете. Обновление также считается новой проверкой.
3
Подтвердите действие кошелькомКошелек подписывает служебное сообщение для сервиса. Транзакция в сеть TRON не отправляется.
4
Получите обновленный выводПосле ответа AML-сервиса отчет дополняется категориями риска, а итоговая оценка пересчитывается по более строгому сигналу.
Откуда берутся полноценные проверки
Активация фабрики
За каждую активированную фабрику владельцу один раз начисляется 10 полноценных AML-проверок.
Экономия AMLback
Если при активации счета достаточно подходящего прошлого результата с высоким риском, неиспользованная новая проверка зачисляется на баланс.
Использование по решению мерчанта
Одну проверку можно потратить на новый или обновленный AML-отчет адреса плательщика, чтобы принять решение еще до оплаты счета.
Как использовать результат
Сначала выполните бесплатную предварительную оценку. Если данных недостаточно, дополните отчет полноценной AML-проверкой и решите, можно ли принимать оплату с этого адреса или следует запросить другой. Обогащенный отчет, включая категории риска, можно сохранить в PDF.
Кабинет сохраняет историю работы, выделяет важные события и показывает короткие сообщения во время активной сессии.
Важное не зависит от открытого браузераЖурнал и важные уведомления хранятся на сервере для авторизованного кошелька. Если событие произошло, пока мерчант был не в кабинете, оно будет доступно после следующего входа.
Три уровня информирования
Каждый уровень решает свою задачу. Журнал дает полную хронологию, центр уведомлений собирает выбранные важные события, а toast помогает сразу увидеть результат текущего действия.
Журнал событийПоследовательная история операций фабрик, счетов, платежей, AML-проверок, настроек и движений средств.
Важные уведомленияОтдельный список событий, которые требуют внимания или были выбраны мерчантом в настройках.
Toast-сообщенияКороткие всплывающие сообщения о результате действия или новом событии, пока кабинет открыт.
НовостиОтдельная вкладка для объявлений сервиса. Новости не смешиваются с операциями конкретного мерчанта.
Журнал событий
Журнал нужен для восстановления последовательности действий. В нем остаются события независимо от настроек важных уведомлений: создание и обработка счетов, поступления и переводы, предупреждения, результаты AML, изменения фабрик и подтвержденные настройки.
Записи привязаны к адресу кошелька мерчанта и загружаются с сервера. Поэтому история доступна после перезапуска браузера и при входе с другого устройства под тем же кошельком. Смена языка переводит уже загруженные записи без изменения сохраненных данных.
Время и порядок
Новые записи располагаются первыми, дата и время помогают восстановить ход обработки.
Контекст
Когда это применимо, запись содержит ссылку на фабрику или счет и понятное описание произошедшего.
Независимость от подписок
Отключение категории уведомлений не удаляет соответствующие события из журнала.
Важные уведомления
Центр уведомлений представляет сокращенную выборку журнала. Он помогает не искать вручную события, которые важны для ежедневной работы, и показывает количество непрочитанных записей рядом с колокольчиком.
Обязательные уведомления
Недостаточно TMRФабрике не хватает служебного баланса для выполнения операции.
ВСЕГДА ВКЛЮЧЕНО
Ошибка публикации счетаСчет не был опубликован, уведомление содержит безопасное описание причины.
ВСЕГДА ВКЛЮЧЕНО
Эти категории защищают основной платежный процесс, поэтому отключить их нельзя.
Настраиваемые категории
Платежи и переплатыСостояние счетовAML-проверкиФабрики и заявкиИзменение настроекБаланс и операции TMR
Мерчант сам выбирает, какие из этих событий дублировать из журнала в список важных уведомлений.
Как управлять подписками
1
Откройте настройкиПерейдите в общий раздел «Настройки» кабинета, а затем к настройкам уведомлений.
2
Выберите категорииВключите события, которые должны появляться в центре уведомлений.
3
Настройка сохранитсяВыбор сохраняется на сервере для текущего кошелька и действует независимо от устройства.
4
Следите за колокольчикомКрасный счетчик показывает непрочитанные записи, а компактное окно открывает пять последних уведомлений.
Что работает онлайн и без открытого кабинета
ВСЕГДАЖурнал
События фиксируются сервисом и ожидают следующего входа мерчанта.
ВСЕГДАВажные уведомления
Выбранные и обязательные категории сохраняются даже при закрытом кабинете.
ТОЛЬКО ОНЛАЙНToast-сообщения
Показываются поверх текущего экрана и помогают сразу заметить результат операции.
Toast-сообщение можно закрыть сразу или дождаться его автоматического исчезновения. Оно служит быстрым визуальным подтверждением и не заменяет журнал или центр уведомлений.
Работа с непрочитанными
Откройте колокольчик в верхней панели, чтобы увидеть пять последних уведомлений и счетчик непрочитанного. Запись можно отметить прочитанной отдельно или использовать команду «Отметить все прочитанными». Полный список с постраничной навигацией находится в разделе «События».
✓
Простое правилоЖурнал отвечает на вопрос «что происходило», уведомления — «что важно не пропустить», а toast — «что произошло прямо сейчас».
Получайте сообщения о событиях фабрики сразу после того, как их зафиксирует Merchant Receipt.
Webhook сообщает, API отвечает
При работе с API сервер мерчанта сам запрашивает данные у Merchant Receipt. Webhook работает в обратном направлении: наш сервер отправляет HTTPS POST на адрес мерчанта, когда происходит выбранное событие.
Когда использовать webhook
Webhook подходит для автоматической реакции на создание счета, обнаружение платежа, результат AML, публикацию кошелька счета и другие изменения. Постоянно опрашивать API в ожидании события не требуется.
APIЗапрос по инициативе мерчанта
Приложение запрашивает актуальные данные или выполняет разрешенную операцию.
WEBHOOKСообщение по инициативе сервиса
Merchant Receipt доставляет событие на заранее указанный endpoint.
SDKГотовая работа с API
Node.js SDK подписывает запросы и предоставляет методы фабрик и счетов.
Подключение к фабрике
1
Подготовьте HTTPS endpointОн должен принимать POST с JSON и отвечать без длительной обработки.
2
Включите webhookУкажите URL в параметрах фабрики и выберите нужные события.
3
Сохраните секретСекрет создается при включении и используется приемником для проверки HMAC.
4
Проверьте подключениеРукопожатие подтверждает доступность endpoint и правильность секрета.
Требования к endpoint
✓
HTTPS и POSTСервис отправляет JSON методом POST и не следует перенаправлениям.
✓
Доступ к исходному bodyПодпись проверяется по исходным байтам до повторного разбора JSON.
✓
Быстрый ответ 2xxСложную работу лучше поставить в собственную очередь после проверки запроса.
✓
Хранилище event idОдинаковое событие нельзя обрабатывать как новую бизнес-операцию.
Доставка и повторные попытки
Любой ответ 2xx завершает доставку. Таймаут, сетевой сбой или другой HTTP-статус приводят к повторным попыткам с увеличивающейся задержкой, всего выполняется не более восьми попыток. Поэтому доставка имеет модель at least once.
Timestamp содержит Unix time в секундах и относится к конкретной попытке доставки. Время возникновения события находится в createdAt и передается в ISO 8601 с миллисекундами.
Строка подписи
HMAC-SHA256
{timestamp}.{eventId}.{rawRequestBody}
Безопасный порядок обработки
1
Проверьте времяОтклоните слишком старый timestamp.
2
Сверьте HMACСравнивайте подписи безопасным способом с постоянным временем.
3
Сверьте идентификаторЗаголовок Webhook-Id должен совпасть с id внутри JSON.
4
Проверьте дубликатДля уже сохраненного id верните 2xx без повторения действия.
Проверочное рукопожатие
Кнопка проверки отправляет служебное событие webhook.endpoint_verification со случайным challenge. Приемник проверяет обычную подпись и возвращает тот же challenge вместе с HMAC-proof. Успех одновременно подтверждает доступность URL и наличие правильного секрета.
Денежные значения в минимальных единицах передаются десятичными строками, чтобы JavaScript не терял точность. Необязательные пустые поля в data не добавляются.
Поддерживаемые события
invoice.created
Счет создан, проверен и поставлен на мониторинг.
payment.detected
В сети подтвержден входящий платеж на адрес счета.
aml.pending
AML-проверка создана и ожидает результата.
aml.approved
Риск не превысил порог, установленный для счета.
aml.rejected
Риск достиг порога, автоматическая обработка остановлена.
Зафиксированы фактические переводы получателям при активации.
manual_review.required
Счет ожидает решения мерчанта из-за режима или защитного правила.
Идемпотентная обработка
Сохраняйте id как уникальный ключ входящего события. Один txId может присутствовать у разных событий, например invoice.published и settlement.sent, поэтому использовать только txId для удаления дублей нельзя.
✓
Повторный id тоже получает успешный ответВерните 2xx, но не выполняйте бизнес-действие второй раз.
Минимальный приемник проверяет подпись, отвечает на рукопожатие и обрабатывает создание счета.
Сначала проверка, затем обработка
Нельзя доверять типу события, challenge или другим полям JSON, пока HMAC не проверен по исходным байтам body.
Подготовка
Установка Express
npm install express
Перед запуском передайте секрет из параметров фабрики через переменную окружения TMR_WEBHOOK_SECRET.
Подключение HTTPS
Разместите перед Node.js reverse proxy, например Nginx. Он принимает защищенный запрос на публичном домене и без изменения маршрута передает его локальному приемнику:
В настройках фабрики укажите публичный HTTPS URLДля схемы выше это https://hooks.example.com/webhook, а не внутренний адрес http://127.0.0.1:3000/webhook.
Один ключ можно ограничить конкретными фабриками, минимальным набором разрешений, сроком до 365 дней и точным списком исходящих IP. Для разных приложений рекомендуется создавать отдельные ключи.
Граница Merchant API
Merchant API работает с данными сервиса, счетами, webhook, мониторингом и явно разрешенными сервисными конвертациями V3. Изменение сетевых настроек, произвольные переводы и прямые конвертации владельца выполняются через TRON API.
Подпись охватывает метод, путь, отсортированные параметры, точное тело, время и одноразовый nonce. Изменение любой части делает подпись недействительной.
Проверки сервера
✓
Ed25519-подписьПроверяется открытым ключом, сохраненным при создании интеграции.
✓
Допустимое времяTimestamp принимается с отклонением не более пяти минут.
✓
Одноразовый nonceПовторно отправить тот же подписанный запрос нельзя.
✓
Scope, фабрика и IPЗапрос остается внутри ограничений конкретного ключа.
Для обычной интеграции используйте Node.js SDK: он формирует каноническую строку, хеширует точные байты и устанавливает заголовки автоматически.
factoryAddress передается в Base58-формате TRON. Недоступная ключу фабрика возвращается как FACTORY_NOT_FOUND без раскрытия ее существования.
Оба POST-метода конвертации требуют заголовок Idempotency-Key и JSON-тело { amountRaw }. Сумма передается строкой в минимальных единицах и должна помещаться в uint88.
Страница и размер от 1 до 100, по умолчанию 1 и 25.
search
string
Поиск по номеру, адресу, назначению и externalId.
externalId
string
Точное совпадение внешнего идентификатора.
status
string
Фильтр по текущему статусу.
requiresAttention
boolean
Только счета, требующие действий мерчанта.
sort
created | updated | expires | amount | status | number
Поле сортировки, по умолчанию created.
direction
asc | desc
Направление сортировки, по умолчанию desc.
Создание счета
Адрес должен быть рассчитан локально.
Ответ prepare содержит версию контракта и известные хеши. Клиент выбирает тип счета, вычисляет addressCode, chainInvoiceId и invoiceAddress, при желании сверяет результат через TRON-узел и только затем отправляет create.
Свойство
Тип
Описание
reservationId
string
Идентификатор действующей резервации prepare.
sequenceNumber, addressCode, chainInvoiceId
integer string
Части локального расчета адреса.
invoiceAddress
string
Рассчитанный Base58-адрес будущего счета.
invoiceKind, contractVersion
string, number
Тип trc20 или trx и версия шаблона из prepare.
amount
decimal string
Положительная сумма в обычных единицах монеты.
purpose, externalId
string
Назначение до 220 символов и необязательный ID мерчанта до 120.
expiresMinutes
number
Срок оплаты от 1 до 43200 минут.
activationMode, settlementRule
auto | manual, at_least | any
Режим активации и правило достаточности платежа.
autoStopMultipleSenders, autoStopOverpayment
boolean
Условия остановки автоматической обработки.
autoAmlRiskMode, autoAmlRiskThreshold
string, number
Режим medium, high или custom и порог больше 0, но не больше 1.
Create требует Idempotency-Key длиной до 128 символов. Повтор того же бизнес-запроса возвращает созданный счет, а изменение параметров с тем же ключом отклоняется. Непустой externalId уникален в пределах фабрики.
activation/process и payment-link не требуют тела. Особые планы выплаты и операции кошелька не относятся к Merchant API и выполняются напрямую через TRON.
Передайте lastEventId последнего обработанного события после переподключения. Сервер воспроизведет пропущенные события, неизвестный cursor и слишком большой разрыв возвращаются явной ошибкой.
События
Единый factory.event содержит уникальный id, версию API, type, фабрику, createdAt и предметные данные в data. События счетов требуют invoices:read, остальные события фабрики — factories:read.
Для отключения одной фабрики отправьте factory:unsubscribe с ее factoryAddress. Realtime предназначен для оперативного интерфейса, а webhook остается надежным каналом доставки бизнес-событий.
Повторяйте только временные сетевые ошибки и безопасные идемпотентные операции. Nonce защищает подпись от replay, а Idempotency-Key защищает бизнес-операцию при повторном запросе.
SDK уменьшает объем интеграционного кода: формирует подпись TMR1, преобразует ошибки, создает контексты фабрик и счетов и позволяет сверять on-chain данные через TronWeb. Особенно важно, что адрес нового счета рассчитывается локально на сервере мерчанта.
Требования
Node.js 18+API-ключ Merchant ReceiptHTTPS-доступ к APITRON-узел или TronGrid
Конструктор принимает один объект params. Обязательны идентификатор и приватная часть API-ключа; остальные свойства имеют значения по умолчанию или подключают дополнительную проверку.
Параметры конструктора
Свойство
Тип
Обязательный
Описание
apiUrl
string
Нет
Базовый URL Merchant API. По умолчанию https://merchant.trc20.money/api.
keyId
string
Да
Публичный идентификатор API-ключа в формате tmrk_...
privateKey
string
Да
Одноразово показанная приватная Ed25519-часть в формате tmrsk_v1_...
mainFactoryAddress
string
Нет
Адрес центральной фабрики для проверки принадлежности MerchantFactory.
factoryAddress
string
Нет
Адрес платежной фабрики по умолчанию для методов без явного адреса.
timeoutMs
number
Нет
Таймаут HTTP-запроса в миллисекундах. По умолчанию 15000.
tron
object
Нет
Настройки узла, из которых SDK создаст TronWeb.
tronWeb
TronWeb
Нет
Готовый экземпляр TronWeb. Имеет приоритет над объектом tron.
Параметры tron
Если готовый tronWeb не передан, SDK создаст его из объекта tron. Если отсутствуют оба варианта, используется публичный TronGrid. Настроенный экземпляр всегда доступен как tmr.tronWeb.
Свойство
Тип
Описание
fullHost
string
HTTP API выбранного TRON-узла.
headers
object
Заголовки провайдера, например TRON-PRO-API-KEY для TronGrid.
Примеры конфигурации
Минимальная конфигурация
Node.js
const tmr = new TmrMerchant({
keyId: process.env.TMR_KEY_ID,
privateKey: process.env.TMR_API_PRIVATE_KEY
});
Метод возвращает массив фабрик, доступных текущему API-ключу. Для вызова требуется разрешение factories:read. Порядок совпадает с порядком фабрик в меню кабинета.
Свойство
Тип
Описание
id
number
Внутренний идентификатор фабрики.
address
string
TRON-адрес смарт-контракта фабрики.
displayName
string
Отображаемое имя фабрики.
description
string
Описание фабрики из профиля.
invoicePrefix
string
Префикс отображаемых номеров счетов.
receivedTotalRaw
string
Принятый объем в минимальных единицах рабочей монеты.
createdAt
string
Дата создания записи в формате ISO 8601.
updatedAt
string
Дата последнего обновления в формате ISO 8601.
Выбор фабрики
Найдите запись по данным профиля и передайте ее адрес в at(address). Метод создаст локальный контекст фабрики и сразу подготовит вложенные сервисы profile, webhook, statistics и invoice.
Node.js
const factories = await tmr.factory.list();
const selected = factories.find(
({ displayName }) => displayName === "my_shop_1"
);
if (!selected) throw new Error("Factory my_shop_1 not found");
const factory = tmr.factory.at(selected.address);
const info = await factory.get();
console.log(info.asset.symbol, info.statistics.invoiceCount);
Методы фабрик
Метод
Источник
Результат
Описание
tmr.factory.list(apiOptions?)
API
FactorySummary[]
Возвращает фабрики, разрешенные API-ключу.
tmr.factory.at(address)
Локально
FactoryService
Создает контекст одной фабрики без сетевого запроса.
factory.get(readOptions?)
TronWeb + API
FactoryInfo
Читает контракт, токен и балансы, затем добавляет статистику сервиса.
tmr.factory.get(address, readOptions?)
TronWeb + API
FactoryInfo
То же чтение без предварительного создания контекста через at().
factory.profile.get(apiOptions?)
API
FactoryProfile
Возвращает редактируемые описательные данные профиля.
Возвращает индексированную историю выбранной монеты кошелька фабрики.
factory.on(event, handler, realtimeOptions?)
Socket.IO
unsubscribe
Подписывает обработчик на повторяющиеся события фабрики.
factory.once(event, handler, realtimeOptions?)
Socket.IO
unsubscribe
Удаляет обработчик после первого подходящего события.
factory.off(event, handler?)
Локально
boolean
Удаляет выбранный обработчик или все обработчики события.
Ответ factory.get()
По умолчанию get() выполняет on-chain чтение через настроенный TronWeb и параллельно запрашивает statistics. Передайте includeStatistics: false, чтобы получить только сетевой снимок без обращения к Merchant API.
Добавить статистику Merchant API; по умолчанию true.
timeoutMs
number
Таймаут API-запроса статистики; не влияет на чтение TronWeb.
Параметр apiOptions
Свойство
Тип
Описание
timeoutMs
number
Индивидуальный таймаут HTTP-запроса Merchant API.
apiOptions используется методами Merchant API, webhookOptions дополнительно принимает idempotencyKey, а transactionOptions передается TronWeb при сетевых изменениях.
Поля FactoryInfo
Свойство
Тип
Описание
address
string
Нормализованный адрес фабрики.
mainFactoryAddress
string
Адрес центрального контракта, к которому относится фабрика.
merchantOwnerAddress
string
Адрес владельца фабрики.
active
boolean
Текущее on-chain состояние активности.
asset.address
string
Адрес рабочей монеты.
asset.name
string
Название рабочей монеты.
asset.symbol
string
Тикер рабочей монеты.
asset.decimals
number
Количество десятичных знаков монеты.
asset.standard
string
Стандарт актива: TRX или TRC20.
settings.feeRaw
string
Текущая комиссия в минимальных единицах TMR.
settings.approvedMaxFeeRaw
string
Максимальная комиссия, одобренная владельцем.
settings.feeSchedule
object
Действующая и будущая комиссия V3, эффективные значения и блок вступления в силу.
feeApproval
object
Готовность комиссии к активации и созданию новых счетов.
settings.payoutAddress
string
Адрес получателя штатных выплат.
settings.minimumInvoiceBalanceRaw
string
Минимальный баланс счета для обработки.
settings.autoConvertUsdtToTmrEnabled
boolean
Разрешено ли автоматическое пополнение TMR.
settings.autoConvertUsdtRetainAmountRaw
string
USDT-остаток, исключенный из автоматической конвертации.
settings.amlEnabled
boolean
Включена ли AML-проверка фабрики.
settings.amlFeeRaw
string
Скидка комиссии при отключенной AML-проверке.
balances.trxRaw
string
Баланс TRX фабрики в sun.
balances.assetRaw
string
Баланс рабочей монеты.
balances.tmrRaw
string
Баланс TMR фабрики.
balances.usdtRaw
string
Баланс USDT фабрики.
balances.convertibleUsdtRaw
string
Часть USDT-баланса, доступная для автоматической конвертации после вычета остатка.
contracts.nativeTrxTokenAddress
string
Служебный адрес представления нативного TRX.
statistics
object
Статистика сервиса; отсутствует при includeStatistics: false.
Все денежные значения с суффиксом Raw возвращаются строками в минимальных единицах монеты. Это исключает потерю точности JavaScript.
Профиль фабрики
Профиль хранится в Merchant API и не является сетевой настройкой контракта. Метод set() изменяет только переданные поля и не затрагивает webhook.
Node.js
const profile = await factory.profile.get();
const updated = await factory.profile.set({
displayName: "My shop",
description: "Primary payment factory",
invoicePrefix: "SHOP",
notificationContact: "admin@example.com",
paymentRecipientName: "Example LLC"
});
// Set the logo displayed on the public invoice page.
await factory.profile.setPaymentLogo("./logo.png");
// Remove the logo from the public invoice page.
await factory.profile.removePaymentLogo();
В SDK v0.4.3 имя получателя изменяется через profile.set(), а логотип — через setPaymentLogo() и removePaymentLogo(). Файл читается внутри SDK; поддерживаются PNG, JPEG и WebP до 5 МБ.
Получатель на странице счета
Передайте только paymentRecipientName длиной до 60 символов, чтобы изменить подпись получателя и сохранить остальные поля профиля без изменений. Пустая строка удаляет имя получателя.
setPaymentLogo() принимает путь к локальному файлу. SDK читает файл через fs.promises.readFile(), определяет MIME-тип по расширению и подписывает точные байты изображения. Относительный путь считается от текущей рабочей папки Node.js.
Отображаемое имя получателя на публичной странице счета; изменяется через profile.set().
paymentLogoUrl
string
URL установленного логотипа страницы счета; поле доступно только для чтения.
createdAt
string
Дата создания записи в формате ISO 8601.
updatedAt
string
Дата последнего обновления в формате ISO 8601.
Настройка webhook
Webhook сообщает серверу мерчанта о событиях без постоянного опроса Merchant API. Конфигурация заменяется целиком, поэтому при каждом set() передавайте enabled, url и полный список events.
Node.js
const webhook = await factory.webhook.set({
enabled: true,
url: "https://shop.example/tmr/webhook",
events: ["invoice.created", "payment.detected"]
}, {
idempotencyKey: "webhook-my-shop-v1"
});
console.log(webhook.secret); // Доступен только при выдаче новых реквизитов
console.log(await factory.webhook.get());
console.log(await factory.webhook.test());
Параметр webhookOptions
Свойство
Тип
Описание
idempotencyKey
string
Устойчивый ключ безопасного повтора изменения конфигурации.
timeoutMs
number
Индивидуальный таймаут HTTP-запроса Merchant API.
Поля FactoryWebhook
Свойство
Тип
Описание
enabled
boolean
Включена ли отправка выбранных событий.
url
string
HTTPS endpoint сервера мерчанта.
events
string[]
Полный список событий, на которые подписана фабрика.
keyId
string
Открытый идентификатор ключа подписи webhook.
secret
string?
Одноразово возвращается при первом включении или повторном включении после отключения.
test() обращается только к сохраненному endpoint и требует включенной конфигурации. Проверки ограничены по частоте: одна на фабрику за 30 секунд, до 10 на API-ключ и до 30 с одного IP за минуту.
Метод history() возвращает сводную выписку из кабинета: выплаты по счетам, пополнения TMR, комиссии и вывод TMR. Итоги рассчитываются за весь выбранный период, независимо от размера текущей страницы.
Все операции, только выплаты или только движения TMR.
search
string
Поиск по счету, адресу выплаты или txId; до 180 символов.
limit
number
От 1 до 100 записей; по умолчанию 50.
cursor
string
nextCursor предыдущей страницы.
Ответ FactoryHistory
Свойство
Тип
Описание
history
FactoryHistoryItem[]
Операции от новых к старым.
summary.payoutRaw
string
Общая сумма выплат в рабочей монете за период.
summary.tmrCreditRaw
string
Общее пополнение TMR за период.
summary.tmrDebitRaw
string
Общий расход TMR за период.
period
string
Примененный период.
operationType
string
Примененный тип операций.
nextCursor
string
Курсор следующей страницы или пустая строка.
hasMore
boolean
Есть ли следующая страница.
Поля FactoryHistoryItem
Свойство
Тип
Описание
id / createdAt
string
Курсор записи и время операции ISO 8601.
operation
string
activation_payout, additional_payout, tmr_topup, tmr_fee или tmr_withdrawal.
invoiceDbId / invoiceId / invoiceAddress
string
Связанный счет; пустые строки для операции без счета.
payoutAddress / payoutAmountRaw
string
Получатель и сумма выплаты в рабочей монете.
tmrAmountRaw / tmrDirection
string
Сумма TMR и направление in/out.
txId / callId
string
Идентификаторы сетевой транзакции и вызова.
Метод вызывает GET /api/v1/factories/{factoryAddress}/history и требует право «Просмотр фабрики».
Кошелек фабрики
Фабрика может хранить TRX, TRC20-монеты, TMR и служебный запас USDT. Методы wallet позволяют владельцу переводить TRX и TRC20, вручную обменивать USDT на TMR, выводить TMR обратно в USDT и читать историю движений по выбранной монете.
Переводит TRX с адреса фабрики, сумма указывается в sun.
history(historyOptions, apiOptions?)
API
FactoryWalletHistory
Возвращает индексированные движения одной выбранной монеты с курсорной пагинацией.
Методы баланса обращаются только к выбранному TRON-узлу. Они не отправляют транзакцию, не требуют signer и не используют Merchant API. Для TRC20 необходимо передать адрес контракта монеты.
Все суммы передаются целыми положительными значениями в минимальных единицах монеты. SDK проверяет формат, но не скрывает сетевые ошибки недостаточного баланса, ресурсов или отклоненной транзакции.
Ручной convertUsdtToTmr() не зависит от переключателя автопополнения. SDK не проверяет настройку или баланс заранее, актуальное состояние проверяют смарт-контракты при исполнении.
Параметр historyOptions
Свойство
Тип
Обязательный
Описание
standard
"TRX" | "TRC20" | "TRC10"
Да
Стандарт монеты, по которой нужна история.
assetAddress
string
Для TRC20
Адрес контракта TRC20-монеты.
tokenId
string
Нет
Идентификатор TRC10, для TMR по умолчанию используется 1005181.
limit
number
Нет
От 1 до 100 записей, по умолчанию 30.
cursor
string
Нет
nextCursor из предыдущего ответа для загрузки следующей страницы.
Нормализованный фильтр standard, assetAddress и tokenId.
nextCursor
string
Курсор следующей страницы или пустая строка.
hasMore
boolean
Есть ли следующая страница.
Поля FactoryWalletMovement
Свойство
Тип
Описание
id
string
Курсорный идентификатор записи.
createdAt
string
Время обнаружения движения в формате ISO 8601.
eventType
string
Тип сетевого события, создавшего запись.
direction
string
Направление движения: вход, выход, комиссия или конвертация.
amountRaw
string
Сумма в минимальных единицах монеты.
assetStandard
string
TRX, TRC20 или TRC10.
assetAddress
string
Адрес TRC20-контракта или пустая строка.
tokenId
string
Идентификатор TRC10 или пустая строка.
invoiceId
string
Связанный счет, если движение относится к счету.
invoiceAddress
string
Адрес связанного счета или пустая строка.
counterpartyAddress
string
Адрес второй стороны движения.
payload
object
Дополнительные индексированные данные события.
history() вызывает GET /api/v1/factories/{factoryAddress}/wallet/history и требует право «Просмотр фабрики» для выбранной фабрики.
Интерфейсы смарт-контрактов
SDK не открывает универсальный исполнитель отдельным методом. Он сам формирует допустимый вызов перевода TRX или transfer() выбранной TRC20-монеты.
Solidity
interface IMainFactoryWallet {
function convertFactoryUsdtToTmr(uint32 factoryId, uint256 amount) external;
function convertFactoryTmrToUsdt(uint32 factoryId, uint256 amount) external;
}
interface IMerchantFactoryWallet {
function executor(bytes calldata data) external;
}
interface ITrc20Transfer {
function transfer(address recipient, uint256 amount) external returns (bool);
}
Изменение сетевых настроек
Эти методы изменяют состояние смарт-контракта MerchantFactory напрямую в сети TRON. Merchant API в операции не участвует: транзакцию формирует TronWeb, а подтвердить ее может только кошелек владельца выбранной фабрики.
Задает USDT-остаток, который не участвует в автоматической конвертации.
setAmlEnabled(enabled, transactionOptions?)
bool
txId
Включает или отключает AML-проверку для новых счетов фабрики.
Параметры valueRaw передаются целыми числами в минимальных единицах соответствующей монеты. Для больших значений используйте строку, чтобы JavaScript не потерял точность.
Интерфейс смарт-контракта
Ниже показан только публичный интерфейс доступных операций без исходного кода реализации.
Solidity
interface IMerchantFactorySettings {
function setApprovedMaxFee(uint32 newApprovedMaxFee) external;
function setPayoutAddress(address newPayoutAddress) external;
function setMinimumInvoiceBalance(uint256 newMinimumInvoiceBalance) external;
function setAutoConvertUsdtToTmrEnabled(bool enabled) external;
function setAutoConvertUsdtRetainAmount(uint256 value) external;
function setAmlEnabled(bool enabled) external;
}
Функции Solidity не возвращают значение. txId в JavaScript является результатом отправки транзакции методом TronWeb и позволяет затем проверить ее подтверждение в сети.
Параметр transactionOptions
Свойство
Тип
Описание
feeLimit
number
Максимальная стоимость выполнения транзакции в sun.
permissionId
number
Идентификатор активного разрешения TRON-аккаунта, если используется permission management.
shouldPollResponse
boolean
Ожидать результат выполнения вместо немедленного возврата txId.
pollTimes
number
Количество попыток проверки результата при включенном ожидании.
rawResponse
boolean
Вернуть полный ответ TronWeb.
keepTxID
boolean
Сохранить идентификатор транзакции в расширенном ответе TronWeb.
События в реальном времени
Подписка получает события фабрики и принадлежащих ей счетов без постоянного опроса API. SDK использует одно Socket.IO-соединение на экземпляр TmrMerchant, даже если одновременно выбрано несколько фабрик.
SDK получает короткоживущий realtime-токен подписанным HTTP-запросом. События фабрики требуют factories:read, события счетов — invoices:read. Настройки webhook на realtime-подписки не влияют.
Основные ошибки
Код
Описание
FACTORY_ADDRESS_REQUIRED
Для операции не задан адрес фабрики.
INVALID_FACTORY_ADDRESS
Переданное значение не является корректным TRON-адресом.
FACTORY_NOT_FOUND
Фабрика не существует или не разрешена API-ключу.
FACTORY_NODE_READ_FAILED
Выбранный TRON-узел не смог прочитать контракт.
MAIN_FACTORY_MISMATCH
Фабрика относится к другому центральному контракту.
API_SCOPE_REQUIRED
У API-ключа отсутствует разрешение, необходимое выбранному методу.
INVALID_* / ZERO_PAYOUT_ADDRESS
SDK отклонил значение настройки до формирования транзакции.
INVALID_*_AMOUNT / INVALID_*_ADDRESS
SDK отклонил сумму, адрес монеты или адрес получателя до формирования транзакции.
FACTORY_WALLET_CONTEXT_FAILED
Не удалось согласовать фабрику, владельца и запись в MainFactory.
FACTORY_BALANCE_READ_FAILED
Выбранный TRON-узел не смог прочитать баланс фабрики.
FACTORY_TRANSACTION_FAILED
TronWeb не смог подписать, отправить или выполнить транзакцию.
Для каждого направления SDK предоставляет сервисную операцию за ресурсы TMR и прямую транзакцию владельца фабрики.
Два режима исполнения
Методы ViaService подписывают HTTP-запрос API-ключом, а транзакцию отправляет Генерал сервиса. Методы OnChain вызывают MainFactory V3 через настроенный TronWeb, поэтому ресурсы оплачивает и транзакцию подписывает владелец фабрики.
Метод
Режим
Результат
Описание
getTmrToUsdtServiceQuota(apiOptions?)
API
ConversionQuota
Возвращает лимит, расход и остаток бесплатных TMR-to-USDT операций текущего UTC-месяца.
tmrToUsdtViaService(amountRaw, options)
API
ServiceConversionResult
Конвертирует TMR фабрики в USDT за ресурсы сервиса; доступно три успешных вызова в месяц.
tmrToUsdtOnChain(amountRaw, transactionOptions?)
TronWeb
OnChainConversionResult
Отправляет прямую транзакцию владельца без расходования сервисной квоты.
usdtToTmrViaService(amountRaw, options)
API
ServiceConversionResult
Конвертирует USDT фабрики в TMR за ресурсы сервиса; сейчас число вызовов не ограничено.
usdtToTmrOnChain(amountRaw, transactionOptions?)
TronWeb
OnChainConversionResult
Отправляет прямую транзакцию владельца для конвертации USDT в TMR.
amountRaw передается целой строкой в минимальных единицах и должен помещаться в uint88. idempotencyKey обязателен: повтор полностью совпадающего успешного запроса возвращает сохраненный результат и не создает вторую транзакцию.
Прямые методы принимают положительный uint256 и не обращаются к Merchant API. Они используют signer и transactionOptions настроенного TronWeb. API-ключ не может заменить подпись кошелька.
Результаты и повтор запросов
Сервисный ответ содержит operationId, executionMode, direction, factoryId, factoryAddress, amountRaw и result; для TMR-to-USDT также quota. Прямой ответ содержит executionMode, direction, amountRaw, txId и исходный result TronWeb.
Один idempotencyKey нельзя применять к другой сумме, фабрике или направлению. Если первая попытка записана как неуспешная, после устранения причины создайте новый ключ операции.
Основные ошибки
Код
Описание
API_SCOPE_REQUIRED
У ключа нет разрешения на выбранное направление.
INVALID_IDEMPOTENCY_KEY
Для сервисной операции не задан допустимый idempotencyKey.
IDEMPOTENCY_KEY_REUSED
Ключ уже связан с другой операцией.
IDEMPOTENT_OPERATION_IN_PROGRESS / FAILED
Первый запрос еще выполняется либо ранее завершился ошибкой.
Контекст фабрики управляет списком счетов, а отдельный контекст счета объединяет его состояние, активацию, кошелек и события.
Два уровня работы
Методы factory.invoice работают с коллекцией счетов выбранной фабрики. Вызов at(idOrAddress) создает локальный объект одного счета без сетевого запроса. Так интеграция сначала находит или создает счет, а затем работает только с его контекстом.
Безвозвратно резервирует следующий номер на пять минут и локально рассчитывает будущий адрес.
factory.invoice.create(params, createOptions?)
Локально + API + TronWeb
InvoiceData
Создает счет, проверяет адрес через выбранный TRON-узел и возвращает обычный объект данных.
factory.invoice.list(filters?, apiOptions?)
API
InvoicePage
Возвращает страницу счетов с поиском, фильтрацией и сортировкой.
factory.invoice.at(idOrAddress)
Локально
InvoiceResource
Создает контекст одного счета по внутреннему id или полному TRON-адресу.
Параметр filters
Свойство
Тип
Описание
page / pageSize
number
Номер страницы и размер от 1 до 100, по умолчанию 25.
search
string
Поиск по номеру, адресу, назначению и внешнему идентификатору.
externalId / status
string
Точный внешний идентификатор или статус счета.
requiresAttention
boolean
Оставляет счета, которым требуется ручное решение владельца.
sort / direction
string
Сортировка created, updated, expires, amount, status или number в направлении asc или desc.
Контекст одного счета
Внутренний идентификатор хранится в invoice.invoiceDbId, адрес в invoice.invoiceAddress, а сетевой номер в invoice.chainInvoiceId. При выборе по id адрес и сетевой номер запоминаются после первого get() или state().
Метод
Источник
Результат
Описание
invoice.get(apiOptions?)
API
InvoiceData
Возвращает основные данные и активные предупреждения.
invoice.state(apiOptions?)
API
InvoiceState
Возвращает счет, платежи, журнал, AML-проверки и обнаруженные активы одним запросом.
invoice.payments.list(apiOptions?)
API
Payment[]
Возвращает входящие и исходящие движения счета.
invoice.timeline.list(apiOptions?)
API
TimelineEvent[]
Возвращает последовательный журнал обработки.
invoice.warnings.list(apiOptions?)
API
Warning[]
Возвращает только активные предупреждения.
invoice.aml.get(apiOptions?)
API
AmlCheck[]
Возвращает выполненные AML-проверки счета.
invoice.paymentLink.get(apiOptions?)
API
PaymentLink
Возвращает ссылку и токен публичной страницы оплаты.
Активация и особый план
Штатную обработку можно запустить через Merchant API, временно приостановить или продолжить автоматическую активацию и запросить ручную AML-проверку. Особый план выплаты фиксируется отдельной транзакцией владельца фабрики.
После активации адрес остается полноценным кошельком счета. Владелец фабрики может читать его балансы и переводить TRX или TRC20. Отправка средств возможна только после активации и требует реальной транзакции владельца фабрики.
Метод
Источник
Результат
Описание
invoice.wallet.assets(apiOptions?)
API
WalletAsset[]
Возвращает активы, обнаруженные сервисом при мониторинге.
invoice.wallet.getTrxBalance()
TronWeb
string
Читает актуальный баланс TRX в sun из выбранного узла.
invoice.wallet.transferTrc20(token, to, amountRaw, transactionOptions?)
TronWeb
txId
Вызывает transfer выбранной TRC20-монеты от имени кошелька счета.
✓
Произвольные вызовы не предоставляются.SDK открывает только переводы TRX и TRC20. Методов approve, TRC10 и выполнения произвольного кода в публичном контексте счета нет.
on получает все совпадающие события, once только первое, off удаляет обработчик. Маска * внутри контекста счета означает только события этого счета. Если контекст создан по внутреннему id, перед подпиской вызовите get() или state(), чтобы SDK узнал адрес.
Подписанный запрос API-ключом, транзакция TRON не создается.
Резервация и создание
invoices:create
Адрес рассчитывается локально и повторно проверяется сервисом.
Штатная обработка
invoices:activate:standard
Процесс, пауза, продолжение и ручная AML-проверка через Merchant API.
План и переводы
Подпись владельца
TronWeb подписывает реальную сетевую транзакцию. SDK не читает и не проверяет приватный ключ.
НЕЗАВИСИМОЕ УПРАВЛЕНИЕ
Что происходит со счетами, если сервис недоступен
Средства на фабриках и счетах остаются под полным контролем мерчанта. Недоступность кабинета, API или мониторинга не передает контроль сервису и не блокирует прямую работу с контрактами.
Полный контроль остается у мерчанта
Merchant Receipt не хранит приватные ключи счетов и не имеет доступа к средствам мерчанта. Управляющие операции подтверждаются кошельком владельца фабрики, а правила исполнения закреплены в смарт-контрактах.
Что изменится при остановке сервиса
Временно приостановится автоматизацияМониторинг новых поступлений, уведомления, API, webhook, автоматические проверки и активация счета за ресурсы сервиса будут ожидать восстановления.
Контроль владельца останется доступенСредства, сетевые настройки фабрики, ручная активация и разрешенные операции с кошельком активированного счета останутся доступны владельцу.
В штатном режиме Merchant Receipt отслеживает поступления и, когда условия выполнены, активирует счет за собственные сетевые ресурсы. При недоступности сервиса эта автоматизация ожидает восстановления. Средства не переводятся сервису и не становятся ему доступны: мерчант может выполнить необходимые действия самостоятельно.
Rescue Merchant
rescue-merchant.trc20.money— отдельная статическая страница для прямого управления фабрикой и счетами. Она не обращается к backend Merchant Receipt и получает состояние непосредственно из сети TRON.
Настройки фабрики, ее кошелек и поиск счета по сетевым данным.
✓
Работает независимо от сервераДля чтения состояния и подготовки операций используется выбранный TRON-узел.
✓
Можно выбрать собственный узелВ настройках подключения можно указать любой совместимый FullNode API.
✓
Подпись остается у мерчантаTronLink показывает каждую транзакцию до отправки. Приватный ключ страницу не покидает.
✓
Данные счета сверяютсяПоиск использует сетевой Invoice ID и обязательный адрес счета, чтобы исключить ошибочный выбор.
Какие действия доступны
Объект
Доступные операции
Фабрика
Проверка и изменение сетевых настроек, получателя выплат и параметров обработки.
Кошелек фабрики
Просмотр балансов и отправка TRX, TMR и поддерживаемых TRC20-токенов.
Неактивированный счет
Выбор плана выплаты, подтверждение его записи в сети и последующая прямая активация.
Активированный счет
Просмотр балансов и разрешенные владельцу операции с кошельком счета.
Порядок действий мерчанта
1
Проверьте сеть TRONУбедитесь, что выбранный узел отвечает, а TronLink подключен к адресу владельца фабрики.
2
Откройте Rescue MerchantВыберите фабрику либо откройте ссылку с заранее переданными параметрами.
3
Сверьте сетевые данныеПроверьте фабрику, Invoice ID, адрес счета, рабочую монету и текущие балансы.
4
Подтвердите только нужную операциюИзучите параметры и предполагаемые сетевые расходы в окне подтверждения.
5
Проверьте новое состояниеПосле отправки перечитайте данные через узел и сохраните txID для журнала инцидента.
Прямой доступ через TronWeb
Rescue Merchant — удобный интерфейс, но не единственная точка доступа. Техническая команда мерчанта может читать и вызывать публичные методы контрактов напрямую через TronWeb и любой совместимый узел.
Независимый статический интерфейс для прямой работы с фабриками и счетами Merchant Receipt через сеть TRON — без кабинета, API и серверного мониторинга.
Rescue Merchant читает данные через выбранный TRON-узел и подготавливает контрактные вызовы. Каждую транзакцию отдельно подтверждает кошелек владельца фабрики.
Для чего предназначен Rescue Merchant
Страница используется, когда основной интерфейс или сервер Merchant Receipt временно недоступен, а мерчанту необходимо проверить состояние контрактов либо выполнить разрешенную владельцу операцию.
✓
Управление фабрикойПроверка и изменение сетевых настроек, получателя выплат и параметров обработки.
✓
Кошелек фабрикиПросмотр балансов и отправка TRX, TMR и поддерживаемых TRC20-токенов.
✓
Поиск и активация счетаСверка Invoice ID и адреса, выбор плана и последовательная ручная активация.
✓
Кошелек счетаПросмотр активов и доступные владельцу операции после активации контракта.
Как обеспечивается независимость
1Браузер и TronLinkИнтерфейс загружается как набор статических файлов, а подпись выполняется в кошельке мерчанта.
→
2Выбранный TRON-узелСтраница получает состояние и готовит транзакции через TronGrid или совместимый FullNode API.
→
3Смарт-контрактыФабрики и счета исполняют только правила и полномочия, закрепленные непосредственно в сети.
Интерфейс страницы
В одном рабочем пространстве доступны список фабрик, сетевые настройки, кошелек фабрики и поиск счета.
Подключение к сети
Узел по умолчанию
Для чтения сети можно использовать публичный endpoint TronGrid, установленный в приложении.
Собственный узел
В настройках подключения можно указать URL любого совместимого FullNode API и направить все запросы через него.
Кошелек владельца
После подключения Rescue Merchant показывает только фабрики, зарегистрированные за активным адресом.
Проверка перед отправкой
Перед каждой транзакцией интерфейс сверяет сеть, контракт, владельца и параметры операции.
Работа со счетом
1
Введите идентификатор и адресДопускается сетевой Invoice ID либо номер из UI, но адрес счета всегда обязателен для контрольной сверки.
2
Проверьте найденные данныеСверьте сетевой Invoice ID, адрес, рабочую монету, баланс и состояние активации.
3
Выберите разрешенное действиеДля неактивированного счета доступны планы активации, для активированного — операции кошелька.
4
Подпишите транзакциюTronLink показывает фактический контрактный вызов и сетевые расходы до отправки.
Открытие по защищенной ссылке
Мерчант может заранее передать оператору deep-link с фабрикой, сетевым Invoice ID и ожидаемым адресом счета.
Проведите контрольную проверку до инцидентаСохраните адреса фабрик и счетов, проверьте доступ к кошельку владельца, резервному узлу и странице Rescue Merchant.
Технический резервный путь для чтения состояния и выполнения разрешенных владельцу операций напрямую через публичные интерфейсы контрактов.
Код мерчанта не должен получать приватный ключ
Для чтения можно использовать любой совместимый TRON-узел. Изменяющие состояние вызовы подписываются подключенным кошельком владельца фабрики, а перед отправкой обязательно сверяются адрес контракта, сеть и параметры.
Перед началом
MainFactory
TA8yRJ7bghwmMupPikN4xFYQhRqYVTVFssПостоянный главный реестр: поиск персональных фабрик и ручной обмен USDT/TMR.
MerchantFactory
Адрес персональной фабрики мерчантаПолучайте адрес из MainFactory и обязательно сверяйте владельца и factoryId.
EmergencyExecutor
TZAehzArybCEoQNQp1SUdZsggZWwJSx6kBПостоянный контракт для разрешенных операций с активированным кошельком счета.
Владелец фабрики
Активный адрес TronLink должен совпадать с merchantOwner, полученным из сети.
Raw-значения
Invoice ID и суммы передавайте целыми строками. Для USDT и TMR значение 1 000 000 соответствует одной монете.
Подключение и проверка контекста
Для чтения и отправки достаточно сигнатуры функции, типов параметров и адреса контракта. Внешний файл интерфейса не требуется.
JavaScript · TronWeb
const readWeb = new TronWeb({ fullHost: nodeUrl });
const signer = window.tronWeb;
if (!signer?.ready) throw new Error("Connect TronLink");
const owner = signer.defaultAddress.base58;
async function constantCall(contract, selector, parameters = []) {
const response = await readWeb.transactionBuilder
.triggerConstantContract(contract, selector, {}, parameters, owner);
if (!response.result?.result) {
throw new Error(response.result?.message || "Constant call rejected");
}
return response.constant_result?.[0] || "";
}
async function sendCall(contract, selector, parameters, feeLimit) {
const prepared = await signer.transactionBuilder
.triggerSmartContract(contract, selector, { feeLimit }, parameters, owner);
if (!prepared.result?.result) {
throw new Error(prepared.result?.message || "Simulation rejected");
}
const signed = await signer.trx.sign(prepared.transaction);
return signer.trx.sendRawTransaction(signed);
}
Чтение фабрики и счета
Сначала получите состояние из сети и независимо рассчитайте ожидаемый адрес счета. Адрес, переданный пользователем или deep-link, используется только для сверки.
JavaScript · read
const invoiceId = "10217324555";
const predictedWord = await constantCall(
factoryAddress,
"predictInvoice(uint40)",
[{ type: "uint40", value: invoiceId }]
);
const predictedAddress = readWeb.address.fromHex(
"41" + predictedWord.slice(-40)
);
if (normalize(predictedAddress) !== normalize(expectedInvoiceAddress)) {
throw new Error("Invoice ID does not match the expected address");
}
const payoutPlanHex = await constantCall(
factoryAddress,
"getInvoicePayoutPlan(address)",
[{ type: "address", value: expectedInvoiceAddress }]
);
Штатная активация счета
Основной сценарий не требует предварительного плана. Сначала проверьте рассчитанный адрес, активность фабрики, адрес выплаты, минимальный баланс счета и запас TMR на комиссию.
1
Сверьте счетПолучите адрес через predictInvoice(uint40) и сравните его с ожидаемым адресом.
2
Проверьте штатные условияФабрика активна, получатель выплат задан, план имеет режим default, TMR хватает на комиссию, а баланс счета достиг установленного минимума.
3
Выполните симуляциюПроверьте deployInvoice(uint40) через triggerConstantContract и не продолжайте при отклонении.
4
Подпишите активациюПодготовьте отдельную транзакцию deployInvoice(uint40), проверьте контракт и Invoice ID в TronLink.
Другой получатель, распределение или сохранение средств на счете оформляются отдельным планом. Сначала сохраните план, дождитесь его появления в состоянии фабрики и только затем готовьте активацию.
1
Сформируйте планУкажите режим, массивы из трех получателей и сумм, количество используемых позиций и false для запроса активации.
2
Сохраните первой транзакциейВызовите setInvoicePayoutPlanById и подпишите только установку плана.
3
Дождитесь состояния сетиДо 30 секунд опрашивайте getInvoicePayoutPlan(address) и сравнивайте весь план с ожидаемым.
4
Активируйте второй транзакциейТолько после точного совпадения плана симулируйте и отправляйте deployInvoice(uint40).
Проверка до подписи
✓
Сеть и контрактыПроверьте mainnet, фиксированные адреса MainFactory и EmergencyExecutor и регистрацию MerchantFactory.
✓
Полномочия владельцаПодключенный адрес должен совпадать с merchantOwner выбранной фабрики.
✓
Параметры вызоваСверьте типы, raw-суммы, адреса получателей, Invoice ID и ожидаемый адрес счета.
✓
Результат симуляцииНе подписывайте транзакцию, если узел отклонил вызов или вернул непонятную ошибку.
Функции независимого управления
Ниже перечислены методы чтения и операции, доступные владельцу фабрики. Служебные административные методы намеренно не включены.
MainFactory (TA8yRJ7bghwmMupPikN4xFYQhRqYVTVFss): поиск фабрик и обмен
Функция
Доступ
Параметры
Результат
nativeTrxToken()
Чтение
Нет параметров.
Адрес адаптера, через который читается нативный баланс TRX.
usdtAccounting()
Чтение
Нет параметров.
Баланс USDT, TMR в MainFactory, зарезервированный и доступный остаток USDT.
flags— сумма битов:1 max fee, 2 payout address, 4 minimum balance, 8 auto-convert, 16 AML, 32 retain amount. Далее по порядку:newApprovedMaxFee, newPayoutAddress, newMinimumInvoiceBalance, newAutoConvertUsdtToTmrEnabled, newAmlEnabled, newAutoConvertUsdtRetainAmount. Поля без установленного бита игнорируются, но должны иметь корректный ABI-тип.
Атомарно применяет выбранные настройки одной транзакцией.flags=63применяет все шесть настроек.
executor(bytes)
Владелец
data: 20 байтtarget + 32 байта суммы TRX в sun + calldata. Для TRC20 target — токен, сумма TRX равна 0, calldata — transfer(address,uint256).
Выполняет прямую отправку TRX или вызов поддерживаемого TRC20 от имени фабрики.
invoiceId; mode: 0штатно, 1другой получатель, 2оставить на счете, 3распределить; activateRequested=falseдля ручной последовательности;recipientsиamounts— массивы из 3 элементов;count — 0…3. Неиспользуемые элементы нулевые.
Сохраняет особый план. Для mode 1 нужен один получатель и нулевая сумма; для mode 3 нужны 1–3 ненулевых получателя и суммы.
deployInvoice(uint40)
Публичный вызов
invoiceId— полный сетевой ID найденного и предварительно проверенного счета.
Публикует счет, применяет текущий план и списывает эффективную комиссию TMR с фабрики.
EmergencyExecutor (TZAehzArybCEoQNQp1SUdZsggZWwJSx6kB) и чтение активов
Функция
Доступ
Параметры
Результат
mainFactory()
Чтение
Нет параметров.
Должен вернуть фиксированный адрес MainFactory; это проверка связи исполнителя с главным реестром.
execute(uint32,uint40,address,bytes)
Владелец
factoryId— ID фабрики;invoiceId— сетевой ID;expectedInvoice— ожидаемый адрес;invoiceFallbackData— 20 байт target + 32 байта суммы TRX в sun + calldata. Для TRC20 target — токен, сумма TRX равна 0.
Повторно проверяет владельца и рассчитанный адрес, затем выполняет операцию из активированного кошелька счета.
balanceOf(address)
Чтение
account— фабрика или счет; вызов выполняется на адресе TRC20 либо nativeTrxToken().
Баланс актива в raw units. Для TRX результат указан в sun.
decimals()
Чтение
Нет параметров; вызов выполняется на адресе токена.
Количество знаков после запятой для перевода raw balance в отображаемое значение.
symbol()
Чтение
Нет параметров; вызов выполняется на адресе токена.
Короткое обозначение актива для проверки перед отправкой.
Операции с кошельками
Источник
Метод
Назначение
Кошелек фабрики
executor(bytes)
Прямая отправка TRX или вызов transfer(address,uint256) поддерживаемого TRC20-токена.
Кошелек счета
execute(uint32,uint40,address,bytes)
EmergencyExecutor повторно проверяет владельца, фабрику и рассчитанный адрес активированного счета.
Обмен TMR
convertFactoryTmrToUsdt(uint32,uint256)
Владелец выбранной фабрики обменивает raw-сумму TMR на USDT через MainFactory.
Ошибки и завершение операции
Симуляция отклонена
Не подписывайте транзакцию. Перечитайте состояние фабрики и счета, проверьте minimum balance, план, комиссию и полномочия владельца.
Отправка отклонена
Сохраните ответ узла, но не повторяйте подпись автоматически. Сначала убедитесь, что исходная транзакция не была принята.
Подтверждение состояния
После отправки перечитайте контракт через выбранный узел и сохраните txID. Для плана проверяйте полное совпадение всех полей.
Короткий контрольный список
✓
Адреса, владелец, сеть и параметры получены из проверенного источника и повторно сверены в сети.Каждая изменяющая состояние операция симулируется, отдельно подтверждается владельцем и завершается чтением нового состояния.
БЕЗОПАСНОСТЬ
Рекомендации
Merchant Receipt уменьшает число секретов и доверенных участников, но безопасная интеграция также зависит от того, как мерчант получает адрес счета, хранит ключи и проверяет операции.
Сервис не хранит приватные ключи от платежных адресов
Адрес счета создается детерминированно и до, и после активации не имеет приватного ключа. После активации он становится смарт-контрактным кошельком, действия которого ограничены правилами контрактов и полномочиями владельца фабрики.
Подход Merchant Receipt
✓
Без хранения ключей от средствСервер мониторит состояние и координирует обработку, но не хранит ключ, которым можно подписать перевод со счета.
✓
Правила закреплены контрактамиПолучатель, рабочая монета, комиссия и полномочия не могут произвольно подменяться серверной записью.
✓
API-ключ отделен от кошелькаКлюч tmrsk_v1 подписывает запросы Merchant API и сам по себе не позволяет подписывать транзакции TRON.
✓
Результат можно проверить независимоМерчант может рассчитывать адреса своим кодом и сверять их через выбранный TRON-узел без доверия к интерфейсу кабинета.
Безопасное получение адреса счета
Для production-интеграции рекомендуем формировать адрес на собственном сервере через Node.js SDK либо совместимую независимую реализацию. Адрес, который увидит покупатель, должен происходить из расчета мерчанта, а не из ответа интерфейса или произвольной строки от внешнего сервиса.
1
Резервируется последовательностьMerchant API выделяет номер счета и возвращает версию известного шаблона контракта.
2
Адрес рассчитывается локальноSDK выполняет математический расчет внутри процесса на сервере мерчанта. Выбранный адрес еще не передан Merchant Receipt и не поставлен на мониторинг.
3
Расчет проверяется через TRONSDK сверяет локальный результат с predictInvoice выбранной фабрики через узел, которому доверяет мерчант.
4
Мерчант регистрирует счетТолько после проверки мерчант сообщает рассчитанный адрес сервису, после чего начинается мониторинг платежа.
✓
Источник платежного адреса контролирует мерчантДаже при проблеме с интерфейсом адрес для покупателя можно получить и проверить независимо на собственном backend. Сервер Merchant Receipt повторно проверяет расчет, но не должен быть единственным источником истины.
Что следует проверять
Версия шаблона
Сверяйте creation code hash из prepare с известным значением в вашей версии SDK. Не принимайте незнакомую версию автоматически.
TRON-узел
Для независимой on-chain проверки используйте TronGrid со своим ключом или собственный Full Node. Зафиксируйте ожидаемую сеть и адрес фабрики.
Связь с заказом
Храните externalId, сумму, монету, срок, адрес счета и идентификатор фабрики. Перед показом адреса убедитесь, что эти данные относятся к одному заказу.
События и статусы
Проверяйте подпись webhook, обрабатывайте event.id идемпотентно и подтверждайте критическое состояние повторным чтением API или блокчейна.
Ключи и доступ
API-ключХраните tmrsk_v1 только в секретном хранилище backend, не помещайте его во frontend, мобильное приложение, репозиторий или журнал.
Ключ кошелька владельцаПо возможности используйте аппаратный кошелек. Если автоматизация требует signer, изолируйте его и не передавайте приватный ключ параметром Merchant API.
Минимальные разрешенияСоздавайте отдельный ключ для каждой интеграции, выбирайте только нужные фабрики и scopes, задавайте срок и IP allowlist.
Отзыв и заменаПри подозрении на утечку немедленно отзовите API-ключ в кабинете и создайте новый. Утраченная приватная часть не восстанавливается.
Транзакции в сеть
Изменение сетевых настроек, управление средствами фабрики или активированного счета и применение особого плана требуют реальной транзакции TRON. Перед подписью кошелек должен показывать ожидаемый контракт и действие, а приложение должно проверять сеть, адрес назначения и параметры вызова.
При подозрении на проблему
1
Остановите выдачу новых счетовСохраните уже выданные адреса и зафиксируйте время обнаружения.
2
Отзовите интеграционные ключиЗамените API-ключи и webhook-реквизиты, которые могли стать доступны посторонним.
3
Сверьте данные независимоПроверьте фабрику, счета и транзакции через доверенный TRON-узел.
4
Сохраните доказательстваНе удаляйте логи, request ID, event ID, txId и снимки конфигурации до завершения расследования.
Короткие определения, форматы данных, статусы, ошибки и публичные интерфейсы контрактов Merchant Receipt.
Основные понятия
Фабрика
Персональный смарт-контракт мерчанта, который хранит правила приема платежей: рабочую монету, адрес выплат, допустимую комиссию и условия активации счетов. У каждой фабрики один владелец, подтверждающий критические изменения своим кошельком.
Кошелек фабрики
Тот же адрес фабрики может хранить TRX, TRC20 и TMR. Владелец видит балансы и может подписывать переводы доступных активов или обмен TMR и USDT.
Счет
Отдельный заранее рассчитанный адрес для одного платежа. Приватного ключа для этого адреса не существует ни до, ни после активации. До активации контракт еще не опубликован, а после нее адрес становится смарт-контрактным кошельком.
Активация счета
Публикация заранее известного контракта по адресу счета. В штатном сценарии контракт сразу направляет поступивший баланс по правилам фабрики. Особый план может изменить получателя, оставить средства или распределить сумму.
Адреса, идентификаторы и суммы
Значение
Формат
Описание
factoryAddress
Base58Check
Адрес персональной фабрики, обычно начинается с T. Он определяет настройки и пространство адресов ее счетов.
invoiceAddress
Base58Check
Рассчитанный адрес конкретного счета. Он остается тем же до и после публикации контракта.
tokenAddress
Base58Check
Адрес контракта TRC20. Для нативного TRX система использует адрес служебного контракта-адаптера.
41...
hex
Сетевое hex-представление того же TRON-адреса: байт сети 41 и 20 байт адреса. В Merchant API используйте Base58Check, если параметр явно не требует hex.
id
integer
Внутренний идентификатор записи Merchant API. Не является адресом или номером транзакции.
chainInvoiceId
uint40
Неизменяемый сетевой номер счета внутри фабрики, используемый для расчета адреса.
txId
hex string
Идентификатор отправленной транзакции TRON.
amountRaw
decimal string
Сумма в минимальных единицах без десятичной точки. Строковый формат не допускает потери точности JavaScript.
Монета TMR
TMR, или Merchant Receipt, — служебная TRC10-монета проекта с идентификатором 1005181 и 6 знаками после запятой. Фабрика расходует TMR при публикации счетов, поэтому мерчант заранее видит стоимость обработки и максимальную комиссию, которую он разрешил контракту.
✓
Неизменяемая привязка к USDTВ контракте главной фабрики навсегда зафиксированы адрес USDT в сети TRON и обмен один к одному в минимальных единицах: 1 TMR соответствует 1 USDT.
✓
USDT формирует обеспечениеКаждой единице TMR за пределами главной фабрики соответствует зарезервированная единица USDT. Владелец проекта может вывести только USDT сверх рассчитанного резерва.
✓
Возврат принадлежит мерчантуВладелец персональной фабрики может обменять ее TMR обратно. TMR возвращается главной фабрике, а равная сумма USDT отправляется непосредственно на адрес владельца.
✓
Обеспечение нельзя забрать в обход учетаАдминистративный вывод проверяет свободный остаток, а резервный вызов главной фабрики не может быть направлен на контракт USDT или персональную фабрику. Эти ограничения исполняются смарт-контрактом, а не серверным обещанием.
Статусы счета
Статус
Описание
created
Запись счета создана, начальная постановка на мониторинг еще завершается.
waiting_payment
Счет ожидает первое подходящее поступление.
partial_paid
Получена часть ожидаемой суммы; мониторинг продолжается.
paid
Условие оплаты выполнено, счет готовится к активации.
overpaid
Получено больше ожидаемой суммы; дальнейшее действие зависит от правил счета.
awaiting_activation
Нужна ручная проверка или решение владельца перед активацией.
fulfilled
Контракт счета опубликован, выбранный план обработки выполнен.
activation_failed
Попытка активации не завершилась; причина доступна в состоянии и журнале счета.
expired
Срок ожидания оплаты завершен и обычный мониторинг остановлен.
Статус описывает этап обработки, а не заменяет проверку баланса и транзакций. Для финансового решения читайте состояние счета, платежи и журнал вместе.
Коды ошибок
Merchant API возвращает машинный код в поле error. SDK переносит его в TmrApiError.code, HTTP-статус в status, а дополнительные сведения в details. Если HTTP-ответ не был получен, status равен 0.
HTTP-статусы
HTTP
Значение
400
Некорректный формат или значение параметров.
401
Запрос не прошел аутентификацию или подпись.
403
Ключ распознан, но не имеет нужного scope, фабрики или IP.
404
Фабрика, счет, ключ или резервация не найдены в доступной области.
409
Конфликт состояния, повтор nonce или несовместимое повторное использование idempotency key.
429
Превышено ограничение частоты запросов.
500 / 503
Внутренняя ошибка обработки или временная недоступность TRON-провайдера.
Основные машинные коды
Код
Категория
Описание
INVALID_API_SIGNATURE API_REQUEST_REPLAYED
Авторизация
Подпись запроса некорректна либо nonce уже был использован.
API_KEY_INACTIVE API_KEY_IP_DENIED
Доступ
Ключ истек или отозван либо запрос пришел не с разрешенного IP.
API_SCOPE_REQUIRED API_FACTORY_ACCESS_DENIED
Доступ
Для операции нет нужного разрешения или доступа к выбранной фабрике.
FACTORY_NOT_FOUND FACTORY_NOT_READY
Фабрика
Фабрика недоступна этому ключу либо ее сетевые условия пока не позволяют выполнить действие.
INVOICE_NOT_FOUND INVALID_INVOICE_IDENTIFIER
Счет
Счет не найден или переданный id/адрес имеет неподдерживаемый формат.
Сетевая транзакция фабрики не отправлена либо независимая проверка адреса через выбранный узел завершилась ошибкой.
NativeTrxToken и нативный TRX
У TRX нет адреса TRC20-контракта, хотя интерфейсу нужны единые поля монеты и единый способ чтения баланса. NativeTrxToken служит сетевым адаптером: сообщает имя TRON, символ TRX, 6 знаков после запятой и возвращает нативный баланс указанного адреса.
Solidity
interface INativeTrxToken {
// Возвращает полное название нативной монеты.
function name() external pure returns (string memory);
// Возвращает тикер нативной монеты.
function symbol() external pure returns (string memory);
// Возвращает количество знаков после запятой для TRX.
function decimals() external pure returns (uint8);
// Читает нативный баланс TRX указанного адреса в sun.
function balanceOf(address account) external view returns (uint256);
}
Публичные интерфейсы контрактов
Эти функции можно читать или вызывать через совместимый TRON-узел без кабинета Merchant Receipt. Функции изменения состояния создают транзакцию и должны быть подписаны тем адресом, которому контракт выдал соответствующее право.
Главная фабрика: поиск и обмен
Solidity
interface IMainFactoryPublic {
// Возвращает адрес контракта, представляющего нативный TRX.
function nativeTrxToken() external view returns (address);
// Возвращает баланс USDT, резерв выпущенных TMR и свободный остаток.
function usdtAccounting() external view returns (
uint256 usdtBalance, uint256 tmrInMain, uint256 reservedUsdt, uint256 availableUsdt
);
// Создает сетевую заявку на публикацию персональной фабрики.
function requestMerchantFactory(uint32 fee, address token, bytes32 factorySalt)
external returns (uint40 requestId);
// Читает заявку на публикацию фабрики по ее requestId.
function getFactoryRequest(uint40 requestId) external view returns (
address merchantOwner, uint32 fee, address token, bytes32 factorySalt, uint8 status
);
// Читает зарегистрированную фабрику по ее числовому ID.
function getFactory(uint32 factoryId) external view returns (
address merchantOwner, address factory, address serviceProxy, uint32 fee, bool active
);
// Находит зарегистрированную фабрику по адресу контракта.
function getFactoryByAddress(address factoryAddress) external view returns (
uint32 factoryId, address merchantOwner, address factory,
address serviceProxy, uint32 fee, bool active
);
// Возвращает количество фабрик зарегистрированного владельца.
function getMerchantFactoryCount(address merchantOwner) external view returns (uint32);
// Читает фабрику владельца по ее позиции в реестре.
function getMerchantFactoryByIndex(address merchantOwner, uint32 index) external view returns (
uint32 factoryId, address factory, address serviceProxy, uint32 fee, bool active
);
// Обменивает USDT фабрики на равное raw-количество TMR.
function convertFactoryUsdtToTmr(uint32 factoryId, uint256 amount) external;
// Возвращает TMR и отправляет равное raw-количество USDT владельцу.
function convertFactoryTmrToUsdt(uint32 factoryId, uint256 amount) external;
}
Функции get... доступны для чтения. Обмен средств персональной фабрики разрешен только зарегистрированному владельцу этой фабрики. Заявка на новую фабрику лишь фиксируется в сети и не означает автоматическое принятие.
Персональная фабрика: настройки и счета
Solidity
interface IMerchantFactoryPublic {
// Возвращает полные сетевые настройки и балансы фабрики.
function merchantFactoryInfo() external view returns (
address mainFactory, address merchantOwner, uint32 fee, uint32 approvedMaxFee,
bool active, address token, address payoutAddress, uint256 minimumInvoiceBalance,
uint256 tmrBalance, uint256 usdtBalance, bool autoConvertUsdtToTmrEnabled,
bool amlEnabled, uint32 amlFee
);
// Возвращает действующую и будущую комиссию V3 и блок вступления в силу.
function feeSchedule() external view returns (
uint32 activeFee, uint32 activeAmlFee, uint32 pendingFee,
uint32 pendingAmlFee, uint64 activationBlock,
uint32 activeEffectiveFee, uint32 pendingEffectiveFee
);
// Возвращает USDT-баланс, доступный для автоматической конвертации.
function convertibleUsdtBalance() external view returns (uint256 amount);
// Устанавливает максимальную комиссию, одобренную владельцем.
function setApprovedMaxFee(uint32 valueRaw) external;
// Изменяет получателя штатных выплат по счетам.
function setPayoutAddress(address payoutAddress) external;
// Задает минимальный баланс для штатной активации.
function setMinimumInvoiceBalance(uint256 valueRaw) external;
// Включает или отключает автоматическое пополнение TMR за USDT.
function setAutoConvertUsdtToTmrEnabled(bool enabled) external;
// Задает USDT-остаток, исключенный из автоматической конвертации.
function setAutoConvertUsdtRetainAmount(uint256 valueRaw) external;
// Включает или отключает AML-проверку будущих счетов.
function setAmlEnabled(bool enabled) external;
// Рассчитывает детерминированный адрес будущего счета.
function predictInvoice(uint40 invoiceId) external view returns (address invoice);
// Публикует счет после выполнения условий фабрики.
function deployInvoice(uint40 invoiceId) external returns (address invoice);
// Читает особого получателя, установленного для счета.
function getInvoiceException(address invoice) external view returns (address);
// Читает установленный для счета план выплаты.
function getInvoicePayoutPlan(address invoice) external view returns (
uint8 mode, bool activateRequested, uint8 count,
address[3] memory recipients, uint256[3] memory amounts
);
// Сохраняет план выплаты и может запросить активацию счета.
function setInvoicePayoutPlanById(
uint40 invoiceId, uint8 mode, bool activateRequested,
address[3] calldata recipients, uint256[3] calldata amounts, uint8 count
) external;
}
Чтение информации и расчет адреса не требуют подписи. Изменение настроек и особого плана разрешено только владельцу фабрики. deployInvoice открыт для отправителя транзакции, но публикация пройдет лишь при выполнении закрепленных фабрикой условий.
Прокси доступа к кошельку счета
После активации счет остается смарт-контрактным кошельком. КонтрактTZAehzArybCEoQNQp1SUdZsggZWwJSx6kBвыполняет роль проверяющего прокси: находит счет через неизменяемую связь главной и персональной фабрик, подтверждает владельца и только после этого передает выбранную операцию кошельку счета.
✓
Только владелец фабрикиАдрес отправителя сверяется с владельцем, записанным в главной фабрике. API-ключ или сервер Merchant Receipt не заменяют эту подпись.
✓
Неизменяемая связьГлавная фабрика закрепляется в прокси один раз, поэтому сервис не может позднее подменить реестр владельцев.
✓
Адрес проверяется повторноПрокси самостоятельно рассчитывает адрес по factoryId и invoiceId и может сверить его с ожидаемым адресом счета.
Пользовательские сценарии
Операция
Вызов монеты
Описание
Перевод TRX
TRX transfer
Прокси поручает активированному счету отправить указанное количество sun получателю.
Перевод TRC20
transfer(to, amount)
Счет вызывает стандартную функцию transfer у выбранного TRC20-контракта.
Разрешение TRC20
approve(spender, amount)
Счет может выдать указанному контракту ограниченное разрешение на расход TRC20 для заранее понятного сценария мерчанта.
Solidity
interface IInvoiceWalletExecutor {
// Выполняет подготовленную операцию после проверки владельца и адреса счета.
function execute(
uint32 factoryId,
uint40 invoiceId,
address expectedInvoice,
bytes calldata invoiceFallbackData
) external;
}
Параметр
Тип
Описание
factoryId
uint32
Сетевой идентификатор фабрики, владелец которой подписывает операцию.
invoiceId
uint40
Сетевой номер счета внутри выбранной фабрики.
expectedInvoice
address
Ожидаемый адрес счета для дополнительной проверки перед выполнением.
invoiceFallbackData
bytes
ABI-кодированные данные выбранной операции перевода или разрешения. SDK умеет подготовить их автоматически.