Skip to content

feat(individuality): buildLiteAliasBindTx encodes the lite bind leg client-side - #352

Open
peetzweg wants to merge 1 commit into
feat/individuality-with-lite-aliasfrom
feat/individuality-lite-bind-tx
Open

feat(individuality): buildLiteAliasBindTx encodes the lite bind leg client-side#352
peetzweg wants to merge 1 commit into
feat/individuality-with-lite-aliasfrom
feat/individuality-lite-bind-tx

Conversation

@peetzweg

@peetzweg peetzweg commented Aug 31, 2026

Copy link
Copy Markdown
Member

Stacked on #348. The bind leg of the lite sign-up (#354): PeopleLite.set_alias_account as an unsigned V5 general extrinsic, encoded entirely client-side.

Why: the bind leg has origin None — no signature, nothing to sign — so it needs neither a PolkadotSigner nor a host createTransaction (whose per-host dialects are exactly what bit us before). And because account is a plain call parameter, this is the call that lets the personhood product vouch for another product's account.

How: buildLiteAliasBindTx(chain, { account, createProof }) reads the extension pipeline from the chain's own metadata, fills every slot from a table of general-transaction defaults (VerifyMultiSignature=Disabled, RestrictOrigins=true, immortal era so the implicit is the genesis hash, nonce 0 — each probed against the real blobs), computes the proof message as blake2-256 of the implication after PeopleLiteAuth, and assembles compact(len) ++ 0x45 ++ extVersion ++ extras ++ call. All extension encoding reuses the withLiteAlias machinery; call bytes come from the caller's typed PAPI tx, so no call index is hand-rolled. Returns finished extrinsic bytes for any raw submit. One judgment call: immortal era + nonce 0 instead of the live run's mortal/real values — both are pass-throughs for a None origin, and immortal spares a block-hash fetch.

Full extrinsic pinned byte-for-byte against a hand-written per-slot hex table on the previewnet blob (spec 1000036 — the chain the flow ran live on) and paseo; devnet (pre-RevisionIndex) is the loud-failure negative. 468 package tests pass; workspace tests + typecheck + biome clean.

…lient-side

The bind leg of the lite sign-up — PeopleLite.set_alias_account under
PeopleLiteAuth::AsLiteAliasWithProof — is an unsigned V5 general extrinsic
(origin None), so it can ride neither a PolkadotSigner nor the host's
createTransaction dialects. With the extension pipeline read from the chain's
own metadata the SDK now assembles the whole extrinsic itself:
compact(len) ++ 0x45 ++ extensionVersion ++ extras ++ call, with every extra
holding the value a general transaction needs (RestrictOrigins enabled,
VerifyMultiSignature Disabled, immortal era, zero nonce and tip, every origin
Option slot None) and the ring-VRF proof minted over the implication after
PeopleLiteAuth. The layout reproduces the encoding verified live on previewnet
(spec 1000036) and is pinned byte for byte against the previewnet and paseo
blobs; devnet's pre-revision PeopleLiteAuth is a loud error.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant