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:
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
- Create or use an existing zkLogin account in Slush (web or extension).
- Call
signPersonalMessage on any message.
- Inspect the resulting envelope's
maxEpoch field.
- 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
Summary
signPersonalMessageon a zkLogin Slush account produces an envelope with aninvalid
maxEpochvalue. This breaks any downstream flow that depends on acorrectly 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:
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
signPersonalMessageon any message.maxEpochfield.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
same wallet's correctly-signed on-chain transactions in the same window