РазделыКонтракты

Документация

Контракты

SmartAlert следит за контрактом тремя способами: по событиям, которые он выпускает, по ответам его view-функций и по чекам транзакций к нему. На этой странице — всё, что относится к самому контракту. Пороги, норма и проверка на истории описаны в разделе Правила.

На этой странице
Готовые наборы правил по типу контракта
Все тарифы
Загрузка своего ABI
Все тарифы
Состояние контракта
Pro и выше
Доля упавших транзакций
Business и выше
Разрешённые отправители
Business и выше

Готовые наборы правил по типу контракта

Когда вы добавляете контракт, SmartAlert смотрит его ABI и определяет тип по событиям. Для каждого найденного типа в «Предложениях» появляется готовый набор правил. Контракт может подходить под несколько типов, например USDC — это ERC-20, Pausable и прокси. Тогда показываются все подходящие наборы, а одинаковые правила в них не повторяются. Контракт без ABI наборов не получает.

Safe (мультисиг)
Признак в ABIAddedOwner, RemovedOwner, ChangedThreshold, ExecutionSuccess
ПравилаСменился состав владельцев · Сменился порог подписей · Исполнена транзакция · Транзакция не прошла · Подключён модуль или guard
ERC-20 (токен)
Признак в ABITransfer(address,address,uint256), Approval
ПравилаВыпуск токенов · Сжигание токенов · Объём переводов выше нормы · Переводов меньше нормы · Крупный перевод
Ownable
Признак в ABIOwnershipTransferred
ПравилаСменился владелец · Начата передача владения
Pausable
Признак в ABIPaused, Unpaused
ПравилаКонтракт на паузе · Пауза снята
AccessControl
Признак в ABIRoleGranted, RoleRevoked
ПравилаВыдана роль · Отозвана роль · Сменился админ роли
Прокси (ERC-1967)
Признак в ABIUpgraded(address)
ПравилаКонтракт обновлён · Сменился админ прокси

Правило попадает в набор, только если нужное ему событие есть в ABI. Например, «Начата передача владения» предлагается только контракту с OwnershipTransferStarted (Ownable2Step).

Ни одно правило не включается само. Отметьте нужные и нажмите Принять: правила появятся одним действием. Ненужное нажмите Отклонить, и для этого контракта его больше не предложат. Принятое правило — обычное правило: его можно изменить или удалить.

Если правила не помещаются в лимит тарифа, весь набор всё равно виден, а принять можно в пределах лимита. Без выбора канала правила получают первый канал проекта. Если каналов нет, правило создаётся без канала.

Загрузка своего ABI

У проверенного (verified) контракта ABI подтягивается сам. У непроверенного загрузите ABI на странице контракта. Без ABI нет ни событий для правил, ни функций для состояния контракта.

Что принимается. JSON-массив ABI или артефакт сборки Hardhat или Foundry: файл, в котором ABI лежит в поле abi. Файл не больше 1 МБ, в ABI не больше 2000 элементов и хотя бы одна функция.

Как проверяется. SmartAlert читает байткод контракта в сети и ищет в нём каждую функцию ABI. Если контракт — прокси ERC-1967, проверяется код реализации, а не прокси. Если у контракта уже есть события, ABI должен описывать хотя бы одно из них: так ловится ABI от другого контракта. Если хоть одна функция не нашлась, ABI не сохраняется, а на экране видно, каких функций нет в байткоде.

Кто может загрузить. ABI один на контракт и общий для всех проектов, которые за ним следят. Пока ABI у контракта нет, загрузить его может любой проект с этим контрактом (роль editor и выше). Первая загрузка задаёт ABI для всех.

Замена. Заменить ABI может только проект, который подтвердил владение контрактом. Новый ABI должен содержать все функции и события, на которых стоят включённые правила любых проектов. Иначе замена не пройдёт, а прежний ABI останется. У контракта без функции owner() владение подтвердить нельзя: для замены напишите на [email protected].

Состояние контракта

Правило может следить не за событиями, а за ответом view-функции контракта: paused(), owner(), цена оракула latestAnswer(), totalSupply(), balanceOf(address). SmartAlert спрашивает функцию по расписанию и сравнивает ответ с условием.

Пример: «Контракт на паузе» — paused() стало true. «Сменился owner» — owner() вернул другой адрес.

Какие функции подходят. View- и pure-функции из ABI, у которых один выход: bool, address или число (uint*, int*). Аргументов не больше трёх, типы address, bool, uint*, int*, bytes32. Функции, которые возвращают строку, байты, массив или несколько значений, в списке видны, но выбрать их нельзя.

Проверить функцию. Перед сохранением нажмите Проверить: SmartAlert вызовет функцию в сети и покажет ответ. Если у контракта есть decimals(), форма предложит учесть знаки: цена фида Chainlink приходит с 8 знаками. Проверка ничего не сохраняет. Не чаще 60 проверок в час на проект.

Условия.

