EntropyGasBenchmark.t.sol 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-License-Identifier: Apache 2
  2. pragma solidity ^0.8.0;
  3. import "forge-std/Test.sol";
  4. import "@pythnetwork/entropy-sdk-solidity/EntropyStructs.sol";
  5. import "../contracts/entropy/Entropy.sol";
  6. import "./utils/EntropyTestUtils.t.sol";
  7. // TODO
  8. // - what's the impact of # of in-flight requests on gas usage? More requests => more hashes to
  9. // verify the provider's value.
  10. contract EntropyGasBenchmark is Test, EntropyTestUtils {
  11. Entropy public random;
  12. uint128 pythFeeInWei = 7;
  13. address public provider1 = address(1);
  14. bytes32[] provider1Proofs;
  15. uint128 provider1FeeInWei = 8;
  16. uint64 provider1ChainLength = 100;
  17. address public user1 = address(3);
  18. function setUp() public {
  19. random = new Entropy(pythFeeInWei, provider1, true);
  20. bytes32[] memory hashChain1 = generateHashChain(
  21. provider1,
  22. 0,
  23. provider1ChainLength
  24. );
  25. provider1Proofs = hashChain1;
  26. vm.prank(provider1);
  27. random.register(
  28. provider1FeeInWei,
  29. provider1Proofs[0],
  30. hex"0100",
  31. provider1ChainLength,
  32. ""
  33. );
  34. // Register twice so the commitment sequence number is nonzero. Zero values can be misleading
  35. // when gas benchmarking.
  36. vm.prank(provider1);
  37. random.register(
  38. provider1FeeInWei,
  39. provider1Proofs[0],
  40. hex"0100",
  41. provider1ChainLength,
  42. ""
  43. );
  44. assert(
  45. random.getProviderInfo(provider1).currentCommitmentSequenceNumber !=
  46. 0
  47. );
  48. }
  49. // Test helper method for requesting a random value as user from provider.
  50. function requestHelper(
  51. address user,
  52. uint randomNumber,
  53. bool useBlockhash
  54. ) public returns (uint64 sequenceNumber) {
  55. uint fee = random.getFee(provider1);
  56. vm.deal(user, fee);
  57. vm.prank(user);
  58. sequenceNumber = random.request{value: fee}(
  59. provider1,
  60. random.constructUserCommitment(bytes32(randomNumber)),
  61. useBlockhash
  62. );
  63. }
  64. function revealHelper(
  65. uint64 sequenceNumber,
  66. uint userRandom
  67. ) public returns (bytes32 randomNumber) {
  68. randomNumber = random.reveal(
  69. provider1,
  70. sequenceNumber,
  71. bytes32(userRandom),
  72. provider1Proofs[
  73. sequenceNumber -
  74. random
  75. .getProviderInfo(provider1)
  76. .originalCommitmentSequenceNumber
  77. ]
  78. );
  79. }
  80. function testBasicFlow() public {
  81. uint userRandom = 42;
  82. uint64 sequenceNumber = requestHelper(user1, userRandom, true);
  83. revealHelper(sequenceNumber, userRandom);
  84. }
  85. }