Web host (paseo.li): Statements › Submit fails with account full: submitted expiry < min — same shape as the just-closed Desktop #581
Web host: paseo.li (dot.li PWA shell).
Android signer: Polkadot Android v1.0.0-1253.
Desktop (for reference): polkadot-desktop v0.6.7.
Chain: Paseo Next v2 (people + bulletin via paseo-people-next-system-rpc.polkadot.io).
Test suite: host-playground-web in triangle-e2e (web.test.ts:415 Statements › Submit).
Summary
statement-store-submit from the host-playground.dot iframe inside the paseo.li PWA fails deterministically with the same chain rejection that paritytech/polkadot-desktop#581 tracked on Desktop. That issue was closed today (2026-06-25T11:46Z); the original report explicitly stated "Web passes, Desktop fails". We now observe the inverse — Desktop and Android both pass; the bug has surfaced on web. Looks like a regression introduced by whatever change closed #581, or the closure was premature.
Failing call
[signed-test] statement-store-submit: error —
GenericError - Submit failed, account full:
submitted expiry 7655334336702447616
< min 18446744069433815040
Delta min - submitted ≈ 1.08e19 ns ≈ 343 years — the magnitude looks like a sentinel/uninitialised u64 (0xFFFF_FFFF_2EAD_AAAA ≈ 18446744069...) being compared against a real timestamp, not a small clock-skew. The Desktop #581 numbers were small-delta (~43 min). This is a different numeric pattern but the same chain reject code, suggesting the web shell now computes a valid expiry but the chain side reads a bogus min — or vice versa.
Cross-platform matrix (CI run 28173825676)
Same chain. Same Android signer. Only the web shell differs.
What this isolates
- Not the chain runtime — Desktop and Android both hit the same
LitePeople collection on the same chain and pass.
- Not the Android signer — the web shard signs via the same paired Android device that Desktop uses.
- Not "fresh account vs full account" — the same identity passes Create Proof (3.7s on Android, 3.5s on Desktop, 6.7s on web) immediately before.
- The web shell's path to building the expiry field for
statement_submit diverges from what the chain expects.
Reproduction
pnpm --filter @triangle-e2e/app-tests test:web --grep "Statements > Submit"
against:
- Polkadot Android
v1.0.0-1253 (paired signer)
paseo.li (dot.li shell)
- Paseo Next v2
CI run 28173825676 / job 83448824963 — Statements › Submit failed all 3 retries with identical error.
Triage
- Diff
paseo.li shell's statement_submit payload (signed bytes + expiry) against the working Desktop path on the same chain at the same wall-clock moment.
- The sentinel-looking
min 18446744069433815040 deserves a direct look — does the runtime read min_expiry from chain state, or did the web SDK forward a default-uninitialised u64?
- Confirm whether the fix that closed #581 shifted only the Desktop code path or also touched the shared SDK / shell-side encoding.
Ask
- Re-open or reference #581 — this looks like the same defect surfaced on the previously-passing surface.
- Surface a typed error from the chain (
StatementSubmitErr::ExpiryOutOfWindow with the two values) instead of the opaque GenericError - account full.
Suggested target repo
Best guess: same repo as #581 (paritytech/polkadot-desktop) if the shared encoder lives there, otherwise paritytech/truhost (web PWA host) or paritytech/product-sdk (the layer that produces the encoded payload). The Desktop maintainers will know which.
Web host (paseo.li):
Statements › Submitfails withaccount full: submitted expiry < min— same shape as the just-closed Desktop #581Web host:
paseo.li(dot.li PWA shell).Android signer: Polkadot Android
v1.0.0-1253.Desktop (for reference):
polkadot-desktop v0.6.7.Chain: Paseo Next v2 (people + bulletin via
paseo-people-next-system-rpc.polkadot.io).Test suite:
host-playground-webintriangle-e2e(web.test.ts:415Statements › Submit).Summary
statement-store-submitfrom thehost-playground.dotiframe inside thepaseo.liPWA fails deterministically with the same chain rejection that paritytech/polkadot-desktop#581 tracked on Desktop. That issue was closed today (2026-06-25T11:46Z); the original report explicitly stated "Web passes, Desktop fails". We now observe the inverse — Desktop and Android both pass; the bug has surfaced on web. Looks like a regression introduced by whatever change closed #581, or the closure was premature.Failing call
Delta
min - submitted ≈ 1.08e19 ns ≈ 343 years— the magnitude looks like a sentinel/uninitialisedu64(0xFFFF_FFFF_2EAD_AAAA≈ 18446744069...) being compared against a real timestamp, not a small clock-skew. The Desktop #581 numbers were small-delta (~43 min). This is a different numeric pattern but the same chain reject code, suggesting the web shell now computes a valid expiry but the chain side reads a bogusmin— or vice versa.Cross-platform matrix (CI run 28173825676)
v0.6.7v1.0.0-1253(Browse tab)Same chain. Same Android signer. Only the web shell differs.
What this isolates
LitePeoplecollection on the same chain and pass.statement_submitdiverges from what the chain expects.Reproduction
against:
v1.0.0-1253(paired signer)paseo.li(dot.li shell)CI run 28173825676 / job 83448824963 —
Statements › Submitfailed all 3 retries with identical error.Triage
paseo.lishell'sstatement_submitpayload (signed bytes + expiry) against the working Desktop path on the same chain at the same wall-clock moment.min 18446744069433815040deserves a direct look — does the runtime readmin_expiryfrom chain state, or did the web SDK forward a default-uninitialisedu64?Ask
StatementSubmitErr::ExpiryOutOfWindowwith the two values) instead of the opaqueGenericError - account full.Suggested target repo
Best guess: same repo as #581 (
paritytech/polkadot-desktop) if the shared encoder lives there, otherwiseparitytech/truhost(web PWA host) orparitytech/product-sdk(the layer that produces the encoded payload). The Desktop maintainers will know which.