diff --git a/loopdb/loopout.go b/loopdb/loopout.go index 2507784c..54fd274b 100644 --- a/loopdb/loopout.go +++ b/loopdb/loopout.go @@ -61,6 +61,10 @@ type LoopOutContract struct { // allow the server to delay the publication in exchange for possibly // lower fees. SwapPublicationDeadline time.Time + + // PaymentTimeout is the timeout for any individual off-chain payment + // attempt. + PaymentTimeout time.Duration } // ChannelSet stores a set of channels. diff --git a/loopdb/sql_store.go b/loopdb/sql_store.go index 293d57dd..9158e033 100644 --- a/loopdb/sql_store.go +++ b/loopdb/sql_store.go @@ -443,6 +443,7 @@ func loopOutToInsertArgs(hash lntypes.Hash, PrepayInvoice: loopOut.PrepayInvoice, MaxPrepayRoutingFee: int64(loopOut.MaxPrepayRoutingFee), PublicationDeadline: loopOut.SwapPublicationDeadline.UTC(), + PaymentTimeout: int32(loopOut.PaymentTimeout.Seconds()), } } @@ -536,6 +537,9 @@ func ConvertLoopOutRow(network *chaincfg.Params, row sqlc.GetLoopOutSwapRow, PrepayInvoice: row.PrepayInvoice, MaxPrepayRoutingFee: btcutil.Amount(row.MaxPrepayRoutingFee), SwapPublicationDeadline: row.PublicationDeadline, + PaymentTimeout: time.Duration( + row.PaymentTimeout, + ) * time.Second, }, Loop: Loop{ Hash: swapHash, diff --git a/loopdb/sql_test.go b/loopdb/sql_test.go index dce2b373..b0082069 100644 --- a/loopdb/sql_test.go +++ b/loopdb/sql_test.go @@ -60,6 +60,7 @@ func TestSqliteLoopOutStore(t *testing.T) { SweepConfTarget: 2, HtlcConfirmations: 2, SwapPublicationDeadline: initiationTime, + PaymentTimeout: time.Second * 11, } t.Run("no outgoing set", func(t *testing.T) { @@ -120,6 +121,8 @@ func testSqliteLoopOutStore(t *testing.T, pendingSwap *LoopOutContract) { if expectedState == StatePreimageRevealed { require.NotNil(t, swap.State().HtlcTxHash) } + + require.Equal(t, time.Second*11, swap.Contract.PaymentTimeout) } // If we create a new swap, then it should show up as being initialized diff --git a/loopdb/sqlc/batch.sql.go b/loopdb/sqlc/batch.sql.go index 6f4aaf9f..dae2ad17 100644 --- a/loopdb/sqlc/batch.sql.go +++ b/loopdb/sqlc/batch.sql.go @@ -29,7 +29,7 @@ const getBatchSweeps = `-- name: GetBatchSweeps :many SELECT sweeps.id, sweeps.swap_hash, sweeps.batch_id, sweeps.outpoint_txid, sweeps.outpoint_index, sweeps.amt, sweeps.completed, swaps.id, swaps.swap_hash, swaps.preimage, swaps.initiation_time, swaps.amount_requested, swaps.cltv_expiry, swaps.max_miner_fee, swaps.max_swap_fee, swaps.initiation_height, swaps.protocol_version, swaps.label, - loopout_swaps.swap_hash, loopout_swaps.dest_address, loopout_swaps.swap_invoice, loopout_swaps.max_swap_routing_fee, loopout_swaps.sweep_conf_target, loopout_swaps.htlc_confirmations, loopout_swaps.outgoing_chan_set, loopout_swaps.prepay_invoice, loopout_swaps.max_prepay_routing_fee, loopout_swaps.publication_deadline, loopout_swaps.single_sweep, + loopout_swaps.swap_hash, loopout_swaps.dest_address, loopout_swaps.swap_invoice, loopout_swaps.max_swap_routing_fee, loopout_swaps.sweep_conf_target, loopout_swaps.htlc_confirmations, loopout_swaps.outgoing_chan_set, loopout_swaps.prepay_invoice, loopout_swaps.max_prepay_routing_fee, loopout_swaps.publication_deadline, loopout_swaps.single_sweep, loopout_swaps.payment_timeout, htlc_keys.swap_hash, htlc_keys.sender_script_pubkey, htlc_keys.receiver_script_pubkey, htlc_keys.sender_internal_pubkey, htlc_keys.receiver_internal_pubkey, htlc_keys.client_key_family, htlc_keys.client_key_index FROM sweeps @@ -75,6 +75,7 @@ type GetBatchSweepsRow struct { MaxPrepayRoutingFee int64 PublicationDeadline time.Time SingleSweep bool + PaymentTimeout int32 SwapHash_4 []byte SenderScriptPubkey []byte ReceiverScriptPubkey []byte @@ -123,6 +124,7 @@ func (q *Queries) GetBatchSweeps(ctx context.Context, batchID int32) ([]GetBatch &i.MaxPrepayRoutingFee, &i.PublicationDeadline, &i.SingleSweep, + &i.PaymentTimeout, &i.SwapHash_4, &i.SenderScriptPubkey, &i.ReceiverScriptPubkey, diff --git a/loopdb/sqlc/migrations/000007_payment_timeout.down.sql b/loopdb/sqlc/migrations/000007_payment_timeout.down.sql new file mode 100644 index 00000000..2e466f36 --- /dev/null +++ b/loopdb/sqlc/migrations/000007_payment_timeout.down.sql @@ -0,0 +1,3 @@ +-- payment_timeout is the timeout in seconds for each individual off-chain +-- payment. +ALTER TABLE loopout_swaps DROP COLUMN payment_timeout; diff --git a/loopdb/sqlc/migrations/000007_payment_timeout.up.sql b/loopdb/sqlc/migrations/000007_payment_timeout.up.sql new file mode 100644 index 00000000..cdd43436 --- /dev/null +++ b/loopdb/sqlc/migrations/000007_payment_timeout.up.sql @@ -0,0 +1,3 @@ +-- payment_timeout is the timeout in seconds for each individual off-chain +-- payment. +ALTER TABLE loopout_swaps ADD payment_timeout INTEGER NOT NULL DEFAULT 0; diff --git a/loopdb/sqlc/models.go b/loopdb/sqlc/models.go index ec9dc56c..45185d30 100644 --- a/loopdb/sqlc/models.go +++ b/loopdb/sqlc/models.go @@ -64,6 +64,7 @@ type LoopoutSwap struct { MaxPrepayRoutingFee int64 PublicationDeadline time.Time SingleSweep bool + PaymentTimeout int32 } type Reservation struct { diff --git a/loopdb/sqlc/queries/swaps.sql b/loopdb/sqlc/queries/swaps.sql index 925ede6d..8d8dd66e 100644 --- a/loopdb/sqlc/queries/swaps.sql +++ b/loopdb/sqlc/queries/swaps.sql @@ -105,9 +105,10 @@ INSERT INTO loopout_swaps ( prepay_invoice, max_prepay_routing_fee, publication_deadline, - single_sweep + single_sweep, + payment_timeout ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11 + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12 ); -- name: InsertLoopIn :exec @@ -131,4 +132,4 @@ INSERT INTO htlc_keys( client_key_index ) VALUES ( $1, $2, $3, $4, $5, $6, $7 -); \ No newline at end of file +); diff --git a/loopdb/sqlc/swaps.sql.go b/loopdb/sqlc/swaps.sql.go index a4403084..cda5dec5 100644 --- a/loopdb/sqlc/swaps.sql.go +++ b/loopdb/sqlc/swaps.sql.go @@ -169,7 +169,7 @@ func (q *Queries) GetLoopInSwaps(ctx context.Context) ([]GetLoopInSwapsRow, erro const getLoopOutSwap = `-- name: GetLoopOutSwap :one SELECT swaps.id, swaps.swap_hash, swaps.preimage, swaps.initiation_time, swaps.amount_requested, swaps.cltv_expiry, swaps.max_miner_fee, swaps.max_swap_fee, swaps.initiation_height, swaps.protocol_version, swaps.label, - loopout_swaps.swap_hash, loopout_swaps.dest_address, loopout_swaps.swap_invoice, loopout_swaps.max_swap_routing_fee, loopout_swaps.sweep_conf_target, loopout_swaps.htlc_confirmations, loopout_swaps.outgoing_chan_set, loopout_swaps.prepay_invoice, loopout_swaps.max_prepay_routing_fee, loopout_swaps.publication_deadline, loopout_swaps.single_sweep, + loopout_swaps.swap_hash, loopout_swaps.dest_address, loopout_swaps.swap_invoice, loopout_swaps.max_swap_routing_fee, loopout_swaps.sweep_conf_target, loopout_swaps.htlc_confirmations, loopout_swaps.outgoing_chan_set, loopout_swaps.prepay_invoice, loopout_swaps.max_prepay_routing_fee, loopout_swaps.publication_deadline, loopout_swaps.single_sweep, loopout_swaps.payment_timeout, htlc_keys.swap_hash, htlc_keys.sender_script_pubkey, htlc_keys.receiver_script_pubkey, htlc_keys.sender_internal_pubkey, htlc_keys.receiver_internal_pubkey, htlc_keys.client_key_family, htlc_keys.client_key_index FROM swaps @@ -204,6 +204,7 @@ type GetLoopOutSwapRow struct { MaxPrepayRoutingFee int64 PublicationDeadline time.Time SingleSweep bool + PaymentTimeout int32 SwapHash_3 []byte SenderScriptPubkey []byte ReceiverScriptPubkey []byte @@ -239,6 +240,7 @@ func (q *Queries) GetLoopOutSwap(ctx context.Context, swapHash []byte) (GetLoopO &i.MaxPrepayRoutingFee, &i.PublicationDeadline, &i.SingleSweep, + &i.PaymentTimeout, &i.SwapHash_3, &i.SenderScriptPubkey, &i.ReceiverScriptPubkey, @@ -253,7 +255,7 @@ func (q *Queries) GetLoopOutSwap(ctx context.Context, swapHash []byte) (GetLoopO const getLoopOutSwaps = `-- name: GetLoopOutSwaps :many SELECT swaps.id, swaps.swap_hash, swaps.preimage, swaps.initiation_time, swaps.amount_requested, swaps.cltv_expiry, swaps.max_miner_fee, swaps.max_swap_fee, swaps.initiation_height, swaps.protocol_version, swaps.label, - loopout_swaps.swap_hash, loopout_swaps.dest_address, loopout_swaps.swap_invoice, loopout_swaps.max_swap_routing_fee, loopout_swaps.sweep_conf_target, loopout_swaps.htlc_confirmations, loopout_swaps.outgoing_chan_set, loopout_swaps.prepay_invoice, loopout_swaps.max_prepay_routing_fee, loopout_swaps.publication_deadline, loopout_swaps.single_sweep, + loopout_swaps.swap_hash, loopout_swaps.dest_address, loopout_swaps.swap_invoice, loopout_swaps.max_swap_routing_fee, loopout_swaps.sweep_conf_target, loopout_swaps.htlc_confirmations, loopout_swaps.outgoing_chan_set, loopout_swaps.prepay_invoice, loopout_swaps.max_prepay_routing_fee, loopout_swaps.publication_deadline, loopout_swaps.single_sweep, loopout_swaps.payment_timeout, htlc_keys.swap_hash, htlc_keys.sender_script_pubkey, htlc_keys.receiver_script_pubkey, htlc_keys.sender_internal_pubkey, htlc_keys.receiver_internal_pubkey, htlc_keys.client_key_family, htlc_keys.client_key_index FROM swaps @@ -288,6 +290,7 @@ type GetLoopOutSwapsRow struct { MaxPrepayRoutingFee int64 PublicationDeadline time.Time SingleSweep bool + PaymentTimeout int32 SwapHash_3 []byte SenderScriptPubkey []byte ReceiverScriptPubkey []byte @@ -329,6 +332,7 @@ func (q *Queries) GetLoopOutSwaps(ctx context.Context) ([]GetLoopOutSwapsRow, er &i.MaxPrepayRoutingFee, &i.PublicationDeadline, &i.SingleSweep, + &i.PaymentTimeout, &i.SwapHash_3, &i.SenderScriptPubkey, &i.ReceiverScriptPubkey, @@ -470,9 +474,10 @@ INSERT INTO loopout_swaps ( prepay_invoice, max_prepay_routing_fee, publication_deadline, - single_sweep + single_sweep, + payment_timeout ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11 + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12 ) ` @@ -488,6 +493,7 @@ type InsertLoopOutParams struct { MaxPrepayRoutingFee int64 PublicationDeadline time.Time SingleSweep bool + PaymentTimeout int32 } func (q *Queries) InsertLoopOut(ctx context.Context, arg InsertLoopOutParams) error { @@ -503,6 +509,7 @@ func (q *Queries) InsertLoopOut(ctx context.Context, arg InsertLoopOutParams) er arg.MaxPrepayRoutingFee, arg.PublicationDeadline, arg.SingleSweep, + arg.PaymentTimeout, ) return err }