Skip to content

Commit 2a1d5a8

Browse files
committed
wip
1 parent fd908f6 commit 2a1d5a8

File tree

11 files changed

+151
-65
lines changed

11 files changed

+151
-65
lines changed

.github/workflows/dotnet.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ jobs:
1616
- name: Setup .NET
1717
uses: actions/setup-dotnet@v4
1818
with:
19-
dotnet-version: 9.0.x
20-
- name: Setup .NET 8.0
21-
uses: actions/setup-dotnet@v4
22-
with:
23-
dotnet-version: 8.0.x
19+
dotnet-version: 10.0.x
2420
- name: Restore dependencies
2521
run: dotnet restore
2622
- name: Check code formatting
@@ -33,7 +29,7 @@ jobs:
3329
run: |
3430
cdir=`pwd`
3531
cd LNUnit.Tests
36-
dotnet test -f net8.0 --filter FullyQualifiedName~LNUnit.Test --no-build --verbosity normal -l "console;verbosity=detailed" --collect:"XPlat Code Coverage" --logger "trx;LogFileName=test-results.trx" --results-directory $cdir/coverage
32+
dotnet test --filter FullyQualifiedName~LNUnit.Test --no-build --verbosity normal -l "console;verbosity=detailed" --collect:"XPlat Code Coverage" --logger "trx;LogFileName=test-results.trx" --results-directory $cdir/coverage
3733
- name: Test Report
3834
uses: dorny/test-reporter@v1
3935
if: success() || failure() # run this step even if previous step failed

.github/workflows/nuget.yml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,7 @@ jobs:
1414
- name: Setup .NET
1515
uses: actions/setup-dotnet@v4
1616
with:
17-
dotnet-version: 9.0.x
18-
- name: Setup .NET 8.0
19-
uses: actions/setup-dotnet@v4
20-
with:
21-
dotnet-version: 8.0.x
17+
dotnet-version: 10.0.x
2218
- name: Restore dependencies
2319
run: dotnet restore
2420
- name: Build

.github/workflows/pr.yml

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,12 @@ jobs:
1313

1414
runs-on: ubuntu-latest
1515

16-
steps:
16+
steps:
1717
- uses: actions/checkout@v4
1818
- name: Setup .NET
1919
uses: actions/setup-dotnet@v4
2020
with:
21-
dotnet-version: 9.0.x
22-
- name: Setup .NET 8.0
23-
uses: actions/setup-dotnet@v4
24-
with:
25-
dotnet-version: 8.0.x
21+
dotnet-version: 10.0.x
2622
- name: Restore dependencies
2723
run: dotnet restore
2824
- name: Check code formatting
@@ -32,7 +28,7 @@ jobs:
3228
- name: Build
3329
run: dotnet build --no-restore
3430
- name: Test
35-
run: dotnet test -f net8.0 --no-build --verbosity normal -l "console;verbosity=detailed" --collect:"XPlat Code Coverage" --logger "trx;LogFileName=test-results.trx" --results-directory ./coverage
31+
run: dotnet test --no-build --verbosity normal -l "console;verbosity=detailed" --collect:"XPlat Code Coverage" --logger "trx;LogFileName=test-results.trx" --results-directory ./coverage
3632
- name: Code Coverage Report
3733
uses: irongut/CodeCoverageSummary@v1.3.0
3834
with:

LNBolt.Tests/LNBolt.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
1616
<PackageReference Include="NLightning.Bolt11" Version="4.0.0" />
1717
<PackageReference Include="NUnit" Version="3.14.0" />
18-
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
18+
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
1919
<PackageReference Include="org.ldk" Version="0.1.5" />
2020
<PackageReference Include="coverlet.collector" Version="6.0.4">
2121
<PrivateAssets>all</PrivateAssets>

