diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d15bdfa2..42597b56 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: contents: read security-events: write env: - SOLC_VERSION: 0.8.20 + SOLC_VERSION: 0.8.24 ETH_MAINNET_RPC_URL: ${{ secrets.ETH_MAINNET_RPC_URL }} ETH_SEPOLIA_RPC_URL: ${{ secrets.ETH_SEPOLIA_RPC_URL }} BASE_MAINNET_RPC_URL: ${{ secrets.BASE_MAINNET_RPC_URL }} diff --git a/.gitmodules b/.gitmodules index 9870147f..2db530d3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,6 +23,12 @@ [submodule "lib/solady"] path = lib/solady url = https://github.com/Vectorized/solady +[submodule "lib/v4-periphery"] + path = lib/v4-periphery + url = https://github.com/Uniswap/v4-periphery +[submodule "lib/v4-core"] + path = lib/v4-core + url = https://github.com/Uniswap/v4-core [submodule "lib/diamond-2-hardhat"] path = lib/diamond-2-hardhat url = https://github.com/nayms/diamond-2-hardhat diff --git a/foundry.toml b/foundry.toml index a7f82d92..bb83330e 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,7 +7,7 @@ remappings = ["forge-std/=lib/forge-std/src/"] libraries = [] cache = true force = false -evm_version = 'paris' +evm_version = 'cancun' auto_detect_solc = true offline = true optimizer = true diff --git a/gemforge.config.cjs b/gemforge.config.cjs index 87948947..64740485 100644 --- a/gemforge.config.cjs +++ b/gemforge.config.cjs @@ -15,7 +15,7 @@ module.exports = { // SPDX License - to be inserted in all generated .sol files license: "MIT", // Solidity compiler version - to be inserted in all generated .sol files - version: "0.8.20", + version: "0.8.24", }, // commands to execute commands: { @@ -58,7 +58,7 @@ module.exports = { // proxy interface options proxyInterface: { // imports to include in the generated IDiamondProxy interface - imports: ["src/shared/FreeStructs.sol"], + imports: ["src/shared/FreeStructs.sol", "lib/v4-core/src/types/BalanceDelta.sol"], }, }, // diamond configuration diff --git a/lib/v4-core b/lib/v4-core new file mode 160000 index 00000000..87292dfc --- /dev/null +++ b/lib/v4-core @@ -0,0 +1 @@ +Subproject commit 87292dfce503e6726527250e6c2815f82ce22d0e diff --git a/lib/v4-periphery b/lib/v4-periphery new file mode 160000 index 00000000..86117136 --- /dev/null +++ b/lib/v4-periphery @@ -0,0 +1 @@ +Subproject commit 861171363d3af46363b50ba022b535ff942cade1 diff --git a/remappings.txt b/remappings.txt index c72a2f36..3cb0f018 100644 --- a/remappings.txt +++ b/remappings.txt @@ -8,3 +8,5 @@ solady/=lib/solady/src/ solidity-lib/=lib/solidity-lib/contracts/ solidity-stringutils/=lib/solidity-stringutils/ solmate/=lib/solmate/src/ +@v4-core/=lib/v4-core +@v4-periphery/=lib/v4-periphery diff --git a/script/AddSupportedExternalToken.s.sol b/script/AddSupportedExternalToken.s.sol index 6cb15630..10283fd6 100644 --- a/script/AddSupportedExternalToken.s.sol +++ b/script/AddSupportedExternalToken.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import "forge-std/Script.sol"; import { DiamondProxy } from "src/generated/DiamondProxy.sol"; diff --git a/script/CreateEntity.s.sol b/script/CreateEntity.s.sol index 2e0f9283..feb9f6f9 100644 --- a/script/CreateEntity.s.sol +++ b/script/CreateEntity.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import "forge-std/Script.sol"; diff --git a/script/deployment/DeployERC20.s.sol b/script/deployment/DeployERC20.s.sol index fef2b104..0be190e7 100644 --- a/script/deployment/DeployERC20.s.sol +++ b/script/deployment/DeployERC20.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /// @notice Quickly deploy a mock ERC20 token, for testing only! diff --git a/src/facets/ACLFacet.sol b/src/facets/ACLFacet.sol index e995323b..70aa4bd3 100644 --- a/src/facets/ACLFacet.sol +++ b/src/facets/ACLFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibAdmin } from "../libs/LibAdmin.sol"; import { LibACL, LibHelpers } from "../libs/LibACL.sol"; diff --git a/src/facets/AdminFacet.sol b/src/facets/AdminFacet.sol index a4321943..aaafa034 100644 --- a/src/facets/AdminFacet.sol +++ b/src/facets/AdminFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { Modifiers } from "../shared/Modifiers.sol"; diff --git a/src/facets/EntityFacet.sol b/src/facets/EntityFacet.sol index b92c63cd..6e21ec0e 100644 --- a/src/facets/EntityFacet.sol +++ b/src/facets/EntityFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Entity, FeeSchedule } from "../shared/AppStorage.sol"; import { Modifiers } from "../shared/Modifiers.sol"; diff --git a/src/facets/GovernanceFacet.sol b/src/facets/GovernanceFacet.sol index 1787b138..2b4ca334 100644 --- a/src/facets/GovernanceFacet.sol +++ b/src/facets/GovernanceFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { IDiamondCut } from "lib/diamond-2-hardhat/contracts/interfaces/IDiamondCut.sol"; import { Modifiers } from "../shared/Modifiers.sol"; diff --git a/src/facets/MarketFacet.sol b/src/facets/MarketFacet.sol index aca3493c..05c080b7 100644 --- a/src/facets/MarketFacet.sol +++ b/src/facets/MarketFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Modifiers } from "../shared/Modifiers.sol"; import { MarketInfo } from "../shared/AppStorage.sol"; diff --git a/src/facets/NaymsOwnershipFacet.sol b/src/facets/NaymsOwnershipFacet.sol index d11a3962..33829b94 100644 --- a/src/facets/NaymsOwnershipFacet.sol +++ b/src/facets/NaymsOwnershipFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibDiamond } from "lib/diamond-2-hardhat/contracts/libraries/LibDiamond.sol"; import { IERC173 } from "lib/diamond-2-hardhat/contracts/interfaces/IERC173.sol"; diff --git a/src/facets/PhasedDiamondCutFacet.sol b/src/facets/PhasedDiamondCutFacet.sol index 063860bf..52e64c0c 100644 --- a/src/facets/PhasedDiamondCutFacet.sol +++ b/src/facets/PhasedDiamondCutFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { DiamondCutFacet } from "lib/diamond-2-hardhat/contracts/facets/DiamondCutFacet.sol"; import { LibDiamond } from "lib/diamond-2-hardhat/contracts/libraries/LibDiamond.sol"; diff --git a/src/facets/SimplePolicyFacet.sol b/src/facets/SimplePolicyFacet.sol index a6eb170d..37e570a1 100644 --- a/src/facets/SimplePolicyFacet.sol +++ b/src/facets/SimplePolicyFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Modifiers } from "../shared/Modifiers.sol"; import { SimplePolicyInfo, SimplePolicy, CalculatedFees, Stakeholders } from "../shared/AppStorage.sol"; diff --git a/src/facets/StakingFacet.sol b/src/facets/StakingFacet.sol index 1f5a815c..121a19b8 100644 --- a/src/facets/StakingFacet.sol +++ b/src/facets/StakingFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibTokenizedVaultStaking, StakingConfig } from "../libs/LibTokenizedVaultStaking.sol"; import { LibHelpers } from "../libs/LibHelpers.sol"; diff --git a/src/facets/SwapFacet.sol b/src/facets/SwapFacet.sol new file mode 100644 index 00000000..fbff6a6b --- /dev/null +++ b/src/facets/SwapFacet.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { LibAdmin } from "src/libs/LibAdmin.sol"; +import { LibObject } from "src/libs/LibObject.sol"; +import { LibConstants as LC } from "src/libs/LibConstants.sol"; +import { LibTokenizedVault } from "src/libs/LibTokenizedVault.sol"; +import { Modifiers } from "src/shared/Modifiers.sol"; +import { IPoolManager } from "v4-core/interfaces/IPoolManager.sol"; +import { BalanceDelta } from "v4-core/types/BalanceDelta.sol"; +import { Currency } from "v4-core/types/Currency.sol"; +import { CurrencySettler } from "lib/v4-core/test/utils/CurrencySettler.sol"; +import { SwapParams, CallbackData } from "../shared/FreeStructs.sol"; +import { StateLibrary } from "v4-core/libraries/StateLibrary.sol"; +import { TransientStateLibrary } from "v4-core/libraries/TransientStateLibrary.sol"; + +/** + * @title Swap + * @notice Facet for working with Swaps + * @dev Swap facet + */ +contract SwapFacet is Modifiers { + using LibObject for address; + using CurrencySettler for Currency; + using TransientStateLibrary for IPoolManager; + + function swap( + IPoolManager _manager, + SwapParams memory swapParams, + bytes32 _fromTokenId, + bytes32 _toTokenId, + bytes32 _toEntityId + ) external assertPrivilege(LibAdmin._getSystemId(), LC.GROUP_SYSTEM_ADMINS) returns (BalanceDelta delta) { + LibTokenizedVault._internalBurn(msg.sender._getParentFromAddress(), _fromTokenId, uint256(swapParams.params.amountSpecified)); + + // Swap tokens + delta = abi.decode( + _manager.unlock(abi.encode(CallbackData(msg.sender, swapParams.key, swapParams.params, swapParams.takeClaims, swapParams.settleUsingBurn, swapParams.hookData))), + (BalanceDelta) + ); + + LibTokenizedVault._internalMint(_toEntityId, _toTokenId, uint256(uint128(delta.amount0()))); + } + + function unlockCallback(bytes calldata rawData) external returns (bytes memory) { + IPoolManager _manager = IPoolManager(msg.sender); + + // Decode the callback data + CallbackData memory data = abi.decode(rawData, (CallbackData)); + + // Initial balance checks (optional, but recommended for debugging and validation) + (, , int256 deltaBefore0) = _fetchBalances(_manager, data.key.currency0, data.sender, address(this)); + (, , int256 deltaBefore1) = _fetchBalances(_manager, data.key.currency1, data.sender, address(this)); + + require(deltaBefore0 == 0, "deltaBefore0 is not equal to 0"); + require(deltaBefore1 == 0, "deltaBefore1 is not equal to 0"); + + // Execute the swap on Uniswap V4 pool + BalanceDelta delta = _manager.swap(data.key, data.params, data.hookData); + + // Post-swap balance checks + (, , int256 deltaAfter0) = _fetchBalances(_manager, data.key.currency0, data.sender, address(this)); + (, , int256 deltaAfter1) = _fetchBalances(_manager, data.key.currency1, data.sender, address(this)); + + if (data.params.zeroForOne) { + if (data.params.amountSpecified < 0) { + // exact input, 0 for 1 + require(deltaAfter0 >= data.params.amountSpecified, "deltaAfter0 is not greater than or equal to data.params.amountSpecified"); + require(delta.amount0() == deltaAfter0, "delta.amount0() is not equal to deltaAfter0"); + require(deltaAfter1 >= 0, "deltaAfter1 is not greater than or equal to 0"); + } else { + // exact output, 0 for 1 + require(deltaAfter0 <= 0, "deltaAfter0 is not less than or equal to zero"); + require(delta.amount1() == deltaAfter1, "delta.amount1() is not equal to deltaAfter1"); + require(deltaAfter1 <= data.params.amountSpecified, "deltaAfter1 is not less than or equal to data.params.amountSpecified"); + } + } else { + if (data.params.amountSpecified < 0) { + // exact input, 1 for 0 + require(deltaAfter1 >= data.params.amountSpecified, "deltaAfter1 is not greater than or equal to data.params.amountSpecified"); + require(delta.amount1() == deltaAfter1, "delta.amount1() is not equal to deltaAfter1"); + require(deltaAfter0 >= 0, "deltaAfter0 is not greater than or equal to 0"); + } else { + // exact output, 1 for 0 + require(deltaAfter1 <= 0, "deltaAfter1 is not less than or equal to 0"); + require(delta.amount0() == deltaAfter0, "delta.amount0() is not equal to deltaAfter0"); + require(deltaAfter0 <= data.params.amountSpecified, "deltaAfter0 is not less than or equal to data.params.amountSpecified"); + } + } + + // Post-swap balance handling + if (deltaAfter0 < 0) { + data.key.currency0.settle(_manager, data.sender, uint256(-deltaAfter0), data.settleUsingBurn); + } + if (deltaAfter1 < 0) { + data.key.currency1.settle(_manager, data.sender, uint256(-deltaAfter1), data.settleUsingBurn); + } + if (deltaAfter0 > 0) { + data.key.currency0.take(_manager, data.sender, uint256(deltaAfter0), data.takeClaims); + } + if (deltaAfter1 > 0) { + data.key.currency1.take(_manager, data.sender, uint256(deltaAfter1), data.takeClaims); + } + + // Return the encoded delta + return abi.encode(delta); + } + + function _fetchBalances( + IPoolManager _manager, + Currency currency, + address user, + address deltaHolder + ) internal view returns (uint256 userBalance, uint256 poolBalance, int256 delta) { + userBalance = currency.balanceOf(user); + poolBalance = currency.balanceOf(address(_manager)); + delta = _manager.currencyDelta(deltaHolder, currency); + } +} diff --git a/src/facets/SystemFacet.sol b/src/facets/SystemFacet.sol index 75961df6..dab71edf 100644 --- a/src/facets/SystemFacet.sol +++ b/src/facets/SystemFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibConstants as LC } from "../libs/LibConstants.sol"; import { Modifiers } from "../shared/Modifiers.sol"; diff --git a/src/facets/TokenizedVaultFacet.sol b/src/facets/TokenizedVaultFacet.sol index 59e98ffa..8fcb6f19 100644 --- a/src/facets/TokenizedVaultFacet.sol +++ b/src/facets/TokenizedVaultFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Modifiers } from "../shared/Modifiers.sol"; import { LibConstants as LC } from "../libs/LibConstants.sol"; diff --git a/src/facets/TokenizedVaultIOFacet.sol b/src/facets/TokenizedVaultIOFacet.sol index 2306116a..ca346db9 100644 --- a/src/facets/TokenizedVaultIOFacet.sol +++ b/src/facets/TokenizedVaultIOFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Modifiers } from "../shared/Modifiers.sol"; import { LibTokenizedVaultIO } from "../libs/LibTokenizedVaultIO.sol"; diff --git a/src/facets/UserFacet.sol b/src/facets/UserFacet.sol index 1b63d424..09534f36 100644 --- a/src/facets/UserFacet.sol +++ b/src/facets/UserFacet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Modifiers } from "../shared/Modifiers.sol"; import { LibConstants as LC } from "../libs/LibConstants.sol"; diff --git a/src/init/InitDiamond.sol b/src/init/InitDiamond.sol index 6fbb9b7f..6faea443 100644 --- a/src/init/InitDiamond.sol +++ b/src/init/InitDiamond.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { IDiamondCut } from "lib/diamond-2-hardhat/contracts/interfaces/IDiamondCut.sol"; import { IDiamondLoupe } from "lib/diamond-2-hardhat/contracts/interfaces/IDiamondLoupe.sol"; diff --git a/src/interfaces/IERC1271.sol b/src/interfaces/IERC1271.sol index a56057ba..a8277431 100644 --- a/src/interfaces/IERC1271.sol +++ b/src/interfaces/IERC1271.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1271.sol) -pragma solidity ^0.8.20; +pragma solidity 0.8.24; /** * @dev Interface of the ERC1271 standard signature validation method for diff --git a/src/interfaces/IERC165.sol b/src/interfaces/IERC165.sol index d1d345e1..3b72271d 100644 --- a/src/interfaces/IERC165.sol +++ b/src/interfaces/IERC165.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; interface IERC165 { /// @notice Query if a contract implements an interface diff --git a/src/interfaces/IERC173.sol b/src/interfaces/IERC173.sol index 4f62a7bb..6fddac92 100644 --- a/src/interfaces/IERC173.sol +++ b/src/interfaces/IERC173.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /// @title ERC-173 Contract Ownership Standard /// Note: the ERC-165 identifier for this interface is 0x7f5828d0 is ERC165 diff --git a/src/interfaces/IERC20.sol b/src/interfaces/IERC20.sol index ed74e601..4b7f1f5d 100644 --- a/src/interfaces/IERC20.sol +++ b/src/interfaces/IERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /** * See https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20 diff --git a/src/libs/LibACL.sol b/src/libs/LibACL.sol index 987cb295..52a98d45 100644 --- a/src/libs/LibACL.sol +++ b/src/libs/LibACL.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { LibDiamond } from "lib/diamond-2-hardhat/contracts/libraries/LibDiamond.sol"; diff --git a/src/libs/LibAdmin.sol b/src/libs/LibAdmin.sol index 8eb73905..76134928 100644 --- a/src/libs/LibAdmin.sol +++ b/src/libs/LibAdmin.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, FunctionLockedStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { Entity, EntityApproval } from "../shared/FreeStructs.sol"; diff --git a/src/libs/LibConstants.sol b/src/libs/LibConstants.sol index f510f12b..8dcceb7c 100644 --- a/src/libs/LibConstants.sol +++ b/src/libs/LibConstants.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /** * @dev Settings keys. diff --git a/src/libs/LibEIP712.sol b/src/libs/LibEIP712.sol index 2a6a5943..d3233cee 100644 --- a/src/libs/LibEIP712.sol +++ b/src/libs/LibEIP712.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "../shared/AppStorage.sol"; diff --git a/src/libs/LibERC20.sol b/src/libs/LibERC20.sol index 13b1617b..8c47ceae 100644 --- a/src/libs/LibERC20.sol +++ b/src/libs/LibERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /******************************************************************************\ * Author: Nick Mudge diff --git a/src/libs/LibEntity.sol b/src/libs/LibEntity.sol index 483e0d5d..38af384f 100644 --- a/src/libs/LibEntity.sol +++ b/src/libs/LibEntity.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibAppStorage, AppStorage } from "../shared/AppStorage.sol"; import { Entity } from "../shared/AppStorage.sol"; diff --git a/src/libs/LibFeeRouter.sol b/src/libs/LibFeeRouter.sol index 3ead922c..cdade091 100644 --- a/src/libs/LibFeeRouter.sol +++ b/src/libs/LibFeeRouter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage, CalculatedFees, FeeAllocation, FeeSchedule } from "../shared/AppStorage.sol"; import { LibObject } from "./LibObject.sol"; diff --git a/src/libs/LibGovernance.sol b/src/libs/LibGovernance.sol index 92f699ab..ce0855ef 100644 --- a/src/libs/LibGovernance.sol +++ b/src/libs/LibGovernance.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { IDiamondCut } from "lib/diamond-2-hardhat/contracts/interfaces/IDiamondCut.sol"; diff --git a/src/libs/LibHelpers.sol b/src/libs/LibHelpers.sol index 4787371f..b401eb74 100644 --- a/src/libs/LibHelpers.sol +++ b/src/libs/LibHelpers.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibConstants as LC } from "./LibConstants.sol"; diff --git a/src/libs/LibInitDiamond.sol b/src/libs/LibInitDiamond.sol index 5e6ae5f1..68067ca9 100644 --- a/src/libs/LibInitDiamond.sol +++ b/src/libs/LibInitDiamond.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, FunctionLockedStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { LibConstants as LC } from "./LibConstants.sol"; diff --git a/src/libs/LibMarket.sol b/src/libs/LibMarket.sol index 1657e484..ed5b0723 100644 --- a/src/libs/LibMarket.sol +++ b/src/libs/LibMarket.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage, MarketInfo, TokenAmount, OrderMatchingCalcs } from "../shared/AppStorage.sol"; import { LibTokenizedVault } from "./LibTokenizedVault.sol"; diff --git a/src/libs/LibObject.sol b/src/libs/LibObject.sol index ccbde71d..ebf23fe3 100644 --- a/src/libs/LibObject.sol +++ b/src/libs/LibObject.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { LibHelpers } from "./LibHelpers.sol"; diff --git a/src/libs/LibSimplePolicy.sol b/src/libs/LibSimplePolicy.sol index 6fc817f1..aeaf1f59 100644 --- a/src/libs/LibSimplePolicy.sol +++ b/src/libs/LibSimplePolicy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage, Entity, SimplePolicy, Stakeholders, FeeSchedule } from "../shared/AppStorage.sol"; import { LibACL } from "./LibACL.sol"; diff --git a/src/libs/LibTokenizedVault.sol b/src/libs/LibTokenizedVault.sol index 285112d7..93a407df 100644 --- a/src/libs/LibTokenizedVault.sol +++ b/src/libs/LibTokenizedVault.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { LibAdmin } from "./LibAdmin.sol"; diff --git a/src/libs/LibTokenizedVaultIO.sol b/src/libs/LibTokenizedVaultIO.sol index 1fefcc4d..a479cb64 100644 --- a/src/libs/LibTokenizedVaultIO.sol +++ b/src/libs/LibTokenizedVaultIO.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { LibHelpers } from "./LibHelpers.sol"; diff --git a/src/libs/LibTokenizedVaultStaking.sol b/src/libs/LibTokenizedVaultStaking.sol index a2bb598b..dca01080 100644 --- a/src/libs/LibTokenizedVaultStaking.sol +++ b/src/libs/LibTokenizedVaultStaking.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "../shared/AppStorage.sol"; import { SafeCastLib } from "solady/utils/SafeCastLib.sol"; diff --git a/src/shared/AppStorage.sol b/src/shared/AppStorage.sol index 7b12846e..d60f22f3 100644 --- a/src/shared/AppStorage.sol +++ b/src/shared/AppStorage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /// @notice storage for nayms v3 decentralized insurance platform diff --git a/src/shared/CustomErrors.sol b/src/shared/CustomErrors.sol index a419679a..7c0fafd8 100644 --- a/src/shared/CustomErrors.sol +++ b/src/shared/CustomErrors.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /// @dev The Nayms Diamond (proxy contract) owner (address) must be mutually exclusive with the system admin role. error OwnerCannotBeSystemAdmin(); diff --git a/src/shared/FreeStructs.sol b/src/shared/FreeStructs.sol index a10206ca..2dad3eaa 100644 --- a/src/shared/FreeStructs.sol +++ b/src/shared/FreeStructs.sol @@ -1,5 +1,25 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; + +import { PoolKey } from "v4-core/types/PoolKey.sol"; +import { IPoolManager } from "v4-core/interfaces/IPoolManager.sol"; + +struct SwapParams { + PoolKey key; + IPoolManager.SwapParams params; + bool takeClaims; + bool settleUsingBurn; + bytes hookData; +} + +struct CallbackData { + address sender; + PoolKey key; + IPoolManager.SwapParams params; + bool takeClaims; + bool settleUsingBurn; + bytes hookData; +} struct MarketInfo { bytes32 creator; // entity ID diff --git a/src/shared/Modifiers.sol b/src/shared/Modifiers.sol index aabe2f91..3256e78f 100644 --- a/src/shared/Modifiers.sol +++ b/src/shared/Modifiers.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; /// @notice modifiers diff --git a/src/utils/ERC20Wrapper.sol b/src/utils/ERC20Wrapper.sol index 8dfc8888..bd086924 100644 --- a/src/utils/ERC20Wrapper.sol +++ b/src/utils/ERC20Wrapper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { IERC20 } from "../interfaces/IERC20.sol"; import { IDiamondProxy } from "../generated/IDiamondProxy.sol"; diff --git a/src/utils/ReentrancyGuard.sol b/src/utils/ReentrancyGuard.sol index 933ea3e9..b4722493 100644 --- a/src/utils/ReentrancyGuard.sol +++ b/src/utils/ReentrancyGuard.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibAppStorage } from "../shared/AppStorage.sol"; diff --git a/test/ForkTest.t.sol b/test/ForkTest.t.sol index a7b740bb..00e3c4aa 100644 --- a/test/ForkTest.t.sol +++ b/test/ForkTest.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; // solhint-disable no-console // solhint-disable no-global-import diff --git a/test/T01Deployment.t.sol b/test/T01Deployment.t.sol index 1bcb11f3..aeaaeb7d 100644 --- a/test/T01Deployment.t.sol +++ b/test/T01Deployment.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { StdStorage, stdStorage } from "forge-std/Test.sol"; import { Vm } from "forge-std/Vm.sol"; diff --git a/test/T01GovernanceUpgrades.t.sol b/test/T01GovernanceUpgrades.t.sol index 6dc86f9e..b6f61d99 100644 --- a/test/T01GovernanceUpgrades.t.sol +++ b/test/T01GovernanceUpgrades.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D03ProtocolDefaults, LC } from "./defaults/D03ProtocolDefaults.sol"; import { MockAccounts } from "test/utils/users/MockAccounts.sol"; diff --git a/test/T01LibERC20.t.sol b/test/T01LibERC20.t.sol index b9efd51e..784e0418 100644 --- a/test/T01LibERC20.t.sol +++ b/test/T01LibERC20.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; // solhint-disable no-global-import import { Vm } from "forge-std/Vm.sol"; diff --git a/test/T01LibHelpers.t.sol b/test/T01LibHelpers.t.sol index 26fbf15e..2cc4fb9e 100644 --- a/test/T01LibHelpers.t.sol +++ b/test/T01LibHelpers.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Test } from "forge-std/Test.sol"; import { Vm } from "forge-std/Vm.sol"; diff --git a/test/T02ACL.t.sol b/test/T02ACL.t.sol index 733369a3..d6470f12 100644 --- a/test/T02ACL.t.sol +++ b/test/T02ACL.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { console2 } from "forge-std/console2.sol"; import { D03ProtocolDefaults, LibHelpers, LC } from "./defaults/D03ProtocolDefaults.sol"; import { MockAccounts } from "test/utils/users/MockAccounts.sol"; diff --git a/test/T02Access.t.sol b/test/T02Access.t.sol index e46fb6ba..fc2fd49d 100644 --- a/test/T02Access.t.sol +++ b/test/T02Access.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; // import { c as c } from "forge-std/c.sol"; import { D03ProtocolDefaults, LibHelpers, LC, c } from "./defaults/D03ProtocolDefaults.sol"; import { Entity, SimplePolicy, Stakeholders } from "src/shared/FreeStructs.sol"; diff --git a/test/T02Admin.t.sol b/test/T02Admin.t.sol index 1a224d2c..bed80b50 100644 --- a/test/T02Admin.t.sol +++ b/test/T02Admin.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D03ProtocolDefaults, LibHelpers, LC } from "./defaults/D03ProtocolDefaults.sol"; diff --git a/test/T02User.t.sol b/test/T02User.t.sol index a5e387ff..2d39b6b4 100644 --- a/test/T02User.t.sol +++ b/test/T02User.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D03ProtocolDefaults, LibHelpers, LC } from "./defaults/D03ProtocolDefaults.sol"; import { MockAccounts } from "test/utils/users/MockAccounts.sol"; diff --git a/test/T03NaymsOwnership.t.sol b/test/T03NaymsOwnership.t.sol index fae797be..0065611a 100644 --- a/test/T03NaymsOwnership.t.sol +++ b/test/T03NaymsOwnership.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D03ProtocolDefaults, LibHelpers, LC } from "./defaults/D03ProtocolDefaults.sol"; import "src/shared/CustomErrors.sol"; diff --git a/test/T03SystemFacet.t.sol b/test/T03SystemFacet.t.sol index 39351c93..68cdf600 100644 --- a/test/T03SystemFacet.t.sol +++ b/test/T03SystemFacet.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D03ProtocolDefaults, LibHelpers, LibAdmin, LC, c } from "./defaults/D03ProtocolDefaults.sol"; diff --git a/test/T03TokenizedVault.t.sol b/test/T03TokenizedVault.t.sol index d84d10f0..96fec5c9 100644 --- a/test/T03TokenizedVault.t.sol +++ b/test/T03TokenizedVault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { MockAccounts } from "./utils/users/MockAccounts.sol"; import { c, D03ProtocolDefaults, LibHelpers, LC } from "./defaults/D03ProtocolDefaults.sol"; diff --git a/test/T04Entity.t.sol b/test/T04Entity.t.sol index 27978305..2b6ee4f3 100644 --- a/test/T04Entity.t.sol +++ b/test/T04Entity.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Vm } from "forge-std/Vm.sol"; diff --git a/test/T04Market.t.sol b/test/T04Market.t.sol index f4f69793..9b6a20e8 100644 --- a/test/T04Market.t.sol +++ b/test/T04Market.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D03ProtocolDefaults, LibHelpers, LibObject, LC, c } from "./defaults/D03ProtocolDefaults.sol"; import { Vm } from "forge-std/Vm.sol"; diff --git a/test/T05Fees.t.sol b/test/T05Fees.t.sol index 277feaac..2078b09a 100644 --- a/test/T05Fees.t.sol +++ b/test/T05Fees.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; // solhint-disable no-console import { console2 as c } from "forge-std/console2.sol"; diff --git a/test/T05TokenWrapper.t.sol b/test/T05TokenWrapper.t.sol index 1ae338ea..a0e5553a 100644 --- a/test/T05TokenWrapper.t.sol +++ b/test/T05TokenWrapper.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Vm } from "forge-std/Vm.sol"; diff --git a/test/T06Staking.t.sol b/test/T06Staking.t.sol index d386d4cf..fe4e9e2f 100644 --- a/test/T06Staking.t.sol +++ b/test/T06Staking.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { StdStorage, stdStorage, StdStyle, StdAssertions } from "forge-std/Test.sol"; import { Vm } from "forge-std/Vm.sol"; diff --git a/test/T07UniswapV4.t.sol b/test/T07UniswapV4.t.sol new file mode 100644 index 00000000..81d89ab3 --- /dev/null +++ b/test/T07UniswapV4.t.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { StdStorage, stdStorage, StdStyle, StdAssertions } from "forge-std/Test.sol"; +import { Vm } from "forge-std/Vm.sol"; +import { D03ProtocolDefaults, c, LC, LibHelpers } from "./defaults/D03ProtocolDefaults.sol"; +import { StakingConfig, StakingState, SwapParams, CallbackData } from "src/shared/FreeStructs.sol"; +import { IDiamondCut } from "lib/diamond-2-hardhat/contracts/interfaces/IDiamondCut.sol"; +import { StakingFixture } from "test/fixtures/StakingFixture.sol"; +import { DummyToken } from "./utils/DummyToken.sol"; +import { LibTokenizedVaultStaking } from "src/libs/LibTokenizedVaultStaking.sol"; +import { IERC20 } from "src/interfaces/IERC20.sol"; +// import { TickMath } from "lib/v4-core/contracts/libraries/TickMath.sol"; + +import "lib/v4-core/test/utils/Deployers.sol"; + +contract T07UniswapV4 is D03ProtocolDefaults, Deployers { + using LibHelpers for address; + using stdStorage for StdStorage; + using StdStyle for *; + using Hooks for IHooks; + + address naymsTokenAddress; + + address currency1Address; + + NaymsAccount bob; + NaymsAccount nlf; + + function setUp() public { + bob = makeNaymsAcc("Bob"); + nlf = makeNaymsAcc(LC.NLF_IDENTIFIER); + + vm.startPrank(sm.addr); + hCreateEntity(bob.entityId, bob, entity, "Bob data"); + hCreateEntity(nlf.entityId, nlf, entity, "NLF"); + hCreateEntity(sa.entityId, sa, entity, "System Admin"); + + vm.startPrank(address(this)); + initializeManagerRoutersAndPoolsWithLiq(IHooks(address(0))); + + // For these tests, we will use currency0 as the NAYM Token + naymsTokenAddress = Currency.unwrap(currency0); + currency1Address = Currency.unwrap(currency1); + + vm.label(naymsTokenAddress, "NAYM TOKEN"); + changePrank(sa.addr); + nayms.addSupportedExternalToken(naymsTokenAddress, 1); + } + + function testSwap() public { + // NLFID: makeId(LC.OBJECT_TYPE_ENTITY, bytes20(keccak256(bytes(name)))) + bytes32 nlfId = 0x454e5449545900000000000079356590a83c6af5a59580e3ec1b0924626bbfdf; + + // Test the swap function + deal(naymsTokenAddress, address(bob.addr), 100 ether, true); + deal(currency1Address, address(sa.addr), 100 ether, true); + + // Record initial balances + uint256 bobInitialExternalBalance = IERC20(naymsTokenAddress).balanceOf(bob.addr); + uint256 bobInitialInternalBalance = nayms.internalBalanceOf(bob.id, naymsTokenAddress._getIdForAddress()); + uint256 saInitialCurrency1Balance = IERC20(currency1Address).balanceOf(sa.addr); + uint256 nlfInitialCurrency1Balance = nayms.internalBalanceOf(nlfId, currency1Address._getIdForAddress()); + + // Bob approves and deposits 1 ether of naymsToken + vm.startPrank(bob.addr); + IERC20(naymsTokenAddress).approve(address(nayms), 1 ether); + nayms.externalDeposit(naymsTokenAddress, 1 ether); + + // Verify Bob's balances after deposit + uint256 bobFinalExternalBalance = IERC20(naymsTokenAddress).balanceOf(bob.addr); + uint256 bobFinalInternalBalance = nayms.internalBalanceOf(bob.entityId, naymsTokenAddress._getIdForAddress()); + assertEq(bobFinalExternalBalance, bobInitialExternalBalance - 1 ether, "Bob's external balance should decrease by 1 ether"); + assertEq(bobFinalInternalBalance, bobInitialInternalBalance + 1 ether, "Bob's internal balance should increase by 1 ether"); + + // Transfer 1 ether of naymsToken from sa.entityId to nlfId + nayms.internalTransferFromEntity(sa.entityId, naymsTokenAddress._getIdForAddress(), 1 ether); + + // Record the user's parent internal balance of naymsToken before swap + uint256 userInitialNaymsBalance = nayms.internalBalanceOf(sa.entityId, naymsTokenAddress._getIdForAddress()); + + SwapParams memory swapParams = SwapParams({ + key: PoolKey({ currency0: currency0, currency1: currency1, fee: 3000, tickSpacing: 60, hooks: IHooks(address(0)) }), + params: IPoolManager.SwapParams({ zeroForOne: false, amountSpecified: 1e15, sqrtPriceLimitX96: SQRT_PRICE_2_1 }), + takeClaims: false, + settleUsingBurn: false, + hookData: "" + }); + + address toTokenAddress = Currency.unwrap(currency1); + bytes32 tokenId = LibHelpers._getIdForAddress(toTokenAddress); + + // SA approves tokens for the swap + vm.startPrank(sa.addr); + IERC20(naymsTokenAddress).approve(address(manager), 100 ether); + IERC20(currency1Address).approve(address(nayms), 100 ether); + + // Record user's currency1 balance before swap + uint256 userCurrency1BalanceBeforeSwap = nayms.internalBalanceOf(sa.entityId, currency1Address._getIdForAddress()); + + // Perform the swap + nayms.swap(manager, swapParams, naymsTokenAddress._getIdForAddress(), tokenId, sa.entityId); + + // Record user's balances after swap + uint256 userCurrency1BalanceAfterSwap = nayms.internalBalanceOf(sa.entityId, currency1Address._getIdForAddress()); + uint256 userFinalNaymsBalance = nayms.internalBalanceOf(sa.entityId, naymsTokenAddress._getIdForAddress()); + + // Assertions + // Check that user's currency1 internal balance increased + assertGt(userCurrency1BalanceAfterSwap, userCurrency1BalanceBeforeSwap, "user's currency1 balance should increase after swap"); + + // Check that user's naymsToken internal balance decreased + assertEq(userFinalNaymsBalance, userInitialNaymsBalance - uint256(swapParams.params.amountSpecified), "user's naymsToken balance should decrease by swap amount"); + + // Check that SA's currency1 balance decreased due to the swap fees or amounts + uint256 saFinalCurrency1Balance = IERC20(currency1Address).balanceOf(sa.addr); + assertLt(saFinalCurrency1Balance, saInitialCurrency1Balance, "SA's currency1 external balance should decrease after swap"); + } +} diff --git a/test/defaults/D00GlobalDefaults.sol b/test/defaults/D00GlobalDefaults.sol index ede77a51..537491d4 100644 --- a/test/defaults/D00GlobalDefaults.sol +++ b/test/defaults/D00GlobalDefaults.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; // solhint-disable no-console // solhint-disable no-global-import diff --git a/test/defaults/D01Deployment.sol b/test/defaults/D01Deployment.sol index 03f480ed..8d46afff 100644 --- a/test/defaults/D01Deployment.sol +++ b/test/defaults/D01Deployment.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; // solhint-disable no-console // solhint-disable no-global-import diff --git a/test/defaults/D02TestSetup.sol b/test/defaults/D02TestSetup.sol index bf0c7077..fcc4b120 100644 --- a/test/defaults/D02TestSetup.sol +++ b/test/defaults/D02TestSetup.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D01Deployment, LibHelpers, c } from "./D01Deployment.sol"; import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/test/defaults/D03ProtocolDefaults.sol b/test/defaults/D03ProtocolDefaults.sol index 3537dc62..6ac9a3de 100644 --- a/test/defaults/D03ProtocolDefaults.sol +++ b/test/defaults/D03ProtocolDefaults.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { D02TestSetup, LibHelpers, c } from "./D02TestSetup.sol"; import { Entity, SimplePolicy, MarketInfo, Stakeholders, FeeSchedule } from "src/shared/FreeStructs.sol"; diff --git a/test/fixtures/InitDiamondFixture.sol b/test/fixtures/InitDiamondFixture.sol index c81ffe98..b166abd2 100644 --- a/test/fixtures/InitDiamondFixture.sol +++ b/test/fixtures/InitDiamondFixture.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { InitDiamond } from "src/init/InitDiamond.sol"; import { AdminFacet } from "src/facets/AdminFacet.sol"; diff --git a/test/fixtures/LibERC20Fixture.sol b/test/fixtures/LibERC20Fixture.sol index 03ecc8b8..49ad8ba3 100644 --- a/test/fixtures/LibERC20Fixture.sol +++ b/test/fixtures/LibERC20Fixture.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibERC20 } from "src/libs/LibERC20.sol"; diff --git a/test/fixtures/LibFeeRouterFixture.sol b/test/fixtures/LibFeeRouterFixture.sol index b04e63bf..4fca4f2c 100644 --- a/test/fixtures/LibFeeRouterFixture.sol +++ b/test/fixtures/LibFeeRouterFixture.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibConstants } from "src/libs/LibConstants.sol"; import { LibFeeRouter, CalculatedFees, FeeAllocation, FeeSchedule } from "src/libs/LibFeeRouter.sol"; diff --git a/test/fixtures/SimplePolicyFixture.sol b/test/fixtures/SimplePolicyFixture.sol index 3665d475..8bd9290b 100644 --- a/test/fixtures/SimplePolicyFixture.sol +++ b/test/fixtures/SimplePolicyFixture.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { AppStorage, LibAppStorage } from "src/shared/AppStorage.sol"; import { LibSimplePolicy } from "src/libs/LibSimplePolicy.sol"; diff --git a/test/fixtures/StakingFixture.sol b/test/fixtures/StakingFixture.sol index 2842c387..9adbe829 100644 --- a/test/fixtures/StakingFixture.sol +++ b/test/fixtures/StakingFixture.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibTokenizedVaultStaking } from "src/libs/LibTokenizedVaultStaking.sol"; import { AppStorage, LibAppStorage } from "src/shared/AppStorage.sol"; diff --git a/test/fixtures/TokenizedVaultFixture.sol b/test/fixtures/TokenizedVaultFixture.sol index 51563f7f..e5850c7b 100644 --- a/test/fixtures/TokenizedVaultFixture.sol +++ b/test/fixtures/TokenizedVaultFixture.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { LibTokenizedVaultIO } from "src/libs/LibTokenizedVaultIO.sol"; import { LibAdmin } from "src/libs/LibAdmin.sol"; diff --git a/test/utils/BadToken.sol b/test/utils/BadToken.sol index a4925808..81bac57a 100644 --- a/test/utils/BadToken.sol +++ b/test/utils/BadToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { IERC20 } from "src/interfaces/IERC20.sol"; diff --git a/test/utils/DSILib.sol b/test/utils/DSILib.sol index cc039d3a..a372a5c7 100644 --- a/test/utils/DSILib.sol +++ b/test/utils/DSILib.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { Vm } from "forge-std/Vm.sol"; diff --git a/test/utils/DummyToken.sol b/test/utils/DummyToken.sol index 921d18e0..46df2946 100644 --- a/test/utils/DummyToken.sol +++ b/test/utils/DummyToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; import { IERC20 } from "src/interfaces/IERC20.sol"; diff --git a/test/utils/users/MockAccounts.sol b/test/utils/users/MockAccounts.sol index 36c69717..f7830a6b 100644 --- a/test/utils/users/MockAccounts.sol +++ b/test/utils/users/MockAccounts.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.20; +pragma solidity 0.8.24; abstract contract MockAccounts { // address internal constant account0 = address(0xACC0);