@@ -11,6 +11,7 @@ import "@pythnetwork/entropy-sdk-solidity/IEntropy.sol";
1111import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol " ;
1212import "./utils/EntropyTestUtils.t.sol " ;
1313import "../contracts/entropy/EntropyUpgradable.sol " ;
14+ import "../contracts/entropy/EntropyGasTester.sol " ;
1415import "@pythnetwork/entropy-sdk-solidity/EntropyStatusConstants.sol " ;
1516
1617// TODO
@@ -846,7 +847,10 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
846847 function testRequestWithCallbackAndRevealWithCallbackByContract () public {
847848 bytes32 userRandomNumber = bytes32 (uint (42 ));
848849 uint fee = random.getFee (provider1);
849- EntropyConsumer consumer = new EntropyConsumer (address (random), false );
850+ EntropyGasTester consumer = new EntropyGasTester (
851+ address (random),
852+ false
853+ );
850854 vm.deal (user1, fee);
851855 vm.prank (user1);
852856 uint64 assignedSequenceNumber = consumer.requestEntropy {value: fee}(
@@ -955,7 +959,7 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
955959 function testRequestWithCallbackAndRevealWithCallbackFailing () public {
956960 bytes32 userRandomNumber = bytes32 (uint (42 ));
957961 uint fee = random.getFee (provider1);
958- EntropyConsumer consumer = new EntropyConsumer (address (random), true );
962+ EntropyGasTester consumer = new EntropyGasTester (address (random), true );
959963 vm.deal (address (consumer), fee);
960964 vm.startPrank (address (consumer));
961965 uint64 assignedSequenceNumber = random.requestWithCallback {value: fee}(
@@ -979,7 +983,10 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
979983
980984 bytes32 userRandomNumber = bytes32 (uint (42 ));
981985 uint fee = random.getFee (provider1);
982- EntropyConsumer consumer = new EntropyConsumer (address (random), false );
986+ EntropyGasTester consumer = new EntropyGasTester (
987+ address (random),
988+ false
989+ );
983990 vm.deal (user1, fee);
984991 vm.prank (user1);
985992 uint64 assignedSequenceNumber = consumer.requestEntropy {value: fee}(
@@ -1036,7 +1043,7 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
10361043
10371044 bytes32 userRandomNumber = bytes32 (uint (42 ));
10381045 uint fee = random.getFee (provider1);
1039- EntropyConsumer consumer = new EntropyConsumer (address (random), true );
1046+ EntropyGasTester consumer = new EntropyGasTester (address (random), true );
10401047 vm.deal (user1, fee);
10411048 vm.prank (user1);
10421049 uint64 assignedSequenceNumber = consumer.requestEntropy {value: fee}(
@@ -1135,7 +1142,10 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
11351142
11361143 bytes32 userRandomNumber = bytes32 (uint (42 ));
11371144 uint fee = random.getFee (provider1);
1138- EntropyConsumer consumer = new EntropyConsumer (address (random), false );
1145+ EntropyGasTester consumer = new EntropyGasTester (
1146+ address (random),
1147+ false
1148+ );
11391149 // Consumer callback uses ~10% more gas than the provider's default
11401150 consumer.setTargetGasUsage ((defaultGasLimit * 110 ) / 100 );
11411151
@@ -1256,7 +1266,10 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
12561266
12571267 bytes32 userRandomNumber = bytes32 (uint (42 ));
12581268 uint fee = random.getFee (provider1);
1259- EntropyConsumer consumer = new EntropyConsumer (address (random), false );
1269+ EntropyGasTester consumer = new EntropyGasTester (
1270+ address (random),
1271+ false
1272+ );
12601273 consumer.setTargetGasUsage (defaultGasLimit);
12611274
12621275 vm.deal (user1, fee);
@@ -1659,7 +1672,10 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
16591672
16601673 vm.deal (user1, fee);
16611674 vm.prank (user1);
1662- EntropyConsumer consumer = new EntropyConsumer (address (random), false );
1675+ EntropyGasTester consumer = new EntropyGasTester (
1676+ address (random),
1677+ false
1678+ );
16631679 uint64 sequenceNumber = consumer.requestEntropyWithGasLimit {value: fee}(
16641680 userRandomNumber,
16651681 gasLimit
@@ -1729,78 +1745,3 @@ contract EntropyTest is Test, EntropyTestUtils, EntropyEvents {
17291745 }
17301746 }
17311747}
1732-
1733- contract EntropyConsumer is IEntropyConsumer {
1734- uint64 public sequence;
1735- bytes32 public randomness;
1736- address public provider;
1737- address public entropy;
1738- bool public reverts;
1739- uint256 public targetGasUsage;
1740-
1741- constructor (address _entropy , bool _reverts ) {
1742- entropy = _entropy;
1743- reverts = _reverts;
1744- targetGasUsage = 0 ; // Default target
1745- }
1746-
1747- function requestEntropy (
1748- bytes32 randomNumber
1749- ) public payable returns (uint64 sequenceNumber ) {
1750- address _provider = IEntropy (entropy).getDefaultProvider ();
1751- sequenceNumber = IEntropy (entropy).requestWithCallback {
1752- value: msg .value
1753- }(_provider, randomNumber);
1754- }
1755-
1756- function requestEntropyWithGasLimit (
1757- bytes32 randomNumber ,
1758- uint32 gasLimit
1759- ) public payable returns (uint64 sequenceNumber ) {
1760- address _provider = IEntropy (entropy).getDefaultProvider ();
1761- sequenceNumber = IEntropy (entropy).requestWithCallbackAndGasLimit {
1762- value: msg .value
1763- }(_provider, randomNumber, gasLimit);
1764- }
1765-
1766- function getEntropy () internal view override returns (address ) {
1767- return entropy;
1768- }
1769-
1770- function setReverts (bool _reverts ) public {
1771- reverts = _reverts;
1772- }
1773-
1774- function setTargetGasUsage (uint256 _targetGasUsage ) public {
1775- require (
1776- _targetGasUsage > 60000 ,
1777- "Target gas usage cannot be below 60k (~the cost of storing callback results) "
1778- );
1779- targetGasUsage = _targetGasUsage;
1780- }
1781-
1782- function entropyCallback (
1783- uint64 _sequence ,
1784- address _provider ,
1785- bytes32 _randomness
1786- ) internal override {
1787- uint256 startGas = gasleft ();
1788- // These seemingly innocuous instructions are actually quite expensive
1789- // (~60k gas) because they're writes to contract storage.
1790- sequence = _sequence;
1791- provider = _provider;
1792- randomness = _randomness;
1793-
1794- // Keep consuming gas until we reach our target
1795- uint256 currentGasUsed = startGas - gasleft ();
1796- while (currentGasUsed < targetGasUsage) {
1797- // Consume gas with a hash operation
1798- keccak256 (abi.encodePacked (currentGasUsed, _randomness));
1799- currentGasUsed = startGas - gasleft ();
1800- }
1801-
1802- if (reverts) {
1803- revert ("Callback failed " );
1804- }
1805- }
1806- }
0 commit comments