Skip to content

Commit

Permalink
Initial Impl of SBRV (#13813)
Browse files Browse the repository at this point in the history
* Initial Impl of SBRV

* Generate wrappers/ABI

* Removed ZeroAddress check for feemanager & AC

* Update gethwrappers

* Rename RewardManager=>DestinationRewardManager

* Remove circular dependency between proxy and verifier

* Fixes to init logic

* Update gethwrappers

* llo-feeds: v0.4.0 reward manager tests

* Add check to remove assumption that feeManager cannot be nil

* Generate

* Fixed poolIdMismatch not being thrown

* Fix logic error when looking up the activeDonConfig

* Update gethwrappers

* Update interface sanity checks when setting verifier

* Add remaining interface functionality

* Update gethwrappers

* llo-feeds: verifier SetConfig tests

* llo-feeds: adding verifier contract get methods for easier testing

* adding rewards wire up for testing

* incomeplte fix for test_setConfigWithAddressesAndWeightsAreSetCorrectly

* llo-feeds: adjusting setConfig tests due to changes

* llo-feeds: fee manager v0.4.0 tests: making v0.3.0 tests pass

* llo-feeds: fee manager v0.4.0 tests: fee manager - adding test for PoolIdMismatch

* llo-feeds: fee manager v0.4.0 tests: nits

* llo-feeds: feeManager bulk reverts when PoolId is 0

* llo-feeds: feeManager tests revertOnSettingAnAddressZeroVerifier onlyCallableByOwnerReverts

* llo-feeds: feeManager test poolIdsCannotBeZeroAddress

* llo-feeds: rewardManager test_rewardsAreCorrectlySentToEachAssociatedPoolWhenVerifyingInBulk

* llo-feeds: verifier proxy tests

* llo-feeds: fixing DestinationProxy error handling

* llo-feeds: fixing DestinationProxy test remove verifiercontract zero check

* llo-feeds: remove interface checks for verifierProxy

* llo-feeds: clean up setConfig tests from checking internal state

* fix issue when processing rewards

* Apply suggestions from code review

* Update contracts/src/v0.8/llo-feeds/v0.4.0/DestinationFeeManager.sol

* Update contracts/src/v0.8/llo-feeds/v0.4.0/DestinationVerifierProxy.sol

* llo-feeds: verifier proxy remove test test_setVerifierZeroVerifier

* llo-feeds: tests for verify and verifyBulk

* clean up

* temporal fix for compile error

* llo: v0.4.0 removing V1 report tests

* better comments

* llo-feeds: verify test test_rollingOutConfiguration

* llo-feeds: verify test test_verifyFailsWhenReportIsOlderThanConfig

* llo-feeds: verify test test_verifyFailsWhenReportIsOlderThanConfig

* llo-feeds: tests for billing / billing bulk

* fixing tests

* fixing tests names

* llo-feeds: fix proxy contract should send value in call to verify

* llo-feeds: fix billing tests

* squash me

* llo-feeds: billing bulk verify tests

* llo-feeds: clean up

* llo-feeds: VerifierSetAccessControllerTest

* llo-feeds: clean up

* llo-feeds: extra proxy tests

* Update contracts/src/v0.8/llo-feeds/v0.4.0/DestinationFeeManager.sol

* Fix issue with oldest config verifying incorrectly

* Fix issue with oldest config verifying incorrectly

* llo-feeds: fix underflow and test_verifyFailsWhenReportIsOlderThanConfig

* Update gethwrappers

* Update gethwrappers

* llo-feeds: DestinationVerifier setFeeManager tests

* llo-feeds: Tests for Rewards and configs

* llo-feeds: Tests for DestinationVerifier constructor

* llo-feeds: reverse looping efficiently

* Update contracts/src/v0.8/llo-feeds/v0.4.0/DestinationVerifier.sol

* Update gethwrappers

* llo-feeds: fmt contract tests

* llo-feeds: npx prettify contract tests

* llo-feeds: npx prettify v0.4.0 contracts

* se --Add ability to amend config array

* Update gethwrappers

* Fix issue with future timestamps

* Update gethwrappers

* Small fix

* Fix broken tests

* Update gethwrappers

* llo-feeds: Tests setConfigWithActivationTime

* llo-feeds: Tests setConfigWithActivationTime

* llo-feeds: Tests VerifierRemoveLatestConfigTest

* llo-feeds: fixing linter errors (unused imports)

* llo-feeds: tests better filenaming

* Improve upgradability of contracts

* Update gethwrappers

* Small fix when setting rewardManager

* Update gethwrappers

* Fix var name to honour same interface

* Update gethwrappers

* Improve getter consistency

* Update gethwrappers

* Fix comments & conventions

* Update DON Config to camal case

* Update gethwrappers

* solhint + gas snapshot

* prettier

* Solhint fixes

* Update gethwrappers

* gas snapshot

* Fixed gas issue

* Gas snapshot

* llo-feeds: testing multiple fee managers and verifiers

* llo: fixing tests

* Update contracts/src/v0.8/llo-feeds/v0.4.0/test/verifier/DestinationVerifierTestRewardsMultiVefifierFeeManager.t.sol

Co-authored-by: msuchacz-cll <170782674+msuchacz-cll@users.noreply.github.com>

* llo: v0.4.0 interfaces test

* Fixed gas snaposhot

* prettier

* Generate

---------

Co-authored-by: Sam Davies <samsondav@protonmail.com>
Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com>
Co-authored-by: David Przybilla <dav.alejandro@gmail.com>
Co-authored-by: ad0ll <20057155+ad0ll@users.noreply.github.com>
Co-authored-by: msuchacz-cll <170782674+msuchacz-cll@users.noreply.github.com>
  • Loading branch information
6 people authored Jul 31, 2024
1 parent 6b3f6e2 commit c4ffbfb
Show file tree
Hide file tree
Showing 83 changed files with 14,025 additions and 109 deletions.
241 changes: 241 additions & 0 deletions contracts/gas-snapshots/llo-feeds.gas-snapshot

Large diffs are not rendered by default.

16 changes: 10 additions & 6 deletions contracts/scripts/native_solc_compile_all_llo-feeds
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,19 @@ compileContract () {
"$ROOT"/contracts/src/v0.8/"$1"
}

compileContract llo-feeds/Verifier.sol
compileContract llo-feeds/VerifierProxy.sol
compileContract llo-feeds/FeeManager.sol
compileContract llo-feeds/RewardManager.sol
compileContract llo-feeds/v0.3.0/Verifier.sol
compileContract llo-feeds/v0.3.0/VerifierProxy.sol
compileContract llo-feeds/v0.3.0/FeeManager.sol
compileContract llo-feeds/v0.3.0/RewardManager.sol
compileContract llo-feeds/v0.4.0/DestinationVerifier.sol
compileContract llo-feeds/v0.4.0/DestinationVerifierProxy.sol
compileContract llo-feeds/v0.4.0/DestinationFeeManager.sol
compileContract llo-feeds/v0.4.0/DestinationRewardManager.sol


# Test | Mocks
compileContract llo-feeds/test/mocks/ErroredVerifier.sol
compileContract llo-feeds/test/mocks/ExposedVerifier.sol
compileContract llo-feeds/v0.3.0/test/mocks/ErroredVerifier.sol
compileContract llo-feeds/v0.3.0/test/mocks/ExposedVerifier.sol

# LLO
compileContract llo-feeds/dev/ChannelConfigStore.sol
Expand Down
46 changes: 46 additions & 0 deletions contracts/src/v0.8/llo-feeds/libraries/Common.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,28 @@ library Common {
uint64 weight;
}

/**
* @notice Checks if an array of AddressAndWeight has duplicate addresses
* @param recipients The array of AddressAndWeight to check
* @return bool True if there are duplicates, false otherwise
*/
function _hasDuplicateAddresses(address[] memory recipients) internal pure returns (bool) {
for (uint256 i = 0; i < recipients.length; ) {
for (uint256 j = i + 1; j < recipients.length; ) {
if (recipients[i] == recipients[j]) {
return true;
}
unchecked {
++j;
}
}
unchecked {
++i;
}
}
return false;
}

/**
* @notice Checks if an array of AddressAndWeight has duplicate addresses
* @param recipients The array of AddressAndWeight to check
Expand All @@ -40,4 +62,28 @@ library Common {
}
return false;
}

/**
* @notice sorts a list of addresses numerically
* @param arr The array of addresses to sort
* @param left the start index
* @param right the end index
*/
function _quickSort(address[] memory arr, int256 left, int256 right) internal pure {
int256 i = left;
int256 j = right;
if (i == j) return;
address pivot = arr[uint256(left + (right - left) / 2)];
while (i <= j) {
while (uint160(arr[uint256(i)]) < uint160(pivot)) i++;
while (uint160(pivot) < uint160(arr[uint256(j)])) j--;
if (i <= j) {
(arr[uint256(i)], arr[uint256(j)]) = (arr[uint256(j)], arr[uint256(i)]);
i++;
j--;
}
}
if (left < j) _quickSort(arr, left, j);
if (i < right) _quickSort(arr, i, right);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity 0.8.19;

import {Test} from "forge-std/Test.sol";
import {ByteUtil} from "../libraries/ByteUtil.sol";
import {ByteUtil} from "../ByteUtil.sol";

contract ByteUtilTest is Test {
using ByteUtil for bytes;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol";
import {IFeeManager} from "./interfaces/IFeeManager.sol";
import {TypeAndVersionInterface} from "../interfaces/TypeAndVersionInterface.sol";
import {IERC165} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "./libraries/Common.sol";
import {TypeAndVersionInterface} from "../../interfaces/TypeAndVersionInterface.sol";
import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
import {IRewardManager} from "./interfaces/IRewardManager.sol";
import {IWERC20} from "../shared/interfaces/IWERC20.sol";
import {IERC20} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol";
import {Math} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/math/Math.sol";
import {SafeERC20} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol";
import {IWERC20} from "../../shared/interfaces/IWERC20.sol";
import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol";
import {Math} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/math/Math.sol";
import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol";
import {IVerifierFeeManager} from "./interfaces/IVerifierFeeManager.sol";

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol";
import {IRewardManager} from "./interfaces/IRewardManager.sol";
import {IERC20} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol";
import {TypeAndVersionInterface} from "../interfaces/TypeAndVersionInterface.sol";
import {Common} from "./libraries/Common.sol";
import {SafeERC20} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol";
import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol";
import {TypeAndVersionInterface} from "../../interfaces/TypeAndVersionInterface.sol";
import {Common} from "../libraries/Common.sol";
import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol";

/**
* @title RewardManager
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol";
import {IVerifier} from "./interfaces/IVerifier.sol";
import {IVerifierProxy} from "./interfaces/IVerifierProxy.sol";
import {TypeAndVersionInterface} from "../interfaces/TypeAndVersionInterface.sol";
import {IERC165} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "./libraries/Common.sol";
import {TypeAndVersionInterface} from "../../interfaces/TypeAndVersionInterface.sol";
import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";

// OCR2 standard
uint256 constant MAX_NUM_ORACLES = 31;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol";
import {IVerifierProxy} from "./interfaces/IVerifierProxy.sol";
import {IVerifier} from "./interfaces/IVerifier.sol";
import {TypeAndVersionInterface} from "../interfaces/TypeAndVersionInterface.sol";
import {AccessControllerInterface} from "../shared/interfaces/AccessControllerInterface.sol";
import {IERC165} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {TypeAndVersionInterface} from "../../interfaces/TypeAndVersionInterface.sol";
import {AccessControllerInterface} from "../../shared/interfaces/AccessControllerInterface.sol";
import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {IVerifierFeeManager} from "./interfaces/IVerifierFeeManager.sol";
import {Common} from "./libraries/Common.sol";
import {Common} from "../libraries/Common.sol";

/**
* The verifier proxy contract is the gateway for all report verification requests
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../../libraries/Common.sol";
import {IVerifierFeeManager} from "./IVerifierFeeManager.sol";

interface IFeeManager is IERC165, IVerifierFeeManager {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../../libraries/Common.sol";

interface IRewardManager is IERC165 {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../../libraries/Common.sol";

interface IVerifier is IERC165 {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../../libraries/Common.sol";

interface IVerifierFeeManager is IERC165 {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {Common} from "../libraries/Common.sol";
import {AccessControllerInterface} from "../../shared/interfaces/AccessControllerInterface.sol";
import {Common} from "../../libraries/Common.sol";
import {AccessControllerInterface} from "../../../shared/interfaces/AccessControllerInterface.sol";
import {IVerifierFeeManager} from "./IVerifierFeeManager.sol";

interface IVerifierProxy {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ pragma solidity 0.8.19;
import {Test} from "forge-std/Test.sol";
import {FeeManager} from "../../FeeManager.sol";
import {RewardManager} from "../../RewardManager.sol";
import {Common} from "../../libraries/Common.sol";
import {ERC20Mock} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/mocks/ERC20Mock.sol";
import {WERC20Mock} from "../../../shared/mocks/WERC20Mock.sol";
import {Common} from "../../../libraries/Common.sol";
import {ERC20Mock} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/mocks/ERC20Mock.sol";
import {WERC20Mock} from "../../../../shared/mocks/WERC20Mock.sol";
import {IRewardManager} from "../../interfaces/IRewardManager.sol";
import {FeeManagerProxy} from "../mocks/FeeManagerProxy.sol";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

import {Common} from "../../libraries/Common.sol";
import {Common} from "../../../libraries/Common.sol";
import "./BaseFeeManager.t.sol";

/**
Expand All @@ -10,15 +10,15 @@ import "./BaseFeeManager.t.sol";
* @notice This contract will test the functionality of the feeManager's getFeeAndReward
*/
contract FeeManagerProcessFeeTest is BaseFeeManagerTest {
function test_baseFeeIsAppliedForNative() public {
function test_baseFeeIsAppliedForNative() public view {
//get the fee required by the feeManager
Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER);

//fee should be the default
assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE);
}

function test_baseFeeIsAppliedForLink() public {
function test_baseFeeIsAppliedForLink() public view {
//get the fee required by the feeManager
Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER);

Expand Down Expand Up @@ -378,7 +378,7 @@ contract FeeManagerProcessFeeTest is BaseFeeManagerTest {
assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE - expectedDiscount);
}

function test_reportWithNoExpiryOrFeeReturnsZero() public {
function test_reportWithNoExpiryOrFeeReturnsZero() public view {
//get the fee required by the feeManager
Common.Asset memory fee = getFee(getV1Report(DEFAULT_FEED_1_V1), getNativeQuote(), USER);

Expand Down Expand Up @@ -462,7 +462,7 @@ contract FeeManagerProcessFeeTest is BaseFeeManagerTest {
setNativeSurcharge(nativeSurcharge, ADMIN);
}

function test_getBaseRewardWithLinkQuote() public {
function test_getBaseRewardWithLinkQuote() public view {
//get the fee required by the feeManager
Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER);

Expand All @@ -481,7 +481,7 @@ contract FeeManagerProcessFeeTest is BaseFeeManagerTest {
assertEq(reward.amount, DEFAULT_REPORT_LINK_FEE / 2);
}

function test_getRewardWithNativeQuote() public {
function test_getRewardWithNativeQuote() public view {
//get the fee required by the feeManager
Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

import {Common} from "../../libraries/Common.sol";
import {Common} from "../../../libraries/Common.sol";
import "./BaseFeeManager.t.sol";
import {IRewardManager} from "../../interfaces/IRewardManager.sol";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
pragma solidity 0.8.19;

import {BaseTest, BaseTestWithConfiguredVerifierAndFeeManager} from "../verifier/BaseVerifierTest.t.sol";
import {SimpleWriteAccessController} from "../../../shared/access/SimpleWriteAccessController.sol";
import {Common} from "../../libraries/Common.sol";
import {SimpleWriteAccessController} from "../../../../shared/access/SimpleWriteAccessController.sol";
import {Common} from "../../../libraries/Common.sol";
import {IRewardManager} from "../../interfaces/IRewardManager.sol";

contract Verifier_setConfig is BaseTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,24 @@
pragma solidity 0.8.19;

import {IVerifier} from "../../interfaces/IVerifier.sol";
import {Common} from "../../libraries/Common.sol";
import {Common} from "../../../libraries/Common.sol";

contract ErroredVerifier is IVerifier {
function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {
return interfaceId == this.verify.selector;
}

//define each of the errors thrown in the revert below

error FailedToVerify();
error FailedToSetConfig();
error FailedToActivateConfig();
error FailedToDeactivateConfig();
error FailedToActivateFeed();
error FailedToDeactivateFeed();
error FailedToGetLatestConfigDigestAndEpoch();
error FailedToGetLatestConfigDetails();

function verify(
bytes memory,
/**
Expand All @@ -26,7 +37,7 @@ contract ErroredVerifier is IVerifier {
bytes memory
)
{
revert("Failed to verify");
revert FailedToVerify();
}

function setConfig(
Expand All @@ -39,7 +50,7 @@ contract ErroredVerifier is IVerifier {
bytes memory,
Common.AddressAndWeight[] memory
) external pure override {
revert("Failed to set config");
revert FailedToSetConfig();
}

function setConfigFromSource(
Expand All @@ -55,30 +66,30 @@ contract ErroredVerifier is IVerifier {
bytes memory,
Common.AddressAndWeight[] memory
) external pure override {
revert("Failed to set config");
revert FailedToSetConfig();
}

function activateConfig(bytes32, bytes32) external pure {
revert("Failed to activate config");
revert FailedToActivateConfig();
}

function deactivateConfig(bytes32, bytes32) external pure {
revert("Failed to deactivate config");
revert FailedToDeactivateConfig();
}

function activateFeed(bytes32) external pure {
revert("Failed to activate feed");
revert FailedToActivateFeed();
}

function deactivateFeed(bytes32) external pure {
revert("Failed to deactivate feed");
revert FailedToDeactivateFeed();
}

function latestConfigDigestAndEpoch(bytes32) external pure override returns (bool, bytes32, uint32) {
revert("Failed to get latest config digest and epoch");
revert FailedToGetLatestConfigDigestAndEpoch();
}

function latestConfigDetails(bytes32) external pure override returns (uint32, uint32, bytes32) {
revert("Failed to get latest config details");
revert FailedToGetLatestConfigDetails();
}
}
Loading

0 comments on commit c4ffbfb

Please sign in to comment.