From ab984851ae8c0ff72f7ef11cb4b6e53d92f78079 Mon Sep 17 00:00:00 2001 From: 1marcghannam <1marc.ghannam@gmail.com> Date: Wed, 28 Aug 2024 18:33:44 -0400 Subject: [PATCH 1/3] feat: subgraph testing --- contracts/core/test/EthUsdAggregator.sol | 22 +++++++++++++ contracts/core/test/LinkSdlSushiPool.sol | 28 ++++++++++++++++ contracts/core/test/LinkSdlUniswapPool.sol | 28 ++++++++++++++++ contracts/core/test/LinkUsdAggregator.sol | 22 +++++++++++++ contracts/core/test/MetisEthUniswapPool.sol | 28 ++++++++++++++++ contracts/mock/EthUsdAggregator.sol | 22 +++++++++++++ contracts/mock/LinkSdlSushiPool.sol | 28 ++++++++++++++++ contracts/mock/LinkSdlUniswapPool.sol | 28 ++++++++++++++++ contracts/mock/LinkUsdAggregator.sol | 22 +++++++++++++ contracts/mock/MetisEthUniswapPool.sol | 28 ++++++++++++++++ lib/forge-std | 1 + scripts/test/deploy/deploy.ts | 2 ++ .../deploy/modules/deploy-subgraph-mocks.ts | 33 +++++++++++++++++++ 13 files changed, 292 insertions(+) create mode 100644 contracts/core/test/EthUsdAggregator.sol create mode 100644 contracts/core/test/LinkSdlSushiPool.sol create mode 100644 contracts/core/test/LinkSdlUniswapPool.sol create mode 100644 contracts/core/test/LinkUsdAggregator.sol create mode 100644 contracts/core/test/MetisEthUniswapPool.sol create mode 100644 contracts/mock/EthUsdAggregator.sol create mode 100644 contracts/mock/LinkSdlSushiPool.sol create mode 100644 contracts/mock/LinkSdlUniswapPool.sol create mode 100644 contracts/mock/LinkUsdAggregator.sol create mode 100644 contracts/mock/MetisEthUniswapPool.sol create mode 160000 lib/forge-std create mode 100644 scripts/test/deploy/modules/deploy-subgraph-mocks.ts diff --git a/contracts/core/test/EthUsdAggregator.sol b/contracts/core/test/EthUsdAggregator.sol new file mode 100644 index 00000000..a8013e48 --- /dev/null +++ b/contracts/core/test/EthUsdAggregator.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockEthUsdAggregator { + /** + * @notice Reads the current answer from aggregator delegated to. + * @dev overridden function to add the checkAccess() modifier + * + * @dev #[deprecated] Use latestRoundData instead. This does not error if no + * answer has been reached, it will simply return 0. Either wait to point to + * an already answered Aggregator or use the recommended latestRoundData + * instead which includes better verification information. + */ + function latestAnswer() public view checkAccess returns (int256) { + return 244453000000; + } + + // Mock of checkAccess modifier to allow compilation + modifier checkAccess() { + _; + } +} diff --git a/contracts/core/test/LinkSdlSushiPool.sol b/contracts/core/test/LinkSdlSushiPool.sol new file mode 100644 index 00000000..96bf8322 --- /dev/null +++ b/contracts/core/test/LinkSdlSushiPool.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockLinkSdlSushiPool { + struct Reserves { + uint112 reserve0; + uint112 reserve1; + uint32 blockTimestampLast; + } + + Reserves private _reserves; + + constructor() { + _reserves = Reserves({ + reserve0: 50280390552967262265, + reserve1: 2263776855667093842130, + blockTimestampLast: 1724692727 + }); + } + + function getReserves() + external + view + returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) + { + return (_reserves.reserve0, _reserves.reserve1, _reserves.blockTimestampLast); + } +} diff --git a/contracts/core/test/LinkSdlUniswapPool.sol b/contracts/core/test/LinkSdlUniswapPool.sol new file mode 100644 index 00000000..5e757612 --- /dev/null +++ b/contracts/core/test/LinkSdlUniswapPool.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockLinkSdlUniswapPool { + struct Slot0 { + uint160 sqrtPriceX96; + int24 tick; + uint16 observationIndex; + uint16 observationCardinality; + uint16 observationCardinalityNext; + uint8 feeProtocol; + bool unlocked; + } + + Slot0 public slot0; + + constructor() { + slot0 = Slot0({ + sqrtPriceX96: 539950026751222674039685537688, + tick: 38384, + observationIndex: 0, + observationCardinality: 1, + observationCardinalityNext: 1, + feeProtocol: 0, + unlocked: true + }); + } +} diff --git a/contracts/core/test/LinkUsdAggregator.sol b/contracts/core/test/LinkUsdAggregator.sol new file mode 100644 index 00000000..e5fa5056 --- /dev/null +++ b/contracts/core/test/LinkUsdAggregator.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockLinkUsdAggregator { + /** + * @notice Reads the current answer from aggregator delegated to. + * @dev overridden function to add the checkAccess() modifier + * + * @dev #[deprecated] Use latestRoundData instead. This does not error if no + * answer has been reached, it will simply return 0. Either wait to point to + * an already answered Aggregator or use the recommended latestRoundData + * instead which includes better verification information. + */ + function latestAnswer() public view checkAccess returns (int256) { + return 1110908500; + } + + // Mock of checkAccess modifier to allow compilation + modifier checkAccess() { + _; + } +} diff --git a/contracts/core/test/MetisEthUniswapPool.sol b/contracts/core/test/MetisEthUniswapPool.sol new file mode 100644 index 00000000..c395d18c --- /dev/null +++ b/contracts/core/test/MetisEthUniswapPool.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockMetisEthUniswapPool { + struct Slot0 { + uint160 sqrtPriceX96; + int24 tick; + uint16 observationIndex; + uint16 observationCardinality; + uint16 observationCardinalityNext; + uint8 feeProtocol; + bool unlocked; + } + + Slot0 public slot0; + + constructor() { + slot0 = Slot0({ + sqrtPriceX96: 921607156908519294832225, + tick: -43030, + observationIndex: 52, + observationCardinality: 80, + observationCardinalityNext: 80, + feeProtocol: 0, + unlocked: true + }); + } +} diff --git a/contracts/mock/EthUsdAggregator.sol b/contracts/mock/EthUsdAggregator.sol new file mode 100644 index 00000000..a8013e48 --- /dev/null +++ b/contracts/mock/EthUsdAggregator.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockEthUsdAggregator { + /** + * @notice Reads the current answer from aggregator delegated to. + * @dev overridden function to add the checkAccess() modifier + * + * @dev #[deprecated] Use latestRoundData instead. This does not error if no + * answer has been reached, it will simply return 0. Either wait to point to + * an already answered Aggregator or use the recommended latestRoundData + * instead which includes better verification information. + */ + function latestAnswer() public view checkAccess returns (int256) { + return 244453000000; + } + + // Mock of checkAccess modifier to allow compilation + modifier checkAccess() { + _; + } +} diff --git a/contracts/mock/LinkSdlSushiPool.sol b/contracts/mock/LinkSdlSushiPool.sol new file mode 100644 index 00000000..96bf8322 --- /dev/null +++ b/contracts/mock/LinkSdlSushiPool.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockLinkSdlSushiPool { + struct Reserves { + uint112 reserve0; + uint112 reserve1; + uint32 blockTimestampLast; + } + + Reserves private _reserves; + + constructor() { + _reserves = Reserves({ + reserve0: 50280390552967262265, + reserve1: 2263776855667093842130, + blockTimestampLast: 1724692727 + }); + } + + function getReserves() + external + view + returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) + { + return (_reserves.reserve0, _reserves.reserve1, _reserves.blockTimestampLast); + } +} diff --git a/contracts/mock/LinkSdlUniswapPool.sol b/contracts/mock/LinkSdlUniswapPool.sol new file mode 100644 index 00000000..5e757612 --- /dev/null +++ b/contracts/mock/LinkSdlUniswapPool.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockLinkSdlUniswapPool { + struct Slot0 { + uint160 sqrtPriceX96; + int24 tick; + uint16 observationIndex; + uint16 observationCardinality; + uint16 observationCardinalityNext; + uint8 feeProtocol; + bool unlocked; + } + + Slot0 public slot0; + + constructor() { + slot0 = Slot0({ + sqrtPriceX96: 539950026751222674039685537688, + tick: 38384, + observationIndex: 0, + observationCardinality: 1, + observationCardinalityNext: 1, + feeProtocol: 0, + unlocked: true + }); + } +} diff --git a/contracts/mock/LinkUsdAggregator.sol b/contracts/mock/LinkUsdAggregator.sol new file mode 100644 index 00000000..e5fa5056 --- /dev/null +++ b/contracts/mock/LinkUsdAggregator.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockLinkUsdAggregator { + /** + * @notice Reads the current answer from aggregator delegated to. + * @dev overridden function to add the checkAccess() modifier + * + * @dev #[deprecated] Use latestRoundData instead. This does not error if no + * answer has been reached, it will simply return 0. Either wait to point to + * an already answered Aggregator or use the recommended latestRoundData + * instead which includes better verification information. + */ + function latestAnswer() public view checkAccess returns (int256) { + return 1110908500; + } + + // Mock of checkAccess modifier to allow compilation + modifier checkAccess() { + _; + } +} diff --git a/contracts/mock/MetisEthUniswapPool.sol b/contracts/mock/MetisEthUniswapPool.sol new file mode 100644 index 00000000..c395d18c --- /dev/null +++ b/contracts/mock/MetisEthUniswapPool.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MockMetisEthUniswapPool { + struct Slot0 { + uint160 sqrtPriceX96; + int24 tick; + uint16 observationIndex; + uint16 observationCardinality; + uint16 observationCardinalityNext; + uint8 feeProtocol; + bool unlocked; + } + + Slot0 public slot0; + + constructor() { + slot0 = Slot0({ + sqrtPriceX96: 921607156908519294832225, + tick: -43030, + observationIndex: 52, + observationCardinality: 80, + observationCardinalityNext: 80, + feeProtocol: 0, + unlocked: true + }); + } +} diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 00000000..155d547c --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 155d547c449afa8715f538d69454b83944117811 diff --git a/scripts/test/deploy/deploy.ts b/scripts/test/deploy/deploy.ts index 0aff96f3..3a948a1c 100644 --- a/scripts/test/deploy/deploy.ts +++ b/scripts/test/deploy/deploy.ts @@ -3,6 +3,7 @@ import { deployCore } from './modules/deploy-core' import { deployLINKStaking } from './modules/deploy-link-staking' import { deployMETISStaking } from './modules/deploy-metis-staking' import { deployTestContracts } from './modules/deploy-test-contracts' +import { deploySubgraphMockContracts } from './modules/deploy-subgraph-mocks' const path = './deployments/localhost.json' @@ -15,6 +16,7 @@ async function main() { await deployCore() await deployLINKStaking() await deployMETISStaking() + await deploySubgraphMockContracts() } main() diff --git a/scripts/test/deploy/modules/deploy-subgraph-mocks.ts b/scripts/test/deploy/modules/deploy-subgraph-mocks.ts new file mode 100644 index 00000000..bfa0e410 --- /dev/null +++ b/scripts/test/deploy/modules/deploy-subgraph-mocks.ts @@ -0,0 +1,33 @@ +import { deploy } from '../../../utils/deployment' + +export async function deploySubgraphMockContracts() { + const mockEthUsdAggregator = await deploy( + 'contracts/core/test/EthUsdAggregator.sol:MockEthUsdAggregator', + [] + ) + console.log('MockEthUsdAggregator deployed: ', mockEthUsdAggregator.target) + + const mockLinkSdlSushiPool = await deploy( + 'contracts/core/test/LinkSdlSushiPool.sol:MockLinkSdlSushiPool', + [] + ) + console.log('MockLinkSdlSushiPool deployed: ', mockLinkSdlSushiPool.target) + + const mockLinkSdlUniswapPool = await deploy( + 'contracts/core/test/LinkSdlUniswapPool.sol:MockLinkSdlUniswapPool', + [] + ) + console.log('MockLinkSdlUniswapPool deployed: ', mockLinkSdlUniswapPool.target) + + const mockLinkUsdAggregator = await deploy( + 'contracts/core/test/LinkUsdAggregator.sol:MockLinkUsdAggregator', + [] + ) + console.log('MockLinkUsdAggregator deployed: ', mockLinkUsdAggregator.target) + + const mockMetisEthUniswapPool = await deploy( + 'contracts/core/test/MetisEthUniswapPool.sol:MockMetisEthUniswapPool', + [] + ) + console.log('MockMetisEthUniswapPool deployed: ', mockMetisEthUniswapPool.target) +} From 85c115a27c13ee686a8693c1e24edc44f932edb6 Mon Sep 17 00:00:00 2001 From: 1marcghannam <1marc.ghannam@gmail.com> Date: Wed, 4 Sep 2024 10:13:11 -0400 Subject: [PATCH 2/3] feat: remove duplicate contracts --- .../{ => subgraphMocks}/EthUsdAggregator.sol | 0 .../{ => subgraphMocks}/LinkSdlSushiPool.sol | 0 .../LinkSdlUniswapPool.sol | 0 .../{ => subgraphMocks}/LinkUsdAggregator.sol | 0 .../MetisEthUniswapPool.sol | 0 contracts/mock/EthUsdAggregator.sol | 22 --------------- contracts/mock/LinkSdlSushiPool.sol | 28 ------------------- contracts/mock/LinkSdlUniswapPool.sol | 28 ------------------- contracts/mock/LinkUsdAggregator.sol | 22 --------------- contracts/mock/MetisEthUniswapPool.sol | 28 ------------------- .../deploy/modules/deploy-subgraph-mocks.ts | 10 +++---- 11 files changed, 5 insertions(+), 133 deletions(-) rename contracts/core/test/{ => subgraphMocks}/EthUsdAggregator.sol (100%) rename contracts/core/test/{ => subgraphMocks}/LinkSdlSushiPool.sol (100%) rename contracts/core/test/{ => subgraphMocks}/LinkSdlUniswapPool.sol (100%) rename contracts/core/test/{ => subgraphMocks}/LinkUsdAggregator.sol (100%) rename contracts/core/test/{ => subgraphMocks}/MetisEthUniswapPool.sol (100%) delete mode 100644 contracts/mock/EthUsdAggregator.sol delete mode 100644 contracts/mock/LinkSdlSushiPool.sol delete mode 100644 contracts/mock/LinkSdlUniswapPool.sol delete mode 100644 contracts/mock/LinkUsdAggregator.sol delete mode 100644 contracts/mock/MetisEthUniswapPool.sol diff --git a/contracts/core/test/EthUsdAggregator.sol b/contracts/core/test/subgraphMocks/EthUsdAggregator.sol similarity index 100% rename from contracts/core/test/EthUsdAggregator.sol rename to contracts/core/test/subgraphMocks/EthUsdAggregator.sol diff --git a/contracts/core/test/LinkSdlSushiPool.sol b/contracts/core/test/subgraphMocks/LinkSdlSushiPool.sol similarity index 100% rename from contracts/core/test/LinkSdlSushiPool.sol rename to contracts/core/test/subgraphMocks/LinkSdlSushiPool.sol diff --git a/contracts/core/test/LinkSdlUniswapPool.sol b/contracts/core/test/subgraphMocks/LinkSdlUniswapPool.sol similarity index 100% rename from contracts/core/test/LinkSdlUniswapPool.sol rename to contracts/core/test/subgraphMocks/LinkSdlUniswapPool.sol diff --git a/contracts/core/test/LinkUsdAggregator.sol b/contracts/core/test/subgraphMocks/LinkUsdAggregator.sol similarity index 100% rename from contracts/core/test/LinkUsdAggregator.sol rename to contracts/core/test/subgraphMocks/LinkUsdAggregator.sol diff --git a/contracts/core/test/MetisEthUniswapPool.sol b/contracts/core/test/subgraphMocks/MetisEthUniswapPool.sol similarity index 100% rename from contracts/core/test/MetisEthUniswapPool.sol rename to contracts/core/test/subgraphMocks/MetisEthUniswapPool.sol diff --git a/contracts/mock/EthUsdAggregator.sol b/contracts/mock/EthUsdAggregator.sol deleted file mode 100644 index a8013e48..00000000 --- a/contracts/mock/EthUsdAggregator.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract MockEthUsdAggregator { - /** - * @notice Reads the current answer from aggregator delegated to. - * @dev overridden function to add the checkAccess() modifier - * - * @dev #[deprecated] Use latestRoundData instead. This does not error if no - * answer has been reached, it will simply return 0. Either wait to point to - * an already answered Aggregator or use the recommended latestRoundData - * instead which includes better verification information. - */ - function latestAnswer() public view checkAccess returns (int256) { - return 244453000000; - } - - // Mock of checkAccess modifier to allow compilation - modifier checkAccess() { - _; - } -} diff --git a/contracts/mock/LinkSdlSushiPool.sol b/contracts/mock/LinkSdlSushiPool.sol deleted file mode 100644 index 96bf8322..00000000 --- a/contracts/mock/LinkSdlSushiPool.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract MockLinkSdlSushiPool { - struct Reserves { - uint112 reserve0; - uint112 reserve1; - uint32 blockTimestampLast; - } - - Reserves private _reserves; - - constructor() { - _reserves = Reserves({ - reserve0: 50280390552967262265, - reserve1: 2263776855667093842130, - blockTimestampLast: 1724692727 - }); - } - - function getReserves() - external - view - returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) - { - return (_reserves.reserve0, _reserves.reserve1, _reserves.blockTimestampLast); - } -} diff --git a/contracts/mock/LinkSdlUniswapPool.sol b/contracts/mock/LinkSdlUniswapPool.sol deleted file mode 100644 index 5e757612..00000000 --- a/contracts/mock/LinkSdlUniswapPool.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract MockLinkSdlUniswapPool { - struct Slot0 { - uint160 sqrtPriceX96; - int24 tick; - uint16 observationIndex; - uint16 observationCardinality; - uint16 observationCardinalityNext; - uint8 feeProtocol; - bool unlocked; - } - - Slot0 public slot0; - - constructor() { - slot0 = Slot0({ - sqrtPriceX96: 539950026751222674039685537688, - tick: 38384, - observationIndex: 0, - observationCardinality: 1, - observationCardinalityNext: 1, - feeProtocol: 0, - unlocked: true - }); - } -} diff --git a/contracts/mock/LinkUsdAggregator.sol b/contracts/mock/LinkUsdAggregator.sol deleted file mode 100644 index e5fa5056..00000000 --- a/contracts/mock/LinkUsdAggregator.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract MockLinkUsdAggregator { - /** - * @notice Reads the current answer from aggregator delegated to. - * @dev overridden function to add the checkAccess() modifier - * - * @dev #[deprecated] Use latestRoundData instead. This does not error if no - * answer has been reached, it will simply return 0. Either wait to point to - * an already answered Aggregator or use the recommended latestRoundData - * instead which includes better verification information. - */ - function latestAnswer() public view checkAccess returns (int256) { - return 1110908500; - } - - // Mock of checkAccess modifier to allow compilation - modifier checkAccess() { - _; - } -} diff --git a/contracts/mock/MetisEthUniswapPool.sol b/contracts/mock/MetisEthUniswapPool.sol deleted file mode 100644 index c395d18c..00000000 --- a/contracts/mock/MetisEthUniswapPool.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract MockMetisEthUniswapPool { - struct Slot0 { - uint160 sqrtPriceX96; - int24 tick; - uint16 observationIndex; - uint16 observationCardinality; - uint16 observationCardinalityNext; - uint8 feeProtocol; - bool unlocked; - } - - Slot0 public slot0; - - constructor() { - slot0 = Slot0({ - sqrtPriceX96: 921607156908519294832225, - tick: -43030, - observationIndex: 52, - observationCardinality: 80, - observationCardinalityNext: 80, - feeProtocol: 0, - unlocked: true - }); - } -} diff --git a/scripts/test/deploy/modules/deploy-subgraph-mocks.ts b/scripts/test/deploy/modules/deploy-subgraph-mocks.ts index bfa0e410..15cc7c19 100644 --- a/scripts/test/deploy/modules/deploy-subgraph-mocks.ts +++ b/scripts/test/deploy/modules/deploy-subgraph-mocks.ts @@ -2,31 +2,31 @@ import { deploy } from '../../../utils/deployment' export async function deploySubgraphMockContracts() { const mockEthUsdAggregator = await deploy( - 'contracts/core/test/EthUsdAggregator.sol:MockEthUsdAggregator', + 'contracts/core/test/subgraphMocks/EthUsdAggregator.sol:MockEthUsdAggregator', [] ) console.log('MockEthUsdAggregator deployed: ', mockEthUsdAggregator.target) const mockLinkSdlSushiPool = await deploy( - 'contracts/core/test/LinkSdlSushiPool.sol:MockLinkSdlSushiPool', + 'contracts/core/test/subgraphMocks/LinkSdlSushiPool.sol:MockLinkSdlSushiPool', [] ) console.log('MockLinkSdlSushiPool deployed: ', mockLinkSdlSushiPool.target) const mockLinkSdlUniswapPool = await deploy( - 'contracts/core/test/LinkSdlUniswapPool.sol:MockLinkSdlUniswapPool', + 'contracts/core/test/subgraphMocks/LinkSdlUniswapPool.sol:MockLinkSdlUniswapPool', [] ) console.log('MockLinkSdlUniswapPool deployed: ', mockLinkSdlUniswapPool.target) const mockLinkUsdAggregator = await deploy( - 'contracts/core/test/LinkUsdAggregator.sol:MockLinkUsdAggregator', + 'contracts/core/test/subgraphMocks/LinkUsdAggregator.sol:MockLinkUsdAggregator', [] ) console.log('MockLinkUsdAggregator deployed: ', mockLinkUsdAggregator.target) const mockMetisEthUniswapPool = await deploy( - 'contracts/core/test/MetisEthUniswapPool.sol:MockMetisEthUniswapPool', + 'contracts/core/test/subgraphMocks/MetisEthUniswapPool.sol:MockMetisEthUniswapPool', [] ) console.log('MockMetisEthUniswapPool deployed: ', mockMetisEthUniswapPool.target) From 1ed2ee31dc9c5d48f7f963fba577e3dff0953dd9 Mon Sep 17 00:00:00 2001 From: 1marcghannam <1marc.ghannam@gmail.com> Date: Wed, 11 Sep 2024 09:59:41 -0400 Subject: [PATCH 3/3] feat: remove forge lib --- lib/forge-std | 1 - 1 file changed, 1 deletion(-) delete mode 160000 lib/forge-std diff --git a/lib/forge-std b/lib/forge-std deleted file mode 160000 index 155d547c..00000000 --- a/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 155d547c449afa8715f538d69454b83944117811