@@ -31,6 +31,11 @@ abstract contract Pulse is IPulse, PulseState {
3131 req.publishTime = 1 ;
3232 req.callbackGasLimit = 1 ;
3333 req.requester = address (1 );
34+ req.numPriceIds = 0 ;
35+ // Pre-warm the priceIds array storage
36+ for (uint8 j = 0 ; j < MAX_PRICE_IDS; j++ ) {
37+ req.priceIds[j] = bytes32 (0 );
38+ }
3439 }
3540 }
3641 }
@@ -41,6 +46,9 @@ abstract contract Pulse is IPulse, PulseState {
4146 uint256 callbackGasLimit
4247 ) external payable override returns (uint64 requestSequenceNumber ) {
4348 require (publishTime <= block .timestamp + 60 , "Too far in future " );
49+ if (priceIds.length > MAX_PRICE_IDS) {
50+ revert TooManyPriceIds (priceIds.length , MAX_PRICE_IDS);
51+ }
4452 requestSequenceNumber = _state.currentSequenceNumber++ ;
4553
4654 uint128 requiredFee = getFee (callbackGasLimit);
@@ -49,9 +57,14 @@ abstract contract Pulse is IPulse, PulseState {
4957 Request storage req = allocRequest (requestSequenceNumber);
5058 req.sequenceNumber = requestSequenceNumber;
5159 req.publishTime = publishTime;
52- req.priceIdsHash = keccak256 (abi.encode (priceIds));
5360 req.callbackGasLimit = callbackGasLimit;
5461 req.requester = msg .sender ;
62+ req.numPriceIds = uint8 (priceIds.length );
63+
64+ // Copy price IDs to storage
65+ for (uint8 i = 0 ; i < priceIds.length ; i++ ) {
66+ req.priceIds[i] = priceIds[i];
67+ }
5568
5669 _state.accruedFeesInWei += SafeCast.toUint128 (msg .value );
5770
@@ -66,10 +79,14 @@ abstract contract Pulse is IPulse, PulseState {
6679 Request storage req = findActiveRequest (sequenceNumber);
6780
6881 // Verify priceIds match
69- bytes32 providedPriceIdsHash = keccak256 (abi.encode (priceIds));
70- bytes32 storedPriceIdsHash = req.priceIdsHash;
71- if (providedPriceIdsHash != storedPriceIdsHash) {
72- revert InvalidPriceIds (providedPriceIdsHash, storedPriceIdsHash);
82+ require (
83+ priceIds.length == req.numPriceIds,
84+ "Price IDs length mismatch "
85+ );
86+ for (uint8 i = 0 ; i < req.numPriceIds; i++ ) {
87+ if (priceIds[i] != req.priceIds[i]) {
88+ revert InvalidPriceIds (priceIds[i], req.priceIds[i]);
89+ }
7390 }
7491
7592 // Parse price feeds first to measure gas usage
0 commit comments