You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
loop/liquidity/reasons.go

143 lines
3.6 KiB
Go

package liquidity
import "fmt"
// Reason is an enum which represents the various reasons we have for not
// executing a swap.
type Reason uint8
const (
// ReasonNone is the zero value reason, added so that this enum can
// align with the numeric values used in our protobufs and avoid
// ambiguity around default zero values.
ReasonNone Reason = iota
// ReasonBudgetNotStarted indicates that we do not recommend any swaps
// because the start time for our budget has not arrived yet.
ReasonBudgetNotStarted
// ReasonSweepFees indicates that the estimated fees to sweep swaps
// are too high right now.
ReasonSweepFees
// ReasonBudgetElapsed indicates that the autoloop budget for the
// period has been elapsed.
ReasonBudgetElapsed
// ReasonInFlight indicates that the limit on in-flight automatically
// dispatched swaps has already been reached.
ReasonInFlight
// ReasonSwapFee indicates that the server fee for a specific swap is
// too high.
ReasonSwapFee
// ReasonMinerFee indicates that the miner fee for a specific swap is
// to high.
ReasonMinerFee
// ReasonPrepay indicates that the prepay fee for a specific swap is
// too high.
ReasonPrepay
// ReasonFailureBackoff indicates that a swap has recently failed for
// this target, and the backoff period has not yet passed.
ReasonFailureBackoff
// ReasonLoopOut indicates that a loop out swap is currently utilizing
// the channel, so it is not eligible.
ReasonLoopOut
// ReasonLoopIn indicates that a loop in swap is currently in flight
// for the peer, so it is not eligible.
ReasonLoopIn
// ReasonLiquidityOk indicates that a target meets the liquidity
// balance expressed in its rule, so no swap is needed.
ReasonLiquidityOk
// ReasonBudgetInsufficient indicates that we cannot perform a swap
// because we do not have enough pending budget available. This differs
// from budget elapsed, because we still have some budget available,
// but we have allocated it to other swaps.
ReasonBudgetInsufficient
// ReasonFeePPMInsufficient indicates that the fees a swap would require
// are greater than the portion of swap amount allocated to fees.
ReasonFeePPMInsufficient
// ReasonLoopInUnreachable indicates that the server does not have a
// path to the client, so cannot perform a loop in swap at this time.
ReasonLoopInUnreachable
)
// String returns a string representation of a reason.
func (r Reason) String() string {
switch r {
case ReasonNone:
return "none"
case ReasonBudgetNotStarted:
return "budget not started"
case ReasonSweepFees:
return "sweep fees to high"
case ReasonBudgetElapsed:
return "budget elapsed"
case ReasonInFlight:
return "autoloops already in flight"
case ReasonSwapFee:
return "swap server fee to high"
case ReasonMinerFee:
return "miner fee to high"
case ReasonPrepay:
return "prepayment too high"
case ReasonFailureBackoff:
return "backing off due to failure"
case ReasonLoopOut:
return "loop out using channel"
case ReasonLoopIn:
return "loop in using peer"
case ReasonLiquidityOk:
return "liquidity balance ok"
case ReasonBudgetInsufficient:
return "budget insufficient"
case ReasonFeePPMInsufficient:
return "fee portion insufficient"
case ReasonLoopInUnreachable:
return "loop in unreachable"
default:
return "unknown"
}
}
// reasonError is an error type which embeds our reasons for not performing
// swaps.
type reasonError struct {
reason Reason
}
func newReasonError(r Reason) *reasonError {
return &reasonError{
reason: r,
}
}
// Error returns an error string for a reason error.
func (r *reasonError) Error() string {
return fmt.Sprintf("swap reason: %v", r.reason)
}