diff --git a/funding/manager.go b/funding/manager.go index bbd556a..350ce4d 100644 --- a/funding/manager.go +++ b/funding/manager.go @@ -283,8 +283,8 @@ func (m *Manager) SubscribePendingOpenChan() (*subscribe.Client, error) { // the maker or taker to properly make a channel that stems off the main batch // funding transaction. func (m *Manager) deriveFundingShim(ourOrder order.Order, - matchedOrder *order.MatchedOrder, - batchTx *wire.MsgTx) (*lnrpc.FundingShim, [32]byte, error) { + matchedOrder *order.MatchedOrder, batchTx *wire.MsgTx, + batchHeightHint uint32) (*lnrpc.FundingShim, [32]byte, error) { log.Infof("Registering funding shim for Order(type=%v, amt=%v, "+ "nonce=%v", ourOrder.Type(), @@ -315,6 +315,15 @@ func (m *Manager) deriveFundingShim(ourOrder order.Order, selfChanBalance = matchedOrder.Order.(*order.Bid).SelfChanBalance } + // If either order requires script enforcement, our thaw height needs to + // be an absolute height instead of a relative one. + switch { + case ourOrder.Details().ChannelType == order.ChannelTypeScriptEnforced: + fallthrough + case matchedOrder.Order.Details().ChannelType == order.ChannelTypeScriptEnforced: + thawHeight += batchHeightHint + } + pendingChanID := order.PendingChanKey( askNonce, bidNonce, ) @@ -398,12 +407,13 @@ func (m *Manager) deriveFundingShim(ourOrder order.Order, // side of a new matched order. To prepare ourselves for their incoming funding // request, we'll register a shim with all the expected parameters. func (m *Manager) registerFundingShim(ourBid *order.Bid, - matchedOrder *order.MatchedOrder, batchTx *wire.MsgTx) error { + matchedOrder *order.MatchedOrder, batchTx *wire.MsgTx, + batchHeightHint uint32) error { ctxb := context.Background() fundingShim, pendingChanID, err := m.deriveFundingShim( - ourBid, matchedOrder, batchTx, + ourBid, matchedOrder, batchTx, batchHeightHint, ) if err != nil { return err @@ -556,6 +566,7 @@ func (m *Manager) PrepChannelFunding(batch *order.Batch, // from the asker. err := m.registerFundingShim( ourOrderBid, matchedOrder, batch.BatchTX, + batch.HeightHint, ) if err != nil { return fmt.Errorf("unable to register funding "+ @@ -639,6 +650,7 @@ func (m *Manager) BatchChannelSetup( for _, matchedOrder := range matchedOrders { fundingShim, _, err := m.deriveFundingShim( ourOrder, matchedOrder, batch.BatchTX, + batch.HeightHint, ) if err != nil { return nil, err @@ -678,6 +690,13 @@ func (m *Manager) BatchChannelSetup( // * also other params to set as well chanAmt := matchedOrder.UnitsFilled.ToSatoshis() chanAmt += matchedOrderBid.SelfChanBalance + var commitmentType lnrpc.CommitmentType + switch { + case ourOrder.Details().ChannelType == order.ChannelTypeScriptEnforced: + fallthrough + case matchedOrderBid.Details().ChannelType == order.ChannelTypeScriptEnforced: + commitmentType = lnrpc.CommitmentType_SCRIPT_ENFORCED_LEASE + } fundingReq := &lnrpc.OpenChannelRequest{ NodePubkey: matchedOrder.NodeKey[:], LocalFundingAmount: int64(chanAmt), @@ -685,6 +704,7 @@ func (m *Manager) BatchChannelSetup( PushSat: int64( matchedOrderBid.SelfChanBalance, ), + CommitmentType: commitmentType, } chanStream, err := m.cfg.BaseClient.OpenChannel( setupCtx, fundingReq, @@ -827,6 +847,7 @@ func (m *Manager) SidecarBatchChannelSetup(batch *order.Batch, for _, matchedOrder := range matchedOrders { fundingShim, _, err := m.deriveFundingShim( ourOrder, matchedOrder, batch.BatchTX, + batch.HeightHint, ) if err != nil { return nil, err diff --git a/funding/manager_test.go b/funding/manager_test.go index 32e7c62..9925498 100644 --- a/funding/manager_test.go +++ b/funding/manager_test.go @@ -578,6 +578,7 @@ func TestDeriveFundingShim(t *testing.T) { batchTx = &wire.MsgTx{ TxOut: []*wire.TxOut{{}}, } + batchHeightHint uint32 = 1337 ) askKit := order.NewKit(askNonce) @@ -601,7 +602,7 @@ func TestDeriveFundingShim(t *testing.T) { matchedAsk.MultiSigKey[:], int64(4*order.BaseSupplyUnit), ) shim, pendingChanID, err := h.mgr.deriveFundingShim( - bid, matchedAsk, batchTx, + bid, matchedAsk, batchTx, batchHeightHint, ) require.NoError(t, err) require.Equal(t, order.PendingChanKey(askNonce, bidNonce), pendingChanID) @@ -639,7 +640,7 @@ func TestDeriveFundingShim(t *testing.T) { matchedAsk.MultiSigKey[:], int64(4*order.BaseSupplyUnit), ) shim, pendingChanID, err = h.mgr.deriveFundingShim( - bid, matchedAsk, batchTx, + bid, matchedAsk, batchTx, batchHeightHint, ) require.NoError(t, err) require.Equal(t, order.PendingChanKey(askNonce, bidNonce), pendingChanID)