package main
import (
"context"
"encoding/hex"
"fmt"
"math"
"github.com/lightningnetwork/lnd/lnrpc"
)
func ( r * regolancer ) addFailedChan ( fromStr string , toStr string , amount int64 ) {
r . mcCache [ fromStr + toStr ] = amount
}
func ( r * regolancer ) validateRoute ( route * lnrpc . Route ) error {
prevHopPK := r . myPK
for _ , h := range route . Hops {
hopPK := h . PubKey
if fp , ok := r . mcCache [ prevHopPK + hopPK ] ; ok && absoluteDeltaPPM ( fp , h . AmtToForwardMsat ) < params . FailTolerance {
from , err := hex . DecodeString ( prevHopPK )
if err != nil {
return err
}
to , err := hex . DecodeString ( hopPK )
if err != nil {
return err
}
r . failedPairs = append ( r . failedPairs , & lnrpc . NodePair { From : from , To : to } )
return fmt . Errorf ( "chan %d failed before with %d msat and will not be used anymore during this rebalance, payment attempt with %d msat cancelled" , h . ChanId , fp , h . AmtToForwardMsat )
}
prevHopPK = hopPK
}
return nil
}
func ( r * regolancer ) maxAmountOnRoute ( ctx context . Context , route * lnrpc . Route ) ( uint64 , error ) {
var capAmountMsat uint64 = math . MaxInt64
for _ , h := range route . Hops {
edge , err := r . getChanInfo ( ctx , h . ChanId )
if err != nil {
return 0 , err
}
policyTo := edge . Node1Policy
if h . PubKey != edge . Node2Pub {
policyTo = edge . Node2Policy
}
if policyTo . MaxHtlcMsat <= 0 {
continue
}
if capAmountMsat > policyTo . MaxHtlcMsat {
capAmountMsat = policyTo . MaxHtlcMsat
}
}
return capAmountMsat , nil
}