E2EE messaging over the blockchain, using EVM logs as the only transport layer.
- Noble – audited JS implementations for curves, hashes, secp256k1, and ML-KEM-768 (post-quantum)
- TweetNaCl – for encryption/decryption with NaCl box
- Ethers v6 – for all Ethereum interactions
- Viem – specific for EIP-1271/6492 verification
To start a conversation, Alice emits a Handshake event with her ephemeral keys and an identity proof. Bob sees it, verifies her, and replies with a HandshakeResponse. They combine X25519 and ML-KEM-768 secrets to derive a shared root key that's secure against future quantum computers.
From there it's just encrypted MessageSent events back and forth. A Double Ratchet keeps churning keys forward so old messages stay safe even if something leaks later. Topics rotate too, making it hard for observers to link conversations across time.
Verbeth goes through the proxy at 0x82C9c5475D63e4C9e959280e9066aBb24973a663. The current implementation behind it is VerbethV1 at 0x51670aB6eDE1d1B11C654CCA53b7D42080802326. Every deployment uses deterministic CREATE2, so the same address shows up on every supported chain:
| Chain | Chain ID |
|---|---|
| Base mainnet | 8453 |
| Base Sepolia | 84532 |
| Ethereum Sepolia | 11155111 |
For mor in-depth explanations on like discoverability, identity key binding and non-repudiation head over to the docs.
The SDK is published on npm as @verbeth/sdk. Drop it into any project with
npm install @verbeth/sdkor with pnpm
pnpm add @verbeth/sdkIf you want to hack on the protocol locally, clone the repo and build everything from scratch. You'll need pnpm since the workspace relies on it.
git clone https://github.com/okrame/verbeth.git
cd verbeth
pnpm install
pnpm run buildThat compiles both the SDK and the contracts. The SDK lands in packages/sdk/dist with CJS and ESM outputs ready to be consumed.
To run the test suite
pnpm run test:unit
pnpm run test:contracts
pnpm run test:integration The integration tests need Anvil running, so run it in another terminal first with pnpm run anvil:start.