@@ -80,6 +80,153 @@ const (
8080 startAmount = fundingAmount * 2
8181)
8282
83+ // testCustomChannelsLarge tests that we can create a network with custom
84+ // channels and send large asset payments over them.
85+ func testCustomChannelsLarge (_ context.Context , net * NetworkHarness ,
86+ t * harnessTest ) {
87+
88+ lndArgs := slices .Clone (lndArgsTemplate )
89+ litdArgs := slices .Clone (litdArgsTemplate )
90+
91+ // Explicitly set the proof courier as Alice (how has no other role
92+ // other than proof shuffling), otherwise a hashmail courier will be
93+ // used. For the funding transaction, we're just posting it and don't
94+ // expect a true receiver.
95+ zane , err := net .NewNode (
96+ t .t , "Zane" , lndArgs , false , true , litdArgs ... ,
97+ )
98+ require .NoError (t .t , err )
99+
100+ litdArgs = append (litdArgs , fmt .Sprintf (
101+ "--taproot-assets.proofcourieraddr=%s://%s" ,
102+ proof .UniverseRpcCourierType , zane .Cfg .LitAddr (),
103+ ))
104+
105+ // The topology we are going for looks like the following:
106+ //
107+ // Charlie --[assets]--> Dave --[sats]--> Erin --[assets]--> Fabia
108+ // |
109+ // |
110+ // [assets]
111+ // |
112+ // v
113+ // Yara
114+ //
115+ // With [assets] being a custom channel and [sats] being a normal, BTC
116+ // only channel.
117+ // All 5 nodes need to be full litd nodes running in integrated mode
118+ // with tapd included. We also need specific flags to be enabled, so we
119+ // create 5 completely new nodes, ignoring the two default nodes that
120+ // are created by the harness.
121+ charlie , err := net .NewNode (
122+ t .t , "Charlie" , lndArgs , false , true , litdArgs ... ,
123+ )
124+ require .NoError (t .t , err )
125+
126+ dave , err := net .NewNode (t .t , "Dave" , lndArgs , false , true , litdArgs ... )
127+ require .NoError (t .t , err )
128+ erin , err := net .NewNode (t .t , "Erin" , lndArgs , false , true , litdArgs ... )
129+ require .NoError (t .t , err )
130+ fabia , err := net .NewNode (
131+ t .t , "Fabia" , lndArgs , false , true , litdArgs ... ,
132+ )
133+ require .NoError (t .t , err )
134+ yara , err := net .NewNode (
135+ t .t , "Yara" , lndArgs , false , true , litdArgs ... ,
136+ )
137+ require .NoError (t .t , err )
138+
139+ nodes := []* HarnessNode {charlie , dave , erin , fabia , yara }
140+ connectAllNodes (t .t , net , nodes )
141+ fundAllNodes (t .t , net , nodes )
142+
143+ // Create the normal channel between Dave and Erin.
144+ t .Logf ("Opening normal channel between Dave and Erin..." )
145+ channelOp := openChannelAndAssert (
146+ t , net , dave , erin , lntest.OpenChannelParams {
147+ Amt : 10_000_000 ,
148+ SatPerVByte : 5 ,
149+ },
150+ )
151+ defer closeChannelAndAssert (t , net , dave , channelOp , false )
152+
153+ // This is the only public channel, we need everyone to be aware of it.
154+ assertChannelKnown (t .t , charlie , channelOp )
155+ assertChannelKnown (t .t , fabia , channelOp )
156+
157+ universeTap := newTapClient (t .t , zane )
158+ charlieTap := newTapClient (t .t , charlie )
159+ daveTap := newTapClient (t .t , dave )
160+ erinTap := newTapClient (t .t , erin )
161+ fabiaTap := newTapClient (t .t , fabia )
162+ yaraTap := newTapClient (t .t , yara )
163+
164+ // Mint an asset on Charlie and sync all nodes to Charlie as the
165+ // universe.
166+ mintedAssets := itest .MintAssetsConfirmBatch (
167+ t .t , t .lndHarness .Miner .Client , charlieTap ,
168+ []* mintrpc.MintAssetRequest {
169+ {
170+ Asset : itestAsset ,
171+ },
172+ },
173+ )
174+ cents := mintedAssets [0 ]
175+ assetID := cents .AssetGenesis .AssetId
176+
177+ t .Logf ("Minted %d lightning cents, syncing universes..." , cents .Amount )
178+ syncUniverses (t .t , charlieTap , dave , erin , fabia , yara )
179+ t .Logf ("Universes synced between all nodes, distributing assets..." )
180+
181+ const (
182+ daveFundingAmount = uint64 (400_000 )
183+ erinFundingAmount = uint64 (200_000 )
184+ )
185+ charlieFundingAmount := cents .Amount - uint64 (2 * 400_000 )
186+
187+ createTestAssetNetwork (
188+ t , net , charlieTap , daveTap , erinTap , fabiaTap , yaraTap ,
189+ universeTap , cents , 400_000 , charlieFundingAmount ,
190+ daveFundingAmount , erinFundingAmount ,
191+ )
192+
193+ // Before we start sending out payments, let's make sure each node can
194+ // see the other one in the graph and has all required features.
195+ require .NoError (t .t , t .lndHarness .AssertNodeKnown (charlie , dave ))
196+ require .NoError (t .t , t .lndHarness .AssertNodeKnown (dave , charlie ))
197+ require .NoError (t .t , t .lndHarness .AssertNodeKnown (dave , yara ))
198+ require .NoError (t .t , t .lndHarness .AssertNodeKnown (yara , dave ))
199+ require .NoError (t .t , t .lndHarness .AssertNodeKnown (erin , fabia ))
200+ require .NoError (t .t , t .lndHarness .AssertNodeKnown (fabia , erin ))
201+ require .NoError (t .t , t .lndHarness .AssertNodeKnown (charlie , erin ))
202+
203+ // Print initial channel balances.
204+ logBalance (t .t , nodes , assetID , "initial" )
205+
206+ // Try larger invoice payments, first from Charlie to Erin, then half
207+ // of the amount back in the other direction.
208+ const fabiaInvoiceAssetAmount = 20_000
209+ invoiceResp := createAssetInvoice (
210+ t .t , erin , fabia , fabiaInvoiceAssetAmount , assetID ,
211+ )
212+ payInvoiceWithAssets (t .t , charlie , dave , invoiceResp , assetID )
213+ logBalance (t .t , nodes , assetID , "after invoice" )
214+
215+ invoiceResp2 := createAssetInvoice (
216+ t .t , dave , charlie , fabiaInvoiceAssetAmount / 2 , assetID ,
217+ )
218+ payInvoiceWithAssets (t .t , fabia , erin , invoiceResp2 , assetID )
219+ logBalance (t .t , nodes , assetID , "after invoice 2" )
220+
221+ // Now we send a large invoice from Charlie to Dave.
222+ const largeInvoiceAmount = 100_000
223+ invoiceResp3 := createAssetInvoice (
224+ t .t , charlie , dave , largeInvoiceAmount , assetID ,
225+ )
226+ payInvoiceWithAssets (t .t , charlie , dave , invoiceResp3 , assetID )
227+ logBalance (t .t , nodes , assetID , "after invoice 3" )
228+ }
229+
83230// testCustomChannels tests that we can create a network with custom channels
84231// and send asset payments over them.
85232func testCustomChannels (_ context.Context , net * NetworkHarness ,
0 commit comments