Add Trigger / Edit Trigger
Add trigger открывает подробный wizard создания триггера. Этот wizard задает весь жизненный цикл события: от чтения source item до финального notification defaults.
Редактирование существующего триггера использует тот же wizard, но с уже заполненными значениями.
Если нужно быстро создать много однотипных triggers из ABI или metadata, можно использовать Import triggers. Это упрощенный массовый сценарий поверх общей идеи создания triggers.
Step 1. Description
На этом шаге trigger получает понятное имя и краткое объяснение того, что он делает. Это помогает позже быстро узнавать trigger в проекте, templates, subscriptions и других местах, где нужно выбрать или проверить нужный сценарий.
Title
Обязательное видимое название trigger. Оно показывается в интерфейсе там, где пользователь выбирает, просматривает или проверяет trigger, поэтому лучше писать его коротко и понятно.
ID
Системный slug trigger внутри проекта. Он формируется автоматически из названия и в форме отображается как disabled field, чтобы пользователь видел будущий идентификатор, но не менял его вручную.
Description
Опциональное описание trigger. Его стоит включать, если по одному title не очевидно, какое событие отслеживается, какие данные используются или в каком сценарии этот trigger нужен.
Category
Обязательная категория trigger. Она помогает группировать triggers в таблицах, templates и rules, чтобы большие проекты оставались понятными и удобными для поиска.
Step 2. Source
На этом шаге выбирается, что именно запускает trigger: регулярный таймер или событие из blockchain data source. От выбранного типа зависит набор следующих панелей.
Trigger type
Обязательный выбор базового типа trigger.
timer используется для регулярных срабатываний по интервалу. blockchain используется для событий, extrinsics, calls, blocks или transactions из Data sources.
Timer
Interval
Обязательный интервал, с которым timer trigger должен срабатывать.
Формат interval: число и единица времени, например:
30s;5m;1h;1d.
Blockchain
Source
Обязательный выбор data source, из которого trigger будет читать blockchain/runtime данные.
В списке показываются доступные sources проекта. Если подходящего source нет, можно перейти к Add new source.
Выбранный source определяет дальнейшую ветку настройки: EVM или Substrate.
Blockchain - EVM
Source item
Обязательный выбор типа данных, которые trigger получает из EVM source: event, call, block или transaction.
Для event и call wizard дополнительно настраивает ABI и signature. Для block и transaction ABI и signature не требуются.
ABI contract address
Адрес контракта, по которому wizard пытается загрузить ABI и предложить доступные events или calls.
Если Use as trigger filter включен, trigger будет срабатывать только для этого contract address. Если переключатель выключен, адрес используется только для загрузки ABI, а сам trigger сможет матчить любой контракт с выбранной signature.
Event signature / Call signature
Обязательная signature события или метода, который должен запускать trigger.
Если ABI успешно загружен, signature можно выбрать из списка. Если ABI не найден, контракт указан динамически или нужной signature нет в списке, значение можно ввести вручную.
Blockchain - Substrate
Source item
Обязательный выбор типа Substrate item: event, call/extrinsic или block.
Для event и call wizard дополнительно предлагает выбрать pallet и конкретную entry. Для block pallet и event/extrinsic не требуются.
Pallet
Обязательный pallet из runtime metadata выбранного Substrate source.
Список загружается из metadata source. Он доступен только для event и call/extrinsic selection modes.
Event / Extrinsic
Обязательная entry внутри выбранного pallet.
Для event выбирается событие pallet. Для call/extrinsic выбирается extrinsic. Wizard показывает runtime version, чтобы было понятно, из какой metadata загружены доступные варианты.
Source payload
Выбранный source item определяет структуру source.*, которая будет доступна дальше в wizard: в inputs/templates, providers, activation condition, filters, data transform и defaults.
Timer
| Path | Type | Description |
|---|---|---|
source.now | string | ISO timestamp текущего timer run. |
source.timestampMs | number | Unix timestamp в миллисекундах для текущего timer run. |
EVM event
| Path | Type | Description |
|---|---|---|
source.address | address | Contract address, который эмитнул event. |
source.blockNumber | number | Номер блока, где event был найден. |
source.blockHash | string | Hash блока, где event был найден. |
source.transactionHash | string | Hash transaction, внутри которой был event. |
source.transactionIndex | number | Индекс transaction внутри блока. |
source.index | number | Индекс event/log внутри transaction или блока. |
source.data | string | Raw encoded event data. |
source.topics | array<string> | Topics из EVM log. |
source.args | array | Decoded ABI arguments в позиционном порядке. Если ABI известен, wizard дополнительно подсказывает source.args[index] с именами аргументов. |
EVM call
| Path | Type | Description |
|---|---|---|
source.address | address | Contract address, связанный с matched call. |
source.blockNumber | number | Номер блока, где call был найден. |
source.blockHash | string | Hash блока, где call был найден. |
source.transactionHash | string | Hash transaction, внутри которой был call. |
source.transactionIndex | number | Индекс transaction внутри блока. |
source.index | number | Индекс call/source item. |
source.from | address | Caller address. |
source.to | address | Target contract address. |
source.data | string | Raw encoded calldata. |
source.args | array | Decoded ABI arguments в позиционном порядке. Если ABI известен, wizard дополнительно подсказывает source.args[index] с именами аргументов. |
EVM block
| Path | Type | Description |
|---|---|---|
source.number | number | Номер блока. |
source.hash | string | null | Hash блока. |
source.timestamp | number | Timestamp блока. |
source.transactionsCount | number | Количество transactions в блоке. |
source.gasLimit | string | null | Gas limit блока в raw units, если source его предоставляет. |
source.gasUsed | string | null | Gas, использованный всеми transactions блока, если source его предоставляет. |
source.baseFeePerGas | string | null | Base fee per gas для блока, если source его предоставляет. |
source.blobGasUsed | string | null | Blob gas, использованный блоком, если source его предоставляет. |
source.excessBlobGas | string | null | Excess blob gas блока, если source его предоставляет. |
EVM transaction
| Path | Type | Description |
|---|---|---|
source.block.number | number | Номер блока, где transaction была включена. |
source.block.hash | string | null | Hash блока, где transaction была включена. |
source.block.timestamp | number | Timestamp блока. |
source.index | number | Индекс transaction внутри блока. |
source.hash | string | Hash transaction. |
source.type | string | Нормализованный тип transaction, например legacy или eip1559. |
source.from | address | Sender address. |
source.to | address | null | Recipient address или null для contract creation. |
source.nonce | number | Account nonce transaction. |
source.gasLimit | string | Gas limit в raw units. |
source.gasPrice | string | Gas price в raw units. |
source.maxPriorityFeePerGas | string | null | EIP-1559 max priority fee, если доступен. |
source.maxFeePerGas | string | null | EIP-1559 max fee, если доступен. |
source.maxFeePerBlobGas | string | null | Blob gas fee, если доступен. |
source.input | string | Raw transaction input calldata. |
source.value | string | Native token amount в raw base units. |
source.methodId | string | null | Первые 4 байта calldata selector, если они есть. |
Substrate event
| Path | Type | Description |
|---|---|---|
source.block.number | number | Номер блока, где event был найден. |
source.block.hash | string | Hash блока, где event был найден. |
source.block.timestamp | number | Timestamp блока в миллисекундах. |
source.index | number | Индекс event внутри блока. |
source.module | string | Pallet/module name. |
source.event | string | Event name внутри pallet. |
source.type | string | null | Phase type события. |
source.extrinsic | number | null | Индекс extrinsic для ApplyExtrinsic events. |
source.data | array | Decoded event data в позиционном порядке. Wizard дополнительно подсказывает source.data[index] с именами аргументов из metadata. |
Substrate extrinsic
| Path | Type | Description |
|---|---|---|
source.block.number | number | Номер блока, где extrinsic был найден. |
source.block.hash | string | Hash блока, где extrinsic был найден. |
source.block.timestamp | number | Timestamp блока в миллисекундах. |
source.index | number | Индекс extrinsic внутри блока. |
source.module | string | Pallet/module name. |
source.call | string | Extrinsic method name. |
source.args | array | Decoded extrinsic arguments в позиционном порядке. Wizard дополнительно подсказывает source.args[index] с именами аргументов из metadata. |
source.result | string | null | Execution result matched extrinsic. |
source.sender | address | null | Origin account, который отправил extrinsic. |
source.signature | object | null | Данные подписи extrinsic. |
source.signature.nonce | number | Nonce из подписи. |
source.signature.digest | string | Signature digest. |
source.path | string | Nested call path для matched extrinsic. |
Substrate block
| Path | Type | Description |
|---|---|---|
source.number | number | Номер блока. |
source.hash | string | Hash блока. |
source.parentHash | string | Hash родительского блока. |
source.timestamp | number | Timestamp блока в миллисекундах. |
source.stateRoot | string | State root блока. |
source.extrinsicsRoot | string | Extrinsics root блока. |
Step 3. Inputs schema
Inputs schema описывает параметры, которые пользователь задает при создании подписки.
Inputs похожи на filters, поэтому их легко перепутать. Главное отличие: inputs обязательны для заполнения и задают базовые данные, без которых подписка не может работать. Filters опциональны и нужны для дополнительной персонализации уже после того, как обязательные inputs заполнены.
Редактор поддерживает два режима:
UI mode- поля добавляются через визуальный Schema editor;JSON mode- schema редактируется как JSON.
Schema editor
Schema editor используется в нескольких шагах wizard. В Inputs schema он описывает поля, которые пользователь заполняет при создании подписки; в Filters schema и Output schema используется тот же принцип редактирования.
В UI mode schema состоит из properties. Каждое property можно раскрыть, свернуть, удалить и настроить через набор панелей.
Property
Name - техническое имя поля внутри schema. Оно используется в paths, templates и JavaScript-коде, поэтому должно быть коротким, стабильным и понятным. Для object properties имя становится ключом объекта. Для array item имя не используется, потому что array описывает один общий тип элемента.
Type - тип значения. От выбранного типа зависит, какие дополнительные панели появятся ниже.
Source path - опциональная связь с исходным source.* path. Она нужна, когда поле schema называется не так, как исходное поле source item, но engine должен понимать, какое source-значение использовать для ранней фильтрации. Чаще всего Source path нужен в filters, иногда может быть полезен в inputs, но не используется в output schema.
Property types
string - строковое значение.
number - числовое значение.
boolean - логическое значение true/false.
null - явное пустое значение.
address - blockchain address. Для него выбирается Address type: EVM или SS58 (Substrate). Для SS58 address можно указать SS58 prefix, чтобы интерфейс и downstream-логика знали формат адреса.
object - объект с вложенными properties. После выбора этого типа появляется панель Properties, внутри которой используется такой же редактор schema.
array - массив однотипных элементов. После выбора этого типа появляется вложенный редактор Item, где задается тип каждого элемента массива.
tuple - массив с фиксированным набором позиций. После выбора этого типа появляется панель Items, где каждая позиция описывается отдельно.
balance и currency могут появляться в импортированных Substrate schemas как дополнительные hints от metadata layer. Для ручного описания схемы обычно проще думать о фактическом типе значения: сумма может быть string или number, asset/currency id тоже может быть string или number. Сама schema не обязана решать, как форматировать значение для уведомления: сырые данные приходят из source, а нужное преобразование владелец trigger делает в transform или providers.
enum - набор variants, где каждый variant имеет имя и собственный тип. Этот тип доступен в output schema, но отключен для trigger inputs и filters. Для inputs и filters нужно задавать конкретное значение, по которому subscription сможет сравнивать или фильтровать source item; enum variants для этого сценария слишком неоднозначны.
lookup - ссылка на тип из Substrate metadata. Для него выбирается Lookup ref. Этот тип удобен, когда нужно сохранить связь с runtime type, а не описывать структуру вручную.
Step 4. Data providers
Data providers - опциональный шаг. Providers выполняются сверху вниз и позволяют дополнить source item внешними или runtime-данными перед transform.
В templates и provider-полях можно использовать:
{{source.*}}- данные исходного события;{{inputs.*}}- значения подписки;{{providers.providerId.*}}- результат предыдущих providers.
У каждого provider есть вес. При сохранении trigger сервис считает суммарный вес всех providers и проверяет его по лимиту trigger. Подробно лимиты описаны в разделе Limits.
Общие поля каждого provider:
Type- тип provider;ID- имя, по которому результат будет доступен какproviders.ID;- кнопка тестирования provider;
- кнопка удаления provider.
Для всех providers используется timeout 10 секунд.
Доступные provider types:
HTTP;GraphQL;RPC;Chain State;Value history;JavaScript.
HTTP
Вес: 2.
Method
HTTP method. Сейчас используется выбор из поддерживаемых методов.
URL
Endpoint, на который provider отправит HTTP request.
Headers
Key-value список headers. Значения поддерживают template-подстановки.
Query params
Key-value список query parameters. Значения поддерживают template-подстановки.
Body
Опциональный JSON/template body для POST-запроса. Body поддерживает template-подстановки.
GraphQL
Вес: 2.
Endpoint
GraphQL endpoint URL.
Headers
Key-value headers. Значения поддерживают template-подстановки.
Variables
Key-value variables для GraphQL query. Значения поддерживают template-подстановки.
Query
GraphQL query document.
Chain State
Chain State читает данные состояния из blockchain source и добавляет результат в provider output.
Вес: 1.
State type
Тип чтения: EVM contract или Substrate storage.
EVM contract
Source
EVM source. По умолчанию используется source триггера.
Target contract
Адрес контракта для фактического read-call. Поддерживает template, например {{ source.address }}.
ABI contract address
Адрес контракта, из ABI которого загружать методы. Нужен, если target contract динамический.
Read method
Режим выбора read method: Auto или Manual.
В Auto wizard загружает view/pure methods из ABI и предлагает выбрать метод. В Manual можно вставить signature и ABI fragment вручную; args и output schema синхронизируются из ABI fragment.
Method arguments
Argument-поля появляются, если выбранный method принимает args.
Substrate storage
Source
Substrate source. По умолчанию используется source триггера.
Module
Pallet/module.
Storage entry
Storage item внутри module.
Если storage entry имеет args, wizard создает отдельную панель для каждого arg. Необязательные args можно включать и выключать переключателем Optional.
Storage arguments
Argument-поля выбранного storage entry.
Block
Опциональный block number/hash/template.
Value history
Value history хранит окно последних значений и считает агрегаты.
Вес: 1.
Partition by
Опциональный ключ разделения истории на независимые окна. Например, если указать {{ source.address }}, provider будет хранить отдельную историю значений для каждого адреса, а не одну общую историю для всех source items.
Dedupe by
Обязательный уникальный id текущего item, чтобы одно событие не учитывалось дважды.
Keep last
Размер окна.
Value type
Тип значения в окне.
Value
Значение, которое добавляется в историю. Можно указать простую template-строку, например {{ source.amount }}, или JSON value: object, array, string, number, boolean/null.
Template-подстановки можно использовать внутри JSON-значений. Например, object может собрать несколько полей source item в одно значение:
{
"account": "{{ source.account }}",
"amount": "{{ source.amount }}",
"asset": "{{ source.asset }}"
}Если Value type выбран как number, итоговое значение должно приводиться к числу; для object/array обычно выбирают соответствующий Value type.
Aggregates
Дополнительные агрегаты для числовых values.
RPC
Вес: 1, если используется source runtime transport. Вес: 2, если используется direct endpoint transport.
Transport
Как отправлять RPC request: через source runtime или через direct endpoint.
Если transport идет через source runtime, прямой endpoint не нужен.
Method
RPC method name.
Endpoint
URL, если выбран endpoint transport.
Headers
JSON object headers для endpoint transport.
Params
JSON array params.
Custom body
Опциональный полный JSON-RPC body для endpoint transport.
JavaScript
Вес: 2.
Variables
Key-value variables для функции.
Source
JavaScript function source.
JavaScript provider используется, когда дополнительное значение проще вычислить кодом на основе source, inputs и предыдущих providers.
Test Provider
Для provider доступен диалог Test Provider.
В нем нужно заполнить только те template values, которые provider реально использует. Значения предыдущих providers можно передать вручную через providers.* paths. Если provider не содержит template references, тест можно запускать сразу.
Step 5. Activation condition
Activation condition - опциональное JavaScript-условие.
Оно включается переключателем Optional. Если условие выключено, по умолчанию всегда возвращает true: trigger считается активным для всех source items, прошедших source matching.
Если условие включено, код должен вернуть значение, по которому engine решит, активировать ли дальнейшую обработку. Это удобно для логики, которую нельзя выразить только filters schema или template rules.
Например, custom trigger может быть основан на source event, который технически ловит широкий набор событий. Сам source умеет отдать нужные данные, но не может полностью описать бизнес-логику срабатывания: нужно проверить несколько полей, сравнить значения, учесть результат provider или пропустить часть событий по дополнительному правилу. В таком случае source matching оставляют широким, а в Activation condition описывают финальное условие, при котором trigger действительно должен сработать.
Step 6. Filters schema
Filters schema описывает поля, по которым подписки смогут фильтровать trigger output.
Filters похожи на inputs, но используются иначе. Пользователь может оставить filters пустыми, если ему достаточно базового сценария подписки. Если нужна более точная персонализация, filters позволяют сузить или уточнить условия срабатывания.
Редактор поддерживает:
UI mode;JSON mode;Add property;- тот же schema editor, что и в
Inputs schema.
Source path нужен, когда поле output называется не так, как исходное поле source item. Engine применяет filters в два этапа: ранний pre-filter по source data и затем conditions по сформированному output. Если имена различаются, здесь указывают путь к исходному полю.
Step 7. Output schema
Output schema состоит из двух панелей:
Raw output;Human output.
Raw output описывает машинный результат trigger transform. Эти поля используются в rules, filters, templates и downstream-логике.
Human output описывает человекочитаемый результат для уведомлений. Его можно:
- оставить
Use same as raw; - выключить
Use same as rawи задать собственную schema.
Редактор schema поддерживает UI mode и JSON mode.
Для Raw output и Human output используется тот же schema editor, что и в Inputs schema, но без Source path: output schema описывает уже сформированный результат trigger, а не matching по исходному source item. В отличие от inputs и filters, output schema может использовать enum.
Step 8. Transform
Шаг содержит две JavaScript-панели:
Raw transform;Human transform.
Raw transform получает source, inputs и providers и возвращает объект, соответствующий Raw output.
Human transform получает source, inputs, providers и raw output и возвращает объект, соответствующий Human output.
Редактор подсказывает доступный context и показывает validation error, если JavaScript некорректен.
Step 9. Defaults
Defaults задает рекомендованные шаблоны уведомлений по умолчанию. Это совет от создателя trigger для пользователя, который будет создавать subscription: как лучше назвать уведомление, какие данные показать в коротком и длинном тексте, какую иконку, обложку или ссылки использовать.
Эти значения не являются обязательными. При создании subscription пользователь может оставить defaults как есть или полностью переназначить внешний вид и текст уведомления под свой сценарий.
Все панели опциональные и включаются отдельными переключателями.
Title
Заголовок уведомления.
Short
Короткий markdown-текст.
Long
Длинный markdown-текст.
Icon
URL иконки.
Cover
URL обложки.
Avatar
URL аватара уведомления. По умолчанию используется тот же URL, что и в Icon.
Links
Массив ссылок.
Каждая строка содержит:
Title;Url;- кнопка удаления;
Add itemдля добавления ссылки.
При сохранении каждая ссылка должна иметь и title, и URL.
Поля используют autocomplete и Handlebars/template helpers. Defaults рендерятся от trigger output, поэтому здесь не используется context source, inputs или providers.
Autocomplete подсказывает:
block- номер блока, если он есть в output;index- индекс item/event, если он есть в output;hash- transaction/block hash, если он есть в output;meta- метаданные trigger:description,name,kind,scope;raw.*- поля raw output;human.*- поля human output.
Handlebars helpers
В defaults используется Handlebars syntax: {{human.amount}}, {{#if human.amount}}...{{/if}}, {{round human.price digits=2}}. Общие правила expressions, blocks, paths и sub-expressions описаны в официальной документации Handlebars: Built-in Helpers.
Built-in helpers
if - условный block. Рендерит содержимое, если значение не является falsy.
unless - обратный if. Рендерит содержимое, если значение falsy.
each - перебор array/object. Внутри block можно использовать this, а также служебные значения Handlebars вроде @index для array и @key для object.
with - меняет текущий context внутри block. Удобно, когда нужно несколько раз обратиться к одному вложенному объекту.
lookup - динамически берет значение по ключу. Полезно, когда имя поля или индекс лежит в другой переменной.
Web3alert helpers
round - округляет число или числовую строку. Параметр digits задает количество знаков после точки, fixed=true возвращает строку с фиксированным количеством знаков.
format - форматирует raw integer amount с учетом token decimals. Например, значение 1000000000000000000 при decimals=18 станет 1.
substr - возвращает часть строки. start задает позицию начала; отрицательный start считает от конца строки; len ограничивает длину.
address - форматирует blockchain address для уведомления. Если адрес есть в address book workspace, вернет alias; иначе сократит известный address до компактного вида.
make - рекурсивно заменяет адреса внутри object, array или string на значения из address book, где это возможно. Удобно для вывода структур с несколькими адресами.
includes - проверяет, содержит ли array указанное string-значение. Обычно используется внутри if.
lowercase - приводит строку к lowercase.
uppercase - приводит строку к uppercase.
titlecase - приводит строку к Title Case.
oneline - заменяет переносы строк пробелами.
yaml - сериализует object/array в YAML string.
Step 10. Test & save
Последний шаг позволяет проверить trigger перед сохранением.
Если trigger имеет inputs schema, сначала показываются поля test inputs.
Для blockchain trigger задаются:
Block- номер блока для симуляции;Item index- опциональный индекс item, если в блоке найдено несколько подходящих событий.
Для timer trigger используется текущий timestamp.
После test run отображаются:
- статус
Valid resultилиInvalid result; Source items on block;- список issues, если result invalid;
Source input;Trigger output;Debug.
После успешной проверки или осознанного пропуска проверки trigger можно сохранить. Возможность test run может зависеть от тарифного плана/account tier.