bool, address
равно, не равно, изменилось
число
больше, не меньше, меньше, не больше, отклонение от нормы

«Изменилось» срабатывает на смену значения. В уведомлении видно, что было и что стало. Норма для чисел такая же, как у событий: тот же час за прошлые 7 дней. Медленные величины вроде totalSupply() от нормы почти не отходят, для них лучше порог.

Как часто спрашиваем. Раз в минуту, 5 минут, 15 минут или час — по самому частому правилу на эту функцию. Функцию без правил не спрашиваем. История появляется с первого правила: прошлые значения не дочитываются, поэтому проверка на истории для новой функции пуста.

Если функция ревертит. Revert — не значение. Правило работает по политике «Нет данных», а «изменилось» сравнивает со значением до revert.

На странице контракта. Блок «Состояние» показывает функции, на которые есть правила: текущее значение, когда оно сменилось и что было до этого. У чисел — график, у bool и address — лента изменений.

Уведомление.

  • «Контракт на паузе: paused() = true, было false»
  • «owner() изменился: 0x4a1d…e0c2 → 0x91c2…a7f0», оба адреса — ссылки на эксплорер
  • «latestAnswer() 2 412,5 < 2 500»

Плюс ссылка на контракт и блок, на котором прочитано значение. В вебхуке ответ функции приходит в поле alert.call, см. Webhook.

Лимиты. Правила состояния входят в общий лимит правил. На один контракт в проекте — не больше 20 разных функций с аргументами.

Тариф. Pro и выше. На Free форма видна под замком. После понижения тарифа правило работает дальше, изменить его можно только на Pro.

Доля упавших транзакций

Правило срабатывает, когда за окно доля прямых транзакций к контракту — отправленных на его адрес — которые откатились (revert), больше порога. Окно без транзакций — не сбой: правило молчит. Пример: «Revert 30% за час при норме 2%».

Настройки.

  • Порог — доля в процентах, от 1 до 100.
  • Окно — 15 минут, час, 6 часов или сутки. По умолчанию час.
  • Минимум транзакций в окне — по умолчанию 20. В окне, где транзакций меньше, доля не считается: правило показывает «мало данных», а не 0%, и не срабатывает. Три упавшие из пяти — ещё не 60%.

Норма. Типичная доля упавших за последние 7 суток. В форме — строка «Норма: 2%», на графике за 24 часа — полоса нормы, пунктир порога и штриховка окон с малым числом транзакций.

Уведомление. Числа — за окно, на котором правило сработало, то есть за последнее закрытое:

  • «Значение: 30% (порог: > 2%)»
  • «Транзакции: 12 из 40 упали»
  • «Упавшие: 0xaa…01, 0xbb…02» — до трёх последних, ссылки на эксплорер

Сбор чеков. Revert виден только в чеках транзакций. Чеки контракта SmartAlert начинает читать, когда на нём появляется первое включённое правило по транзакциям, — с этого момента, истории назад нет. До этого вместо графика экран пишет «Чеки этого контракта ещё не собираются». График появляется через одно окно, норма — когда наберётся достаточно окон с транзакциями.

Сети. Правила по транзакциям доступны не во всех сетях. В сети, где сбор чеков выключен, форма не открывается: экран пишет «В сети … правила по транзакциям пока недоступны».

Тариф. Business и выше. На Free и Pro форма видна под замком. После понижения тарифа правило встаёт на паузу, плашка «Нужен Business, правило на паузе».

Разрешённые отправители

Правило срабатывает, когда функцию или событие контракта вызвал адрес не из вашего списка. Пример: upgradeTo(address) вызвал кто-то кроме вашего Safe.

Настройки.

  • Что отслеживать — событие или функция контракта. Рекомендуем событие: оно ловит и прямой вызов, и вызов через Safe или другой контракт. Функция ловит только прямые вызовы: вызов через Safe сюда не попадёт, выберите событие, которое выпускает эта функция.
  • Разрешённые адреса — адреса проекта в той же сети одной кнопкой или любой адрес вручную. Не больше 50 адресов на правило. Пустой список сохранить нельзя: с ним чужим считался бы каждый вызов.

Вызов разрешён, если в списке тот, кто подписал транзакцию, или контракт, которому она отправлена. Добавьте свой Safe — и вызов через него разрешён, кто бы из владельцев его ни исполнил. Упавшие вызовы тоже считаются: чужая попытка вызвать админ-функцию — повод знать.

Уведомление. Заголовок «Вызвано не с разрешённого адреса». В сообщении: кто вызвал, функция или событие, контракт и сеть, список разрешённых, ссылки на транзакцию и правило. Адрес проекта показан именем, чужой — сокращённым адресом.

Сбор чеков. Отправитель берётся из чеков транзакций, как у доли упавших транзакций: чтение контракта включается с первым правилом на нём, без истории назад. Сети — те же.

Тариф. Business и выше. На Free и Pro форма видна под замком. После понижения тарифа правило встаёт на паузу.

Нашли ошибку или не нашли ответ? Напишите