Getting Started

Introduction

Ethernauta is a TypeScript monorepo that ships two things:

  1. A library of primitives for talking to Ethereum — RPC method bindings, transaction codecs, ABI encode/decode, EIP and ERC implementations, ENS resolution, React hooks. Every primitive is a small composable function. No hosted infrastructure, no hidden state, no opinionated client object.
  2. A Chrome MV3 wallet extension that holds an encrypted mnemonic in IndexedDB and serves dapps via the standard EIP-1193 protocol. The wallet implements the standards on top of the same primitives the library exposes.

The library is what most readers want. The wallet is one possible consumer of it.

What sets it apart

Two consumer paths, both first-class. Every operation that needs a signature can either go through a wallet (eth_sendTransaction — path 1, one round trip) or be assembled from primitives by the dapp itself (eth_signTransaction + eth_sendRawTransaction — path 2, the dapp owns the broadcast). The library refuses to collapse the choice. Most libraries only expose path 1.

Standards are folders. Adding EIP-7702, EIP-5792, or a new ERC is a mkdir operation. Schemas, methods, helpers all live under packages/eip/src/<n>/ or packages/erc/src/<n>/. The folder name is the standard number. No coordinated work with a hosted indexer, no server-side deploy, no wallet release coupling.

Schemas are the types. Every value-bearing boundary in the codebase has a Valibot schema first; the TypeScript type comes from v.InferOutput. The schema parses inputs at the boundary, the parsed value flows through the interior with its types inferred. No hand-rolled type X = { … } for wire data, no interface.

No hosted services. The library never depends on a paid RPC provider, a hosted indexer, a bundler, or a paymaster operated by us. Every feature works against public RPC endpoints plus the wallet extension plus dapp code. If a standard genuinely requires hosted infrastructure (ERC-4337 as originally written, for instance), it stays out of scope until an in-house dependency-free implementation becomes feasible.

The packages

Each is independently versioned and tree-shakeable:

PackagePurpose
@ethernauta/corePrimitive Valibot schemas: addresses, bytes, uints, hashes
@ethernauta/utilsPure helpers: hex/bytes/number conversion, RLP, ether parsing
@ethernauta/abiABI codec + log decoding + code generation
@ethernauta/chain500+ EIP-155 chain definitions
@ethernauta/ethEvery eth_* JSON-RPC method binding
@ethernauta/transportThe four resolver factories + HTTP/WebSocket transports
@ethernauta/transactionTransaction lifecycle tracking: Trackable<T>, Watchable
@ethernauta/cryptoUniversal signature verification across EIP-191/712/1271/6492
@ethernauta/eip17 EIPs as importable subpaths
@ethernauta/erc17 ERCs as importable subpaths
@ethernauta/ensENSIP-12, ENSIP-15, multi-call resolution
@ethernauta/reactReact hooks: useProvider, useProviderDetail
@ethernauta/cliABI codegen + selector registry tooling
@ethernauta/walletThe Chrome MV3 extension (private, not published)

Where to go next