@@ -1226,7 +1226,12 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
12261226 assertEq (reqAfterReveal.sequenceNumber, 0 );
12271227 }
12281228
1229+ // Test the corner case caused by the CALL opcode passing at most 63/64ths of the current gas
1230+ // to the sub-call.
12291231 function testRequestWithCallbackUsingTooMuchGas2 () public {
1232+ // With a 64M gas limit, we will pass ~63M gas to the callback (which is insufficient), but still
1233+ // have ~1M gas to execute code within the revealWithCallback method, which should be enough to
1234+ // run all of the logic subsequent to the excessivelySafeCall.
12301235 uint32 defaultGasLimit = 64000000 ;
12311236 vm.prank (provider1);
12321237 random.setDefaultGasLimit (defaultGasLimit);
@@ -1246,98 +1251,15 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
12461251 assignedSequenceNumber
12471252 );
12481253
1249- // Verify the gas limit was set correctly
1250- // assertEq(req.gasLimit10k, 10);
1251-
12521254 // The transaction reverts if the provider does not provide enough gas to forward
12531255 // the gasLimit to the callback transaction.
1254- vm.expectRevert ();
1256+ vm.expectRevert (EntropyErrors.InsufficientGas. selector );
12551257 random.revealWithCallback {gas: defaultGasLimit - 10000 }(
12561258 provider1,
12571259 assignedSequenceNumber,
12581260 userRandomNumber,
12591261 provider1Proofs[assignedSequenceNumber]
12601262 );
1261-
1262- /*
1263- // If called with enough gas, the transaction should succeed, but the callback should fail because
1264- // it uses too much gas.
1265- vm.expectEmit(false, false, false, true, address(random));
1266- emit CallbackFailed(
1267- provider1,
1268- address(consumer),
1269- assignedSequenceNumber,
1270- userRandomNumber,
1271- provider1Proofs[assignedSequenceNumber],
1272- random.combineRandomValues(
1273- userRandomNumber,
1274- provider1Proofs[assignedSequenceNumber],
1275- 0
1276- ),
1277- // out-of-gas reverts have an empty bytes array as the return value.
1278- ""
1279- );
1280- random.revealWithCallback(
1281- provider1,
1282- assignedSequenceNumber,
1283- userRandomNumber,
1284- provider1Proofs[assignedSequenceNumber]
1285- );
1286-
1287- // Verify request is still active after failure
1288- EntropyStructs.Request memory reqAfterFailure = random.getRequest(
1289- provider1,
1290- assignedSequenceNumber
1291- );
1292- assertEq(reqAfterFailure.sequenceNumber, assignedSequenceNumber);
1293- assertEq(
1294- reqAfterFailure.status,
1295- EntropyConstants.STATUS_CALLBACK_FAILED
1296- );
1297-
1298- // A subsequent attempt passing insufficient gas should also revert
1299- vm.expectRevert();
1300- random.revealWithCallback{gas: defaultGasLimit - 10000}(
1301- provider1,
1302- assignedSequenceNumber,
1303- userRandomNumber,
1304- provider1Proofs[assignedSequenceNumber]
1305- );
1306-
1307- // Again, request stays active after failure
1308- reqAfterFailure = random.getRequest(provider1, assignedSequenceNumber);
1309- assertEq(reqAfterFailure.sequenceNumber, assignedSequenceNumber);
1310- assertEq(
1311- reqAfterFailure.status,
1312- EntropyConstants.STATUS_CALLBACK_FAILED
1313- );
1314-
1315- // Calling without a gas limit should succeed
1316- vm.expectEmit(false, false, false, true, address(random));
1317- emit RevealedWithCallback(
1318- reqAfterFailure,
1319- userRandomNumber,
1320- provider1Proofs[assignedSequenceNumber],
1321- random.combineRandomValues(
1322- userRandomNumber,
1323- provider1Proofs[assignedSequenceNumber],
1324- 0
1325- )
1326- );
1327- random.revealWithCallback(
1328- provider1,
1329- assignedSequenceNumber,
1330- userRandomNumber,
1331- provider1Proofs[assignedSequenceNumber]
1332- );
1333-
1334- // Verify request is cleared after successful reveal
1335- EntropyStructs.Request memory reqAfterReveal = random.getRequest(
1336- provider1,
1337- assignedSequenceNumber
1338- );
1339- assertEq(reqAfterReveal.sequenceNumber, 0);
1340- */
13411263 }
13421264
13431265 function testLastRevealedTooOld () public {
0 commit comments