MockEntropy.sol 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // SPDX-License-Identifier: Apache 2
  2. pragma solidity ^0.8.0;
  3. import "./IEntropyV2.sol";
  4. import "./IEntropyConsumer.sol";
  5. import "./EntropyStructsV2.sol";
  6. import "./EntropyEventsV2.sol";
  7. contract MockEntropy is IEntropyV2 {
  8. address public defaultProvider;
  9. mapping(address => EntropyStructsV2.ProviderInfo) public providers;
  10. mapping(address => mapping(uint64 => EntropyStructsV2.Request))
  11. public requests;
  12. constructor(address _defaultProvider) {
  13. require(_defaultProvider != address(0), "Invalid default provider");
  14. defaultProvider = _defaultProvider;
  15. providers[_defaultProvider].sequenceNumber = 1;
  16. providers[_defaultProvider].feeInWei = 1;
  17. providers[_defaultProvider].defaultGasLimit = 100000;
  18. }
  19. function requestV2()
  20. external
  21. payable
  22. override
  23. returns (uint64 assignedSequenceNumber)
  24. {
  25. return _requestV2(defaultProvider, bytes32(0), 0);
  26. }
  27. function requestV2(
  28. uint32 gasLimit
  29. ) external payable override returns (uint64 assignedSequenceNumber) {
  30. return _requestV2(defaultProvider, bytes32(0), gasLimit);
  31. }
  32. function requestV2(
  33. address provider,
  34. uint32 gasLimit
  35. ) external payable override returns (uint64 assignedSequenceNumber) {
  36. return _requestV2(provider, bytes32(0), gasLimit);
  37. }
  38. function requestV2(
  39. address provider,
  40. bytes32 userRandomNumber,
  41. uint32 gasLimit
  42. ) external payable override returns (uint64 assignedSequenceNumber) {
  43. return _requestV2(provider, userRandomNumber, gasLimit);
  44. }
  45. function _requestV2(
  46. address provider,
  47. bytes32 userRandomNumber,
  48. uint32 gasLimit
  49. ) internal returns (uint64 assignedSequenceNumber) {
  50. EntropyStructsV2.ProviderInfo storage providerInfo = providers[
  51. provider
  52. ];
  53. if (providerInfo.sequenceNumber == 0) {
  54. providerInfo.sequenceNumber = 1;
  55. providerInfo.feeInWei = 1;
  56. providerInfo.defaultGasLimit = 100000;
  57. }
  58. assignedSequenceNumber = providerInfo.sequenceNumber;
  59. providerInfo.sequenceNumber += 1;
  60. uint32 effectiveGasLimit = gasLimit == 0
  61. ? providerInfo.defaultGasLimit
  62. : gasLimit;
  63. EntropyStructsV2.Request storage req = requests[provider][
  64. assignedSequenceNumber
  65. ];
  66. req.provider = provider;
  67. req.sequenceNumber = assignedSequenceNumber;
  68. req.requester = msg.sender;
  69. req.blockNumber = uint64(block.number);
  70. req.useBlockhash = false;
  71. req.gasLimit10k = uint16(effectiveGasLimit / 10000);
  72. emit Requested(
  73. provider,
  74. msg.sender,
  75. assignedSequenceNumber,
  76. userRandomNumber,
  77. effectiveGasLimit,
  78. bytes("")
  79. );
  80. return assignedSequenceNumber;
  81. }
  82. function mockReveal(
  83. address provider,
  84. uint64 sequenceNumber,
  85. bytes32 randomNumber
  86. ) external {
  87. EntropyStructsV2.Request storage req = requests[provider][
  88. sequenceNumber
  89. ];
  90. require(req.requester != address(0), "Request not found");
  91. address requester = req.requester;
  92. emit Revealed(
  93. provider,
  94. requester,
  95. sequenceNumber,
  96. randomNumber,
  97. bytes32(0),
  98. bytes32(0),
  99. false,
  100. bytes(""),
  101. 0,
  102. bytes("")
  103. );
  104. delete requests[provider][sequenceNumber];
  105. uint256 codeSize;
  106. assembly {
  107. codeSize := extcodesize(requester)
  108. }
  109. if (codeSize > 0) {
  110. IEntropyConsumer(requester)._entropyCallback(
  111. sequenceNumber,
  112. provider,
  113. randomNumber
  114. );
  115. }
  116. }
  117. function getProviderInfoV2(
  118. address provider
  119. ) external view override returns (EntropyStructsV2.ProviderInfo memory) {
  120. return providers[provider];
  121. }
  122. function getDefaultProvider() external view override returns (address) {
  123. return defaultProvider;
  124. }
  125. function getRequestV2(
  126. address provider,
  127. uint64 sequenceNumber
  128. ) external view override returns (EntropyStructsV2.Request memory) {
  129. return requests[provider][sequenceNumber];
  130. }
  131. function getFeeV2() external pure override returns (uint128) {
  132. return 0;
  133. }
  134. function getFeeV2(uint32) external pure override returns (uint128) {
  135. return 0;
  136. }
  137. function getFeeV2(
  138. address,
  139. uint32
  140. ) external pure override returns (uint128) {
  141. return 0;
  142. }
  143. }