diff --git a/contracts/core/04-channel/IBCChannelPacketTimeout.sol b/contracts/core/04-channel/IBCChannelPacketTimeout.sol index 0df7c5b7..9fbf59a7 100644 --- a/contracts/core/04-channel/IBCChannelPacketTimeout.sol +++ b/contracts/core/04-channel/IBCChannelPacketTimeout.sol @@ -266,6 +266,11 @@ contract IBCChannelPacketTimeout is IBCModuleManager, IIBCChannelPacketTimeout, } else { revert IBCChannelUnknownChannelOrder(channel.ordering); } + + delete getCommitments()[IBCCommitment.packetCommitmentKeyCalldata( + msg_.packet.sourcePort, msg_.packet.sourceChannel, msg_.packet.sequence + )]; + lookupModuleByChannel(msg_.packet.sourcePort, msg_.packet.sourceChannel).onTimeoutPacket( msg_.packet, _msgSender() ); diff --git a/tests/foundry/src/ICS04Packet.t.sol b/tests/foundry/src/ICS04Packet.t.sol index 28d96bdf..1ac3c1dc 100644 --- a/tests/foundry/src/ICS04Packet.t.sol +++ b/tests/foundry/src/ICS04Packet.t.sol @@ -450,6 +450,10 @@ contract TestICS04Packet is ensureChannelCommitment(handler, channelInfo, c); } assertEq(handler.getPacketCommitment(channelInfo.portId, channelInfo.channelId, p0.sequence), bytes32(0)); + // same packet timeout must be failed + IIBCChannelPacketTimeout.MsgTimeoutPacket memory msg2_ = msgTimeoutPacket(channelInfo.ordering, p0, H(getBlockNumber())); + vm.expectRevert(); + handler.timeoutPacket(msg2_); } } @@ -506,6 +510,10 @@ contract TestICS04Packet is ensureChannelCommitment(handler, channelInfo, c); } assertEq(handler.getPacketCommitment(channelInfo.portId, channelInfo.channelId, p0.sequence), bytes32(0)); + // same packet timeout must be failed + IIBCChannelPacketTimeout.MsgTimeoutPacket memory msg2_ = msgTimeoutPacket(channelInfo.ordering, p0, H(getBlockNumber())); + vm.expectRevert(); + handler.timeoutPacket(msg2_); } } @@ -534,6 +542,10 @@ contract TestICS04Packet is } counterpartyHandler.channelCloseInit(msgChannelCloseInit(counterpartyChannelInfo)); handler.timeoutOnClose(msgTimeoutOnClose(counterpartyHandler, orders[i], p0, H(1))); + // same packet timeout must be failed + IIBCChannelPacketTimeout.MsgTimeoutOnClose memory msg_ = msgTimeoutOnClose(counterpartyHandler, orders[i], p0, H(1)); + vm.expectRevert(); + handler.timeoutOnClose(msg_); } }