From ddde6e62b379f9443ef5563737825b8efa00d70f Mon Sep 17 00:00:00 2001 From: Ashitaka Date: Fri, 2 Aug 2024 00:23:45 -0300 Subject: [PATCH] feat: unit tests --- package.json | 4 +- src/contracts/EBORequestCreator.sol | 77 +++++++++++---- src/interfaces/IEBORequestCreator.sol | 40 +++----- test/unit/EBORequestCreator.t.sol | 133 ++++++++++++++++++++------ yarn.lock | 87 ++++------------- 5 files changed, 195 insertions(+), 146 deletions(-) diff --git a/package.json b/package.json index 1686815..7124f34 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "package.json": "sort-package-json" }, "dependencies": { - "@defi-wonderland/prophet-core-contracts": "^0.0.0-e73df4c1", - "@defi-wonderland/prophet-modules-contracts": "^0.0.0-2c7deca8" + "@defi-wonderland/prophet-core-contracts": "0.0.0-c25103ea", + "@defi-wonderland/prophet-modules-contracts": "0.0.0-ee716ee0" }, "devDependencies": { "@commitlint/cli": "19.3.0", diff --git a/src/contracts/EBORequestCreator.sol b/src/contracts/EBORequestCreator.sol index f3ff34f..bd8f7ac 100644 --- a/src/contracts/EBORequestCreator.sol +++ b/src/contracts/EBORequestCreator.sol @@ -1,11 +1,14 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.26; -import {IEBORequestCreator} from 'interfaces/IEBORequestCreator.sol'; +import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; +import {IEBORequestCreator, IOracle} from 'interfaces/IEBORequestCreator.sol'; contract EBORequestCreator is IEBORequestCreator { - // /// @inheritdoc IEBORequestCreator - // IOracle public oracle; + using EnumerableSet for EnumerableSet.Bytes32Set; + + /// @inheritdoc IEBORequestCreator + IOracle public oracle; /// @inheritdoc IEBORequestCreator address public owner; @@ -16,11 +19,12 @@ contract EBORequestCreator is IEBORequestCreator { /// @inheritdoc IEBORequestCreator uint256 public reward; - /// @inheritdoc IEBORequestCreator - mapping(string _chainId => bool _approved) public chainIds; + EnumerableSet.Bytes32Set internal _chainIdsAllowed; - constructor(address _owner) { - // oracle = _oracle; + mapping(uint256 _epoch => EnumerableSet.Bytes32Set _chainIds) internal _epochChainIds; + + constructor(IOracle _oracle, address _owner) { + oracle = _oracle; owner = _owner; reward = 0; } @@ -42,32 +46,59 @@ contract EBORequestCreator is IEBORequestCreator { } /// @inheritdoc IEBORequestCreator - function createRequest( - address _requester, - address _target, - bytes calldata _data, - uint256 _value, - uint256 _nonce - ) external returns (bytes32 _requestId) { - // emit RequestCreated(_requestId, _requester, _target, _data, _value, _nonce); + function createRequests(uint256 _epoch, string[] calldata _chainIds) external { + bytes32 _encodedChainId; + + EnumerableSet.Bytes32Set storage _epochEncodedChainIds = _epochChainIds[_epoch]; + + for (uint256 _i; _i < _chainIds.length; _i++) { + _encodedChainId = _encodeChainId(_chainIds[_i]); + if (!_chainIdsAllowed.contains(_encodedChainId)) revert EBORequestCreator_ChainNotAdded(); + + if (!_epochEncodedChainIds.contains(_encodedChainId)) { + _epochChainIds[_epoch].add(_encodedChainId); + + // TODO: COMPLETE THE REQUEST CREATION WITH THE PROPER MODULES + IOracle.Request memory _request = IOracle.Request({ + nonce: 0, + requester: msg.sender, + requestModule: address(0), + responseModule: address(0), + disputeModule: address(0), + resolutionModule: address(0), + finalityModule: address(0), + requestModuleData: '', + responseModuleData: '', + disputeModuleData: '', + resolutionModuleData: '', + finalityModuleData: '' + }); + + bytes32 _requestId = oracle.createRequest(_request, bytes32(0)); + + emit RequestCreated(_requestId, _epoch, _chainIds[_i]); + } + } } /// @inheritdoc IEBORequestCreator function addChain(string calldata _chainId) external onlyOwner { - if (chainIds[_chainId]) { + bytes32 _encodedChainId = _encodeChainId(_chainId); + if (_chainIdsAllowed.contains(_encodedChainId)) { revert EBORequestCreator_ChainAlreadyAdded(); } - chainIds[_chainId] = true; + _chainIdsAllowed.add(_encodedChainId); emit ChainAdded(_chainId); } /// @inheritdoc IEBORequestCreator function removeChain(string calldata _chainId) external onlyOwner { - if (!chainIds[_chainId]) { + bytes32 _encodedChainId = _encodeChainId(_chainId); + if (!_chainIdsAllowed.contains(_encodedChainId)) { revert EBORequestCreator_ChainNotAdded(); } - chainIds[_chainId] = false; + _chainIdsAllowed.remove(_encodedChainId); emit ChainRemoved(_chainId); } @@ -79,6 +110,14 @@ contract EBORequestCreator is IEBORequestCreator { emit RewardSet(_oldReward, _reward); } + /** + * @notice Encodes the chain id + * @dev The chain id is hashed to have a enumerable set to avoid duplicates + */ + function _encodeChainId(string calldata _chainId) internal pure returns (bytes32 _encodedChainId) { + _encodedChainId = keccak256(abi.encodePacked(_chainId)); + } + /** * @notice Checks if the sender is the owner */ diff --git a/src/interfaces/IEBORequestCreator.sol b/src/interfaces/IEBORequestCreator.sol index 1719b89..d09843b 100644 --- a/src/interfaces/IEBORequestCreator.sol +++ b/src/interfaces/IEBORequestCreator.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.26; -// import {IOracle} from '@defi-wonderland/prophet-core-contracts/solidity/interfaces/IOracle.sol'; +import {IOracle} from '@defi-wonderland/prophet-core-contracts/solidity/interfaces/IOracle.sol'; interface IEBORequestCreator { /*/////////////////////////////////////////////////////////////// @@ -23,10 +23,11 @@ interface IEBORequestCreator { /** * @notice Emitted when a request is created + * @param _requestId The id of the request * @param _epoch The epoch of the request * @param _chainId The chain id of the request */ - event RequestCreated(uint256 indexed _epoch, string indexed _chainId); + event RequestCreated(bytes32 indexed _requestId, uint256 indexed _epoch, string indexed _chainId); /** * @notice Emitted when a chain is added @@ -75,10 +76,10 @@ interface IEBORequestCreator { VARIABLES //////////////////////////////////////////////////////////////*/ - // /** - // * @notice The oracle contract - // */ - // function oracle() external view returns (IOracle _oracle); + /** + * @notice The oracle contract + */ + function oracle() external view returns (IOracle _oracle); /** * @notice The owner of the contract @@ -98,13 +99,6 @@ interface IEBORequestCreator { */ function reward() external view returns (uint256 _reward); - /** - * @notice The chain ids - * @param _chainId The chain id to check - * @return _approved The chain id is approved - */ - function chainIds(string calldata _chainId) external view returns (bool _approved); - /*/////////////////////////////////////////////////////////////// LOGIC //////////////////////////////////////////////////////////////*/ @@ -121,21 +115,11 @@ interface IEBORequestCreator { function acceptPendingOwner() external; /** - * @notice Create a request - * @param _requester The address of the requester - * @param _target The address of the target - * @param _data The data of the request - * @param _value The value of the request - * @param _nonce The nonce of the request - * @return _requestId The id of the request - */ - function createRequest( - address _requester, - address _target, - bytes calldata _data, - uint256 _value, - uint256 _nonce - ) external returns (bytes32 _requestId); + * @notice Create requests + * @param _epoch The epoch of the request + * @param _chainIds The chain ids to update + */ + function createRequests(uint256 _epoch, string[] calldata _chainIds) external; /** * @notice Add a chain to the allowed chains which can be updated diff --git a/test/unit/EBORequestCreator.t.sol b/test/unit/EBORequestCreator.t.sol index d25ae78..8f3c4ef 100644 --- a/test/unit/EBORequestCreator.t.sol +++ b/test/unit/EBORequestCreator.t.sol @@ -3,21 +3,22 @@ pragma solidity 0.8.26; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; -import {EBORequestCreator, IEBORequestCreator} from 'contracts/EBORequestCreator.sol'; +import {EBORequestCreator, IEBORequestCreator, IOracle} from 'contracts/EBORequestCreator.sol'; import {Test} from 'forge-std/Test.sol'; +import 'forge-std/console.sol'; contract EBORequestCreatorForTest is EBORequestCreator { using EnumerableSet for EnumerableSet.Bytes32Set; - constructor(address _owner) EBORequestCreator(_owner) {} + constructor(IOracle _oracle, address _owner) EBORequestCreator(_oracle, _owner) {} function setPendingOwnerForTest(address _pendingOwner) external { pendingOwner = _pendingOwner; } - function setChainIdForTest(string calldata _chainId) external { - chainIds[_chainId] = true; + function setChainIdForTest(string calldata _chainId) external returns (bool _added) { + _added = _chainIdsAllowed.add(_encodeChainId(_chainId)); } } @@ -25,24 +26,24 @@ abstract contract EBORequestCreatorUnitTest is Test { /// Events event PendingOwnerSetted(address _pendingOwner); event OwnerSetted(address _oldOwner, address _newOwner); - event RequestCreated(uint256 indexed _epoch, string indexed _chainId); + event RequestCreated(bytes32 indexed _requestId, uint256 indexed _epoch, string indexed _chainId); event ChainAdded(string indexed _chainId); event ChainRemoved(string indexed _chainId); event RewardSet(uint256 _oldReward, uint256 _newReward); /// Contracts EBORequestCreatorForTest public eboRequestCreator; - // IOracle public oracle; + IOracle public oracle; /// EOAs address public owner; function setUp() external { owner = makeAddr('Owner'); - // oracle = IOracle(makeAddr('Oracle')); + oracle = IOracle(makeAddr('Oracle')); vm.prank(owner); - eboRequestCreator = new EBORequestCreatorForTest(owner); + eboRequestCreator = new EBORequestCreatorForTest(oracle, owner); } function _revertIfNotOwner() internal { @@ -51,11 +52,14 @@ abstract contract EBORequestCreatorUnitTest is Test { } contract UnitEBORequestCreatorConstructor is EBORequestCreatorUnitTest { + /** + * @notice Test the constructor + */ function testConstructor() external view { assertEq(eboRequestCreator.reward(), 0); assertEq(eboRequestCreator.owner(), owner); assertEq(eboRequestCreator.pendingOwner(), address(0)); - // assertEq(eboRequestCreator.oracle(), oracle); + assertEq(address(eboRequestCreator.oracle()), address(oracle)); } } @@ -65,17 +69,26 @@ contract UnitEBORequestCreatorSetPendingOwner is EBORequestCreatorUnitTest { _; } + /** + * @notice Test the revert if the caller is not the owner + */ function testRevertIfNotOwner(address _pendingOwner) external { _revertIfNotOwner(); eboRequestCreator.setPendingOwner(_pendingOwner); } + /** + * @notice Test the set pending owner + */ function testSetPendingOwner(address _pendingOwner) external happyPath(_pendingOwner) { eboRequestCreator.setPendingOwner(_pendingOwner); assertEq(eboRequestCreator.pendingOwner(), _pendingOwner); } + /** + * @notice Test the emit pending owner setted + */ function testEmitPendingOwnerSetted(address _pendingOwner) external happyPath(_pendingOwner) { vm.expectEmit(); emit PendingOwnerSetted(_pendingOwner); @@ -91,11 +104,17 @@ contract UnitEBORequestCreatorAcceptPendingOwner is EBORequestCreatorUnitTest { _; } - function testRevertIfNotPendingOwner(address _pendingOwner) external { + /** + * @notice Test the revert if the caller is not the pending owner + */ + function testRevertIfNotPendingOwner() external { vm.expectRevert(IEBORequestCreator.EBORequestCreator_OnlyPendingOwner.selector); eboRequestCreator.acceptPendingOwner(); } + /** + * @notice Test the accept pending owner + */ function testAcceptPendingOwner(address _pendingOwner) external happyPath(_pendingOwner) { eboRequestCreator.acceptPendingOwner(); @@ -103,6 +122,9 @@ contract UnitEBORequestCreatorAcceptPendingOwner is EBORequestCreatorUnitTest { assertEq(eboRequestCreator.pendingOwner(), address(0)); } + /** + * @notice Test the emit owner setted + */ function testEmitOwnerSetted(address _pendingOwner) external happyPath(_pendingOwner) { vm.expectEmit(); emit OwnerSetted(owner, _pendingOwner); @@ -111,12 +133,52 @@ contract UnitEBORequestCreatorAcceptPendingOwner is EBORequestCreatorUnitTest { } } -// contract UnitEBORequestCreatorCreateRequest is EBORequestCreatorUnitTest { -// function test_CreateRequest() external { -// bytes32 requestId = eboRequestCreator.createRequest(address(this), address(this), '0x', 0, 0); -// assertEq(uint256(requestId), uint256(keccak256(abi.encodePacked(address(this), address(this), '0x', 0, 0))); -// } -// } +contract UnitEBORequestCreatorCreateRequest is EBORequestCreatorUnitTest { + string[] internal _cleanChainIds; + + modifier happyPath(uint256 _epoch, string[] calldata _chainId) { + vm.assume(_epoch > 0); + vm.assume(_chainId.length > 0 && _chainId.length < 30); + + bool _added; + for (uint256 _i; _i < _chainId.length; _i++) { + _added = eboRequestCreator.setChainIdForTest(_chainId[_i]); + if (_added) { + _cleanChainIds.push(_chainId[_i]); + } + } + + vm.startPrank(owner); + _; + } + + /** + * @notice Test the revert if the caller is not the owner + */ + function testRevertIfChainNotAdded() external { + vm.expectRevert(abi.encodeWithSelector(IEBORequestCreator.EBORequestCreator_ChainNotAdded.selector)); + + eboRequestCreator.createRequests(0, new string[](1)); + } + + /** + * @notice Test the create requests + */ + function testEmitCreateRequest( + uint256 _epoch, + string[] calldata _chainIds, + bytes32 _requestId + ) external happyPath(_epoch, _chainIds) { + for (uint256 _i; _i < _cleanChainIds.length; _i++) { + console.log(_cleanChainIds[_i]); + vm.mockCall(address(oracle), abi.encodeWithSelector(IOracle.createRequest.selector), abi.encode(_requestId)); + vm.expectEmit(); + emit RequestCreated(_requestId, _epoch, _cleanChainIds[_i]); + } + + eboRequestCreator.createRequests(_epoch, _cleanChainIds); + } +} contract UnitEBORequestCreatorAddChain is EBORequestCreatorUnitTest { modifier happyPath() { @@ -124,11 +186,17 @@ contract UnitEBORequestCreatorAddChain is EBORequestCreatorUnitTest { _; } + /** + * @notice Test the revert if the caller is not the owner + */ function testRevertIfNotOwner(string calldata _chainId) external { _revertIfNotOwner(); eboRequestCreator.addChain(_chainId); } + /** + * @notice Test the revert if the chain is already added + */ function testRevertIfChainAdded(string calldata _chainId) external happyPath { eboRequestCreator.setChainIdForTest(_chainId); @@ -136,12 +204,9 @@ contract UnitEBORequestCreatorAddChain is EBORequestCreatorUnitTest { eboRequestCreator.addChain(_chainId); } - function testAddChain(string calldata _chainId) external happyPath { - eboRequestCreator.addChain(_chainId); - - assertEq(eboRequestCreator.chainIds(_chainId), true); - } - + /** + * @notice Test the emit chain added + */ function testEmitChainAdded(string calldata _chainId) external happyPath { vm.expectEmit(); emit ChainAdded(_chainId); @@ -157,11 +222,17 @@ contract UnitEBORequestCreatorRemoveChain is EBORequestCreatorUnitTest { _; } + /** + * @notice Test the revert if the caller is not the owner + */ function testRevertIfNotOwner(string calldata _chainId) external { _revertIfNotOwner(); eboRequestCreator.removeChain(_chainId); } + /** + * @notice Test the revert if the chain is not added + */ function testRevertIfChainNotAdded(string calldata _chainId) external { vm.expectRevert(abi.encodeWithSelector(IEBORequestCreator.EBORequestCreator_ChainNotAdded.selector)); @@ -169,12 +240,9 @@ contract UnitEBORequestCreatorRemoveChain is EBORequestCreatorUnitTest { eboRequestCreator.removeChain(_chainId); } - function testRemoveChain(string calldata _chainId) external happyPath(_chainId) { - eboRequestCreator.removeChain(_chainId); - - assertEq(eboRequestCreator.chainIds(_chainId), false); - } - + /** + * @notice Test the emit chain removed + */ function testEmitChainRemoved(string calldata _chainId) external happyPath(_chainId) { vm.expectEmit(); emit ChainRemoved(_chainId); @@ -189,17 +257,26 @@ contract UnitEBORequestCreatorSetReward is EBORequestCreatorUnitTest { _; } + /** + * @notice Test the revert if the caller is not the owner + */ function testRevertIfNotOwner(uint256 _reward) external { vm.expectRevert(); eboRequestCreator.setReward(_reward); } + /** + * @notice Test the set reward + */ function testSetReward(uint256 _reward) external happyPath(_reward) { eboRequestCreator.setReward(_reward); assertEq(eboRequestCreator.reward(), _reward); } + /** + * @notice Test the emit reward set + */ function testEmitRewardSet(uint256 _reward) external happyPath(_reward) { vm.expectEmit(); emit RewardSet(0, _reward); diff --git a/yarn.lock b/yarn.lock index a0b6304..c19cd49 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,49 +190,20 @@ solc-typed-ast "18.1.2" yargs "17.7.2" -"@defi-wonderland/prophet-core-contracts@0.0.0-a8dc38de": - version "0.0.0-a8dc38de" - resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core-contracts/-/prophet-core-contracts-0.0.0-a8dc38de.tgz#3e662bc423887bc1bf12ac44a2c15346b56b6957" - integrity sha512-W0OG+bNBSunUvqeFPxlC/IzfxWwE9CpebBRSfOB9MP+7Wivn3KLtzD7neIFSxmWFDT479YBp715ZnTa87Lr6fQ== - dependencies: - "@defi-wonderland/solidity-utils" "0.0.0-3e9c8e8b" - "@openzeppelin/contracts" "^4.9.3" - ds-test "https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0" - forge-std "https://github.com/foundry-rs/forge-std.git#e8a047e3f40f13fa37af6fe14e6e06283d9a060e" +"@defi-wonderland/prophet-core-contracts@0.0.0-c25103ea": + version "0.0.0-c25103ea" + resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core-contracts/-/prophet-core-contracts-0.0.0-c25103ea.tgz#e7a83271251d6ffbe0644c5971e6748d41ae9255" + integrity sha512-VCIeXwutXaih/ZF0JeqBjqkIs1ALWoFmn9OMeM5ZGcRZfx3JSV+axhi4YiIQVfrTLxICyu2hnbIEV7T1OmLVMQ== + +"@defi-wonderland/prophet-modules-contracts@0.0.0-ee716ee0": + version "0.0.0-ee716ee0" + resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-modules-contracts/-/prophet-modules-contracts-0.0.0-ee716ee0.tgz#cfcc221e8682f6a3cfe77a7353d7b2d894e198e7" + integrity sha512-wFb2FKmIgblXdz8fgTd5D0/ps6wzsnET6yXPhlD6yR2nW2x+/trXf3EvA5hrFzYnkfzp8gaHf60kDns4FAweSA== + dependencies: + "@defi-wonderland/prophet-core-contracts" "0.0.0-c25103ea" + "@openzeppelin/contracts" "4.9.5" solmate "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" -"@defi-wonderland/prophet-core-contracts@^0.0.0-e73df4c1": - version "0.0.0-e73df4c1" - resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core-contracts/-/prophet-core-contracts-0.0.0-e73df4c1.tgz#b5006963fe45c9079fc4a17d638f7199146ba5a2" - integrity sha512-7dFJ2xHXlbZQHYxYLkmkHf7RCpRahbPKt8bOJzUC/As6VpH8tNzwgV6+O1Ih+g77DIFqDUXdWgfaAB432USotA== - dependencies: - "@defi-wonderland/solidity-utils" "0.0.0-3e9c8e8b" - "@openzeppelin/contracts" "^4.9.3" - ds-test "https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0" - forge-std "https://github.com/foundry-rs/forge-std.git#e8a047e3f40f13fa37af6fe14e6e06283d9a060e" - solmate "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" - -"@defi-wonderland/prophet-modules-contracts@^0.0.0-2c7deca8": - version "0.0.0-2c7deca8" - resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-modules-contracts/-/prophet-modules-contracts-0.0.0-2c7deca8.tgz#ae3461200039c62c655b291f7ce6d90011cb0ef5" - integrity sha512-ZK194P+TQUgs50CT0BudgSvadX8DOr8ZFzAfDnOyBY9BGkDDi9ztdE6Ff7BbytXm4wPr+9G1bVDNoTH4XvLu4Q== - dependencies: - "@defi-wonderland/prophet-core-contracts" "0.0.0-a8dc38de" - "@defi-wonderland/solidity-utils" "0.0.0-3e9c8e8b" - "@openzeppelin/contracts" "^4.9.3" - ds-test "https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0" - forge-std "https://github.com/foundry-rs/forge-std.git#e8a047e3f40f13fa37af6fe14e6e06283d9a060e" - solmate "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" - -"@defi-wonderland/solidity-utils@0.0.0-3e9c8e8b": - version "0.0.0-3e9c8e8b" - resolved "https://registry.yarnpkg.com/@defi-wonderland/solidity-utils/-/solidity-utils-0.0.0-3e9c8e8b.tgz#1f9c47506e1679ea36d0854e9aa69bd210af4da0" - integrity sha512-HCN5TTO58jTrLrAcxXwTPm++P0u4dMDnwVkssszoEu0SmVKwegzZOdoA+gNbfOjjYydph+3+9bAZbNXj+UK2rg== - dependencies: - "@openzeppelin/contracts" "4.9.2" - ds-test "https://github.com/dapphub/ds-test" - forge-std "https://github.com/foundry-rs/forge-std" - "@noble/curves@1.3.0", "@noble/curves@~1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" @@ -266,15 +237,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@openzeppelin/contracts@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.2.tgz#1cb2d5e4d3360141a17dbc45094a8cad6aac16c1" - integrity sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg== - -"@openzeppelin/contracts@^4.9.3": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" - integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== +"@openzeppelin/contracts@4.9.5": + version "4.9.5" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.5.tgz#1eed23d4844c861a1835b5d33507c1017fa98de8" + integrity sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg== "@scure/base@~1.1.4": version "1.1.6" @@ -702,15 +668,6 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -"ds-test@https://github.com/dapphub/ds-test": - version "1.0.0" - uid e282159d5170298eb2455a6c05280ab5a73a4ef0 - resolved "https://github.com/dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0" - -"ds-test@https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0": - version "1.0.0" - resolved "https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0" - emoji-regex@^10.3.0: version "10.3.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" @@ -867,14 +824,6 @@ for-each@^0.3.3: version "1.8.2" resolved "https://codeload.github.com/foundry-rs/forge-std/tar.gz/978ac6fadb62f5f0b723c996f64be52eddba6801" -"forge-std@https://github.com/foundry-rs/forge-std": - version "1.9.1" - resolved "https://github.com/foundry-rs/forge-std#2cbff0602d340503dba9828ab6981053704d1384" - -"forge-std@https://github.com/foundry-rs/forge-std.git#e8a047e3f40f13fa37af6fe14e6e06283d9a060e": - version "1.5.6" - resolved "https://github.com/foundry-rs/forge-std.git#e8a047e3f40f13fa37af6fe14e6e06283d9a060e" - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -1771,9 +1720,9 @@ solhint-community@4.0.0: optionalDependencies: prettier "^2.8.3" -"solmate@https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c": +"solmate@git+https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c": version "6.1.0" - resolved "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" + resolved "git+https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" sort-object-keys@^1.1.3: version "1.1.3"