diff --git a/foundry.lock b/foundry.lock new file mode 100644 index 0000000..c0aecc0 --- /dev/null +++ b/foundry.lock @@ -0,0 +1,17 @@ +{ + "lib/forge-std": { + "rev": "8f24d6b04c92975e0795b5868aa0d783251cdeaa" + }, + "lib/openzeppelin-contracts": { + "rev": "3291252c866ad698f6a55ec660259e49a67eb3d0" + }, + "lib/sign-protocol-evm": { + "rev": "264af194a780b7b4493aa056b597ab80243b5a0c" + }, + "lib/v4-core": { + "rev": "4aa6c3ddd3b540a3aa22021c02d2298e79ae3928" + }, + "lib/v4-periphery": { + "rev": "0c162a0cec2bf9184ce97e19f710fbc657ae7a5a" + } +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index ebea179..a39b7c3 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,21 +1,19 @@ [profile.default] -src = "src" -out = "out" -libs = ["lib"] -solc = "0.8.26" -auto_detect_solc = true +solc_version = "0.8.24" via_ir = true +optimizer = true +optimizer_runs = 200 remappings = [ - "@openzeppelin/contracts=lib/openzeppelin-contracts/contracts/", "@foundry-rs/=lib/foundry-rs/", + "@openzeppelin/contracts=lib/openzeppelin-contracts/contracts/", "@uniswap/v4-core/=lib/v4-core/", "forge-gas-snapshot/=lib/v4-core/lib/forge-gas-snapshot/src/", "permit2/=lib/v4-periphery/lib/permit2/", "solmate/=lib/v4-core/lib/solmate/", - "v4-core/=lib/v4-core/", - "v4-periphery/=lib/v4-periphery/", + "v4-core/src/=lib/v4-core/src/", + "v4-periphery/src/=lib/v4-periphery/src/", "@signprotocol/signprotocol-evm=lib/sign-protocol-evm", ] diff --git a/script/AddLiquidity.s.sol b/script/AddLiquidity.s.sol index 8eb9568..454e992 100644 --- a/script/AddLiquidity.s.sol +++ b/script/AddLiquidity.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { Script, console2 } from "forge-std/Script.sol"; import { HelperConfig } from "./HelperConfig.s.sol"; diff --git a/script/DeployAndSetup.s.sol b/script/DeployAndSetup.s.sol index e0dcf79..afa14a3 100644 --- a/script/DeployAndSetup.s.sol +++ b/script/DeployAndSetup.s.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.10; +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; import { console2 } from "forge-std/Test.sol"; import { Script } from "forge-std/Script.sol"; diff --git a/script/HelperConfig.s.sol b/script/HelperConfig.s.sol index 44c50c2..50a0c97 100644 --- a/script/HelperConfig.s.sol +++ b/script/HelperConfig.s.sol @@ -1,6 +1,5 @@ //SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; +pragma solidity ^0.8.24; import { console2 } from "forge-std/Test.sol"; import { Script } from "forge-std/Script.sol"; diff --git a/script/forked/DeployAndTest.s.sol b/script/forked/DeployAndTest.s.sol index fa682ce..d523c3f 100644 --- a/script/forked/DeployAndTest.s.sol +++ b/script/forked/DeployAndTest.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { Script, console2 } from "forge-std/Script.sol"; import { HelperConfig } from "../HelperConfig.s.sol"; diff --git a/src/FactoryTokenContract.sol b/src/FactoryTokenContract.sol index 04e9d45..ba73982 100644 --- a/src/FactoryTokenContract.sol +++ b/src/FactoryTokenContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { TokenContract } from "./helpers/TokenContract.sol"; @@ -74,13 +74,17 @@ contract FactoryTokenContract is Ownable { * @notice Modifiers. */ modifier onlyMultiSigContract() { - require(msg.sender == address(multiSigContract), FactoryTokenContract__onlyMultiSigContract()); + if (msg.sender != address(multiSigContract)) { + revert FactoryTokenContract__onlyMultiSigContract(); + } _; } /// @notice modifier to ensure only pending txs can be executed modifier onlyPendigTx(uint256 _txId) { - require(txArray[_txId].isPending, TransactionAlreadyExecuted()); + if (!txArray[_txId].isPending) { + revert TransactionAlreadyExecuted(); + } _; } @@ -144,12 +148,24 @@ contract FactoryTokenContract is Ownable { external returns (uint256 txId) { - require(_signers.length >= 2, InvalidSignerCount()); - require(bytes(_tokenName).length > 0, EmptyName()); - require(bytes(_tokenSymbol).length > 0, EmptySymbol()); - require(_totalSupply > 0, InvalidSupply()); - if (_supplyCapEnabled) { - require(_maxSupply >= _totalSupply, InvalidSupply()); + if (_signers.length < 2) { + revert InvalidSignerCount(); + } + if (bytes(_tokenName).length == 0) { + revert EmptyName(); + } + if (bytes(_tokenSymbol).length == 0) { + revert EmptySymbol(); + } + if (_totalSupply <= 0) { + if (_supplyCapEnabled) { + if (_maxSupply < _totalSupply) { + revert InvalidSupply(); + } + } + if (_maxSupply < _totalSupply) { + revert InvalidSupply(); + } } txId = _handleQueue( _signers, diff --git a/src/FactoryTokenContractV2.sol b/src/FactoryTokenContractV2.sol index fbe4cee..2b68438 100644 --- a/src/FactoryTokenContractV2.sol +++ b/src/FactoryTokenContractV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; @@ -39,7 +39,7 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { //////////////////// // State Variables // /////////////////// - + /// @notice Maximum values for validation uint256 public constant MAX_SIGNERS = 10; uint256 public constant MIN_SIGNERS = 2; @@ -92,6 +92,18 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { /// @notice All transactions TransactionData[] public transactions; + /// @notice Tracks the next transaction ID + uint256 public nextTxId = 1; + + /// @notice Tracks the total number of tokens created + uint256 public totalTokensCreated; + + /// @notice Declare Addresses of other contracts + MultiSigContract public multiSigContract; + LiquidityManager public liquidityManager; + VestingContract public vestingContract; + IERC20 public USDC; + /// @notice Mappings for efficient lookups mapping(address => uint256[]) public ownerToTxIds; mapping(address => bool) public isTokenCreated; @@ -119,18 +131,9 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { uint256 timestamp ); - event LiquidityProvided( - address indexed token, - address indexed provider, - uint256 amount, - uint256 timestamp - ); + event LiquidityProvided(address indexed token, address indexed provider, uint256 amount, uint256 timestamp); - event LiquidityThresholdMet( - address indexed token, - uint256 totalLiquidity, - uint256 timestamp - ); + event LiquidityThresholdMet(address indexed token, uint256 totalLiquidity, uint256 timestamp); event CreationFeeUpdated(uint256 oldFee, uint256 newFee); event FeeRecipientUpdated(address oldRecipient, address newRecipient); @@ -179,12 +182,13 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { address _usdc, address _feeRecipient, address _initialOwner - ) Ownable(_initialOwner) { - if (_multiSigContract == address(0) || - _liquidityManager == address(0) || - _vestingContract == address(0) || - _usdc == address(0) || - _feeRecipient == address(0)) { + ) + Ownable(_initialOwner) + { + if ( + _multiSigContract == address(0) || _liquidityManager == address(0) || _vestingContract == address(0) + || _usdc == address(0) || _feeRecipient == address(0) + ) { revert FactoryTokenContract__InvalidAddress(); } @@ -195,25 +199,27 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { feeRecipient = _feeRecipient; // Initialize with dummy transaction at index 0 for easier indexing - transactions.push(TransactionData({ - txId: 0, - owner: address(0), - signers: new address[](0), - isPending: false, - isExecuted: false, - tokenName: "", - tokenSymbol: "", - totalSupply: 0, - maxSupply: 0, - canMint: false, - canBurn: false, - supplyCapEnabled: false, - tokenAddress: address(0), - ipfsHash: "", - createdAt: block.timestamp, - executedAt: 0, - liquidityProvided: 0 - })); + transactions.push( + TransactionData({ + txId: 0, + owner: address(0), + signers: new address[](0), + isPending: false, + isExecuted: false, + tokenName: "", + tokenSymbol: "", + totalSupply: 0, + maxSupply: 0, + canMint: false, + canBurn: false, + supplyCapEnabled: false, + tokenAddress: address(0), + ipfsHash: "", + createdAt: block.timestamp, + executedAt: 0, + liquidityProvided: 0 + }) + ); } //////////////////// @@ -259,7 +265,9 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { } // Validate input parameters - _validateTokenParameters(_signers, _tokenName, _tokenSymbol, _totalSupply, _maxSupply, _supplyCapEnabled, _ipfsHash); + _validateTokenParameters( + _signers, _tokenName, _tokenSymbol, _totalSupply, _maxSupply, _supplyCapEnabled, _ipfsHash + ); // Create transaction txId = _createTransaction( @@ -280,7 +288,7 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { // Transfer fee if (msg.value > 0) { - (bool success, ) = feeRecipient.call{value: msg.value}(""); + (bool success,) = feeRecipient.call{ value: msg.value }(""); require(success, "Fee transfer failed"); } @@ -291,38 +299,28 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { * @notice Executes a pending transaction after multisig approval * @param _txId ID of the transaction to execute */ - function executeCreateMemecoin(uint256 _txId) - external - onlyMultiSigContract - onlyPendingTx(_txId) - nonReentrant - { + function executeCreateMemecoin(uint256 _txId) external onlyMultiSigContract onlyPendingTx(_txId) nonReentrant { TransactionData storage txData = transactions[_txId]; - + // Create the token TokenContract newToken = _deployToken(txData); - + // Update transaction status txData.isPending = false; txData.isExecuted = true; txData.tokenAddress = address(newToken); txData.executedAt = block.timestamp; - + // Update tracking isTokenCreated[address(newToken)] = true; tokenToOwner[address(newToken)] = txData.owner; totalTokensCreated++; - + // Initialize liquidity pool _initializeLiquidityPool(address(newToken)); - + emit MemecoinCreated( - txData.owner, - address(newToken), - txData.tokenName, - txData.tokenSymbol, - txData.totalSupply, - block.timestamp + txData.owner, address(newToken), txData.tokenName, txData.tokenSymbol, txData.totalSupply, block.timestamp ); } @@ -331,34 +329,30 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { * @param _tokenAddress Address of the token * @param _usdcAmount Amount of USDC to provide */ - function provideLiquidity(address _tokenAddress, uint256 _usdcAmount) - external - nonReentrant - whenNotPaused - { + function provideLiquidity(address _tokenAddress, uint256 _usdcAmount) external nonReentrant whenNotPaused { if (!isTokenCreated[_tokenAddress]) { revert FactoryTokenContract__InvalidAddress(); } // Transfer USDC from user USDC.transferFrom(msg.sender, address(this), _usdcAmount); - + // Update liquidity tracking LiquidityInfo storage liquidityInfo = tokenLiquidity[_tokenAddress]; - + if (liquidityInfo.contributions[msg.sender] == 0) { liquidityInfo.contributors.push(msg.sender); } - + liquidityInfo.contributions[msg.sender] += _usdcAmount; liquidityInfo.totalLiquidity += _usdcAmount; - + // Check if threshold is met if (!liquidityInfo.thresholdMet && liquidityInfo.totalLiquidity >= MIN_LIQUIDITY_THRESHOLD) { liquidityInfo.thresholdMet = true; emit LiquidityThresholdMet(_tokenAddress, liquidityInfo.totalLiquidity, block.timestamp); } - + emit LiquidityProvided(_tokenAddress, msg.sender, _usdcAmount, block.timestamp); } @@ -399,10 +393,10 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { * @return thresholdMet Whether threshold is met * @return contributorCount Number of contributors */ - function getLiquidityInfo(address _tokenAddress) - external - view - returns (uint256 totalLiquidity, bool thresholdMet, uint256 contributorCount) + function getLiquidityInfo(address _tokenAddress) + external + view + returns (uint256 totalLiquidity, bool thresholdMet, uint256 contributorCount) { LiquidityInfo storage info = tokenLiquidity[_tokenAddress]; return (info.totalLiquidity, info.thresholdMet, info.contributors.length); @@ -493,7 +487,10 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { uint256 _maxSupply, bool _supplyCapEnabled, string memory _ipfsHash - ) internal pure { + ) + internal + pure + { // Validate signers if (_signers.length < MIN_SIGNERS || _signers.length > MAX_SIGNERS) { revert FactoryTokenContract__InvalidSignerCount(); @@ -549,29 +546,34 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { bool _canBurn, bool _supplyCapEnabled, string memory _ipfsHash - ) internal returns (uint256 txId) { + ) + internal + returns (uint256 txId) + { txId = nextTxId; - - transactions.push(TransactionData({ - txId: txId, - owner: _owner, - signers: _signers, - isPending: true, - isExecuted: false, - tokenName: _tokenName, - tokenSymbol: _tokenSymbol, - totalSupply: _totalSupply, - maxSupply: _maxSupply, - canMint: _canMint, - canBurn: _canBurn, - supplyCapEnabled: _supplyCapEnabled, - tokenAddress: address(0), - ipfsHash: _ipfsHash, - createdAt: block.timestamp, - executedAt: 0, - liquidityProvided: 0 - })); - + + transactions.push( + TransactionData({ + txId: txId, + owner: _owner, + signers: _signers, + isPending: true, + isExecuted: false, + tokenName: _tokenName, + tokenSymbol: _tokenSymbol, + totalSupply: _totalSupply, + maxSupply: _maxSupply, + canMint: _canMint, + canBurn: _canBurn, + supplyCapEnabled: _supplyCapEnabled, + tokenAddress: address(0), + ipfsHash: _ipfsHash, + createdAt: block.timestamp, + executedAt: 0, + liquidityProvided: 0 + }) + ); + ownerToTxIds[_owner].push(txId); nextTxId++; } @@ -600,8 +602,8 @@ contract FactoryTokenContractV2 is Ownable, ReentrancyGuard, Pausable { _tokenAddress, address(USDC), 3000, // 0.3% fee tier - 60, // tick spacing - 79228162514264337593543950336 // sqrt price (1:1 ratio) + 60, // tick spacing + 79_228_162_514_264_337_593_543_950_336 // sqrt price (1:1 ratio) ); } } diff --git a/src/LiquidityManager.sol b/src/LiquidityManager.sol index abdf19b..43628c4 100644 --- a/src/LiquidityManager.sol +++ b/src/LiquidityManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { IPoolManager } from "v4-core/src/interfaces/IPoolManager.sol"; import { IHooks } from "v4-core/src/interfaces/IHooks.sol"; @@ -96,7 +96,9 @@ contract LiquidityManager { ) external { - require(!poolInitialized[token0], PoolAlreadyInitialized()); + if (poolInitialized[token0]) { + revert PoolAlreadyInitialized(); + } if (token0 > token1) { (token0, token1) = (token1, token0); } @@ -138,7 +140,7 @@ contract LiquidityManager { ) external { - require(poolInitialized[token0], PoolNotInitialized()); + if (!poolInitialized[token0]) revert PoolNotInitialized(); IERC20(token0).safeTransferFrom(msg.sender, address(this), amountToken0); IERC20(token1).safeTransferFrom(msg.sender, address(this), amountToken1); diff --git a/src/LiquidityManagerV2.sol b/src/LiquidityManagerV2.sol index ef08081..2a377df 100644 --- a/src/LiquidityManagerV2.sol +++ b/src/LiquidityManagerV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { IPoolManager } from "v4-core/src/interfaces/IPoolManager.sol"; import { IHooks } from "v4-core/src/interfaces/IHooks.sol"; @@ -32,4 +32,45 @@ contract LiquidityManagerV2 is Ownable, ReentrancyGuard, Pausable { error LiquidityManager__PoolNotInitialized(); error LiquidityManager__InvalidTokenAddress(); + //////////////////// + // State Variables // + //////////////////// + + /// @notice Uniswap V4 pool manager + IPoolManager public immutable poolManager; + + /// @notice Vesting contract for liquidity providers + VestingContract public vestingContract; + + /// @notice Factory contract address (authorized to initialize pools) + address public factoryContract; + + /// @notice Protocol fee recipient + address public protocolFeeRecipient; + + //////////////////// + // Constructor // + //////////////////// + + constructor( + address _poolManager, + address _vestingContract, + address _factoryContract, + address _protocolFeeRecipient, + address _initialOwner + ) + Ownable(_initialOwner) + { + if ( + _poolManager == address(0) || _vestingContract == address(0) || _factoryContract == address(0) + || _protocolFeeRecipient == address(0) + ) { + revert LiquidityManager__InvalidTokenAddress(); + } + + poolManager = IPoolManager(_poolManager); + vestingContract = VestingContract(_vestingContract); + factoryContract = _factoryContract; + protocolFeeRecipient = _protocolFeeRecipient; + } } diff --git a/src/MultiSigContract.sol b/src/MultiSigContract.sol index 4acc4c9..fe9d6ec 100644 --- a/src/MultiSigContract.sol +++ b/src/MultiSigContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { FactoryTokenContract } from "./FactoryTokenContract.sol"; @@ -52,10 +52,9 @@ contract MultiSigContract is Ownable { * @dev Modifier that ensures only the factory token contract or owner can call the function. */ modifier onlyFactoryTokenContract() { - require( - (msg.sender == address(factoryTokenContract)) || (msg.sender == owner()), - MultiSigContract__onlyFactoryTokenContract() - ); + if (!((msg.sender == address(factoryTokenContract)) || (msg.sender == owner()))) { + revert MultiSigContract__onlyFactoryTokenContract(); + } _; } @@ -70,7 +69,9 @@ contract MultiSigContract is Ownable { temp = pendingTxs[_txId].signers[i]; } } - require(temp == msg.sender, MultiSigContract__onlySigner()); + if (temp != msg.sender) { + revert MultiSigContract__onlySigner(); + } _; } @@ -85,7 +86,9 @@ contract MultiSigContract is Ownable { temp = pendingTxs[_txId].signatures[i]; } } - require(temp == address(0), MultiSigContract__alreadySigned()); + if (temp != address(0)) { + revert MultiSigContract__alreadySigned(); + } _; } @@ -97,10 +100,14 @@ contract MultiSigContract is Ownable { address temp = address(0); for (uint256 i = 0; i < pendingTxs[_txId].signatures.length; i++) { if (pendingTxs[_txId].signatures[i] == msg.sender) { - temp = pendingTxs[_txId].signatures[i]; + if (temp != msg.sender) { + revert MultiSigContract__alreadySigned(); + } } } - require(temp == msg.sender, MultiSigContract__alreadySigned()); + if (temp != msg.sender) { + revert MultiSigContract__alreadySigned(); + } _; } diff --git a/src/VestingContract.sol b/src/VestingContract.sol index 134ac91..7dddc8f 100644 --- a/src/VestingContract.sol +++ b/src/VestingContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; @@ -80,7 +80,9 @@ contract VestingContract is Ownable { external onlyOwner { - require(vestingSchedules[beneficiary].amount == 0, VestingAlreadySet()); + if (vestingSchedules[beneficiary].amount != 0) { + revert VestingAlreadySet(); + } vestingSchedules[beneficiary] = VestingSchedule({ tokenAddress: tokenAddress, @@ -99,11 +101,17 @@ contract VestingContract is Ownable { */ function release(address beneficiary) public { VestingSchedule storage schedule = vestingSchedules[beneficiary]; - require(schedule.amount > 0, NoVestingSchedule()); - require(!schedule.revoked, VestingIsRevoked()); + if (schedule.amount == 0) { + revert NoVestingSchedule(); + } + if (schedule.revoked) { + revert VestingIsRevoked(); + } uint256 unreleased = vestedAmount(beneficiary) - schedule.released; - require(unreleased > 0, NoTokensAreDue()); + if (unreleased == 0) { + revert NoTokensAreDue(); + } schedule.released += unreleased; IERC20(schedule.tokenAddress).safeTransfer(beneficiary, unreleased); @@ -118,7 +126,9 @@ contract VestingContract is Ownable { */ function revoke(address beneficiary) external onlyOwner { VestingSchedule storage schedule = vestingSchedules[beneficiary]; - require(!schedule.revoked, AlreadyRevoked()); + if (schedule.revoked) { + revert AlreadyRevoked(); + } schedule.revoked = true; emit VestingRevoked(beneficiary); diff --git a/src/helpers/TokenContract.sol b/src/helpers/TokenContract.sol index 53d6563..400add7 100644 --- a/src/helpers/TokenContract.sol +++ b/src/helpers/TokenContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.24; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; @@ -100,9 +100,9 @@ contract TokenContract is ERC20, ERC20Pausable, Ownable { * @param amount The amount of tokens to mint. */ function mint(address to, uint256 amount) external onlyOwner { - require(canMint, MintingIsDisabled()); + if (!canMint) revert MintingIsDisabled(); if (supplyCapEnabled) { - require(totalSupply() + amount <= maxSupply, MaxSupplyReached()); + if (totalSupply() + amount > maxSupply) revert MaxSupplyReached(); } _mint(to, amount); emit Mint(to, amount); @@ -119,7 +119,7 @@ contract TokenContract is ERC20, ERC20Pausable, Ownable { * @param amount The amount of tokens to burn. */ function burn(uint256 amount) external { - require(canBurn, BurningIsDisabled()); + if (!canBurn) revert BurningIsDisabled(); _burn(msg.sender, amount); emit Burn(msg.sender, amount); } diff --git a/test/staging/CreateMemeCoinTest.t.sol b/test/staging/CreateMemeCoinTest.t.sol index f5091a1..903b12b 100644 --- a/test/staging/CreateMemeCoinTest.t.sol +++ b/test/staging/CreateMemeCoinTest.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.10; +pragma solidity ^0.8.24; import { Test, console2 } from "forge-std/Test.sol"; import { StdCheats } from "forge-std/StdCheats.sol"; diff --git a/test/unit/anvil/FactoryTokenContractTest.t.sol b/test/unit/anvil/FactoryTokenContractTest.t.sol index 5a56605..65533ad 100644 --- a/test/unit/anvil/FactoryTokenContractTest.t.sol +++ b/test/unit/anvil/FactoryTokenContractTest.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.10; +pragma solidity ^0.8.24; import { Test, console2 } from "forge-std/Test.sol"; import { StdCheats } from "forge-std/StdCheats.sol"; diff --git a/test/unit/anvil/LiquidityManagerTest.t.sol b/test/unit/anvil/LiquidityManagerTest.t.sol index 7686d2b..586a327 100644 --- a/test/unit/anvil/LiquidityManagerTest.t.sol +++ b/test/unit/anvil/LiquidityManagerTest.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.10; +pragma solidity ^0.8.24; import { Test, console2 } from "forge-std/Test.sol"; import { StdCheats } from "forge-std/StdCheats.sol"; diff --git a/test/unit/anvil/MultiSigContractTest.t.sol b/test/unit/anvil/MultiSigContractTest.t.sol index fa573c4..f01fce6 100644 --- a/test/unit/anvil/MultiSigContractTest.t.sol +++ b/test/unit/anvil/MultiSigContractTest.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.10; +pragma solidity ^0.8.24; import { Test, console2 } from "forge-std/Test.sol"; import { StdCheats } from "forge-std/StdCheats.sol"; diff --git a/test/unit/anvil/VestingContractTest.t.sol b/test/unit/anvil/VestingContractTest.t.sol index 70c2c7a..b493243 100644 --- a/test/unit/anvil/VestingContractTest.t.sol +++ b/test/unit/anvil/VestingContractTest.t.sol @@ -1,2 +1,2 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.26; +pragma solidity ^0.8.24;