Address, U256, B256, Filter, TransactionRequest, типизированные блоки, транзакции, квитанции и логи — с собственным транспортом OrbitFlare: failover эндпоинтов, повторные попытки с backoff и самовосстанавливающиеся WebSocket-подписки. SDK ориентирован на Robinhood Chain, EVM-совместимый L2, и по умолчанию использует продакшен-эндпоинты OrbitFlare.
Установка
Типы alloy
Все адреса, хеши и числовые величины — типы alloy. Самые распространённые реэкспортированы в корне крейта (Address, U256, B256, Bytes, Filter, TransactionRequest, BlockNumberOrTag, …), а полные крейты доступны как orbitflare_robinhood_sdk::primitives (alloy-primitives) и orbitflare_robinhood_sdk::rpc_types (alloy-rpc-types-eth).
RPC-клиент
Пример клиента со всеми опциями:Методы билдера
.url(url) — основной эндпоинт. Порядок разрешения: .url() в билдере, затем переменная окружения ORBITFLARE_ROBINHOOD_RPC_URL, затем значение по умолчанию https://robinhood.rpc.orbitflare.com (rpc::DEFAULT_RPC_URL).
.urls(&[...]) — задать основной эндпоинт и все резервные за один вызов. Первый элемент — основной, остальные — fallback.
.fallback_url(url) / .fallback_urls(&[...]) — добавить резервные эндпоинты для failover. При сбое основного SDK пробует fallback по порядку. Сбоящие эндпоинты помещаются в карантин с экспоненциальным периодом ожидания (10 с, 20 с, 40 с, максимум 60 с) и автоматически пробуются снова по его истечении; здоровые эндпоинты всегда в приоритете.
.api_key(key) — ваш лицензионный ключ OrbitFlare. Если не задан, SDK читает ORBITFLARE_LICENSE_KEY из окружения. Ключ подставляется в URL эндпоинта в момент запроса.
.block_tag(tag) — тег блока по умолчанию для запросов состояния (get_balance, call, get_code, …). Принимает всё, что конвертируется в BlockNumberOrTag. По умолчанию Latest.
.retry(policy) — управляет повторами при временных ошибках (5xx, 429, обрывы соединения, код ошибки JSON-RPC -32005) с экспоненциальным backoff перед переключением на следующий эндпоинт. Ответы 429 с заголовком Retry-After учитываются.
.timeout(duration) — HTTP-таймаут каждого отдельного запроса.
Доступные методы RPC
Чтение состояния сети
Фильтры логов
get_logs принимает Filter из alloy напрямую:
Вызовы контрактов и транзакции
call и estimate_gas принимают TransactionRequest из alloy. Чтобы отправить транзакцию, соберите и подпишите её с помощью alloy (alloy-signer, alloy-network), затем разошлите через SDK:
Произвольные методы
request вызывает любой RPC-метод по имени — SDK собирает JSON-RPC-обёртку, применяет retry и failover и возвращает поле result. Это покрывает и методы-расширения arb_*, которые Robinhood Chain обслуживает как сеть на Arbitrum Nitro. request_raw отправляет сырое тело JSON-RPC строкой.
WebSocket-клиент
Включите фичуws. Robinhood Chain производит блоки примерно каждые 100 миллисекунд, поэтому newHeads срабатывает значительно чаще, чем в мейннете Ethereum и большинстве L2.
.build() асинхронный — перед возвратом устанавливается WebSocket-соединение. Методы .urls(), .fallback_url(s)(), .api_key() и .retry() у билдера общие с RPC-билдером; специфичные для WebSocket опции:
.url(url) — основной WebSocket-эндпоинт. Порядок разрешения: .url(), затем ORBITFLARE_ROBINHOOD_WS_URL, затем значение по умолчанию wss://robinhood.rpc.orbitflare.com (ws::DEFAULT_WS_URL).
.ping_interval_secs(n) — как часто SDK отправляет фреймы WebSocket Ping для обнаружения мёртвых соединений. По умолчанию: 10.
.max_missed_pongs(n) — сколько ping без ответа перед тем, как соединение считается мёртвым и переподключается. По умолчанию: 3.
Подписки
Подписки типизированы — каждая выдаёт соответствующий тип alloy вместо сырого JSON:WsSubscription<T>. Вызовите .next() для следующего типизированного события (None — подписка закрыта) или .next_raw() для нетипизированного serde_json::Value.
sub.unsubscribe().await удаляет подписку явно; если дропнуть подписку без вызова, тоже сработает — SDK обнаружит «сироту» и сам отправит отписку.
Переподключение
Если соединение обрывается, фоновая задача переподключается с экспоненциальным backoff и автоматически заново оформляет все активные подписки. Ваши вызовы.next() продолжают работать — события возобновятся после восстановления связи. Мёртвые соединения обнаруживаются активным ping/pong, настраивается через .ping_interval_secs() и .max_missed_pongs().