EIP-712 Types
All EWP signed messages use EIP-712 structured data format.
Domain Separator
All EWP messages share the same domain:
{
"name": "epress world",
"version": "1",
"chainId": 1
}
| Field | Value | Note |
|---|---|---|
name | "epress world" | Protocol namespace. Prevents cross-application signature reuse. |
version | "1" | Domain schema version. Verifiers MUST reject mismatched versions. |
chainId | 1 | Retained for full EVM tooling compatibility. |
Primary Types
CreateConnection
Initiates a follow relationship. Signed by follower.
| Field | Type | Description |
|---|---|---|
followerAddress | address | Follower's Ethereum address |
followeeAddress | address | Followee's Ethereum address |
followeeUrl | string | Followee's canonical URL |
followerUrl | string | Follower's canonical URL |
timestamp | uint64 | Unix seconds |
Signer: follower. Recovered address MUST equal followerAddress.
DestroyConnection
Terminates a connection. Signed by either party.
| Field | Type | Description |
|---|---|---|
followerAddress | address | The follower in the connection |
followeeAddress | address | The followee in the connection |
timestamp | uint64 | Unix seconds |
Signer: either party. Operation inferred from recovered signer:
- Recovered =
followerAddress→ Unfollow - Recovered =
followeeAddress→ RemoveFollower - Recovered = neither → MUST reject
followerAddress is listed first for consistency. Field order matters for EIP-712 typeHash computation; implementations MUST preserve this ordering.
NodeProfileUpdate
Broadcasts profile changes. Signed by node owner.
| Field | Type | Description |
|---|---|---|
ownerAddress | address | Node owner's Ethereum address |
url | string | Updated canonical URL |
title | string | Display name |
description | string | Node description; MUST be "" when not set |
timestamp | uint64 | Must be strictly greater than prior accepted value |
Signer: node owner. Recovered address MUST equal ownerAddress.
StatementOfSource
Content provenance. Signed by publisher.
| Field | Type | Description |
|---|---|---|
contentHash | bytes32 | SHA-256 of content |
publisherAddress | address | Publisher's address |
timestamp | uint64 | Publication time; used for ordering and deduplication |
Signer: publisher. Recovered address MUST equal publisherAddress.
The StatementOfSource is an immutable record.
Encoding Rules
bytes32 (contentHash): In JSON, contentHash is a 0x-prefixed 64-character lowercase hex string. For EIP-712 encoding, decode to raw 32 bytes. SHA-256 output is exactly 32 bytes; no truncation or padding needed. bytes32 values are encoded as raw bytes directly — not keccak256-hashed.
string: Encoded as keccak256(UTF-8(value)) per EIP-712.
address: 20 bytes, left-padded with 12 zero bytes to form a 32-byte word.
uint64: 8-byte unsigned integer, left-padded with 24 zero bytes to form a 32-byte word.
Timestamp Field Semantics
All timestamp fields use Unix epoch seconds encoded as uint64.
| Field | Semantic | Freshness Check |
|---|---|---|
CreateConnection.timestamp | Request time | REQUIRED: receiver's clock ± 1 hour |
DestroyConnection.timestamp | Request time | REQUIRED: receiver's clock ± 1 hour |
NodeProfileUpdate.timestamp | Profile version | NO freshness; MUST be > prior accepted value |
StatementOfSource.timestamp | Publication time | NO freshness; deduplication only |
JSON Schemas
Machine-readable JSON schemas are available in the schemas/ directory.