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 21aaa1db..00c4bf1c 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/ChannelControllerIT.java @@ -12,6 +12,7 @@ import de.cotto.lndmanagej.service.NodeService; import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; import de.cotto.lndmanagej.service.PolicyService; +import de.cotto.lndmanagej.service.RebalanceService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -81,6 +82,9 @@ class ChannelControllerIT { @MockBean private FeeService feeService; + @MockBean + private RebalanceService rebalanceService; + @Test void getBasicInformation_not_found() throws Exception { mockMvc.perform(get(CHANNEL_PREFIX + "/")) @@ -134,6 +138,8 @@ class ChannelControllerIT { when(offChainCostService.getOffChainCostsForChannel(CHANNEL_ID)).thenReturn(OFF_CHAIN_COSTS); when(balanceService.getBalanceInformation(CHANNEL_ID)).thenReturn(Optional.of(BALANCE_INFORMATION_2)); when(feeService.getFeeReportForChannel(CHANNEL_ID)).thenReturn(FEE_REPORT); + when(rebalanceService.getRebalanceAmountFromChannel(CHANNEL_ID)).thenReturn(Coins.ofMilliSatoshis(1)); + when(rebalanceService.getRebalanceAmountToChannel(CHANNEL_ID)).thenReturn(Coins.ofMilliSatoshis(2)); mockMvc.perform(get(DETAILS_PREFIX)) .andExpect(jsonPath("$.channelIdShort", is(String.valueOf(CHANNEL_ID.getShortChannelId())))) .andExpect(jsonPath("$.channelIdCompact", is(CHANNEL_ID.getCompactForm()))) @@ -155,6 +161,8 @@ class ChannelControllerIT { .andExpect(jsonPath("$.onChainCosts.sweepCosts", is("3000"))) .andExpect(jsonPath("$.offChainCosts.rebalanceSource", is("1000000"))) .andExpect(jsonPath("$.offChainCosts.rebalanceTarget", is("2000000"))) + .andExpect(jsonPath("$.rebalanceSourceAmount", is("1"))) + .andExpect(jsonPath("$.rebalanceTargetAmount", is("2"))) .andExpect(jsonPath("$.balance.localBalance", is("2000"))) .andExpect(jsonPath("$.balance.localReserve", is("200"))) .andExpect(jsonPath("$.balance.localAvailable", is("1800"))) @@ -177,6 +185,8 @@ class ChannelControllerIT { when(feeService.getFeeReportForChannel(CHANNEL_ID)).thenReturn(new FeeReport(Coins.NONE, Coins.NONE)); when(onChainCostService.getOnChainCostsForChannelId(CHANNEL_ID)).thenReturn(OnChainCosts.NONE); when(offChainCostService.getOffChainCostsForChannel(CHANNEL_ID)).thenReturn(OffChainCosts.NONE); + when(rebalanceService.getRebalanceAmountFromChannel(CHANNEL_ID)).thenReturn(Coins.NONE); + when(rebalanceService.getRebalanceAmountToChannel(CHANNEL_ID)).thenReturn(Coins.NONE); mockMvc.perform(get(DETAILS_PREFIX)) .andExpect(jsonPath("$.closeDetails.initiator", is("REMOTE"))) .andExpect(jsonPath("$.closeDetails.height", is(987_654))) diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java index 4922a13e..a6f21913 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java @@ -10,6 +10,7 @@ import de.cotto.lndmanagej.service.FeeService; import de.cotto.lndmanagej.service.NodeService; import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; +import de.cotto.lndmanagej.service.RebalanceService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -70,6 +71,9 @@ class NodeControllerIT { @MockBean private FeeService feeService; + @MockBean + private RebalanceService rebalanceService; + @Test void getAlias() throws Exception { when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); @@ -88,6 +92,8 @@ class NodeControllerIT { when(offChainCostService.getOffChainCostsForPeer(PUBKEY_2)).thenReturn(OFF_CHAIN_COSTS); when(balanceService.getBalanceInformationForPeer(PUBKEY_2)).thenReturn(BALANCE_INFORMATION); when(feeService.getFeeReportForPeer(PUBKEY_2)).thenReturn(FEE_REPORT); + when(rebalanceService.getRebalanceAmountFromPeer(PUBKEY_2)).thenReturn(Coins.ofMilliSatoshis(1)); + when(rebalanceService.getRebalanceAmountToPeer(PUBKEY_2)).thenReturn(Coins.ofMilliSatoshis(2)); List channelIds = List.of(CHANNEL_ID.toString(), CHANNEL_ID_2.toString()); List closedChannelIds = List.of(CHANNEL_ID.toString(), CHANNEL_ID_3.toString()); List waitingCloseChannelIds = List.of(CHANNEL_ID.toString()); @@ -112,6 +118,8 @@ class NodeControllerIT { .andExpect(jsonPath("$.onChainCosts.openCosts", is("1000"))) .andExpect(jsonPath("$.onChainCosts.closeCosts", is("2000"))) .andExpect(jsonPath("$.onChainCosts.sweepCosts", is("3000"))) + .andExpect(jsonPath("$.rebalanceSourceAmount", is("1"))) + .andExpect(jsonPath("$.rebalanceTargetAmount", is("2"))) .andExpect(jsonPath("$.online", is(true))); } diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/ChannelController.java b/web/src/main/java/de/cotto/lndmanagej/controller/ChannelController.java index b6009e85..5226ae6d 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/ChannelController.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/ChannelController.java @@ -23,6 +23,7 @@ import de.cotto.lndmanagej.service.NodeService; import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; import de.cotto.lndmanagej.service.PolicyService; +import de.cotto.lndmanagej.service.RebalanceService; import org.springframework.context.annotation.Import; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -43,6 +44,7 @@ public class ChannelController { private final PolicyService policyService; private final FeeService feeService; private final OffChainCostService offChainCostService; + private final RebalanceService rebalanceService; public ChannelController( ChannelService channelService, @@ -51,7 +53,8 @@ public class ChannelController { OnChainCostService onChainCostService, PolicyService policyService, FeeService feeService, - OffChainCostService offChainCostService + OffChainCostService offChainCostService, + RebalanceService rebalanceService ) { this.channelService = channelService; this.nodeService = nodeService; @@ -60,6 +63,7 @@ public class ChannelController { this.policyService = policyService; this.feeService = feeService; this.offChainCostService = offChainCostService; + this.rebalanceService = rebalanceService; } @Timed @@ -90,7 +94,9 @@ public class ChannelController { offChainCostService.getOffChainCostsForChannel(channelId), getPoliciesForChannel(localChannel), getCloseDetailsForChannel(localChannel), - getFeeReportFromService(localChannel.getId()) + getFeeReportFromService(localChannel.getId()), + rebalanceService.getRebalanceAmountFromChannel(localChannel.getId()), + rebalanceService.getRebalanceAmountToChannel(localChannel.getId()) ); } diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java b/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java index 9193e995..d69b95ad 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java @@ -21,6 +21,7 @@ import de.cotto.lndmanagej.service.FeeService; import de.cotto.lndmanagej.service.NodeService; import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; +import de.cotto.lndmanagej.service.RebalanceService; import org.springframework.context.annotation.Import; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -40,6 +41,7 @@ public class NodeController { private final OffChainCostService offChainCostService; private final BalanceService balanceService; private final FeeService feeService; + private final RebalanceService rebalanceService; public NodeController( NodeService nodeService, @@ -47,7 +49,8 @@ public class NodeController { OnChainCostService onChainCostService, OffChainCostService offChainCostService, BalanceService balanceService, - FeeService feeService + FeeService feeService, + RebalanceService rebalanceService ) { this.nodeService = nodeService; this.channelService = channelService; @@ -55,6 +58,7 @@ public class NodeController { this.offChainCostService = offChainCostService; this.balanceService = balanceService; this.feeService = feeService; + this.rebalanceService = rebalanceService; } @Timed @@ -81,7 +85,9 @@ public class NodeController { OffChainCostsDto.createFromModel(offChainCosts), BalanceInformationDto.createFromModel(balanceInformation), node.online(), - getFeeReportDto(pubkey) + getFeeReportDto(pubkey), + String.valueOf(rebalanceService.getRebalanceAmountFromPeer(pubkey).milliSatoshis()), + String.valueOf(rebalanceService.getRebalanceAmountToPeer(pubkey).milliSatoshis()) ); } 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 76495fe9..a3970e93 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 @@ -2,6 +2,7 @@ package de.cotto.lndmanagej.controller.dto; import de.cotto.lndmanagej.model.BalanceInformation; import de.cotto.lndmanagej.model.ChannelPoint; +import de.cotto.lndmanagej.model.Coins; import de.cotto.lndmanagej.model.FeeReport; import de.cotto.lndmanagej.model.LocalChannel; import de.cotto.lndmanagej.model.OffChainCosts; @@ -27,7 +28,9 @@ public record ChannelDetailsDto( OffChainCostsDto offChainCosts, PoliciesDto policies, ClosedChannelDetailsDto closeDetails, - FeeReportDto feeReport + FeeReportDto feeReport, + String rebalanceSourceAmount, + String rebalanceTargetAmount ) { public ChannelDetailsDto( ChannelDto channelDto, @@ -36,7 +39,9 @@ public record ChannelDetailsDto( OnChainCosts onChainCosts, OffChainCosts offChainCosts, PoliciesDto policies, - FeeReport feeReport + FeeReport feeReport, + Coins rebalanceSourceAmount, + Coins rebalanceTargetAmount ) { this( channelDto.channelIdShort(), @@ -56,10 +61,13 @@ public record ChannelDetailsDto( OffChainCostsDto.createFromModel(offChainCosts), policies, channelDto.closeDetails(), - FeeReportDto.createFromModel(feeReport) + FeeReportDto.createFromModel(feeReport), + String.valueOf(rebalanceSourceAmount.milliSatoshis()), + String.valueOf(rebalanceTargetAmount.milliSatoshis()) ); } + @SuppressWarnings("PMD.ExcessiveParameterList") public ChannelDetailsDto( LocalChannel localChannel, String remoteAlias, @@ -68,7 +76,9 @@ public record ChannelDetailsDto( OffChainCosts offChainCosts, PoliciesDto policies, ClosedChannelDetailsDto closeDetails, - FeeReport feeReport + FeeReport feeReport, + Coins rebalanceSourceAmount, + Coins rebalanceTargetAmount ) { this( new ChannelDto(localChannel, closeDetails), @@ -77,7 +87,9 @@ public record ChannelDetailsDto( onChainCosts, offChainCosts, policies, - feeReport + feeReport, + rebalanceSourceAmount, + rebalanceTargetAmount ); } } diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java b/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java index 76d8f0d6..82d8cabf 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java @@ -18,6 +18,8 @@ public record NodeDetailsDto( OffChainCostsDto offChainCosts, BalanceInformationDto balance, boolean online, - FeeReportDto feeReport + FeeReportDto feeReport, + String rebalanceSourceAmount, + String rebalanceTargetAmount ) { } diff --git a/web/src/test/java/de/cotto/lndmanagej/controller/ChannelControllerTest.java b/web/src/test/java/de/cotto/lndmanagej/controller/ChannelControllerTest.java index 8ba95dcc..f51814f0 100644 --- a/web/src/test/java/de/cotto/lndmanagej/controller/ChannelControllerTest.java +++ b/web/src/test/java/de/cotto/lndmanagej/controller/ChannelControllerTest.java @@ -17,6 +17,7 @@ import de.cotto.lndmanagej.service.NodeService; import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; import de.cotto.lndmanagej.service.PolicyService; +import de.cotto.lndmanagej.service.RebalanceService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -73,12 +74,17 @@ class ChannelControllerTest { @Mock private FeeService feeService; + @Mock + private RebalanceService rebalanceService; + @BeforeEach void setUp() { lenient().when(onChainCostService.getOnChainCostsForChannelId(CHANNEL_ID)).thenReturn(ON_CHAIN_COSTS); lenient().when(offChainCostService.getOffChainCostsForChannel(CHANNEL_ID)).thenReturn(OFF_CHAIN_COSTS); lenient().when(policyService.getPolicies(CHANNEL_ID)).thenReturn(POLICIES); lenient().when(feeService.getFeeReportForChannel(CHANNEL_ID)).thenReturn(FEE_REPORT); + lenient().when(rebalanceService.getRebalanceAmountFromChannel(CHANNEL_ID)).thenReturn(Coins.NONE); + lenient().when(rebalanceService.getRebalanceAmountToChannel(CHANNEL_ID)).thenReturn(Coins.NONE); } @Test @@ -117,8 +123,12 @@ class ChannelControllerTest { OFF_CHAIN_COSTS, FEE_CONFIGURATION_DTO, ClosedChannelDetailsDto.UNKNOWN, - FEE_REPORT + FEE_REPORT, + Coins.ofMilliSatoshis(1), + Coins.ofMilliSatoshis(2) ); + when(rebalanceService.getRebalanceAmountFromChannel(CHANNEL_ID)).thenReturn(Coins.ofMilliSatoshis(1)); + when(rebalanceService.getRebalanceAmountToChannel(CHANNEL_ID)).thenReturn(Coins.ofMilliSatoshis(2)); when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); when(channelService.getLocalChannel(CHANNEL_ID)).thenReturn(Optional.of(LOCAL_OPEN_CHANNEL)); when(balanceService.getBalanceInformation(CHANNEL_ID)) @@ -137,7 +147,9 @@ class ChannelControllerTest { OFF_CHAIN_COSTS, FEE_CONFIGURATION_DTO, ClosedChannelDetailsDto.UNKNOWN, - FEE_REPORT + FEE_REPORT, + Coins.NONE, + Coins.NONE ); when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); when(channelService.getLocalChannel(CHANNEL_ID)).thenReturn(Optional.of(LOCAL_OPEN_CHANNEL_PRIVATE)); @@ -215,7 +227,9 @@ class ChannelControllerTest { OFF_CHAIN_COSTS, PoliciesDto.EMPTY, ClosedChannelDetailsDto.createFromModel(channel), - FEE_REPORT + FEE_REPORT, + Coins.NONE, + Coins.NONE ); } } \ No newline at end of file diff --git a/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java b/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java index af7ec2ba..f4b2481d 100644 --- a/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java +++ b/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java @@ -19,6 +19,7 @@ import de.cotto.lndmanagej.service.FeeService; import de.cotto.lndmanagej.service.NodeService; import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; +import de.cotto.lndmanagej.service.RebalanceService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -75,6 +76,9 @@ class NodeControllerTest { @Mock private FeeService feeService; + @Mock + private RebalanceService rebalanceService; + @Test void getAlias() { when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); @@ -88,6 +92,8 @@ class NodeControllerTest { when(offChainCostService.getOffChainCostsForPeer(any())).thenReturn(OffChainCosts.NONE); when(balanceService.getBalanceInformationForPeer(any(Pubkey.class))).thenReturn(BalanceInformation.EMPTY); when(feeService.getFeeReportForPeer(any())).thenReturn(new FeeReport(Coins.NONE, Coins.NONE)); + when(rebalanceService.getRebalanceAmountFromPeer(PUBKEY_2)).thenReturn(Coins.NONE); + when(rebalanceService.getRebalanceAmountToPeer(PUBKEY_2)).thenReturn(Coins.NONE); NodeDetailsDto expectedDetails = new NodeDetailsDto( PUBKEY_2, ALIAS_2, @@ -99,7 +105,9 @@ class NodeControllerTest { OffChainCostsDto.createFromModel(OffChainCosts.NONE), BalanceInformationDto.createFromModel(BalanceInformation.EMPTY), true, - new FeeReportDto("0", "0") + new FeeReportDto("0", "0"), + "0", + "0" ); when(nodeService.getNode(PUBKEY_2)).thenReturn(new Node(PUBKEY_2, ALIAS_2, 0, true)); @@ -125,6 +133,8 @@ class NodeControllerTest { when(onChainCostService.getOnChainCostsForPeer(PUBKEY_2)).thenReturn(onChainCosts); when(offChainCostService.getOffChainCostsForPeer(PUBKEY_2)).thenReturn(OFF_CHAIN_COSTS); when(balanceService.getBalanceInformationForPeer(PUBKEY_2)).thenReturn(BALANCE_INFORMATION); + when(rebalanceService.getRebalanceAmountFromPeer(PUBKEY_2)).thenReturn(Coins.ofMilliSatoshis(111)); + when(rebalanceService.getRebalanceAmountToPeer(PUBKEY_2)).thenReturn(Coins.ofMilliSatoshis(222)); when(feeService.getFeeReportForPeer(PUBKEY_2)).thenReturn(FEE_REPORT); NodeDetailsDto expectedDetails = new NodeDetailsDto( PUBKEY_2, @@ -137,7 +147,9 @@ class NodeControllerTest { OffChainCostsDto.createFromModel(OFF_CHAIN_COSTS), BalanceInformationDto.createFromModel(BALANCE_INFORMATION), false, - new FeeReportDto("1234", "567") + new FeeReportDto("1234", "567"), + "111", + "222" ); assertThat(nodeController.getDetails(PUBKEY_2)).isEqualTo(expectedDetails); diff --git a/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDtoTest.java b/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDtoTest.java index df500ddf..89bb8757 100644 --- a/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDtoTest.java +++ b/web/src/test/java/de/cotto/lndmanagej/controller/dto/ChannelDetailsDtoTest.java @@ -33,7 +33,9 @@ class ChannelDetailsDtoTest { OFF_CHAIN_COSTS, PoliciesDto.EMPTY, CLOSE_DETAILS, - FEE_REPORT + FEE_REPORT, + Coins.ofMilliSatoshis(123), + Coins.ofMilliSatoshis(456) ); @Test @@ -91,7 +93,9 @@ class ChannelDetailsDtoTest { OFF_CHAIN_COSTS, PoliciesDto.EMPTY, CLOSE_DETAILS, - FEE_REPORT + FEE_REPORT, + Coins.NONE, + Coins.NONE ); ChannelStatusDto channelStatusDto = ChannelStatusDto.createFromModel(new ChannelStatus(false, true, false, OPEN)); @@ -122,4 +126,14 @@ class ChannelDetailsDtoTest { void offChainCosts() { assertThat(CHANNEL_DETAILS_DTO.offChainCosts()).isEqualTo(OffChainCostsDto.createFromModel(OFF_CHAIN_COSTS)); } + + @Test + void rebalanceSourceAmount() { + assertThat(CHANNEL_DETAILS_DTO.rebalanceSourceAmount()).isEqualTo("123"); + } + + @Test + void rebalanceTargetAmount() { + assertThat(CHANNEL_DETAILS_DTO.rebalanceTargetAmount()).isEqualTo("456"); + } } \ No newline at end of file