@@ -117,6 +117,161 @@ void main() {
117117 debugPrint ("Custom preimage API test completed successfully!" );
118118 await aliceNode.stop ();
119119 });
120+
121+ testWidgets ('bolt12_route_parameters_api_test' , (WidgetTester tester) async {
122+ await ensureFrbInitialized ();
123+
124+ debugPrint ("Testing RouteParametersConfig and BOLT12 API availability..." );
125+
126+ // Test RouteParametersConfig creation
127+ final routeParams = ldk.RouteParametersConfig (
128+ maxTotalCltvExpiryDelta: 1008 ,
129+ maxPathCount: 3 ,
130+ maxChannelSaturationPowerOfHalf: 2 ,
131+ );
132+ debugPrint ("RouteParametersConfig created: maxPathCount=${routeParams .maxPathCount }" );
133+ expect (routeParams.maxTotalCltvExpiryDelta, equals (1008 ));
134+ expect (routeParams.maxPathCount, equals (3 ));
135+ expect (routeParams.maxChannelSaturationPowerOfHalf, equals (2 ));
136+
137+ // Create a node to verify bolt12Payment() API exists
138+ final config = await initLdkConfig (
139+ 'bolt12_api' , const ldk.SocketAddress .hostname (addr: "0.0.0.0" , port: 3019 ));
140+ final nodeBuilder = ldk.Builder .fromConfig (config: config)
141+ .setEntropyBip39Mnemonic (
142+ mnemonic: ldk.Mnemonic (
143+ seedPhrase:
144+ "replace force spring cruise nothing select glass erupt medal raise consider pull" ))
145+ .setChainSourceEsplora (
146+ esploraServerUrl: esploraUrl, syncConfig: esploraConfig);
147+ final node = await nodeBuilder.build ();
148+ await node.start ();
149+
150+ // Sync wallets
151+ debugPrint ("Syncing wallets..." );
152+ await node.syncWallets ();
153+ debugPrint ("Sync complete" );
154+
155+ // Verify the bolt12Payment handler exists
156+ final bolt12Handler = await node.bolt12Payment ();
157+ debugPrint ("Bolt12Payment handler obtained successfully" );
158+
159+ // Test creating a BOLT12 offer
160+ // BOLT12 offer creation requires the node to have announced itself to the network
161+ // For a fresh node without channels, this may fail
162+ try {
163+ final offer = await bolt12Handler.receive (
164+ amountMsat: BigInt .from (500000 ),
165+ description: "Test BOLT12 offer" ,
166+ );
167+ debugPrint ("BOLT12 offer created successfully: ${offer .s }" );
168+ expect (offer.s.isNotEmpty, true );
169+ } catch (e) {
170+ // OfferCreationFailed is expected for a node without any channels or network presence
171+ debugPrint ("bolt12Payment.receive() - expected for fresh node without channels: $e " );
172+
173+ // Still verify the receiveVariableAmountUnsafe API exists
174+ debugPrint ("Verifying receiveVariableAmountUnsafe API exists..." );
175+ try {
176+ await bolt12Handler.receiveVariableAmountUnsafe (description: "Variable amount test" );
177+ } catch (e2) {
178+ debugPrint ("receiveVariableAmountUnsafe API verified (same expected error): $e2 " );
179+ }
180+ }
181+
182+ debugPrint ("BOLT12 RouteParametersConfig API test completed successfully!" );
183+ await node.stop ();
184+ });
185+
186+ testWidgets ('pathfinding_scores_test' , (WidgetTester tester) async {
187+ await ensureFrbInitialized ();
188+
189+ final config = await initLdkConfig (
190+ 'pathfinding' , const ldk.SocketAddress .hostname (addr: "0.0.0.0" , port: 3011 ));
191+ debugPrint ("Creating node for pathfinding scores test..." );
192+ final nodeBuilder = ldk.Builder .fromConfig (config: config)
193+ .setEntropyBip39Mnemonic (
194+ mnemonic: ldk.Mnemonic (
195+ seedPhrase:
196+ "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" ))
197+ .setChainSourceEsplora (
198+ esploraServerUrl: esploraUrl, syncConfig: esploraConfig);
199+ final node = await nodeBuilder.build ();
200+ await node.start ();
201+
202+ // Sync wallets to initialize persistence
203+ debugPrint ("Syncing wallets..." );
204+ await node.syncWallets ();
205+ debugPrint ("Sync complete" );
206+
207+ debugPrint ("Testing pathfinding scores API..." );
208+
209+ // Test exporting pathfinding scores
210+ debugPrint ("Testing exportPathfindingScores()..." );
211+ try {
212+ final scores = await node.exportPathfindingScores ();
213+ debugPrint ("Exported pathfinding scores: ${scores .length } bytes" );
214+ expect (scores, isNotNull);
215+ // For a fresh node with no routing data, the scores might be empty or minimal
216+ debugPrint ("Pathfinding scores export successful!" );
217+ } catch (e) {
218+ // persistenceFailed can happen on a fresh node with no routing data
219+ debugPrint ("exportPathfindingScores() returned error (expected for fresh node): $e " );
220+ }
221+
222+ await node.stop ();
223+ debugPrint ("Pathfinding scores test completed!" );
224+ });
225+
226+ testWidgets ('bolt12_async_receive_test' , (WidgetTester tester) async {
227+ await ensureFrbInitialized ();
228+
229+ final config = await initLdkConfig (
230+ 'async_receive' , const ldk.SocketAddress .hostname (addr: "0.0.0.0" , port: 3012 ));
231+ debugPrint ("Creating node for async receive test..." );
232+ final nodeBuilder = ldk.Builder .fromConfig (config: config)
233+ .setEntropyBip39Mnemonic (
234+ mnemonic: ldk.Mnemonic (
235+ seedPhrase:
236+ "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" ))
237+ .setChainSourceEsplora (
238+ esploraServerUrl: esploraUrl, syncConfig: esploraConfig);
239+ final node = await nodeBuilder.build ();
240+ await node.start ();
241+
242+ // Sync wallets
243+ debugPrint ("Syncing wallets..." );
244+ await node.syncWallets ();
245+ debugPrint ("Sync complete" );
246+
247+ debugPrint ("Testing BOLT12 receiveAsync API..." );
248+
249+ // receiveAsyncUnsafe is for async payments (BOLT12 static invoices)
250+ // This requires setting up paths to a static invoice server first
251+ // Without that setup, it's expected to fail with offerCreationFailed
252+ final bolt12Handler = await node.bolt12Payment ();
253+ debugPrint ("Bolt12Payment handler obtained successfully" );
254+
255+ try {
256+ final asyncOffer = await bolt12Handler.receiveAsyncUnsafe ();
257+ debugPrint ("Async offer created: ${asyncOffer .s }" );
258+ expect (asyncOffer.s.isNotEmpty, true );
259+ } catch (e) {
260+ // Expected: offerCreationFailed because we haven't set up
261+ // paths to a static invoice server via setPathsToStaticInvoiceServerUnsafe
262+ debugPrint ("receiveAsyncUnsafe() - expected error without static invoice server setup: $e " );
263+
264+ // Verify the setPathsToStaticInvoiceServerUnsafe API exists
265+ debugPrint ("Verifying setPathsToStaticInvoiceServerUnsafe API exists..." );
266+ // This would need real BlindedMessagePath objects to work
267+ // For now, just verify the method exists on the handler
268+ expect (bolt12Handler.setPathsToStaticInvoiceServerUnsafe, isNotNull);
269+ debugPrint ("setPathsToStaticInvoiceServerUnsafe API verified!" );
270+ }
271+
272+ await node.stop ();
273+ debugPrint ("BOLT12 async receive test completed!" );
274+ });
120275 });
121276}
122277
0 commit comments