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 или Solana.

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 загружены доступные варианты.

Blockchain - Solana

Source item

Обязательный выбор типа Solana item: event или call.

event соответствует program event, который source декодирует из logs. call соответствует Solana instruction выбранной программы. В UI используется общий термин call, чтобы сохранить единый язык с другими source types.

Program ID

Обязательный public key Solana program.

Program ID используется как runtime filter: source ищет только events/instructions этой программы.

IDL

JSON IDL выбранной программы.

Wizard может попытаться загрузить IDL автоматически по Program ID через Anchor IDL account или Program Metadata. Если IDL не загружается автоматически, его нужно вставить вручную. Без IDL trigger для Solana event/call создать нельзя, потому что source не сможет надежно декодировать payload, аргументы и accounts.

При сохранении trigger wizard оставляет только нужный фрагмент IDL для выбранного event/call и зависимых custom types, чтобы trigger не требовал хранить полный IDL всей программы.

Event / Call

Обязательная entry из IDL.

Для event выбирается event из events. Для call выбирается instruction из instructions. Если выбран call, accounts из IDL становятся доступными как именованные поля source.accounts.*.

Types source

Types source - опциональная настройка на уровне trigger. Она указывает wizard-у, откуда загружать каталог типов, который используется schema-полями с типом lookup.

Lookup-поля не встраивают всю вложенную schema внутрь поля. Вместо этого они хранят ссылку на именованный тип из каталога. Когда subscription wizard или trigger editor должен показать поля внутри такого lookup-типа, он запрашивает каталог для выбранного trigger и разворачивает ссылку. Это полезно для Substrate runtime metadata, Solana IDL custom types, импортированных каталогов и любых schemas, где объекты большие, переиспользуются в нескольких местах или рекурсивны. Lookup позволяет не копировать глубокие структуры в каждое поле и не разворачивать рекурсивные типы бесконечно в UI.

Если Types source выключен, используется поведение по умолчанию: backend сначала пробует trigger-specific types, если они есть, затем fallback на project/source types, когда их можно вывести из выбранного source. У timer trigger обычно нет source, поэтому каталог пустой, если эта настройка не включена.

Доступные режимы:

  • Source node - выбрать data source и использовать каталог типов, импортированный из runtime или metadata этого source.
  • API / imported catalog - вызвать HTTP API, который возвращает каталог типов. Wizard запрашивает один Base URL. Backend загружает каталог из Base URL + /catalog; этот endpoint может вернуть полный список types, объект { schemas: ... }, обертку { types: [...] }/{ data: [...] } или импортированный список элементов { id, schema }.
  • Inline / manual - вставить JSON object, где keys - имена типов, а values - JSON Schema-like определения типов.

Для динамических filter controls вроде cascade API catalog также должен предоставлять Base URL + /lookup. Wizard вызывает этот endpoint с query params вроде ref, q, value, limit и ID предыдущих cascade-шагов, чтобы загрузить списки options для выбранных Lookup ref. Сохраненная condition подписки по-прежнему хранит одно обычное значение фильтра.

Используйте эту настройку, когда trigger читает данные из одного source, но schema editor должен разворачивать lookups из другого source, импортированного каталога или вручную поддерживаемого набора типов.

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 блока.

Solana event

PathTypeDescription
source.block.slotnumberSlot, где event был найден.
source.block.hashstring | nullBlock hash для slot, если доступен.
source.block.timestampnumber | nullBlock timestamp, если доступен.
source.transaction.indexnumberИндекс transaction внутри блока.
source.transaction.signaturestringSignature Solana transaction.
source.transaction.successbooleanПризнак успешной transaction. Failed transactions source пропускает.
source.transaction.errorunknownОшибка transaction или null для успешной transaction.
source.indexnumberИндекс matched event внутри source output.
source.programIdaddressProgram ID, выбранный в trigger.
source.eventstringИмя event из IDL.
source.dataobjectDecoded event data, где ключи соответствуют именам fields из IDL.

Solana call

