Address, U256, B256, Filter, TransactionRequest, типизированные блоки, транзакции, квитанции и логи), с собственным транспортом OrbitFlare: failover эндпоинтов, повторные попытки с backoff и самовосстанавливающиеся WebSocket-подписки.
Клиенты обобщены по сети (RpcClient<C>, WsClient<C>); приведённые ниже алиасы - это удобные сокращения. gRPC пока доступен только для Polygon (Bor).
Поддерживаемые сети
Переходите с
orbitflare-robinhood-sdk? Robinhood Chain теперь покрывается здесь через RobinhoodRpcClient / RobinhoodWsClient. Поверхность RPC и WebSocket та же самая; отдельный крейт устарел.Установка
RPC
.url() или переменную окружения (см. Эндпоинты), а API-ключ - через .api_key() или ORBITFLARE_LICENSE_KEY.
Методы билдера
.url(url) - основной эндпоинт. Порядок разрешения: .url() в билдере, затем переменная окружения ORBITFLARE_RPC_URL.
.urls(&[...]) - задать основной эндпоинт и все резервные за один вызов. Первый элемент - основной, остальные - fallback.
.fallback_url(url) / .fallback_urls(&[...]) - добавить эндпоинты для failover. Сбоящие эндпоинты помещаются в карантин с экспоненциальным периодом ожидания (10 с, 20 с, 40 с, максимум 60 с) и автоматически пробуются снова по его истечении; здоровые эндпоинты всегда в приоритете.
.api_key(key) - ваш лицензионный ключ OrbitFlare. Если не задан, SDK читает ORBITFLARE_LICENSE_KEY. Ключ подставляется в URL эндпоинта как ?api_key=<key> в момент запроса.
.block_tag(tag) - тег блока по умолчанию для запросов состояния (get_balance, call, get_code, …). По умолчанию Latest.
.retry(policy) - управляет повторами при временных ошибках (5xx, 429, обрывы соединения, код ошибки JSON-RPC -32005) с экспоненциальным backoff перед переключением на следующий эндпоинт.
.timeout(duration) - HTTP-таймаут каждого отдельного запроса.
Доступные методы
Фильтры логов
get_logs принимает Filter из alloy напрямую:
Вызовы контрактов и транзакции
call и estimate_gas принимают TransactionRequest из alloy. Чтобы отправить транзакцию, соберите и подпишите её с помощью alloy (alloy-signer, alloy-network), затем разошлите через SDK:
Произвольные методы
request вызывает любой RPC-метод по имени - SDK собирает JSON-RPC-обёртку, применяет retry и failover и возвращает поле result. request_raw отправляет сырое тело JSON-RPC строкой.
WebSocket
Включите фичуws. .build() асинхронный - соединение устанавливается перед возвратом.
.urls(), .fallback_url(s), .api_key() и .retry() с RPC-билдером; специфичные для WebSocket опции - это .ping_interval_secs(n) (по умолчанию 10) и .max_missed_pongs(n) (по умолчанию 3).
Подписки
Подписки типизированы - каждая выдаёт соответствующий тип alloy вместо сырого JSON:
Все подписки возвращают
WsSubscription<T>. Вызовите .next() для следующего типизированного события (None означает, что подписка закрыта) или .next_raw() для нетипизированного serde_json::Value. sub.unsubscribe().await удаляет подписку явно; если дропнуть подписку, тоже сработает.
Переподключение
Если соединение обрывается, фоновая задача переподключается с экспоненциальным backoff и автоматически заново оформляет все активные подписки. Ваши вызовы.next() продолжают работать. Мёртвые соединения обнаруживаются активным ping/pong.
Polygon gRPC
Polygon предоставляет gRPC-интерфейс Bor для низкозатратного доступа к блокам, заголовкам и квитанциям. Включите фичуgrpc. gRPC работает поверх plaintext HTTP/2; аутентификация выполняется токеном через .api_key() (отправляется как x-token) либо через IP-whitelisting.
Значения H160/H256 конвертируются в alloy
Address/B256 через трейт ToAlloy.
Пользовательские сети
Работает любая EVM-сеть: реализуйтеChain для маркерного типа и направьте обобщённый RpcClient<C> на её URL. CHAIN_ID - это метаданные (доступны как RpcClient::<C>::chain_id_const()); они не ограничивают запросы.
Поля блоков Arbitrum и Nitro
Robinhood Chain - это Arbitrum Nitro, поэтому её блоки несут дополнительные поля (l1BlockNumber, sendRoot, sendCount), которые стандартные типы блоков EVM отбрасывают. SDK сохраняет их и предоставляет типизированные аксессоры через NitroBlockExt. Любое другое нестандартное поле по-прежнему доступно в block.other.
call(), как и любой контракт.
Эндпоинты
Эндпоинтов по умолчанию нет. Задайте URL для каждого клиента через.url() или через переменную окружения. Порядок разрешения: .url() в билдере, затем переменная окружения.
Используйте точные эндпоинты из вашей панели OrbitFlare.