Skip to content

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

PathTypeDescription
source.nowstringISO timestamp текущего timer run.
source.timestampMsnumberUnix timestamp в миллисекундах для текущего timer run.

EVM event

PathTypeDescription
source.addressaddressContract address, который эмитнул event.
source.blockNumbernumberНомер блока, где event был найден.
source.blockHashstringHash блока, где event был найден.
source.transactionHashstringHash transaction, внутри которой был event.
source.transactionIndexnumberИндекс transaction внутри блока.
source.indexnumberИндекс event/log внутри transaction или блока.
source.datastringRaw encoded event data.
source.topicsarray<string>Topics из EVM log.
source.argsarrayDecoded ABI arguments в позиционном порядке. Если ABI известен, wizard дополнительно подсказывает source.args[index] с именами аргументов.

EVM call

PathTypeDescription
source.addressaddressContract address, связанный с matched call.
source.blockNumbernumberНомер блока, где call был найден.
source.blockHashstringHash блока, где call был найден.
source.transactionHashstringHash transaction, внутри которой был call.
source.transactionIndexnumberИндекс transaction внутри блока.
source.indexnumberИндекс call/source item.
source.fromaddressCaller address.
source.toaddressTarget contract address.
source.datastringRaw encoded calldata.
source.argsarrayDecoded ABI arguments в позиционном порядке. Если ABI известен, wizard дополнительно подсказывает source.args[index] с именами аргументов.

EVM block

PathTypeDescription
source.numbernumberНомер блока.
source.hashstring | nullHash блока.
source.timestampnumberTimestamp блока.
source.transactionsCountnumberКоличество transactions в блоке.
source.gasLimitstring | nullGas limit блока в raw units, если source его предоставляет.
source.gasUsedstring | nullGas, использованный всеми transactions блока, если source его предоставляет.
source.baseFeePerGasstring | nullBase fee per gas для блока, если source его предоставляет.
source.blobGasUsedstring | nullBlob gas, использованный блоком, если source его предоставляет.
source.excessBlobGasstring | nullExcess blob gas блока, если source его предоставляет.

EVM transaction

PathTypeDescription
source.block.numbernumberНомер блока, где transaction была включена.
source.block.hashstring | nullHash блока, где transaction была включена.
source.block.timestampnumberTimestamp блока.
source.indexnumberИндекс transaction внутри блока.
source.hashstringHash transaction.
source.typestringНормализованный тип transaction, например legacy или eip1559.
source.fromaddressSender address.
source.toaddress | nullRecipient address или null для contract creation.
source.noncenumberAccount nonce transaction.
source.gasLimitstringGas limit в raw units.
source.gasPricestringGas price в raw units.
source.maxPriorityFeePerGasstring | nullEIP-1559 max priority fee, если доступен.
source.maxFeePerGasstring | nullEIP-1559 max fee, если доступен.
source.maxFeePerBlobGasstring | nullBlob gas fee, если доступен.
source.inputstringRaw transaction input calldata.
source.valuestringNative token amount в raw base units.
source.methodIdstring | nullПервые 4 байта calldata selector, если они есть.

Substrate event

PathTypeDescription
source.block.numbernumberНомер блока, где event был найден.
source.block.hashstringHash блока, где event был найден.
source.block.timestampnumberTimestamp блока в миллисекундах.
source.indexnumberИндекс event внутри блока.
source.modulestringPallet/module name.
source.eventstringEvent name внутри pallet.
source.typestring | nullPhase type события.
source.extrinsicnumber | nullИндекс extrinsic для ApplyExtrinsic events.
source.dataarrayDecoded event data в позиционном порядке. Wizard дополнительно подсказывает source.data[index] с именами аргументов из metadata.

Substrate extrinsic

PathTypeDescription
source.block.numbernumberНомер блока, где extrinsic был найден.
source.block.hashstringHash блока, где extrinsic был найден.
source.block.timestampnumberTimestamp блока в миллисекундах.
source.indexnumberИндекс extrinsic внутри блока.
source.modulestringPallet/module name.
source.callstringExtrinsic method name.
source.argsarrayDecoded extrinsic arguments в позиционном порядке. Wizard дополнительно подсказывает source.args[index] с именами аргументов из metadata.
source.resultstring | nullExecution result matched extrinsic.
source.senderaddress | nullOrigin account, который отправил extrinsic.
source.signatureobject | nullДанные подписи extrinsic.
source.signature.noncenumberNonce из подписи.
source.signature.digeststringSignature digest.
source.pathstringNested call path для matched extrinsic.

Substrate block

PathTypeDescription
source.numbernumberНомер блока.
source.hashstringHash блока.
source.parentHashstringHash родительского блока.
source.timestampnumberTimestamp блока в миллисекундах.
source.stateRootstringState root блока.
source.extrinsicsRootstringExtrinsics 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 в одно значение:

json
{
  "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.

Массив ссылок.

Каждая строка содержит:

  • 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 возвращает строку с фиксированным количеством знаков.

handlebars
{{round human.price digits=2}}
{{round human.price digits=2 fixed=true}}

format - форматирует raw integer amount с учетом token decimals. Например, значение 1000000000000000000 при decimals=18 станет 1.

handlebars
{{format raw.value decimals=18}}

substr - возвращает часть строки. start задает позицию начала; отрицательный start считает от конца строки; len ограничивает длину.

handlebars
{{substr hash start=0 len=10}}
{{substr hash start=-8}}

address - форматирует blockchain address для уведомления. Если адрес есть в address book workspace, вернет alias; иначе сократит известный address до компактного вида.

handlebars
{{address raw.from}}

make - рекурсивно заменяет адреса внутри object, array или string на значения из address book, где это возможно. Удобно для вывода структур с несколькими адресами.

handlebars
{{yaml (make raw.participants)}}

includes - проверяет, содержит ли array указанное string-значение. Обычно используется внутри if.

handlebars
{{#if (includes raw.tags "whale")}}Whale transfer{{/if}}

lowercase - приводит строку к lowercase.

handlebars
{{lowercase meta.name}}

uppercase - приводит строку к uppercase.

handlebars
{{uppercase meta.scope}}

titlecase - приводит строку к Title Case.

handlebars
{{titlecase meta.name}}

oneline - заменяет переносы строк пробелами.

handlebars
{{oneline human.summary}}

yaml - сериализует object/array в YAML string.

handlebars
{{yaml human}}

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.