PathTypeDescription
source.block.slotnumberSlot, где instruction был найден.
source.block.hashstring | nullBlock hash для slot, если доступен.
source.block.timestampnumber | nullBlock timestamp, если доступен.
source.transaction.indexnumberИндекс transaction внутри блока.
source.transaction.signaturestringSignature Solana transaction.
source.transaction.successbooleanПризнак успешной transaction. Failed transactions source пропускает.
source.transaction.errorunknownОшибка transaction или null для успешной transaction.
source.indexnumberИндекс matched call внутри source output.
source.programIdaddressProgram ID, выбранный в trigger.
source.callstringИмя instruction из IDL.
source.signersarray<string>Адреса signers transaction для matched instruction.
source.argsobjectDecoded instruction arguments, где ключи соответствуют именам args из IDL.
source.accountsobjectAccount addresses, где ключи соответствуют именам accounts из IDL; owner aliases для token accounts добавляются, когда доступны.
source.accountsMetaobjectMetadata token accounts, где ключи соответствуют именам accounts из IDL, когда metadata доступна. Поля metadata могут включать address, owner, mint, programId, decimals, rawAmount, uiAmount и uiAmountString.
source.accountsRawarray<string>Account addresses в порядке transaction instruction.
source.pathstringПуть instruction, включая вложенность inner instructions.
source.innerbooleantrue, если matched instruction был inner instruction.

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 - ссылка на тип из metadata/IDL, например Substrate runtime type или Solana custom defined type. Для него выбирается Lookup ref. Этот тип удобен, когда нужно сохранить связь с runtime/source type, а не описывать структуру вручную.

cascade - UI helper для выбора одного string значения через несколько lookup-шагов. Он полезен для filters, где финальное значение сложно вводить вручную, но его можно найти через последовательность: сначала выбрать группу, затем элемент внутри нее. У каждого шага есть ID и Lookup ref; опциональный Label влияет только на UI subscription wizard. Порядок шагов задает зависимости автоматически: каждый шаг после первого загружается с учетом значения предыдущего шага. В trigger schema это всё равно сохраняется как string с io.ryabina.notify.type: "cascade", а подписки по-прежнему хранят обычную condition по исходному filter field.

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-подстановки.

Retry until ready

Опциональный неблокирующий polling готовности ответа. Нужен, когда внешний API индексирует данные с задержкой: on-chain событие уже пришло, а метаданные для него появятся в API только через несколько секунд. Без retry provider вернёт пустой или неполный ответ, transform подставит fallback-значения, и фильтры подписки по output-полям не сработают.

Если ответ provider «не готов», исполнение паркуется и автоматически повторяется позже. Worker при этом не занят ожиданием, событие сохраняет исходную идентичность и доставляется пользователю не более одного раза. Retry выполняется до transform и до фильтров подписки, поэтому фильтры видят уже обогащённые данные. Ожидающий retry trigger не считается сломанным.

Поля:

  • Enabled - включает retry для provider;
  • Attempts - максимальное число повторных попыток, от 1 до 20;
  • Delay, ms - базовая пауза между попытками, от 250 до 60000;
  • Backoff - стратегия роста паузы: Fixed - одинаковая пауза, Linear - пауза × номер попытки, Exponential - пауза удваивается с каждой попыткой;
  • When exhausted - что делать после исчерпания попыток:
    • Continue with last response - продолжить с последним ответом как есть; transform применит свой fallback;
    • Fail the provider - считать provider неуспешным: для Optional provider результат будет пустым, для обязательного исполнение завершится без output;
  • Retry when - условия «не готовности» ответа:
    • Empty array - ответ является пустым массивом;
    • Missing path - по пути Ready when path нет значения;
    • HTTP error - запрос завершился сетевой ошибкой или не-2xx статусом; без этого флага такие ошибки остаются обычными ошибками provider;
  • Ready when path - путь к полю ответа, которое должно присутствовать; сегменты разделяются точкой, индексы массивов указываются числом;
  • Equals - опциональное значение, которому должно равняться поле по Ready when path; поддерживает template-подстановки, hex-строки сравниваются без учёта регистра.

Тест provider выполняет одну попытку и не ждёт готовности - polling работает только в runtime.

Пример конфигурации через API/MCP:

json
{
  "id": "item",
  "type": "http",
  "url": "https://api.example.com/items",
  "queryParams": { "id": "{{ source.args.0 }}" },
  "retry": {
    "attempts": 8,
    "delayMs": 5000,
    "backoff": "linear",
    "retryOn": ["empty_array", "missing_path"],
    "until": { "path": "0.id", "equals": "{{ source.args.0 }}" }
  }
}

Через API/MCP дополнительно доступны поля maxDelayMs (потолок одной паузы) и maxElapsedMs (общий бюджет ожидания); в UI они не отображаются.


GraphQL Вес: 2

Endpoint

GraphQL endpoint URL.

Headers

Key-value headers. Значения поддерживают template-подстановки.

Variables

Key-value variables для GraphQL query. Значения поддерживают template-подстановки.

Query

GraphQL query document.

Retry until ready

GraphQL provider поддерживает retry-политику. Поля и поведение описаны в HTTP -> Retry until ready.


Chain State Вес: 1

Chain State читает данные состояния из blockchain source и добавляет результат в provider output.

State type

Тип чтения: EVM contract, Substrate storage или Solana account.

EVM contract state type

Выполняет view/pure read-call метода EVM-контракта.

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 state type

Читает storage entry из Substrate runtime.

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.

Solana account state type

Читает Solana account и декодирует его содержимое.

Source

Solana source. По умолчанию используется source триггера.

Account

Account public key, состояние которого нужно прочитать. Поле поддерживает template-подстановки, например {{ source.accounts.base_mint }}.

Solana state хранится в accounts. Поэтому provider читает account через source runtime и пытается декодировать его содержимое.

IDL

Опциональный JSON IDL с account definitions.

Если IDL включен и заполнен, provider декодирует account строго по нему. Если декодирование по ручному IDL не удалось, provider возвращает ошибку и не переключается на автоматическое распознавание.

Если IDL выключен, provider автоматически определяет схему по данным account:

  • сначала использует jsonParsed, если Solana RPC возвращает parsed account data;
  • затем пробует built-in layouts для распространенных on-chain accounts, например SPL Token mint/account и Metaplex Metadata;
  • если owner account связан с программой, для которой доступен IDL, пробует загрузить IDL автоматически через Anchor или Program Metadata и декодировать account по нему.

Результат provider доступен как providers.<id>. В нем возвращаются базовые поля account (account, exists, owner, lamports, executable, rentEpoch, slot) и decoded data, если schema была найдена.

Solana account provider кеширует успешные результаты на короткое время, чтобы несколько triggers/events, читающих один и тот же account, не отправляли лишние RPC-запросы.


Value history Вес: 1

Value history хранит окно последних значений и считает агрегаты.

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-2

Вес: 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.

Retry until ready

RPC provider поддерживает retry-политику. Поля и поведение описаны в HTTP -> Retry until ready.


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

Шаг начинается с Output mode.

В режиме Single output шаг содержит две JavaScript-панели:

  • Raw transform;
  • Human transform.

Raw transform получает source, inputs и providers и возвращает объект, соответствующий Raw output.

Human transform получает source, inputs, providers и raw output и возвращает объект, соответствующий Human output.

В режиме Multi-output шаг содержит одну JavaScript-панель, Output items transform. Она используется, когда один source tick или provider query может породить несколько независимых alert items. Transform должен вернуть:

js
{
  outputs: [
    {
      raw: { /* поля, соответствующие Raw output */ },
      human: { /* поля, соответствующие Human output */ },
    },
  ],
}

Каждый item в outputs будет отправлен как отдельный trigger output. Schemas Raw output и Human output описывают один отправляемый item, и каждый item проверяется по этим schemas.

Редактор подсказывает доступный 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.