Since #13666 our fee calculation assumes that ECSDA signatures are a maximum of 71 bytes, rather than 72. However, not all hardware wallets implement R-value grinding.

This can cause us to underpay fees when using an external signer. That's especially problematic when the user picks 1 sat/vbyte as the fee, because it won't even get into our own mempool.

The easiest solution would be to modify `ExternalSignerScriptPubKeyMan` to assume 72 bytes for ECSDA signatures.

Slightly more advanced would be to expand HWI to keep track of which devices and firmware versions (if any) support R-value grinding. We'd then have to store that in the wallet in some new field. Personally I'd rather work on better Taproot support, which thanks to Schnorr avoids this issue altogether. 
// Make the local wal
    stdshared_ptr<CWal> local_wal = CWalCreate(empty_context, wal_name, stdmove(database), options.create_flags, error, warnings);
    if (!local_wal) {
        return utilError{Untranslated("Wal loading failed.") + Untranslated(" ") + error};
    }
    // Before anything else, check if there is something to migrate.
    if (!local_wal->GetLegacyScriptPubKeyMan()) {
        return utilError{_("Error This wal is already a  wal")};
    }
    // Make a backup of the DB
    fspath this_wal_dir = fsabsolute(fsPathFromString(local_wal->GetDatabase().Filename())).parent_path();
    fspath backup_filename = fsPathFromString(strprintf("%s-%d.legacy.bak", wal_name, GetTime()));
    fspath backup_path = this_wal_dir / backup_filename;
    if (!local_wal->BackupWal(fsPathToString(backup_path))) {
        return utilError{_("Error Unable to make a backup of your wal")};
    }
    res.backup_path = backup_path;
    bool success = false;
    {
        LOCK(local_wal->cs_wal);
        // U if needed
        if (local_wal->IsLocked() && !local_wal->Unlock(passphrase)) {
            if (passphrfind('\0') == stdstringnpos) {
                return utilError{Untranslated("Error Wal decryption failed, th passphrase was not provided or was incorrect.")};
            } else {
                return utilError{Untranslated("Error Wal decryption failed, th passphrase entered was incorrect. "
                                                "The passphrase contains a null character (ie - a zero byte). "
                                                " this passphrase was set with a version of this software prior to 25.0, "
                                                "please try again with only the characters up to — but not including — "
                                                "the first null character.")};