Skip to content

Slush zkLogin signPersonalMessage produces stale/invalid maxEpoch, breaks downstream SessionKey retrieval #27853

Description

@aionchainops

Summary

signPersonalMessage on a zkLogin Slush account produces an envelope with an
invalid maxEpoch value. This breaks any downstream flow that depends on a
correctly epoch-bound personal message signature — in our case, Seal
SessionKey retrieval fails 100% of the time for zkLogin accounts.

On-chain transaction signing on the same wallet, in the same session, is
unaffected — the fault is isolated to signPersonalMessage specifically.

Evidence

A captured signPersonalMessage envelope from a zkLogin Slush account showed:

maxEpoch: 8

against a current network epoch of ~1229 at time of capture.

This is not staleness or decay from an earlier session — epoch 8 corresponds
to mainnet's first fortnight (May 2023). The account in question did not
exist then. The same wallet's own on-chain transactions in the same time
window correctly carried maxEpoch: 1230, confirming transaction signing
reads the epoch correctly while signPersonalMessage does not.

Reproduction

  1. Create or use an existing zkLogin account in Slush (web or extension).
  2. Call signPersonalMessage on any message.
  3. Inspect the resulting envelope's maxEpoch field.
  4. Compare against the actual current network epoch at time of signing.

Expected: maxEpoch reflects a value consistent with the current epoch
(matching what the same wallet's transaction signing produces).

Actual: maxEpoch returns a stale/fixed value (observed: 8), regardless of
current epoch or session freshness.

Impact

Any dApp relying on signPersonalMessage output for epoch-bound verification
(e.g. Seal SessionKey retrieval) will fail for 100% of zkLogin Slush users,
on the first attempt, not intermittently. This is currently blocking a
production payment flow that uses Slush as its primary zkLogin onramp.

Environment

  • Wallet: Slush (web)
  • Login method: zkLogin (social login)
  • Confirmed via: direct envelope inspection + cross-reference against the
    same wallet's correctly-signed on-chain transactions in the same window

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions