pull down to refresh

LND attributes every failed HTLC attempt to a specific position in the route via the failure_source_index field. Since intermediate failures come back to you as encrypted error onions that only the sender can decode, LND decodes them and records exactly which node reported the error on each attempt.

Live: lncli trackpayment <payment_hash> (RouterRPC TrackPaymentV2) streams every HTLC attempt. Failed ones look like:

"htlcs": [{
  "status": "FAILED",
  "route": { "hops": [ {"pub_key": "02aa...", "chan_id": "..."}, ... ] },
  "failure": {
    "code": "TEMPORARY_CHANNEL_FAILURE",
    "failure_source_index": 2
  }
}]