LNBolt/LNBolt.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<PackageProjectUrl>https://github.com/rsafier/LNBolt</PackageProjectUrl>
88
<PackageId>LNBolt</PackageId>
9-
<Version>1.7.8</Version>
9+
<Version>1.9.0</Version>
1010
<Authors>Richard Safier</Authors>
1111
<PackageDescription>LNBolt - C# BOLT protocol helpers</PackageDescription>
1212
<RepositoryUrl>https://github.com/rsafier/LNBolt</RepositoryUrl>
@@ -17,7 +17,7 @@
1717
<PackageReference Include="EndianBinaryIO" Version="1.1.2"/>
1818
<PackageReference Include="Google.Protobuf" Version="3.32.1" />
1919
<PackageReference Include="Grpc.Net.Client" Version="2.71.0" />
20-
<PackageReference Include="NBitcoin" Version="7.0.50" />
20+
<PackageReference Include="NBitcoin" Version="9.0.1" />
2121
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0"/>
2222
<PackageReference Include="ServiceStack.Text" Version="8.8.0" />
2323
<None Include="README.md" Pack="true" PackagePath="\"/>

LNUnit.LND/LNUnit.LND.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
<Nullable>enable</Nullable>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<PackageId>LNUnit.LND</PackageId>
8-
<Version>1.8.7</Version>
8+
<Version>1.9.0</Version>
99
<PackageDescription>LNUnit LND Typed Clients</PackageDescription>
10-
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
10+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
1111
<LangVersion>12.0</LangVersion>
1212
</PropertyGroup>
1313

@@ -34,7 +34,7 @@
3434

3535
<PackageReference Include="Microsoft.NETCore.Targets" Version="5.0.0"/>
3636

37-
<PackageReference Include="NBitcoin" Version="7.0.50" />
37+
<PackageReference Include="NBitcoin" Version="9.0.1" />
3838

3939
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0"/>
4040

LNUnit.Tests/Abstract/AbcLightningAbstractTests.cs

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -335,66 +335,72 @@ public async Task<bool> IsRunning()
335335
//
336336
// }
337337

