Skip to main content
Experimental - This page is intentionally not included in the sidebar navigation. The API is unstable and may change without notice.

Overview

The RawProviderService provides direct access to the EIP-1193 request method for custom RPCs or object-style params not covered by provider free functions.

RawProviderService

Direct access to the underlying transport for EIP-1193 requests:
import { Effect, Layer } from 'effect'
import { RawProviderService, RawProviderTransport, HttpTransport } from 'voltaire-effect'

// Compose layers first
const RawLayer = RawProviderTransport.pipe(
  Layer.provide(HttpTransport('https://eth.llamarpc.com'))
)

const program = Effect.gen(function* () {
  const raw = yield* RawProviderService

  // Direct EIP-1193 request
  const result = yield* raw.request({ method: 'eth_blockNumber', params: [] })

  return result
}).pipe(Effect.provide(RawLayer))

Use Cases

Testing methods (evm_snapshot, evm_revert)

const program = Effect.gen(function* () {
  const raw = yield* RawProviderService
  
  // Take snapshot
  const snapshotId = yield* raw.request({ 
    method: 'evm_snapshot', 
    params: [] 
  })
  
  // ... make changes ...
  
  // Revert to snapshot
  yield* raw.request({ 
    method: 'evm_revert', 
    params: [snapshotId] 
  })
})

Custom RPC methods

const program = Effect.gen(function* () {
  const raw = yield* RawProviderService
  
  // Call a custom method not covered by provider free functions
  const traces = yield* raw.request({ 
    method: 'debug_traceTransaction',
    params: ['0x...', { tracer: 'callTracer' }]
  })
  
  return traces
})

Error Handling

All requests produce TransportError on failure:
import { TransportError } from 'voltaire-effect'

program.pipe(
  Effect.catchTag('TransportError', (e) => {
    console.error(`RPC failed [${e.code}]: ${e.message}`)
    return Effect.succeed(null)
  })
)

Layer Composition

RawProviderTransport requires TransportService:
import * as Layer from 'effect/Layer'
import { RawProviderTransport, HttpTransport } from 'voltaire-effect'

const RawLayer = RawProviderTransport.pipe(
  Layer.provide(HttpTransport('https://eth.llamarpc.com'))
)

Service Interface

type RequestArguments = {
  readonly method: string
  readonly params?: readonly unknown[] | object
}

type RawProviderShape = {
  readonly request: (args: RequestArguments) => Effect.Effect<unknown, TransportError>
}

class RawProviderService extends Context.Tag("RawProviderService")<
  RawProviderService,
  RawProviderShape
>() {}

Native Provider Transports (Bun only)

When using Bun, you can import native provider transports that wrap voltaire’s provider classes:
// Available only with Bun runtime
import { HttpProviderTransport } from 'voltaire-effect'
import { WebSocketProviderTransport } from 'voltaire-effect'
import { ForkProviderTransport } from 'voltaire-effect'
import { InMemoryProviderTransport } from 'voltaire-effect'
These transports wrap voltaire’s native EIP-1193 provider implementations.