package client import ( "time" "github.com/btcsuite/btcutil" "github.com/lightningnetwork/lnd/lntypes" ) // UnchargeRequest contains the required parameters for the swap. type UnchargeRequest struct { // Amount specifies the requested swap amount in sat. This does not // include the swap and miner fee. Amount btcutil.Amount // Destination address for the swap. DestAddr btcutil.Address // MaxSwapRoutingFee is the maximum off-chain fee in msat that may be // paid for payment to the server. This limit is applied during path // finding. Typically this value is taken from the response of the // UnchargeQuote call. MaxSwapRoutingFee btcutil.Amount // MaxPrepayRoutingFee is the maximum off-chain fee in msat that may be // paid for payment to the server. This limit is applied during path // finding. Typically this value is taken from the response of the // UnchargeQuote call. MaxPrepayRoutingFee btcutil.Amount // MaxSwapFee is the maximum we are willing to pay the server for the // swap. This value is not disclosed in the swap initiation call, but if // the server asks for a higher fee, we abort the swap. Typically this // value is taken from the response of the UnchargeQuote call. It // includes the prepay amount. MaxSwapFee btcutil.Amount // MaxPrepayAmount is the maximum amount of the swap fee that may be // charged as a prepayment. MaxPrepayAmount btcutil.Amount // MaxMinerFee is the maximum in on-chain fees that we are willing to // spent. If we want to sweep the on-chain htlc and the fee estimate // turns out higher than this value, we cancel the swap. If the fee // estimate is lower, we publish the sweep tx. // // If the sweep tx isn't confirmed, we are forced to ratchet up fees // until it is swept. Possibly even exceeding MaxMinerFee if we get // close to the htlc timeout. Because the initial publication revealed // the preimage, we have no other choice. The server may already have // pulled the off-chain htlc. Only when the fee becomes higher than the // swap amount, we can only wait for fees to come down and hope - if we // are past the timeout - that the server isn't publishing the // revocation. // // MaxMinerFee is typically taken from the response of the // UnchargeQuote call. MaxMinerFee btcutil.Amount // SweepConfTarget specifies the targeted confirmation target for the // client sweep tx. SweepConfTarget int32 // UnchargeChannel optionally specifies the short channel id of the // channel to uncharge. UnchargeChannel *uint64 } // UnchargeContract contains the data that is serialized to persistent storage for // pending swaps. type UnchargeContract struct { SwapContract DestAddr btcutil.Address SwapInvoice string // MaxSwapRoutingFee is the maximum off-chain fee in msat that may be // paid for the swap payment to the server. MaxSwapRoutingFee btcutil.Amount // SweepConfTarget specifies the targeted confirmation target for the // client sweep tx. SweepConfTarget int32 // UnchargeChannel is the channel to uncharge. If zero, any channel may // be used. UnchargeChannel *uint64 } // UnchargeSwapInfo contains status information for a uncharge swap. type UnchargeSwapInfo struct { UnchargeContract SwapInfoKit // State where the swap is in. State SwapState } // SwapCost is a breakdown of the final swap costs. type SwapCost struct { // Swap is the amount paid to the server. Server btcutil.Amount // Onchain is the amount paid to miners for the onchain tx. Onchain btcutil.Amount } // UnchargeQuoteRequest specifies the swap parameters for which a quote is // requested. type UnchargeQuoteRequest struct { // Amount specifies the requested swap amount in sat. This does not // include the swap and miner fee. Amount btcutil.Amount // SweepConfTarget specifies the targeted confirmation target for the // client sweep tx. SweepConfTarget int32 // TODO: Add argument to specify confirmation target for server // publishing htlc. This may influence the swap fee quote, because the // server needs to pay more for faster confirmations. // // TODO: Add arguments to specify maximum total time locks for the // off-chain swap payment and prepayment. This may influence the // available routes and off-chain fee estimates. To apply these maximum // values properly, the server needs to be queried for its required // final cltv delta values for the off-chain payments. } // UnchargeQuote contains estimates for the fees making up the total swap cost // for the client. type UnchargeQuote struct { // SwapFee is the fee that the swap server is charging for the swap. SwapFee btcutil.Amount // PrepayAmount is the part of the swap fee that is requested as a // prepayment. PrepayAmount btcutil.Amount // MinerFee is an estimate of the on-chain fee that needs to be paid to // sweep the htlc. MinerFee btcutil.Amount } // UnchargeTerms are the server terms on which it executes swaps. type UnchargeTerms struct { // SwapFeeBase is the fixed per-swap base fee. SwapFeeBase btcutil.Amount // SwapFeeRate is the variable fee in parts per million. SwapFeeRate int64 // PrepayAmt is the fixed part of the swap fee that needs to be prepaid. PrepayAmt btcutil.Amount // MinSwapAmount is the minimum amount that the server requires for a // swap. MinSwapAmount btcutil.Amount // MaxSwapAmount is the maximum amount that the server accepts for a // swap. MaxSwapAmount btcutil.Amount // Time lock delta relative to current block height that swap server // will accept on the swap initiation call. CltvDelta int32 // SwapPaymentDest is the node pubkey where to swap payment needs to be // sent to. SwapPaymentDest [33]byte } // SwapContract contains the base data that is serialized to persistent storage // for pending swaps. type SwapContract struct { Preimage lntypes.Preimage AmountRequested btcutil.Amount PrepayInvoice string SenderKey [33]byte ReceiverKey [33]byte CltvExpiry int32 // MaxPrepayRoutingFee is the maximum off-chain fee in msat that may be // paid for the prepayment to the server. MaxPrepayRoutingFee btcutil.Amount // MaxSwapFee is the maximum we are willing to pay the server for the // swap. MaxSwapFee btcutil.Amount // MaxMinerFee is the maximum in on-chain fees that we are willing to // spend. MaxMinerFee btcutil.Amount // InitiationHeight is the block height at which the swap was initiated. InitiationHeight int32 // InitiationTime is the time at which the swap was initiated. InitiationTime time.Time } // SwapInfoKit contains common swap info fields. type SwapInfoKit struct { // Hash is the sha256 hash of the preimage that unlocks the htlcs. It is // used to uniquely identify this swap. Hash lntypes.Hash // LastUpdateTime is the time of the last update of this swap. LastUpdateTime time.Time } // SwapType indicates the type of swap. type SwapType uint8 const ( // SwapTypeCharge is a charge swap. SwapTypeCharge SwapType = iota // SwapTypeUncharge is an uncharge swap. SwapTypeUncharge ) // SwapInfo exposes common info fields for charge and uncharge swaps. type SwapInfo struct { LastUpdate time.Time SwapHash lntypes.Hash State SwapState SwapType SwapType SwapContract }