diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala b/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala index 6d0739cecf..f89e82b304 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala @@ -259,7 +259,7 @@ class ChannelRelay private(nodeParams: NodeParams, RelayFailure(CMD_FAIL_HTLC(add.id, Right(ChannelDisabled(channelUpdate.messageFlags, channelUpdate.channelFlags, channelUpdate)), commit = true)) case Some(channelUpdate) if payload.amountToForward < channelUpdate.htlcMinimumMsat => RelayFailure(CMD_FAIL_HTLC(add.id, Right(AmountBelowMinimum(payload.amountToForward, channelUpdate)), commit = true)) - case Some(channelUpdate) if r.expiryDelta != channelUpdate.cltvExpiryDelta => + case Some(channelUpdate) if r.expiryDelta < channelUpdate.cltvExpiryDelta => RelayFailure(CMD_FAIL_HTLC(add.id, Right(IncorrectCltvExpiry(payload.outgoingCltv, channelUpdate)), commit = true)) case Some(channelUpdate) if r.relayFeeMsat < nodeFee(channelUpdate.feeBaseMsat, channelUpdate.feeProportionalMillionths, payload.amountToForward) => RelayFailure(CMD_FAIL_HTLC(add.id, Right(FeeInsufficient(add.amountMsat, channelUpdate)), commit = true)) diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala index a51846b271..0ca3802870 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala @@ -198,25 +198,25 @@ class ChannelRelayerSpec extends ScalaTestWithActorTestKit(ConfigFactory.load("a expectFwdFail(register, r.add.channelId, CMD_FAIL_HTLC(r.add.id, Right(AmountBelowMinimum(outgoingAmount, u.channelUpdate)), commit = true)) } - test("fail to relay an htlc-add (expiry too small)") { f => + test("relay an htlc-add (expiry larger than our requirements)") { f => import f._ - val payload = RelayLegacyPayload(shortId1, outgoingAmount, outgoingExpiry - CltvExpiryDelta(1)) - val r = createValidIncomingPacket(1100000 msat, CltvExpiry(400100), payload) + val payload = RelayLegacyPayload(shortId1, outgoingAmount, outgoingExpiry) val u = createLocalUpdate(shortId1) + val r = createValidIncomingPacket(1100000 msat, outgoingExpiry + u.channelUpdate.cltvExpiryDelta + CltvExpiryDelta(1), payload) channelRelayer ! WrappedLocalChannelUpdate(u) channelRelayer ! Relay(r) - expectFwdFail(register, r.add.channelId, CMD_FAIL_HTLC(r.add.id, Right(IncorrectCltvExpiry(payload.outgoingCltv, u.channelUpdate)), commit = true)) + expectFwdAdd(register, shortId1, payload.amountToForward, payload.outgoingCltv).message } - test("fail to relay an htlc-add (expiry too large)") { f => + test("fail to relay an htlc-add (expiry too small)") { f => import f._ - val payload = RelayLegacyPayload(shortId1, outgoingAmount, outgoingExpiry + CltvExpiryDelta(1)) - val r = createValidIncomingPacket(1100000 msat, CltvExpiry(400100), payload) + val payload = RelayLegacyPayload(shortId1, outgoingAmount, outgoingExpiry) val u = createLocalUpdate(shortId1) + val r = createValidIncomingPacket(1100000 msat, outgoingExpiry + u.channelUpdate.cltvExpiryDelta - CltvExpiryDelta(1), payload) channelRelayer ! WrappedLocalChannelUpdate(u) channelRelayer ! Relay(r) @@ -330,11 +330,18 @@ class ChannelRelayerSpec extends ScalaTestWithActorTestKit(ConfigFactory.load("a expectFwdAdd(register, ShortChannelId(12345), payload.amountToForward, payload.outgoingCltv).message } { - // invalid cltv expiry, no suitable channel found - val payload = RelayLegacyPayload(ShortChannelId(12345), 998900 msat, CltvExpiry(40)) + // cltv expiry larger than our requirements + val payload = RelayLegacyPayload(ShortChannelId(12345), 998900 msat, CltvExpiry(50)) + val r = createValidIncomingPacket(1000000 msat, CltvExpiry(70), payload) + channelRelayer ! Relay(r) + expectFwdAdd(register, ShortChannelId(22223), payload.amountToForward, payload.outgoingCltv).message + } + { + // cltv expiry too small, no suitable channel found + val payload = RelayLegacyPayload(ShortChannelId(12345), 998900 msat, CltvExpiry(61)) val r = createValidIncomingPacket(1000000 msat, CltvExpiry(70), payload) channelRelayer ! Relay(r) - expectFwdFail(register, r.add.channelId, CMD_FAIL_HTLC(r.add.id, Right(IncorrectCltvExpiry(CltvExpiry(40), channelUpdates(ShortChannelId(12345)).channelUpdate)), commit = true)) + expectFwdFail(register, r.add.channelId, CMD_FAIL_HTLC(r.add.id, Right(IncorrectCltvExpiry(CltvExpiry(61), channelUpdates(ShortChannelId(12345)).channelUpdate)), commit = true)) } }