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. 
{
    interfacesChain* chain = context.chain;
    ArgsManager& args = *Assert(context.args);
    const stdstring& walFile = database->Filename();
    const auto start{SteadyClocknow()};
    // TODO Can't use stdmake_shared because we need a custom deer but
    // should be possible to use stdallocate_shared.
    stdshared_ptr<CWal> walInstance(new CWal(chain, name, stdmove(database)), ReleaseWal);
    walInstance->m_keypool_size = stdmax(args.GetIntArg("-keypool", DEFAULT_KEYPOOL_SIZE), int64_t{1});
    walInstance->m_notify_tx_changed_script = args.GetArg("-walnotify", "");
    // Load wal
    bool rescan_required = false;
    DBErrors nLoadWalRet = walInstance->LoadWal();
    if (nLoadWalRet != DBErrorsLOAD_OK) {
        if (nLoadWalRet == DBErrorsCORRUPT) {
            error = strprintf(_("Error loading %s Wal corrupted"), walFile);
            return nullptr;
        }
        else if (nLoadWalRet == DBErrorsNONCRITICAL_ERROR)
        {
            warnings.push_back(strprintf(_("Error reading %s! All keys read correctly, but transaction data"
                                           " or address book entries might be missing or incorrect."),
                walFile));
        }
        else if (nLoadWalRet == DBErrorsTOO_NEW) {
            error = strprintf(_("Error loading %s Wal requires newer version of %s"), walFile, PACKAGE_NAME);
            return nullptr;
        }
        else if (nLoadWalRet == DBErrorsEXTERNAL_SIGNER_SUPPORT_REQUIRED) {
            error = strprintf(_("Error loading %s External signer wal being loaded without external signer support compiled"), walFile);