Skip to content

Passport Core v2.3.11: Unicode multisig wallet name causes settings.save() AssertionError and misleading "Out of space" error #658

Description

@TIROBITCOIN

The current firmware version on your Passport.

2.3.11

Passport Model

Passport Founders Edition

Software Wallet Details

Summary

On Passport Core v2.3.11, importing a multisig wallet whose wallet name contains Korean/Unicode characters fails when saving the multisig configuration.

Passport displays:

Out of space in user settings. Too many multisig configs?

However, the actual exception is an AssertionError in sffile.py while writing the final settings checksum.

Changing only the multisig wallet name from Korean to ASCII makes the exact same multisig import succeed.

Environment

  • Passport Core firmware: v2.3.11
  • Multisig: 2-of-3
  • Coordinator: Nunchuk
  • Import method: QR
  • Existing multisig configs on Passport: 0
  • Account count: 1

Reproduction

  1. Create a 2-of-3 multisig wallet in Nunchuk.

  2. Give the wallet a Korean/Unicode name.

  3. Export/import the multisig configuration via QR.

  4. Passport parses and reviews the multisig successfully.

  5. Confirm saving the wallet.

  6. Passport reports:

    Out of space in user settings. Too many multisig configs?

  7. Change only the wallet name to an ASCII-only name such as:

    vault-2of3

  8. Export a new QR and import it again.

  9. The multisig saves successfully.

Actual exception

I built a v2.3.11 diagnostic firmware that records the exception raised by settings.save().

The resulting traceback is:

multisig settings.save() exception:
Traceback (most recent call last):
  File "tasks/save_multisig_wallet_task.py", line 34, in save_multisig_wallet_task
  File "ext_settings.py", line 402, in save
  File "ext_settings.py", line 396, in internal_save
  File "ext_settings.py", line 410, in do_save
  File "ext_settings.py", line 455, in save_impl
  File "sffile.py", line 104, in write
AssertionError:

### Expected Behavior

Unicode wallet names should either:

save correctly using the actual serialized byte length, or
be rejected/normalized before saving with a clear validation error.

The error should not be reported as user-settings storage exhaustion.

### Please provide the steps that you've used to reproduce the issue

1. Create a 2-of-3 multisig wallet in Nunchuk.
2. Set the wallet name to a Korean/Unicode name (for example, "비트코인 금고").
3. Export the multisig wallet configuration as a QR code.
4. Scan/import the QR code on Passport Core v2.3.11.
5. Review the multisig configuration and confirm saving it.
6. Passport fails with: "Out of space in user settings. Too many multisig configs?"
7. Change only the Nunchuk wallet name to an ASCII-only name such as "vault-2of3".
8. Export a new QR code and import it again.
9. The multisig configuration saves successfully.

### Steps Taken to Resolve

I first confirmed there were no existing multisig configurations and that normal Passport settings could still be saved.

I also erased/restored the Passport and reproduced the same issue.

To identify the real exception, I built a diagnostic firmware from the exact v2.3.11 source which logs the exception raised by settings.save().

The traceback was:

Traceback (most recent call last):
  File "tasks/save_multisig_wallet_task.py", line 34, in save_multisig_wallet_task
  File "ext_settings.py", line 402, in save
  File "ext_settings.py", line 396, in internal_save
  File "ext_settings.py", line 410, in do_save
  File "ext_settings.py", line 455, in save_impl
  File "sffile.py", line 104, in write
AssertionError:

Changing only the multisig wallet name from Korean/Unicode to ASCII fixed the problem immediately.

### If applicable, add screenshots or screen recordings to help explain the issue.

_No response_

### Anything else?

The failure appears to be caused by a Unicode byte-length calculation issue in ExtSettings.save_impl().

The code uses:

data_len = len(d)
pad_len = self.max_json_len - data_len

For a Unicode Python string, len(d) can count characters rather than the number of UTF-8 bytes actually written to flash.

Korean characters require multiple UTF-8 bytes. This can cause excessive padding to be written, so the final 32-byte encrypted digest exceeds the SFFile max_size and triggers the assertion in sffile.py.

The exception is then caught by save_multisig_wallet_task() and reported to the user as USER_SETTINGS_FULL, which results in the misleading "Out of space in user settings" message.

Workaround: use an ASCII-only multisig wallet name.

No seed words, private keys, xprvs, wallet QR data, or xpubs are included in this report.

### Impact of the issue

{"label" => "Medium: Moderate issue affecting usability."}

### If you found any similar or related issues, provide links to them here.

None found.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions