Skip to content

Asset Channel Closure on Self-Payment (from tapchannelrpc) b/t v0.14.1-alpha and v0.15.0-alpha-rc1 #1083

@Nsandomeno

Description

@Nsandomeno

Background

  1. Mint grouped asset on node A
  2. Sync node B to node A, add to federation (public universe configs enabled)
  taproot-assets.universe.public-access=rw
  taproot-assets.allow-public-uni-proof-courier=1
  taproot-assets.allow-public-stats=1
  1. Transfer assets from node A to node B
  2. Open asset channel from node B to node A (100% of asset capacity on local side of node B)
  3. Open regular channel from node A to node B (50% of sats balance on each side)
  4. Generate sats invoice (with lncli) on node B for 2000 sats
  invoice, err := lnClient.AddInvoice(context.TODO(), &lnrpc.Invoice{
  	Value: int64(2000),
  })

  1. Make self-payment with route-hints (hop-hints fully populated) through tapchannelrpc
	payReq := &routerrpc.SendPaymentRequest{
		PaymentRequest:   invoice.PaymentRequest,
		OutgoingChanIds:  []uint64{swapAssetChanId},
		AllowSelfPayment: true,
		FeeLimitSat:      20000,
		RouteHints: []*lnrpc.RouteHint{{
			HopHints: []*lnrpc.HopHint{
				{
					NodeId:                    pubkey,
					ChanId:                    assetsPeerScidAlias,
					CltvExpiryDelta:           80,
					FeeBaseMsat:               1000,
					FeeProportionalMillionths: 1,
				},
				{
					NodeId:                    peerPubkey,
					ChanId:                    satsPeerScidAlias,
					CltvExpiryDelta:           80,
					FeeBaseMsat:               1000,
					FeeProportionalMillionths: 1,
				},
			}},
		},
	}
	stream, err := tapChannelClient.SendPayment(context.TODO(), &tapchannelrpc.SendPaymentRequest{
		AssetId:        assetHex,
		PeerPubkey:    peerPubkey,
		PaymentRequest: payReq,
		AllowOverpay:   true,
		RfqId:          rfqQuoteId,
	})
	if err != nil {
		fmt.Printf("error sending asset payment for swap: %s", err.Error())
		return
	}
  1. Results in a force close of the channel
   2025-06-04 21:17:25.272 [DBG] DISC: The message ChannelUpdate has no AuthProof, sending the update to remote peer 03a87aca1479286fea390d79ac9ba85842caa1713377d07daadb1b00ce1175d435
