From d6e16fb8f0d8fb9f100fd4a59d819bdfb05672b3 Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Sat, 27 Nov 2021 19:09:05 +0100 Subject: [PATCH] return total sent/received in channel information --- .../TransactionBackgroundLoaderTest.java | 21 +++++---- .../cotto/lndmanagej/grpc/GrpcChannels.java | 21 ++++----- .../lndmanagej/grpc/GrpcChannelsTest.java | 26 +++++++--- .../model/BreachForceClosedChannel.java | 8 +--- .../BreachForceClosedChannelBuilder.java | 4 +- .../de/cotto/lndmanagej/model/Channel.java | 22 ++++----- .../model/ChannelCoreInformation.java | 4 ++ .../cotto/lndmanagej/model/ClosedChannel.java | 8 +--- .../model/ClosedChannelBuilder.java | 16 +++++-- .../model/ClosedOrClosingChannel.java | 16 +++++-- .../lndmanagej/model/CoopClosedChannel.java | 8 +--- .../model/CoopClosedChannelBuilder.java | 4 +- .../lndmanagej/model/ForceClosedChannel.java | 8 +--- .../model/ForceClosedChannelBuilder.java | 4 +- .../lndmanagej/model/ForceClosingChannel.java | 6 +-- .../cotto/lndmanagej/model/LocalChannel.java | 10 ++-- .../lndmanagej/model/LocalOpenChannel.java | 31 +++++++++--- .../lndmanagej/model/WaitingCloseChannel.java | 16 +++++-- .../cotto/lndmanagej/model/ChannelTest.java | 2 +- .../model/CoopClosedChannelTest.java | 10 ++++ .../model/ForceClosedChannelTest.java | 10 ++++ .../model/ForceClosingChannelTest.java | 14 ++++-- .../model/LocalOpenChannelTest.java | 18 +++++-- .../model/WaitingCloseChannelTest.java | 18 ++++++- .../model/ForceClosingChannelFixtures.java | 32 +++++++++++-- .../model/LocalOpenChannelFixtures.java | 47 ++++++++++--------- .../model/WaitingCloseChannelFixtures.java | 24 +++++++--- .../controller/ChannelControllerIT.java | 8 ++++ .../controller/dto/ChannelDetailsDto.java | 4 ++ .../lndmanagej/controller/dto/ChannelDto.java | 4 ++ .../controller/dto/ChannelDtoTest.java | 14 ++++++ 31 files changed, 299 insertions(+), 139 deletions(-) create mode 100644 model/src/main/java/de/cotto/lndmanagej/model/ChannelCoreInformation.java diff --git a/backend/src/test/java/de/cotto/lndmanagej/service/TransactionBackgroundLoaderTest.java b/backend/src/test/java/de/cotto/lndmanagej/service/TransactionBackgroundLoaderTest.java index d7e0b578..fff2bde8 100644 --- a/backend/src/test/java/de/cotto/lndmanagej/service/TransactionBackgroundLoaderTest.java +++ b/backend/src/test/java/de/cotto/lndmanagej/service/TransactionBackgroundLoaderTest.java @@ -1,5 +1,6 @@ package de.cotto.lndmanagej.service; +import de.cotto.lndmanagej.model.ChannelCoreInformation; import de.cotto.lndmanagej.model.ChannelPoint; import de.cotto.lndmanagej.model.LocalOpenChannel; import de.cotto.lndmanagej.transactions.service.TransactionService; @@ -23,6 +24,8 @@ import static de.cotto.lndmanagej.model.CoopClosedChannelFixtures.CLOSED_CHANNEL import static de.cotto.lndmanagej.model.ForceClosingChannelFixtures.FORCE_CLOSING_CHANNEL; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL_2; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_RECEIVED; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_SENT; import static de.cotto.lndmanagej.model.OpenInitiator.LOCAL; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; @@ -137,35 +140,35 @@ class TransactionBackgroundLoaderTest { @Test void update_one_unknown() { LocalOpenChannel channel1 = new LocalOpenChannel( - CHANNEL_ID, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); LocalOpenChannel channel2 = new LocalOpenChannel( - CHANNEL_ID_2, - CHANNEL_POINT_2, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID_2, CHANNEL_POINT_2, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); LocalOpenChannel channel3 = new LocalOpenChannel( - CHANNEL_ID_3, - CHANNEL_POINT_3, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID_3, CHANNEL_POINT_3, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); diff --git a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannels.java b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannels.java index 65701213..88141127 100644 --- a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannels.java +++ b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannels.java @@ -1,6 +1,7 @@ package de.cotto.lndmanagej.grpc; import de.cotto.lndmanagej.model.BalanceInformation; +import de.cotto.lndmanagej.model.ChannelCoreInformation; import de.cotto.lndmanagej.model.ChannelId; import de.cotto.lndmanagej.model.ChannelIdResolver; import de.cotto.lndmanagej.model.ChannelPoint; @@ -75,10 +76,7 @@ public class GrpcChannels extends GrpcChannelsBase { PendingChannel pendingChannel = waitingCloseChannel.getChannel(); ChannelPoint channelPoint = ChannelPoint.create(pendingChannel.getChannelPoint()); return resolveChannelId(channelPoint).map(id -> new WaitingCloseChannel( - id, - channelPoint, - Coins.ofSatoshis(pendingChannel.getCapacity()), - ownPubkey, + new ChannelCoreInformation(id, channelPoint, Coins.ofSatoshis(pendingChannel.getCapacity())), ownPubkey, Pubkey.create(pendingChannel.getRemoteNodePub()), getOpenInitiator(pendingChannel.getInitiator()) )); @@ -91,9 +89,7 @@ public class GrpcChannels extends GrpcChannelsBase { PendingChannel pendingChannel = forceClosedChannel.getChannel(); ChannelPoint channelPoint = ChannelPoint.create(pendingChannel.getChannelPoint()); return resolveChannelId(channelPoint).map(id -> new ForceClosingChannel( - id, - channelPoint, - Coins.ofSatoshis(pendingChannel.getCapacity()), + new ChannelCoreInformation(id, channelPoint, Coins.ofSatoshis(pendingChannel.getCapacity())), ownPubkey, Pubkey.create(pendingChannel.getRemoteNodePub()), forceClosedChannel.getClosingTxid(), @@ -117,13 +113,16 @@ public class GrpcChannels extends GrpcChannelsBase { Coins.ofSatoshis(lndChannel.getRemoteConstraints().getChanReserveSat()) ); return new LocalOpenChannel( - ChannelId.fromShortChannelId(lndChannel.getChanId()), - ChannelPoint.create(lndChannel.getChannelPoint()), - Coins.ofSatoshis(lndChannel.getCapacity()), - ownPubkey, + new ChannelCoreInformation( + ChannelId.fromShortChannelId(lndChannel.getChanId()), + ChannelPoint.create(lndChannel.getChannelPoint()), + Coins.ofSatoshis(lndChannel.getCapacity()) + ), ownPubkey, Pubkey.create(lndChannel.getRemotePubkey()), balanceInformation, getOpenInitiator(lndChannel), + Coins.ofSatoshis(lndChannel.getTotalSatoshisSent()), + Coins.ofSatoshis(lndChannel.getTotalSatoshisReceived()), lndChannel.getPrivate(), lndChannel.getActive() ); diff --git a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelsTest.java b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelsTest.java index 5f127fa7..5e3708e3 100644 --- a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelsTest.java +++ b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelsTest.java @@ -3,6 +3,7 @@ package de.cotto.lndmanagej.grpc; import de.cotto.lndmanagej.model.ChannelId; import de.cotto.lndmanagej.model.ChannelIdResolver; import de.cotto.lndmanagej.model.ChannelPoint; +import de.cotto.lndmanagej.model.Coins; import lnrpc.Channel; import lnrpc.ChannelConstraints; import lnrpc.Initiator; @@ -33,6 +34,10 @@ import static de.cotto.lndmanagej.model.ForceClosingChannelFixtures.HTLC_OUTPOIN import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL_2; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL_PRIVATE; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_RECEIVED; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_RECEIVED_2; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_SENT; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_SENT_2; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; import static de.cotto.lndmanagej.model.WaitingCloseChannelFixtures.WAITING_CLOSE_CHANNEL; @@ -67,8 +72,8 @@ class GrpcChannelsTest { @Test void getChannels() { when(grpcService.getChannels()).thenReturn(List.of( - channel(CHANNEL_ID, true, false, true), - channel(CHANNEL_ID_2, false, false, false) + channel(CHANNEL_ID, true, false, true, TOTAL_SENT, TOTAL_RECEIVED), + channel(CHANNEL_ID_2, false, false, false, TOTAL_SENT_2, TOTAL_RECEIVED_2) )); assertThat(grpcChannels.getChannels()).containsExactlyInAnyOrder(LOCAL_OPEN_CHANNEL, LOCAL_OPEN_CHANNEL_2); } @@ -76,7 +81,7 @@ class GrpcChannelsTest { @Test void getChannels_private() { when(grpcService.getChannels()).thenReturn(List.of( - channel(CHANNEL_ID, true, true, true) + channel(CHANNEL_ID, true, true, true, TOTAL_SENT, TOTAL_RECEIVED) )); assertThat(grpcChannels.getChannels()).containsExactlyInAnyOrder(LOCAL_OPEN_CHANNEL_PRIVATE); } @@ -128,8 +133,8 @@ class GrpcChannelsTest { @Test void getChannel() { when(grpcService.getChannels()).thenReturn(List.of( - channel(CHANNEL_ID_2, false, false, false), - channel(CHANNEL_ID, true, false, true) + channel(CHANNEL_ID_2, false, false, false, TOTAL_SENT_2, TOTAL_RECEIVED_2), + channel(CHANNEL_ID, true, false, true, TOTAL_SENT, TOTAL_RECEIVED) )); assertThat(grpcChannels.getChannel(CHANNEL_ID)).contains(LOCAL_OPEN_CHANNEL); } @@ -139,7 +144,14 @@ class GrpcChannelsTest { assertThat(grpcChannels.getChannel(CHANNEL_ID)).isEmpty(); } - private Channel channel(ChannelId channelId, boolean isInitiator, boolean isPrivate, boolean isActive) { + private Channel channel( + ChannelId channelId, + boolean isInitiator, + boolean isPrivate, + boolean isActive, + Coins totalSent, + Coins totalReceived + ) { ChannelConstraints localConstraints = ChannelConstraints.newBuilder() .setChanReserveSat(BALANCE_INFORMATION.localReserve().satoshis()) .build(); @@ -156,6 +168,8 @@ class GrpcChannelsTest { .setLocalConstraints(localConstraints) .setRemoteConstraints(remoteConstraints) .setInitiator(isInitiator) + .setTotalSatoshisSent(totalSent.satoshis()) + .setTotalSatoshisReceived(totalReceived.satoshis()) .setPrivate(isPrivate) .setActive(isActive) .build(); diff --git a/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannel.java b/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannel.java index 80f349ba..1c40afe7 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannel.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannel.java @@ -2,18 +2,14 @@ package de.cotto.lndmanagej.model; public class BreachForceClosedChannel extends ForceClosedChannel { public BreachForceClosedChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, String closeTransactionHash, OpenInitiator openInitiator ) { super( - channelId, - channelPoint, - capacity, + channelCoreInformation, ownPubkey, remotePubkey, closeTransactionHash, diff --git a/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannelBuilder.java b/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannelBuilder.java index a1d1b8cd..d2c87826 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannelBuilder.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/BreachForceClosedChannelBuilder.java @@ -10,9 +10,7 @@ public class BreachForceClosedChannelBuilder extends ClosedChannelBuilder pubkeys; - protected Channel(ChannelId channelId, ChannelPoint channelPoint, Coins capacity, Pubkey pubkey1, Pubkey pubkey2) { + protected Channel(ChannelCoreInformation channelCoreInformation, Pubkey pubkey1, Pubkey pubkey2) { + this.channelCoreInformation = channelCoreInformation; if (pubkey1.equals(pubkey2)) { throw new IllegalArgumentException("Pubkeys must not be the same"); } - this.channelId = channelId; - this.capacity = capacity; - this.channelPoint = channelPoint; this.pubkeys = Set.of(pubkey1, pubkey2); } public Coins getCapacity() { - return capacity; + return channelCoreInformation.capacity(); } public ChannelId getId() { - return channelId; + return channelCoreInformation.channelId(); } public Set getPubkeys() { @@ -32,7 +28,7 @@ public class Channel { } public ChannelPoint getChannelPoint() { - return channelPoint; + return channelCoreInformation.channelPoint(); } @Override @@ -44,14 +40,12 @@ public class Channel { return false; } Channel channel = (Channel) other; - return Objects.equals(channelId, channel.channelId) - && Objects.equals(capacity, channel.capacity) - && Objects.equals(channelPoint, channel.channelPoint) + return Objects.equals(channelCoreInformation, channel.channelCoreInformation) && Objects.equals(pubkeys, channel.pubkeys); } @Override public int hashCode() { - return Objects.hash(channelId, capacity, channelPoint, pubkeys); + return Objects.hash(channelCoreInformation, pubkeys); } } diff --git a/model/src/main/java/de/cotto/lndmanagej/model/ChannelCoreInformation.java b/model/src/main/java/de/cotto/lndmanagej/model/ChannelCoreInformation.java new file mode 100644 index 00000000..86450820 --- /dev/null +++ b/model/src/main/java/de/cotto/lndmanagej/model/ChannelCoreInformation.java @@ -0,0 +1,4 @@ +package de.cotto.lndmanagej.model; + +public record ChannelCoreInformation(ChannelId channelId, ChannelPoint channelPoint, Coins capacity) { +} \ No newline at end of file diff --git a/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannel.java b/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannel.java index f61a97c8..ba71e850 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannel.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannel.java @@ -8,9 +8,7 @@ public abstract class ClosedChannel extends ClosedOrClosingChannel { private final CloseInitiator closeInitiator; public ClosedChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, String closeTransactionHash, @@ -18,9 +16,7 @@ public abstract class ClosedChannel extends ClosedOrClosingChannel { CloseInitiator closeInitiator ) { super( - channelId, - channelPoint, - capacity, + channelCoreInformation, ownPubkey, remotePubkey, closeTransactionHash, diff --git a/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannelBuilder.java b/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannelBuilder.java index d5f6b08d..a093e4fd 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannelBuilder.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/ClosedChannelBuilder.java @@ -2,15 +2,17 @@ package de.cotto.lndmanagej.model; import javax.annotation.Nullable; +import static java.util.Objects.requireNonNull; + public abstract class ClosedChannelBuilder { @Nullable - ChannelId channelId; + private ChannelId channelId; @Nullable - ChannelPoint channelPoint; + private ChannelPoint channelPoint; @Nullable - Coins capacity; + private Coins capacity; @Nullable Pubkey ownPubkey; @@ -71,5 +73,13 @@ public abstract class ClosedChannelBuilder { return this; } + protected ChannelCoreInformation getChannelCoreInformation() { + return new ChannelCoreInformation( + requireNonNull(channelId), + requireNonNull(channelPoint), + requireNonNull(capacity) + ); + } + public abstract T build(); } diff --git a/model/src/main/java/de/cotto/lndmanagej/model/ClosedOrClosingChannel.java b/model/src/main/java/de/cotto/lndmanagej/model/ClosedOrClosingChannel.java index b73541c6..9287140e 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/ClosedOrClosingChannel.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/ClosedOrClosingChannel.java @@ -6,15 +6,13 @@ public abstract class ClosedOrClosingChannel extends LocalChannel { private final String closeTransactionHash; protected ClosedOrClosingChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, String closeTransactionHash, OpenInitiator openInitiator ) { - super(channelId, channelPoint, capacity, ownPubkey, remotePubkey, openInitiator, false); + super(channelCoreInformation, ownPubkey, remotePubkey, openInitiator, false); this.closeTransactionHash = closeTransactionHash; } @@ -22,6 +20,16 @@ public abstract class ClosedOrClosingChannel extends LocalChannel { return closeTransactionHash; } + @Override + public Coins getTotalReceived() { + return Coins.NONE; + } + + @Override + public Coins getTotalSent() { + return Coins.NONE; + } + @Override @SuppressWarnings("CPD-START") public boolean equals(Object other) { diff --git a/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannel.java b/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannel.java index 2aa2be6c..b681089d 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannel.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannel.java @@ -2,9 +2,7 @@ package de.cotto.lndmanagej.model; public class CoopClosedChannel extends ClosedChannel { public CoopClosedChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, String closeTransactionHash, @@ -12,9 +10,7 @@ public class CoopClosedChannel extends ClosedChannel { CloseInitiator closeInitiator ) { super( - channelId, - channelPoint, - capacity, + channelCoreInformation, ownPubkey, remotePubkey, closeTransactionHash, diff --git a/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannelBuilder.java b/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannelBuilder.java index 429df275..39a6341e 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannelBuilder.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/CoopClosedChannelBuilder.java @@ -10,9 +10,7 @@ public class CoopClosedChannelBuilder extends ClosedChannelBuilder htlcOutpoints; public ForceClosingChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, String closeTransactionHash, Set htlcOutpoints, OpenInitiator openInitiator ) { - super(channelId, channelPoint, capacity, ownPubkey, remotePubkey, closeTransactionHash, openInitiator); + super(channelCoreInformation, ownPubkey, remotePubkey, closeTransactionHash, openInitiator); this.htlcOutpoints = htlcOutpoints; } diff --git a/model/src/main/java/de/cotto/lndmanagej/model/LocalChannel.java b/model/src/main/java/de/cotto/lndmanagej/model/LocalChannel.java index 1e4276e7..48292aee 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/LocalChannel.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/LocalChannel.java @@ -8,15 +8,13 @@ public abstract class LocalChannel extends Channel { private final boolean privateChannel; protected LocalChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, OpenInitiator openInitiator, boolean privateChannel ) { - super(channelId, channelPoint, capacity, ownPubkey, remotePubkey); + super(channelCoreInformation, ownPubkey, remotePubkey); this.remotePubkey = remotePubkey; this.openInitiator = openInitiator; this.privateChannel = privateChannel; @@ -36,6 +34,10 @@ public abstract class LocalChannel extends Channel { public abstract ChannelStatus getStatus(); + public abstract Coins getTotalSent(); + + public abstract Coins getTotalReceived(); + @Override @SuppressWarnings("CPD-START") public boolean equals(Object other) { diff --git a/model/src/main/java/de/cotto/lndmanagej/model/LocalOpenChannel.java b/model/src/main/java/de/cotto/lndmanagej/model/LocalOpenChannel.java index 4121b49f..d2bf037b 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/LocalOpenChannel.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/LocalOpenChannel.java @@ -4,21 +4,25 @@ import java.util.Objects; public class LocalOpenChannel extends LocalChannel { private final BalanceInformation balanceInformation; + private final Coins totalSent; + private final Coins totalReceived; private final boolean active; public LocalOpenChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, BalanceInformation balanceInformation, OpenInitiator openInitiator, + Coins totalSent, + Coins totalReceived, boolean isPrivate, boolean active ) { - super(channelId, channelPoint, capacity, ownPubkey, remotePubkey, openInitiator, isPrivate); + super(channelCoreInformation, ownPubkey, remotePubkey, openInitiator, isPrivate); this.balanceInformation = balanceInformation; + this.totalSent = totalSent; + this.totalReceived = totalReceived; this.active = active; } @@ -31,6 +35,16 @@ public class LocalOpenChannel extends LocalChannel { return new ChannelStatus(isPrivateChannel(), active, false, OpenCloseStatus.OPEN); } + @Override + public Coins getTotalSent() { + return totalSent; + } + + @Override + public Coins getTotalReceived() { + return totalReceived; + } + @Override @SuppressWarnings("CPD-START") public boolean equals(Object other) { @@ -44,11 +58,14 @@ public class LocalOpenChannel extends LocalChannel { return false; } LocalOpenChannel that = (LocalOpenChannel) other; - return active == that.active && Objects.equals(balanceInformation, that.balanceInformation); + return active == that.active + && Objects.equals(balanceInformation, that.balanceInformation) + && Objects.equals(totalSent, that.totalSent) + && Objects.equals(totalReceived, that.totalReceived); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), balanceInformation, active); + return Objects.hash(super.hashCode(), balanceInformation, totalSent, totalReceived, active); } -} +} \ No newline at end of file diff --git a/model/src/main/java/de/cotto/lndmanagej/model/WaitingCloseChannel.java b/model/src/main/java/de/cotto/lndmanagej/model/WaitingCloseChannel.java index 30416b67..3dd7aa34 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/WaitingCloseChannel.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/WaitingCloseChannel.java @@ -4,14 +4,22 @@ import static de.cotto.lndmanagej.model.OpenCloseStatus.WAITING_CLOSE; public class WaitingCloseChannel extends LocalChannel { public WaitingCloseChannel( - ChannelId channelId, - ChannelPoint channelPoint, - Coins capacity, + ChannelCoreInformation channelCoreInformation, Pubkey ownPubkey, Pubkey remotePubkey, OpenInitiator openInitiator ) { - super(channelId, channelPoint, capacity, ownPubkey, remotePubkey, openInitiator, false); + super(channelCoreInformation, ownPubkey, remotePubkey, openInitiator, false); + } + + @Override + public Coins getTotalSent() { + return Coins.NONE; + } + + @Override + public Coins getTotalReceived() { + return Coins.NONE; } @Override diff --git a/model/src/test/java/de/cotto/lndmanagej/model/ChannelTest.java b/model/src/test/java/de/cotto/lndmanagej/model/ChannelTest.java index 4d02640a..8c3d86a5 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/ChannelTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/ChannelTest.java @@ -61,7 +61,7 @@ class ChannelTest { Pubkey pubkey1, Pubkey pubkey2 ) { - super(channelId, channelPoint, Coins.ofMilliSatoshis(capacity.milliSatoshis()), pubkey1, pubkey2); + super(new ChannelCoreInformation(channelId, channelPoint, capacity), pubkey1, pubkey2); } } } \ No newline at end of file diff --git a/model/src/test/java/de/cotto/lndmanagej/model/CoopClosedChannelTest.java b/model/src/test/java/de/cotto/lndmanagej/model/CoopClosedChannelTest.java index 1a165613..94e7ab9f 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/CoopClosedChannelTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/CoopClosedChannelTest.java @@ -46,6 +46,16 @@ class CoopClosedChannelTest { assertThat(CLOSED_CHANNEL.getCapacity()).isEqualTo(CAPACITY); } + @Test + void getTotalSent() { + assertThat(CLOSED_CHANNEL.getTotalSent()).isEqualTo(Coins.NONE); + } + + @Test + void getTotalReceived() { + assertThat(CLOSED_CHANNEL.getTotalReceived()).isEqualTo(Coins.NONE); + } + @Test void getChannelPoint() { assertThat(CLOSED_CHANNEL.getChannelPoint()).isEqualTo(CHANNEL_POINT); diff --git a/model/src/test/java/de/cotto/lndmanagej/model/ForceClosedChannelTest.java b/model/src/test/java/de/cotto/lndmanagej/model/ForceClosedChannelTest.java index e8398538..7e3db2ca 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/ForceClosedChannelTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/ForceClosedChannelTest.java @@ -45,6 +45,16 @@ class ForceClosedChannelTest { assertThat(FORCE_CLOSED_CHANNEL_REMOTE.getCapacity()).isEqualTo(CAPACITY); } + @Test + void getTotalSent() { + assertThat(FORCE_CLOSED_CHANNEL_REMOTE.getTotalSent()).isEqualTo(Coins.NONE); + } + + @Test + void getTotalReceived() { + assertThat(FORCE_CLOSED_CHANNEL_REMOTE.getTotalReceived()).isEqualTo(Coins.NONE); + } + @Test void getChannelPoint() { assertThat(FORCE_CLOSED_CHANNEL_REMOTE.getChannelPoint()).isEqualTo(CHANNEL_POINT); diff --git a/model/src/test/java/de/cotto/lndmanagej/model/ForceClosingChannelTest.java b/model/src/test/java/de/cotto/lndmanagej/model/ForceClosingChannelTest.java index 38d27158..5daea477 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/ForceClosingChannelTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/ForceClosingChannelTest.java @@ -19,9 +19,7 @@ class ForceClosingChannelTest { @Test void create() { assertThat(new ForceClosingChannel( - CHANNEL_ID, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, TRANSACTION_HASH_3, @@ -45,6 +43,16 @@ class ForceClosingChannelTest { assertThat(FORCE_CLOSING_CHANNEL.getCapacity()).isEqualTo(CAPACITY); } + @Test + void getTotalSent() { + assertThat(FORCE_CLOSING_CHANNEL.getTotalSent()).isEqualTo(Coins.NONE); + } + + @Test + void getTotalReceived() { + assertThat(FORCE_CLOSING_CHANNEL.getTotalReceived()).isEqualTo(Coins.NONE); + } + @Test void getChannelPoint() { assertThat(FORCE_CLOSING_CHANNEL.getChannelPoint()).isEqualTo(CHANNEL_POINT); diff --git a/model/src/test/java/de/cotto/lndmanagej/model/LocalOpenChannelTest.java b/model/src/test/java/de/cotto/lndmanagej/model/LocalOpenChannelTest.java index 51aaa658..09d2ed4c 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/LocalOpenChannelTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/LocalOpenChannelTest.java @@ -14,6 +14,8 @@ import static de.cotto.lndmanagej.model.ChannelPointFixtures.CHANNEL_POINT; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL_2; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL_PRIVATE; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_RECEIVED; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_SENT; import static de.cotto.lndmanagej.model.OpenCloseStatus.OPEN; import static de.cotto.lndmanagej.model.OpenInitiator.LOCAL; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; @@ -29,13 +31,13 @@ class LocalOpenChannelTest { @Test void getRemotePubkey_swapped() { LocalOpenChannel localOpenChannel = new LocalOpenChannel( - CHANNEL_ID, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), PUBKEY_2, PUBKEY, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); @@ -67,6 +69,16 @@ class LocalOpenChannelTest { assertThat(LOCAL_OPEN_CHANNEL.getOpenInitiator()).isEqualTo(LOCAL); } + @Test + void getTotalSent() { + assertThat(LOCAL_OPEN_CHANNEL.getTotalSent()).isEqualTo(TOTAL_SENT); + } + + @Test + void getTotalReceived() { + assertThat(LOCAL_OPEN_CHANNEL.getTotalReceived()).isEqualTo(TOTAL_RECEIVED); + } + @Test void isPrivateChannel_false() { assertThat(LOCAL_OPEN_CHANNEL.isPrivateChannel()).isFalse(); diff --git a/model/src/test/java/de/cotto/lndmanagej/model/WaitingCloseChannelTest.java b/model/src/test/java/de/cotto/lndmanagej/model/WaitingCloseChannelTest.java index 14706a2d..85e53577 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/WaitingCloseChannelTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/WaitingCloseChannelTest.java @@ -15,8 +15,12 @@ import static org.assertj.core.api.Assertions.assertThat; class WaitingCloseChannelTest { @Test void create() { - assertThat(new WaitingCloseChannel(CHANNEL_ID, CHANNEL_POINT, CAPACITY, PUBKEY, PUBKEY_2, OpenInitiator.LOCAL)) - .isEqualTo(WAITING_CLOSE_CHANNEL); + assertThat(new WaitingCloseChannel( + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), + PUBKEY, + PUBKEY_2, + OpenInitiator.LOCAL) + ).isEqualTo(WAITING_CLOSE_CHANNEL); } @Test @@ -34,6 +38,16 @@ class WaitingCloseChannelTest { assertThat(WAITING_CLOSE_CHANNEL.getCapacity()).isEqualTo(CAPACITY); } + @Test + void getTotalSent() { + assertThat(WAITING_CLOSE_CHANNEL.getTotalSent()).isEqualTo(Coins.NONE); + } + + @Test + void getTotalReceived() { + assertThat(WAITING_CLOSE_CHANNEL.getTotalReceived()).isEqualTo(Coins.NONE); + } + @Test void getChannelPoint() { assertThat(WAITING_CLOSE_CHANNEL.getChannelPoint()).isEqualTo(CHANNEL_POINT); diff --git a/model/src/testFixtures/java/de/cotto/lndmanagej/model/ForceClosingChannelFixtures.java b/model/src/testFixtures/java/de/cotto/lndmanagej/model/ForceClosingChannelFixtures.java index 21120a5c..1cd65f7d 100644 --- a/model/src/testFixtures/java/de/cotto/lndmanagej/model/ForceClosingChannelFixtures.java +++ b/model/src/testFixtures/java/de/cotto/lndmanagej/model/ForceClosingChannelFixtures.java @@ -21,11 +21,35 @@ public class ForceClosingChannelFixtures { public static final ChannelPoint HTLC_OUTPOINT = CHANNEL_POINT_3; public static final Set HTLC_OUTPOINTS = Set.of(HTLC_OUTPOINT); public static final ForceClosingChannel FORCE_CLOSING_CHANNEL = new ForceClosingChannel( - CHANNEL_ID, CHANNEL_POINT, CAPACITY, PUBKEY, PUBKEY_2, TRANSACTION_HASH_3, HTLC_OUTPOINTS, LOCAL); + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), + PUBKEY, + PUBKEY_2, + TRANSACTION_HASH_3, + HTLC_OUTPOINTS, + LOCAL + ); public static final ForceClosingChannel FORCE_CLOSING_CHANNEL_2 = new ForceClosingChannel( - CHANNEL_ID_2, CHANNEL_POINT_2, CAPACITY, PUBKEY, PUBKEY_2, TRANSACTION_HASH_3, HTLC_OUTPOINTS, REMOTE); + new ChannelCoreInformation(CHANNEL_ID_2, CHANNEL_POINT_2, CAPACITY), + PUBKEY, + PUBKEY_2, + TRANSACTION_HASH_3, + HTLC_OUTPOINTS, + REMOTE + ); public static final ForceClosingChannel FORCE_CLOSING_CHANNEL_3 = new ForceClosingChannel( - CHANNEL_ID_3, CHANNEL_POINT, CAPACITY, PUBKEY, PUBKEY_2, TRANSACTION_HASH_3, HTLC_OUTPOINTS, UNKNOWN); + new ChannelCoreInformation(CHANNEL_ID_3, CHANNEL_POINT, CAPACITY), + PUBKEY, + PUBKEY_2, + TRANSACTION_HASH_3, + HTLC_OUTPOINTS, + UNKNOWN + ); public static final ForceClosingChannel FORCE_CLOSING_CHANNEL_TO_NODE_3 = new ForceClosingChannel( - CHANNEL_ID_3, CHANNEL_POINT, CAPACITY, PUBKEY, PUBKEY_3, TRANSACTION_HASH_3, HTLC_OUTPOINTS, LOCAL); + new ChannelCoreInformation(CHANNEL_ID_3, CHANNEL_POINT, CAPACITY), + PUBKEY, + PUBKEY_3, + TRANSACTION_HASH_3, + HTLC_OUTPOINTS, + LOCAL + ); } diff --git a/model/src/testFixtures/java/de/cotto/lndmanagej/model/LocalOpenChannelFixtures.java b/model/src/testFixtures/java/de/cotto/lndmanagej/model/LocalOpenChannelFixtures.java index 1f624159..f1ad3852 100644 --- a/model/src/testFixtures/java/de/cotto/lndmanagej/model/LocalOpenChannelFixtures.java +++ b/model/src/testFixtures/java/de/cotto/lndmanagej/model/LocalOpenChannelFixtures.java @@ -16,87 +16,92 @@ import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_3; public class LocalOpenChannelFixtures { + public static final Coins TOTAL_SENT = Coins.ofSatoshis(1_001); + public static final Coins TOTAL_SENT_2 = Coins.ofSatoshis(101); + public static final Coins TOTAL_RECEIVED = Coins.ofSatoshis(2_002); + public static final Coins TOTAL_RECEIVED_2 = Coins.ofSatoshis(202); + public static final LocalOpenChannel LOCAL_OPEN_CHANNEL = new LocalOpenChannel( - CHANNEL_ID, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); public static final LocalOpenChannel LOCAL_OPEN_CHANNEL_MORE_BALANCE = new LocalOpenChannel( - CHANNEL_ID, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION_2, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); public static final LocalOpenChannel LOCAL_OPEN_CHANNEL_PRIVATE = new LocalOpenChannel( - CHANNEL_ID, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, true, true ); public static final LocalOpenChannel LOCAL_OPEN_CHANNEL_2 = new LocalOpenChannel( - CHANNEL_ID_2, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID_2, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION, REMOTE, + TOTAL_SENT_2, + TOTAL_RECEIVED_2, false, false ); public static final LocalOpenChannel LOCAL_OPEN_CHANNEL_MORE_BALANCE_2 = new LocalOpenChannel( - CHANNEL_ID_2, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID_2, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION_2, REMOTE, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); public static final LocalOpenChannel LOCAL_OPEN_CHANNEL_3 = new LocalOpenChannel( - CHANNEL_ID_3, - CHANNEL_POINT, - CAPACITY, + new ChannelCoreInformation(CHANNEL_ID_3, CHANNEL_POINT, CAPACITY), PUBKEY, PUBKEY_2, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); public static final LocalOpenChannel LOCAL_OPEN_CHANNEL_TO_NODE_3 = new LocalOpenChannel( - CHANNEL_ID_4, - CHANNEL_POINT, - CAPACITY_2, + new ChannelCoreInformation(CHANNEL_ID_4, CHANNEL_POINT, CAPACITY_2), PUBKEY, PUBKEY_3, BALANCE_INFORMATION, LOCAL, + TOTAL_SENT, + TOTAL_RECEIVED, false, true ); diff --git a/model/src/testFixtures/java/de/cotto/lndmanagej/model/WaitingCloseChannelFixtures.java b/model/src/testFixtures/java/de/cotto/lndmanagej/model/WaitingCloseChannelFixtures.java index 3b0ea973..4ca8100b 100644 --- a/model/src/testFixtures/java/de/cotto/lndmanagej/model/WaitingCloseChannelFixtures.java +++ b/model/src/testFixtures/java/de/cotto/lndmanagej/model/WaitingCloseChannelFixtures.java @@ -13,10 +13,22 @@ import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_3; public class WaitingCloseChannelFixtures { - public static final WaitingCloseChannel WAITING_CLOSE_CHANNEL = - new WaitingCloseChannel(CHANNEL_ID, CHANNEL_POINT, CAPACITY, PUBKEY, PUBKEY_2, LOCAL); - public static final WaitingCloseChannel WAITING_CLOSE_CHANNEL_2 - = new WaitingCloseChannel(CHANNEL_ID_2, CHANNEL_POINT_2, CAPACITY, PUBKEY, PUBKEY_2, REMOTE); - public static final WaitingCloseChannel WAITING_CLOSE_CHANNEL_TO_NODE_3 = - new WaitingCloseChannel(CHANNEL_ID_3, CHANNEL_POINT, CAPACITY, PUBKEY, PUBKEY_3, LOCAL); + public static final WaitingCloseChannel WAITING_CLOSE_CHANNEL = new WaitingCloseChannel( + new ChannelCoreInformation(CHANNEL_ID, CHANNEL_POINT, CAPACITY), + PUBKEY, + PUBKEY_2, + LOCAL + ); + public static final WaitingCloseChannel WAITING_CLOSE_CHANNEL_2 = new WaitingCloseChannel( + new ChannelCoreInformation(CHANNEL_ID_2, CHANNEL_POINT_2, CAPACITY), + PUBKEY, + PUBKEY_2, + REMOTE + ); + public static final WaitingCloseChannel WAITING_CLOSE_CHANNEL_TO_NODE_3 = new WaitingCloseChannel( + new ChannelCoreInformation(CHANNEL_ID_3, CHANNEL_POINT, CAPACITY), + PUBKEY, + PUBKEY_3, + LOCAL + ); } diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java index 7b8aca68..38b26383 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java @@ -24,6 +24,10 @@ import static de.cotto.lndmanagej.model.FeeConfigurationFixtures.FEE_CONFIGURATI import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL_2; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL_PRIVATE; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_RECEIVED; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_RECEIVED_2; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_SENT; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_SENT_2; import static de.cotto.lndmanagej.model.NodeFixtures.ALIAS_2; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; import static org.hamcrest.core.Is.is; @@ -74,6 +78,8 @@ class ChannelControllerIT { .andExpect(jsonPath("$.channelPoint", is(CHANNEL_POINT.toString()))) .andExpect(jsonPath("$.remotePubkey", is(PUBKEY_2.toString()))) .andExpect(jsonPath("$.capacity", is(String.valueOf(CAPACITY.satoshis())))) + .andExpect(jsonPath("$.totalSent", is(String.valueOf(TOTAL_SENT_2.satoshis())))) + .andExpect(jsonPath("$.totalReceived", is(String.valueOf(TOTAL_RECEIVED_2.satoshis())))) .andExpect(jsonPath("$.openInitiator", is("REMOTE"))) .andExpect(jsonPath("$.openHeight", is(CHANNEL_ID_2.getBlockHeight()))) .andExpect(jsonPath("$.status.private", is(false))) @@ -104,6 +110,8 @@ class ChannelControllerIT { .andExpect(jsonPath("$.remotePubkey", is(PUBKEY_2.toString()))) .andExpect(jsonPath("$.remoteAlias", is(ALIAS_2))) .andExpect(jsonPath("$.capacity", is(String.valueOf(CAPACITY.satoshis())))) + .andExpect(jsonPath("$.totalSent", is(String.valueOf(TOTAL_SENT.satoshis())))) + .andExpect(jsonPath("$.totalReceived", is(String.valueOf(TOTAL_RECEIVED.satoshis())))) .andExpect(jsonPath("$.openInitiator", is("LOCAL"))) .andExpect(jsonPath("$.openHeight", is(CHANNEL_ID.getBlockHeight()))) .andExpect(jsonPath("$.status.private", is(true))) diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDto.java b/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDto.java index e7f2600e..0031a24b 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDto.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDto.java @@ -16,6 +16,8 @@ public record ChannelDetailsDto( OpenInitiator openInitiator, String remoteAlias, String capacity, + String totalSent, + String totalReceived, ChannelStatusDto status, BalanceInformationDto balance, OnChainCostsDto onChainCosts, @@ -38,6 +40,8 @@ public record ChannelDetailsDto( channelDto.openInitiator(), remoteAlias, channelDto.capacity(), + channelDto.totalSent(), + channelDto.totalReceived(), channelDto.status(), BalanceInformationDto.createFrom(balanceInformation), onChainCosts, diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDto.java b/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDto.java index 79e63165..5e249dd2 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDto.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/dto/ChannelDto.java @@ -13,6 +13,8 @@ public record ChannelDto( int openHeight, Pubkey remotePubkey, String capacity, + String totalSent, + String totalReceived, ChannelStatusDto status, OpenInitiator openInitiator ) { @@ -25,6 +27,8 @@ public record ChannelDto( localChannel.getId().getBlockHeight(), localChannel.getRemotePubkey(), String.valueOf(localChannel.getCapacity().satoshis()), + String.valueOf(localChannel.getTotalSent().satoshis()), + String.valueOf(localChannel.getTotalReceived().satoshis()), ChannelStatusDto.createFrom(localChannel.getStatus()), localChannel.getOpenInitiator() ); diff --git a/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDtoTest.java b/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDtoTest.java index 804f77a9..55126bea 100644 --- a/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDtoTest.java +++ b/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDtoTest.java @@ -9,6 +9,8 @@ import static de.cotto.lndmanagej.model.ChannelIdFixtures.CHANNEL_ID; import static de.cotto.lndmanagej.model.ChannelPointFixtures.CHANNEL_POINT; import static de.cotto.lndmanagej.model.CoopClosedChannelFixtures.CLOSED_CHANNEL; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_RECEIVED; +import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.TOTAL_SENT; import static de.cotto.lndmanagej.model.OpenCloseStatus.OPEN; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; import static org.assertj.core.api.Assertions.assertThat; @@ -51,6 +53,18 @@ class ChannelDtoTest { assertThat(CHANNEL_DTO.capacity()).isEqualTo(String.valueOf(CAPACITY.satoshis())); } + @Test + void totalSent() { + assertThat(new ChannelDto(LOCAL_OPEN_CHANNEL).totalSent()) + .isEqualTo(String.valueOf(TOTAL_SENT.satoshis())); + } + + @Test + void totalReceived() { + assertThat(new ChannelDto(LOCAL_OPEN_CHANNEL).totalReceived()) + .isEqualTo(String.valueOf(TOTAL_RECEIVED.satoshis())); + } + @Test void openInitiator() { assertThat(CHANNEL_DTO.openInitiator()).isEqualTo(OpenInitiator.LOCAL);