From 3744f2b426eebf1c4eb77e7d43253d8d2c6ff4ad Mon Sep 17 00:00:00 2001 From: Jayant Krishnamurthy Date: Sat, 25 Nov 2023 14:47:16 -0800 Subject: [PATCH] add default provider --- .../contracts/contracts/entropy/Entropy.sol | 6 + .../contracts/forge-test/Entropy.t.sol | 107 +++++++++++++----- .../entropy_sdk/solidity/IEntropy.sol | 2 + 3 files changed, 89 insertions(+), 26 deletions(-) diff --git a/target_chains/ethereum/contracts/contracts/entropy/Entropy.sol b/target_chains/ethereum/contracts/contracts/entropy/Entropy.sol index d9484297ea..b23ea09c2e 100644 --- a/target_chains/ethereum/contracts/contracts/entropy/Entropy.sol +++ b/target_chains/ethereum/contracts/contracts/entropy/Entropy.sol @@ -311,6 +311,12 @@ contract Entropy is IEntropy, EntropyState { return _state.providers[provider].feeInWei + _state.pythFeeInWei; } + function getFee() public view override returns (uint feeAmount) { + return + _state.providers[_state.defaultProvider].feeInWei + + _state.pythFeeInWei; + } + function getAccruedPythFees() public view diff --git a/target_chains/ethereum/contracts/forge-test/Entropy.t.sol b/target_chains/ethereum/contracts/forge-test/Entropy.t.sol index 7182d6f044..e6c41c6666 100644 --- a/target_chains/ethereum/contracts/forge-test/Entropy.t.sol +++ b/target_chains/ethereum/contracts/forge-test/Entropy.t.sol @@ -30,6 +30,7 @@ contract EntropyTest is Test { address public unregisteredProvider = address(7); uint256 MAX_UINT256 = 2 ** 256 - 1; bytes32 ALL_ZEROS = bytes32(uint256(0)); + address ALL_ZERO_ADDR = address(bytes20(uint160(0))); function setUp() public { random = new Entropy(pythFeeInWei, provider1); @@ -64,7 +65,9 @@ contract EntropyTest is Test { uint64 startSequenceNumber, uint64 size ) public pure returns (bytes32[] memory hashChain) { - bytes32 initialValue = keccak256(abi.encodePacked(startSequenceNumber)); + bytes32 initialValue = keccak256( + abi.encodePacked(provider, startSequenceNumber) + ); hashChain = new bytes32[](size); for (uint64 i = 0; i < size; i++) { hashChain[size - (i + 1)] = initialValue; @@ -73,15 +76,23 @@ contract EntropyTest is Test { } // Test helper method for requesting a random value as user from provider. + // If provider is all-zeros, use the default provider in the contract. function request( address user, address provider, uint randomNumber, bool useBlockhash ) public returns (uint64 sequenceNumber) { + uint fee = 0; + if (provider == ALL_ZERO_ADDR) { + fee = random.getFee(); + } else { + fee = random.getFee(provider); + } + sequenceNumber = requestWithFee( user, - random.getFee(provider), + fee, provider, randomNumber, useBlockhash @@ -95,13 +106,22 @@ contract EntropyTest is Test { uint randomNumber, bool useBlockhash ) public returns (uint64 sequenceNumber) { - vm.deal(user, fee); - vm.prank(user); - sequenceNumber = random.request{value: fee}( - provider, - random.constructUserCommitment(bytes32(randomNumber)), - useBlockhash - ); + if (provider == ALL_ZERO_ADDR) { + vm.deal(user, fee); + vm.prank(user); + sequenceNumber = random.request{value: fee}( + random.constructUserCommitment(bytes32(randomNumber)), + useBlockhash + ); + } else { + vm.deal(user, fee); + vm.prank(user); + sequenceNumber = random.request{value: fee}( + provider, + random.constructUserCommitment(bytes32(randomNumber)), + useBlockhash + ); + } } function assertRequestReverts( @@ -136,12 +156,22 @@ contract EntropyTest is Test { bytes32 providerRevelation, bytes32 hash ) public { - bytes32 randomNumber = random.reveal( - provider, - sequenceNumber, - bytes32(userRandom), - providerRevelation - ); + bytes32 randomNumber; + + if (provider == ALL_ZERO_ADDR) { + randomNumber = random.reveal( + sequenceNumber, + bytes32(userRandom), + providerRevelation + ); + } else { + randomNumber = random.reveal( + provider, + sequenceNumber, + bytes32(userRandom), + providerRevelation + ); + } assertEq( randomNumber, random.combineRandomValues( @@ -158,13 +188,22 @@ contract EntropyTest is Test { uint userRandom, bytes32 providerRevelation ) public { - vm.expectRevert(); - random.reveal( - provider, - sequenceNumber, - bytes32(uint256(userRandom)), - providerRevelation - ); + if (provider == ALL_ZERO_ADDR) { + vm.expectRevert(); + random.reveal( + sequenceNumber, + bytes32(uint256(userRandom)), + providerRevelation + ); + } else { + vm.expectRevert(); + random.reveal( + provider, + sequenceNumber, + bytes32(uint256(userRandom)), + providerRevelation + ); + } } function assertInvariants() public { @@ -217,6 +256,26 @@ contract EntropyTest is Test { ); } + function testDefaultProvider() public { + uint64 sequenceNumber = request(user2, ALL_ZERO_ADDR, 42, false); + assertEq(random.getRequest(provider1, sequenceNumber).blockNumber, 0); + + assertRevealReverts( + ALL_ZERO_ADDR, + sequenceNumber, + 42, + provider2Proofs[sequenceNumber] + ); + + assertRevealSucceeds( + ALL_ZERO_ADDR, + sequenceNumber, + 42, + provider1Proofs[sequenceNumber], + ALL_ZEROS + ); + } + function testNoSuchProvider() public { assertRequestReverts(10000000, unregisteredProvider, 42, false); } @@ -486,8 +545,4 @@ contract EntropyTest is Test { vm.expectRevert(); random.withdraw(providerOneBalance); } - - function testDefaultProvider() { - assert() - } } diff --git a/target_chains/ethereum/entropy_sdk/solidity/IEntropy.sol b/target_chains/ethereum/entropy_sdk/solidity/IEntropy.sol index 9cc4780826..6fd6d9159c 100644 --- a/target_chains/ethereum/entropy_sdk/solidity/IEntropy.sol +++ b/target_chains/ethereum/entropy_sdk/solidity/IEntropy.sol @@ -77,6 +77,8 @@ interface IEntropy is EntropyEvents { function getFee(address provider) external view returns (uint feeAmount); + function getFee() external view returns (uint feeAmount); + function getAccruedPythFees() external view