+ let error_data = Readable::read(reader)?;
+ let mut payment_hash = PaymentHash([0; 32]);
+ let mut rejected_by_dest = false;
+ let mut network_update = None;
+ let mut all_paths_failed = Some(true);
+ read_tlv_fields!(reader, {
+ (0, payment_hash, required),
+ (1, network_update, ignorable),
+ (2, rejected_by_dest, required),
+ (3, all_paths_failed, option),
+ });
+ Ok(Some(Event::PaymentFailed {
+ payment_hash,
+ rejected_by_dest,
+ network_update,
+ all_paths_failed: all_paths_failed.unwrap(),
+ #[cfg(test)]
+ error_code,
+ #[cfg(test)]
+ error_data,
+ }))
+ };
+ f()
+ },
+ 4u8 => {
+ let f = || {
+ read_tlv_fields!(reader, {});
+ Ok(Some(Event::PendingHTLCsForwardable {
+ time_forwardable: Duration::from_secs(0)
+ }))
+ };
+ f()
+ },
+ 5u8 => {
+ let f = || {
+ let mut outputs = VecReadWrapper(Vec::new());
+ read_tlv_fields!(reader, {
+ (0, outputs, required),
+ });
+ Ok(Some(Event::SpendableOutputs { outputs: outputs.0 }))
+ };
+ f()
+ },
+ 7u8 => {
+ let f = || {
+ let mut fee_earned_msat = None;
+ let mut claim_from_onchain_tx = false;
+ read_tlv_fields!(reader, {
+ (0, fee_earned_msat, option),
+ (2, claim_from_onchain_tx, required),
+ });
+ Ok(Some(Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx }))
+ };
+ f()
+ },
+ // Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
+ x if x % 2 == 1 => Ok(None),