fix: sign and export with each address's own derivation index (closes #510)
Sending, site transactions, site signatures and private key export derived the key at the address's position in the wallet's list. After an import whose scan passed over an unused index, or after removing an address that was not the last, that position named another address's key. Each HD and xprv address record now stores the index it was derived at (at wallet creation, by the import scan, by "+"). getSignerForAddress() derives at that index, refuses a record without one, and refuses any key whose address differs from the record's. The confirmation screen signs as the From address it shows, not the selected one. The export screen reports a refusal instead of calling the password wrong. Model: opus-5-5
This commit is contained in:
@@ -1192,7 +1192,16 @@ The core hierarchy is **Wallets → Addresses**:
|
||||
of its stored `xpub` by `src/shared/walletDefects.js`, explained in the
|
||||
wallet list, and blocked from signing, sending and private-key export. It
|
||||
is never deleted or rewritten.
|
||||
- An **address** holds ETH and ERC-20 tokens.
|
||||
- An **address** holds ETH and ERC-20 tokens. In an HD or xprv wallet each
|
||||
address record also stores `index`, the derivation index it was made at: 0 for
|
||||
the first address, the index the import scan found it at, or `nextIndex` when
|
||||
"+" added it. An address's `index` and its position in the wallet's list
|
||||
differ once the scan has passed over an unused index or an address has been
|
||||
removed. Sending, site transactions, site signatures and private-key export
|
||||
derive the key at `index`, and refuse it unless it is that address's own key;
|
||||
an HD or xprv address with no valid `index` is refused before anything is
|
||||
derived (`getSignerForAddress()` in `src/shared/wallet.js`). Each refusal is a
|
||||
full sentence naming the address.
|
||||
- The user can have multiple wallets, each with multiple addresses (HD) or a
|
||||
single address (key).
|
||||
|
||||
@@ -1518,6 +1527,9 @@ view would leave a wallet one click from deletion.
|
||||
change)
|
||||
- "Reveal" (wrong password) → full-sentence error on the error line, nothing
|
||||
revealed (no screen change)
|
||||
- "Reveal" (correct password, but this address's key is refused, see Data
|
||||
Model) → full-sentence error saying why, nothing revealed (no screen
|
||||
change)
|
||||
- "Back" → previous screen (AddressDetail)
|
||||
- Settings gear → **Settings**, whose "Back" goes to AddressDetail: leaving
|
||||
drops the address the screen was showing, so it also takes the screen off
|
||||
@@ -1653,6 +1665,13 @@ view would leave a wallet one click from deletion.
|
||||
be signed for another
|
||||
- "Sign & Send" (wrong password) → "Wrong password." on the password error
|
||||
line, no screen change
|
||||
- "Sign & Send" signs as the From address above, not as whichever address is
|
||||
selected: the two are saved separately, so the popup can reopen onto this
|
||||
screen with another address selected. When the selected wallet does not
|
||||
hold the From address → full-sentence error on the password error line,
|
||||
nothing sent (no screen change)
|
||||
- "Sign & Send" (correct password, but the From address's key is refused,
|
||||
see Data Model) → nothing is signed → **ErrorTx** saying why
|
||||
- "Back" → **Send**
|
||||
|
||||
#### WaitTx (`wait-tx`)
|
||||
@@ -2118,6 +2137,9 @@ view would leave a wallet one click from deletion.
|
||||
shown, exactly as shown, hands the signed transaction to the background to
|
||||
broadcast, then → **WaitTx** in the same popup window
|
||||
- "Confirm" (wrong password) → error line, no screen change
|
||||
- "Confirm" (correct password, but the From address's key is refused, see
|
||||
Data Model) → full-sentence error on the error line saying why, nothing
|
||||
signed (no screen change)
|
||||
- "Reject" → closes popup (returns rejection to background)
|
||||
- Popup window closed without answering → the request is rejected with
|
||||
EIP-1193 code 4001
|
||||
|
||||
Reference in New Issue
Block a user