Steps to reproduce:

* Build with `integer` sanitizer
* `UBSAN_OPTIONS="suppressions=$(pwd)/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1" ./src/qt/bitcoin-qt`
* Enter into the RPC debug console: `decodepsbt "cHNidP8BAKOro2MDAwMDA5ggCAAA////CQAtAAD+///1AAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAD+///1Zm9ybmV3nWx1Y2vmelLmegAAAAAAAAAAAAAAAAAAAAMKAwMDAwMDAwMDAwMACvMBA3FkAAAAAAAAAAAABAAlAAAAAAAAACEWDQ0zDQ0NDQ0NDQ0NCwEAAH9/f39/fwMAAABNo6P///kAAA=="`
const auto& tuples = m_tap_tree->GetTreeTuples();
            for (const auto& tuple : tuples) {
                uint8_t depth = std::get<0>(tuple);
                uint8_t leaf_ver = std::get<1>(tuple);
                CScript script = std::get<2>(tuple);
                s_value << depth;
                s_value << leaf_ver;
                s_value << script;
            }
            s << value;
        }
        
        for (const auto& [xonly, leaf] : m_tap_bip32_paths) {
            const auto& [leaf_hashes, origin] = leaf;
            SerializeToVector(s, PSBT_OUT_TAP_BIP32_DERIVATION, xonly);
            std::vector<unsigned char> value;
            CVectorWriter s_value(s.GetType(), s.GetVersion(), value, 0);
            s_value << leaf_hashes;
            SerializeKeyOrigin(s_value, origin);
            s << value;
        }
        
        for (auto& entry : unknown) {
            s << entry.first;
            s << entry.second;
        }
        s << PSBT_SEPARATOR;
    }
    template <typename Stream>
    inline void Unserialize(Stream& s) {