holdge-rpc
v0.2.1
Published
RPC provider resiliente para apps Holdge (server-side): Rabby via node:https → públicos → Alchemy. Failover estrito por-erro + perfis cost/speed. HTTP + WSS.
Readme
@holdge/rpc
Provider RPC resiliente pras apps Holdge (comcripto, grouppay, swap.holdge, agent.holdge). Uma camada só, em vez de cada app reimplementar fallback de RPC.
HTTP → Rabby (grátis) → públicos (grátis) → Alchemy (pago, último recurso) (FailoverProvider estrito)
WSS → Alchemy (se key) → público (Rabby não tem WebSocket)- Ordenado por CUSTO: Rabby e públicos são grátis e vêm primeiro; o Alchemy (pago) só é tocado quando TODOS os grátis falham. Isso evita queimar CU à toa.
- Failover ESTRITO por-erro (
FailoverProvider, não oFallbackProviderdo ethers). O FallbackProvider é latência-based: ele raceia e prefere o mais rápido (Alchemy direto), queimando CU. O nosso só cai pro próximo quando o atual lança (erro de transporte). Todas as ops passam por_perform→ cobre o caminho inteiro (getLogs, getBalance, call, estimateGas, broadcastTransaction, getTransactionCount…).
⚠️ Rabby exige node:https (NÃO fetch)
A api.rabby.io (server dbkserver atrás de CloudFront) bloqueia (403) o fetch do Node (undici) por
fingerprint TLS/HTTP — independe de User-Agent/headers. O módulo https nativo do Node passa (200).
Verificado empiricamente: curl e https nativo → 200+JSON; fetch/undici → 403 página de bloqueio.
Por isso o RabbyProvider usa node:https (com keep-alive), e a lib é server-side (Node) apenas — não
roda em browser/edge runtime. (O GroupPay usa fetch e por isso está com Rabby OFFLINE; esta lib o supera.)
Nota: BSC no proxy Rabby costuma dar 429 (rate-limit) sob carga — o failover cobre caindo pro público.
Uso
import { httpProvider, wssProvider } from "@holdge/rpc";
const http = httpProvider("polygon", { alchemyKey: process.env.ALCHEMY_API_KEY });
await http.getBalance("0x..."); // Rabby → públicos → Alchemy (pago só em último caso)
const ws = wssProvider("polygon", { alchemyKey: process.env.ALCHEMY_API_KEY });
ws.on("block", (n) => console.log("novo bloco", n)); // Alchemy/público (Rabby não faz WSS)Sem alchemyKey → roda Rabby → públicos ($0, sem provedor pago). useRabby: false desliga a Rabby.
Redes
ethereum · polygon · base · arbitrum · bsc (extensível em src/chains.ts — Rabby cobre ~103 EVMs).
Instalação (consumidor)
Use --install-links pra copiar (deduplica o ethers via peer dep, evita tipos duplicados):
npm install file:../holdge-rpc --install-links