@@ -219,6 +219,10 @@ contract PulseTest is Test, PulseEvents {
219219 assertEq (lastRequest.provider, expectedRequest.provider);
220220 assertEq (lastRequest.sequenceNumber, expectedRequest.sequenceNumber);
221221 assertEq (lastRequest.publishTime, expectedRequest.publishTime);
222+ assertEq (
223+ keccak256 (abi.encode (lastRequest.priceIds)),
224+ keccak256 (abi.encode (expectedRequest.priceIds))
225+ );
222226 assertEq (
223227 lastRequest.callbackGasLimit,
224228 expectedRequest.callbackGasLimit
@@ -468,6 +472,38 @@ contract PulseTest is Test, PulseEvents {
468472 );
469473 }
470474
475+ function testExecuteCallbackWithFutureTimestamp () public {
476+ // Setup request with future timestamp
477+ bytes32 [] memory priceIds = createPriceIds ();
478+ uint256 futureTime = block .timestamp + 1 days ;
479+ vm.deal (address (consumer), 1 gwei);
480+
481+ vm.prank (address (consumer));
482+ uint64 sequenceNumber = pulse.requestPriceUpdatesWithCallback {
483+ value: calculateTotalFee ()
484+ }(provider, futureTime, priceIds, CALLBACK_GAS_LIMIT);
485+
486+ // Try to execute callback before the requested timestamp
487+ PythStructs.PriceFeed[] memory priceFeeds = createMockPriceFeeds (
488+ futureTime // Mock price feeds with future timestamp
489+ );
490+ mockPythResponse (priceFeeds); // This will make parsePriceFeedUpdates return future-dated prices
491+ bytes [] memory updateData = createMockUpdateData (priceFeeds);
492+
493+ vm.prank (provider);
494+ // Should succeed because we're simulating receiving future-dated price updates
495+ pulse.executeCallback (
496+ provider,
497+ sequenceNumber,
498+ priceIds,
499+ updateData,
500+ CALLBACK_GAS_LIMIT
501+ );
502+
503+ // Verify the callback was executed with future timestamp
504+ assertEq (consumer.lastPublishTime (), futureTime);
505+ }
506+
471507 function testGetFee () public {
472508 // Test with different gas limits to verify fee calculation
473509 uint256 [] memory gasLimits = new uint256 [](3 );
0 commit comments