338-
private PSBT CreatePsbtOutputTemplate(int numberOfOutputs, string destinationAddress, long amountPerOutputSats, Network network)
339-
{
340-
if (numberOfOutputs <= 0 || amountPerOutputSats <= 0)
341-
throw new ArgumentException("Number of outputs and amount per output must be greater than zero.");
342-
343-
BitcoinAddress address = BitcoinAddress.Create(destinationAddress, network);
344-
345-
// Create a transaction
346-
var tx = NBitcoin.Transaction.Create(network);
347-
348-
// // Add dummy inputs
349-
// tx.Inputs.Add(new TxIn(new OutPoint(uint256.Zero, 0)));
350-
351-
// Add outputs
352-
for (int i = 0; i < numberOfOutputs; i++)
353-
{
354-
tx.Outputs.Add(new TxOut(Money.Satoshis(amountPerOutputSats), address));
355-
}
338+
// private PSBT CreatePsbtOutputTemplate(int numberOfOutputs, string destinationAddress, long amountPerOutputSats, Network network)
339+
// {
340+
// if (numberOfOutputs <= 0 || amountPerOutputSats <= 0)
341+
// throw new ArgumentException("Number of outputs and amount per output must be greater than zero.");
342+
//
343+
// BitcoinAddress address = BitcoinAddress.Create(destinationAddress, network);
344+
//
345+
// // Create a transaction
346+
// var tx = NBitcoin.Transaction.Create(network);
347+
//
348+
// // // Add dummy inputs
349+
// // tx.Inputs.Add(new TxIn(new OutPoint(uint256.Zero, 0)));
350+
//
351+
// // Add outputs
352+
// for (int i = 0; i < numberOfOutputs; i++)
353+
// {
354+
// tx.Outputs.Add(new TxOut(Money.Satoshis(amountPerOutputSats), address));
355+
// }
356+
//
357+
// // Create PSBT from the transaction
358+
// return PSBT.FromTransaction(tx, network);
359+
// }
356360

357-
// Create PSBT from the transaction
358-
return PSBT.FromTransaction(tx, network);
361+
private async Task<string> CreatePsbtOutputTemplateBitcoinRPC(int numberOfOutputs, string destinationAddress, long amountPerOutputSats, Network network)
362+
{
363+
return await Builder.BitcoinRpcClient.CreateMultiOutputPsbt(destinationAddress, amountPerOutputSats,
364+
numberOfOutputs);
359365
}
360-
361-
[TestCase(2,"bcrt1pau9xpav22lr592a2fgldkqy65e42uz5gdgy8et6kgvkrtep5gkeq07uyla",1000,"regtest")]
366+
367+
[TestCase(2, "bcrt1pau9xpav22lr592a2fgldkqy65e42uz5gdgy8et6kgvkrtep5gkeq07uyla", 1000, "regtest")]
362368
[Category("PSBT")]
363-
public async Task PSBTFlow(int numberOfOutputs, string depositAddress,int amountPerOutputSats, string network, ulong feeRate=1)
369+
public async Task PSBTFlow(int numberOfOutputs, string depositAddress, int amountPerOutputSats, string network, ulong feeRate = 1)
364370
{
365-
var n = Network.GetNetwork(network);
366-
var p = CreatePsbtOutputTemplate(numberOfOutputs, depositAddress, amountPerOutputSats, n);
371+
var networkChain = Network.GetNetwork(network);
372+
var psbtOutputTemplate = await CreatePsbtOutputTemplateBitcoinRPC(numberOfOutputs, depositAddress, amountPerOutputSats, networkChain);
367373
//This verifies is fundable, and leases outputs.
368374
var fundReq = new FundPsbtRequest()
369375
{
370-
Psbt = ByteString.FromBase64(p.ToBase64())
376+
Psbt = ByteString.FromBase64(psbtOutputTemplate)
371377
};
372378

373379
fundReq.SatPerVbyte = feeRate;
374-
var node = Builder.LNDNodePool.GetLNDNodeConnection();
380+
var node = Builder.LNDNodePool.GetLNDNodeConnection();
375381

376382
var fundedPsbt = node.WalletKitClient.FundPsbt(fundReq);
377-
383+
378384
//extract txId
379-
var psbt = PSBT.Parse(fundedPsbt.FundedPsbt.ToBase64(), n);
385+
var psbt = PSBT.Parse(fundedPsbt.FundedPsbt.ToBase64(), networkChain);
380386
var txIdHexString = psbt.GetGlobalTransaction().GetHash().ToString();
381387
Console.WriteLine($"LoopStaticInDeposit: Generated funded TX: {txIdHexString}");
382-
388+
383389
//Signs and returns raw tx to transmit
384390
var finalizedPsbt = node.WalletKitClient.FinalizePsbt(new FinalizePsbtRequest()
385391
{
386392
FundedPsbt = fundedPsbt.FundedPsbt
387-
});
393+
});
388394
Console.WriteLine($"LoopStaticInDeposit: Finalized TX: {txIdHexString}");
389-
395+
390396
//Publish
391397
var publicRes = node.WalletKitClient.PublishTransaction(new Transaction()
392398
{
393399
Label = $"Loop Static In Split",
394400
TxHex = finalizedPsbt.RawFinalTx
395-
});
401+
});
396402
}
397-
403+
398404
[Test]
399405
[Category("Payment")]
400406
[NonParallelizable]

LNUnit.Tests/LNUnit.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net9.0</TargetFrameworks>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<Version>0.2.2</Version>
@@ -25,7 +25,7 @@
2525
<!-- <PackageReference Include="NLightning.Bolt11" Version="4.0.0" />-->
2626
<PackageReference Include="Npgsql" Version="9.0.3" />
2727
<PackageReference Include="NUnit" Version="3.14.0" />
28-
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
28+
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
2929
<PackageReference Include="NUnit.Analyzers" Version="4.10.0">
3030
<PrivateAssets>all</PrivateAssets>
3131
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using NBitcoin;
2+
using NBitcoin.RPC;
3+
4+
namespace LNUnit.Tests;
5+
6+
public static class PsbtMultiOutputBuilderExtensions
7+
{
8+
/// <summary>
9+
/// Creates a PSBT template with n outputs to the same destination address, no inputs
10+
/// </summary>
11+
public static async Task<string> CreateMultiOutputPsbt(this RPCClient rpcClient,
12+
string destinationAddress,
13+
decimal amountPerOutput,
14+
int numberOfOutputs)
15+
{
16+
// Get the scriptPubKey for the address
17+
var address = BitcoinAddress.Create(destinationAddress, rpcClient.Network);
18+
var scriptPubKey = address.ScriptPubKey;
19+
20+
// Build raw transaction manually
21+
var rawTxHex = BuildRawTransaction(scriptPubKey, amountPerOutput, numberOfOutputs);
22+
23+
// Convert to PSBT using RPC
24+
var psbt = await rpcClient.SendCommandAsync("converttopsbt", rawTxHex);
25+
return psbt.Result.ToString();
26+
}
27+
28+
private static string BuildRawTransaction(Script scriptPubKey, decimal amountPerOutput, int numberOfOutputs)
29+
{
30+
using var stream = new MemoryStream();
31+
using var writer = new BinaryWriter(stream);
32+
33+
// Version (4 bytes)
34+
writer.Write((uint)2);
35+
36+
// Input count (variable length integer) - 0 inputs
37+
WriteVarInt(writer, 0);
38+
39+
// Output count
40+
WriteVarInt(writer, (ulong)numberOfOutputs);
41+
42+
// Write each output
43+
var scriptBytes = scriptPubKey.ToBytes();
44+
var satoshis = (ulong)(amountPerOutput);
45+
46+
for (int i = 0; i < numberOfOutputs; i++)
47+
{
48+
// Amount in satoshis (8 bytes, little-endian)
49+
writer.Write(satoshis);
50+
51+
// Script length
52+
WriteVarInt(writer, (ulong)scriptBytes.Length);
53+
54+
// Script
55+
writer.Write(scriptBytes);
56+
}
57+
58+
// Locktime (4 bytes)
59+
writer.Write((uint)0);
60+
61+
// Convert to hex
62+
return BytesToHex(stream.ToArray());
63+
}
64+
65+
private static void WriteVarInt(BinaryWriter writer, ulong value)
66+
{
67+
if (value < 0xfd)
68+
{
69+
writer.Write((byte)value);
70+
}
71+
else if (value <= 0xffff)
72+
{
73+
writer.Write((byte)0xfd);
74+
writer.Write((ushort)value);
75+
}
76+
else if (value <= 0xffffffff)
77+
{
78+
writer.Write((byte)0xfe);
79+
writer.Write((uint)value);
80+
}
81+
else
82+
{
83+
writer.Write((byte)0xff);
84+
writer.Write(value);
85+
}
86+
}
87+
88+
private static string BytesToHex(byte[] bytes)
89+
{
90+
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
91+
}
92+
}

LNUnit/LNUnit.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<Project Sdk="Microsoft.NET.Sdk.Web">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
4+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
55
<Nullable>enable</Nullable>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
8-
<Version>1.8.7</Version>
8+
<Version>1.9.0</Version>
99
<IsPackable>true</IsPackable>
1010
<PackageId>LNUnit</PackageId>
1111
<PackageDescription>Lightning Network Unit Testing Framework</PackageDescription>
@@ -18,10 +18,10 @@
1818
<PackageReference Include="Grpc.Net.Client" Version="2.71.0" />
1919
<PackageReference Include="Grpc.Net.Common" Version="2.71.0" />
2020

21-
<PackageReference Include="NBitcoin" Version="7.0.50" />
21+
<PackageReference Include="NBitcoin" Version="9.0.1" />
2222
<PackageReference Include="ServiceStack" Version="8.8.0" />
2323
<PackageReference Include="SharpCompress" Version="0.40.0" />
24-
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.4" />
24+
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.5" />
2525
<PackageReference Include="Docker.DotNet" Version="3.125.15"/>
2626
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1"/>
2727
</ItemGroup>

0 commit comments

Comments
 (0)