2025-06-04 21:17:25.278 [DBG] DISC: Processed ChannelUpdate: peer=<nil>, short_chan_id=17592186044416000002, timestamp=2025-06-04 21:17:25 +0000 UTC
2025-06-04 21:17:25.278 [DBG] DISC: Successfully sent ChannelUpdate message for channel=16000000:0:2 with peer=03a87aca1479286fea390d79ac9ba85842caa1713377d07daadb1b00ce1175d435
2025-06-04 21:17:25.278 [INF] CNCT: ChannelArbitrator(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): received force close request
2025-06-04 21:17:25.284 [DBG] CNCT: ChannelArbitrator(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): attempting state step with trigger=userTrigger from state=StateDefault
2025-06-04 21:17:25.278 [DBG] PEER: Peer(03a87aca1479286fea390d79ac9ba85842caa1713377d07daadb1b00ce1175d435): Sending ChannelUpdate(chain_hash=0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206, short_chan_id=17592186044416000002, mflags=00000001, cflags=00000010, update_time=2025-06-04 21:17:25 +0000 UTC) to 03a87aca1479286fea390d79ac9ba85842caa1713377d07daadb1b00ce1175d435@172.31.0.1:60902
2025-06-04 21:17:25.287 [DBG] CNCT: ChannelArbitrator(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): new block (height=364) examining active HTLC's
2025-06-04 21:17:25.294 [DBG] CNCT: ChannelArbitrator(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): checking commit chain actions at height=364, in_htlc_count=0, out_htlc_count=0
2025-06-04 21:17:25.319 [DBG] CNCT: ChannelArbitrator(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): attempting state step with trigger=userTrigger from state=StateBroadcastCommit
2025-06-04 21:17:25.319 [INF] CNCT: ChannelArbitrator(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): force closing chan
2025-06-04 21:17:25.337 [DBG] TSVR: FetchLeavesFromCommit called, ourBalance=0 mSAT, theirBalance=96920000 mSAT, numHtlcs=0
2025-06-04 21:17:25.341 [DBG] TSVR: FetchLeavesFromCommit called, ourBalance=0 mSAT, theirBalance=96920000 mSAT, numHtlcs=0
2025-06-04 21:17:25.342 [DBG] LNWL: ChannelPoint(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): Restoring 0 dangling remote updates
2025-06-04 21:17:25.345 [DBG] LNWL: ChannelPoint(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): Restoring 0 local updates that the peer should sign
2025-06-04 21:17:25.351 [INF] LNWL: Generating new musig2 sig for session=daf310c3e35f7128930b38d5156ec27e5ff1ad7caff7a8ebb026459ecf5800ca, nonces=NoncePair(verification_nonce=02a5f11cdd0d20f526a38a8df624a96d119d8cc7de30c23613222ae679687889cc0349d24b3188967d565bee73386ab1face62743190ef16df20f9912cf9e0f05487, signing_nonce=0316d8676c542a811b4f899633c576aca62d1bdc55e1ea5f22c5867c60ab0d3c8103cc80ac2609d98b46e6df6976e5b016bd0893a770bb2afe77c297e0d7922d18b1)
2025-06-04 21:17:25.376 [INF] CNCT: Broadcasting force close transaction 74b7961c0461e3f4df5accbafc99ecad8ba6e99543c451d11c1cb8f270e929d9, ChannelPoint(39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0): (*wire.MsgTx)(0xc001334ec0)({
 Version: (int32) 2,
 TxIn: ([]*wire.TxIn) (len=1 cap=1) {
  (*wire.TxIn)(0xc003c1fb00)({
   PreviousOutPoint: (wire.OutPoint) 39fcd986a8cb181984f66045ab9970780e4dee1680315720e865d22e5c060fbc:0,
   SignatureScript: ([]uint8) <nil>,
   Witness: (wire.TxWitness) (len=1 cap=1) {
    ([]uint8) (len=64 cap=64) {
     00000000  bc a9 6c e8 60 17 a0 d9  2b 1f 1f 26 e8 6a bd 08  |..l.`...+..&.j..|
     00000010  70 f7 9a 4d fc 88 a2 09  8b 92 73 36 d4 a3 13 dd  |p..M......s6....|
     00000020  0b 54 ef bd aa 77 54 53  f9 1d da ec 33 a4 27 20  |.T...wTS....3.' |
     00000030  83 61 e9 9d d8 61 9f 55  3f 39 86 cc e3 67 ab 69  |.a...a.U?9...g.i|
    }
   },
   Sequence: (uint32) 2164190000
  })

Your environment

Node A

litcli getinfo

litd@alice:/$ litcli getinfo
{
    "version": "0.14.1-alpha commit=v0.14.1-alpha"
}

uname -mrsv

Linux 5.15.49-linuxkit-pr #1 SMP Thu May 25 07:17:40 UTC 2023 x86_64

bitcoind --version

v0.29.0

Node B

lighting-terminal v0.15.0-alpha-rc1

uname -mrsv

Darwin 22.6.0 Darwin Kernel Version 22.6.0: Mon Apr 22 20:54:28 PDT 2024; root:xnu-8796.141.3.705.2~1/RELEASE_X86_64 x86_64

bitcoind --version

v0.29.0

Expected behavior

Things worked when both members of the channel were from lightning-terminal 0.15.0-alpha-rc1

Actual behavior

Force close of asset channel. While Node B acknowledges receipt of its assets from the on-chain send from Node A, it doesn't seem to gain a transfer proof. The "No AuthProof" line of the log output from bullet 8. makes me think some validation is failing.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions