mirror of
https://github.com/Such-Software/smirk-backend-core.git
synced 2026-10-17 07:21:32 +02:00
A v0.3.0 wallet registers two different Grin keys in sequence. Bootstrap stores the Smirk-derived public key, which is what /auth/website/verify checks a Grin signature against, and a deferred effect then registers the canonical grin-wallet slatepack address. These are separate derivations, not two encodings of one key, and both wrote (user_id, 'grin', 'primary'). The second silently replaced the first, so signing in to the website with Grin could not match any account. Route the value to its own row instead. A slatepack address is bech32 under the grin/tgrin HRP and a hex public key cannot start with those letters, since none of them are hex digits, so the two are separable by construction rather than by guess. That matters because it fixes wallets that are already shipped: they keep posting what they post today and land in the right row. lookup_username picked with an unqualified find on the asset, which returns an arbitrary row once an asset has two. It now selects by key_type, and for Grin prefers the slatepack address, falling back to a primary row only while that row still holds a pre-split address. A sender is never handed a public key where an address belongs. The migration is additive: existing bech32 values are copied into the new row and the primary row is left for the next unlock to rewrite. Nothing is deleted, so a user who never unlocks again keeps a working address.