From 499782828a4fd82f03b9dca16f550d1b5c840bd4 Mon Sep 17 00:00:00 2001 From: 7400 <7400> Date: Wed, 25 Oct 2023 08:14:19 -0700 Subject: [PATCH] Port to Solidity 0.8.21 passes 3 tests --- .vscode/settings.json | 3 +++ foundry-default.toml | 3 ++- lib/@uniswap/v3-core | 1 - lib/@uniswap/v3-periphery | 1 - lib/openzeppelin-contracts | 2 +- lib_sol8/v3-core/contracts/libraries/FullMath.sol | 2 +- lib_sol8/v3-core/contracts/libraries/TickMath.sol | 2 +- .../contracts/interfaces/IERC20Metadata.sol | 3 ++- .../interfaces/INonfungiblePositionManager.sol | 4 ++-- .../contracts/interfaces/external/IWETH9.sol | 3 ++- .../contracts/libraries/PoolAddress.sol | 4 ++-- script/Deploy.sol | 3 ++- src/Constants.sol | 3 ++- src/Dexorder.sol | 3 ++- src/Factory.sol | 3 ++- src/MockERC20.sol | 13 ++++++++++--- src/OrderLib.sol | 3 ++- src/QueryHelper.sol | 3 ++- src/UniswapSwapper.sol | 3 ++- src/Util.sol | 3 ++- src/Vault.sol | 5 +++-- src/VaultAddress.sol | 9 +++++---- src/VaultDeployer.sol | 5 +++-- src/interface/IVaultDeployer.sol | 3 ++- test/MockEnv.sol | 3 ++- test/TestOrder.sol | 3 ++- test/TestSinglePool.sol | 3 ++- test/TestVault.sol | 3 ++- 28 files changed, 63 insertions(+), 36 deletions(-) create mode 100644 .vscode/settings.json delete mode 120000 lib/@uniswap/v3-core delete mode 120000 lib/@uniswap/v3-periphery diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e4ec924 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "solidity.compileUsingRemoteVersion": "v0.8.21+commit.d9974bed" +} \ No newline at end of file diff --git a/foundry-default.toml b/foundry-default.toml index c144cae..02aef6a 100644 --- a/foundry-default.toml +++ b/foundry-default.toml @@ -1,5 +1,6 @@ [profile.default] -solc_version = '0.7.6' +# solc_version = '0.7.6' +solc_version = '0.8.21' libs = ['lib'] remappings = [ '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/', diff --git a/lib/@uniswap/v3-core b/lib/@uniswap/v3-core deleted file mode 120000 index 10cd50c..0000000 --- a/lib/@uniswap/v3-core +++ /dev/null @@ -1 +0,0 @@ -../v3-core/contracts/ \ No newline at end of file diff --git a/lib/@uniswap/v3-periphery b/lib/@uniswap/v3-periphery deleted file mode 120000 index a751e86..0000000 --- a/lib/@uniswap/v3-periphery +++ /dev/null @@ -1 +0,0 @@ -../v3-periphery/contracts/ \ No newline at end of file diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts index 04695ae..0a25c19 160000 --- a/lib/openzeppelin-contracts +++ b/lib/openzeppelin-contracts @@ -1 +1 @@ -Subproject commit 04695aecbd4d17dddfd55de766d10e3805d6f42f +Subproject commit 0a25c1940ca220686588c4af3ec526f725fe2582 diff --git a/lib_sol8/v3-core/contracts/libraries/FullMath.sol b/lib_sol8/v3-core/contracts/libraries/FullMath.sol index 8688a17..c5b77b9 100644 --- a/lib_sol8/v3-core/contracts/libraries/FullMath.sol +++ b/lib_sol8/v3-core/contracts/libraries/FullMath.sol @@ -61,7 +61,7 @@ library FullMath { // Factor powers of two out of denominator // Compute largest power of two divisor of denominator. // Always >= 1. - uint256 twos = -denominator & denominator; + uint256 twos = uint256(-int256(denominator)) & denominator; // Divide denominator by power of two assembly { denominator := div(denominator, twos) diff --git a/lib_sol8/v3-core/contracts/libraries/TickMath.sol b/lib_sol8/v3-core/contracts/libraries/TickMath.sol index 378e445..1024980 100644 --- a/lib_sol8/v3-core/contracts/libraries/TickMath.sol +++ b/lib_sol8/v3-core/contracts/libraries/TickMath.sol @@ -22,7 +22,7 @@ library TickMath { /// at the given tick function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) { uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick)); - require(absTick <= uint256(MAX_TICK), 'T'); + require(absTick <= uint256(int256(MAX_TICK)), 'T'); uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000; if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128; diff --git a/lib_sol8/v3-periphery/contracts/interfaces/IERC20Metadata.sol b/lib_sol8/v3-periphery/contracts/interfaces/IERC20Metadata.sol index 3c876ee..a31f327 100644 --- a/lib_sol8/v3-periphery/contracts/interfaces/IERC20Metadata.sol +++ b/lib_sol8/v3-periphery/contracts/interfaces/IERC20Metadata.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.7.0; +pragma solidity >=0.8.0; +//pragma solidity ^0.7.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; diff --git a/lib_sol8/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol b/lib_sol8/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol index 023b266..db97932 100644 --- a/lib_sol8/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol +++ b/lib_sol8/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol @@ -2,8 +2,8 @@ pragma solidity >=0.7.5; pragma abicoder v2; -import '@openzeppelin/contracts/token/ERC721/IERC721Metadata.sol'; -import '@openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol'; +import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; +import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol'; import './IPoolInitializer.sol'; import './IERC721Permit.sol'; diff --git a/lib_sol8/v3-periphery/contracts/interfaces/external/IWETH9.sol b/lib_sol8/v3-periphery/contracts/interfaces/external/IWETH9.sol index 58ab43e..a1ab90e 100644 --- a/lib_sol8/v3-periphery/contracts/interfaces/external/IWETH9.sol +++ b/lib_sol8/v3-periphery/contracts/interfaces/external/IWETH9.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity =0.7.6; +// pragma solidity =0.7.6; +pragma solidity >=0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; diff --git a/lib_sol8/v3-periphery/contracts/libraries/PoolAddress.sol b/lib_sol8/v3-periphery/contracts/libraries/PoolAddress.sol index 60de385..90ac4f2 100644 --- a/lib_sol8/v3-periphery/contracts/libraries/PoolAddress.sol +++ b/lib_sol8/v3-periphery/contracts/libraries/PoolAddress.sol @@ -32,7 +32,7 @@ library PoolAddress { /// @return pool The contract address of the V3 pool function computeAddress(address factory, PoolKey memory key) internal pure returns (address pool) { require(key.token0 < key.token1); - pool = address( + pool = address(uint160( uint256( keccak256( abi.encodePacked( @@ -43,6 +43,6 @@ library PoolAddress { ) ) ) - ); + )); } } diff --git a/script/Deploy.sol b/script/Deploy.sol index 922508e..34de8a5 100644 --- a/script/Deploy.sol +++ b/script/Deploy.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +// pragma solidity =0.7.6; +pragma solidity >=0.8.0; import "forge-std/Script.sol"; import "forge-std/console2.sol"; diff --git a/src/Constants.sol b/src/Constants.sol index 7fea2db..79498d7 100644 --- a/src/Constants.sol +++ b/src/Constants.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; diff --git a/src/Dexorder.sol b/src/Dexorder.sol index d02b150..92630c9 100644 --- a/src/Dexorder.sol +++ b/src/Dexorder.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +// pragma solidity =0.7.6; +pragma solidity >=0.8.0; import "./OrderLib.sol"; import "./Vault.sol"; pragma abicoder v2; diff --git a/src/Factory.sol b/src/Factory.sol index 6fb7de1..2af7d1e 100644 --- a/src/Factory.sol +++ b/src/Factory.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; import "./VaultDeployer.sol"; pragma abicoder v2; diff --git a/src/MockERC20.sol b/src/MockERC20.sol index b111100..cf51a64 100644 --- a/src/MockERC20.sol +++ b/src/MockERC20.sol @@ -1,15 +1,22 @@ -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract MockERC20 is ERC20 { - constructor(string memory name, string memory symbol, uint8 decimals) + uint8 private _decimals; + + constructor(string memory name, string memory symbol, uint8 decimals_) ERC20(name, symbol) { - _setupDecimals(decimals); + // _setupDecimals(decimals); + _decimals = decimals_; } + function decimals() public view override returns (uint8) { + return _decimals; + } function mint(address account, uint256 amount) external { _mint(account, amount); diff --git a/src/OrderLib.sol b/src/OrderLib.sol index f3ca8e2..d409741 100644 --- a/src/OrderLib.sol +++ b/src/OrderLib.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +// pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; diff --git a/src/QueryHelper.sol b/src/QueryHelper.sol index 223316b..d088061 100644 --- a/src/QueryHelper.sol +++ b/src/QueryHelper.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "v3-core/contracts/interfaces/IUniswapV3Pool.sol"; diff --git a/src/UniswapSwapper.sol b/src/UniswapSwapper.sol index edf3965..4e43bc8 100644 --- a/src/UniswapSwapper.sol +++ b/src/UniswapSwapper.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "./Constants.sol"; diff --git a/src/Util.sol b/src/Util.sol index 0dc70fb..44738f9 100644 --- a/src/Util.sol +++ b/src/Util.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; library Util { diff --git a/src/Vault.sol b/src/Vault.sol index d49aa58..da96912 100644 --- a/src/Vault.sol +++ b/src/Vault.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "./Constants.sol"; @@ -31,7 +32,7 @@ contract Vault { } function withdraw(uint256 amount) public { - _withdrawNative(msg.sender, amount); + _withdrawNative(payable(msg.sender), amount); } function withdrawTo(address payable recipient, uint256 amount) public { diff --git a/src/VaultAddress.sol b/src/VaultAddress.sol index 11cb06c..3ff3c28 100644 --- a/src/VaultAddress.sol +++ b/src/VaultAddress.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "./Constants.sol"; @@ -10,7 +11,7 @@ library VaultAddress { // keccak-256 hash of the Vault's bytecode (not the deployed bytecode but the initialization bytecode) // can paste into: // https://emn178.github.io/online-tools/keccak_256.html - bytes32 internal constant VAULT_INIT_CODE_HASH = 0xbc5f4b6509a7bbf6d9bcbd2b24c599e63143e9ba77aebe3d9486f1cbfcbda9ea; + bytes32 internal constant VAULT_INIT_CODE_HASH = 0x060e1878e07cde3b1fe03b6a8929c62c502510ed5dda30b278951f11dfc03490; // the contract being constructed must not have any constructor arguments or the determinism will be broken. instead, use a callback to // get construction arguments @@ -22,7 +23,7 @@ library VaultAddress { function computeAddress(address factory, address owner, uint8 num) internal pure returns (address vault) { bytes32 salt = keccak256(abi.encodePacked(owner,num)); - vault = address( + vault = address(uint160( uint256( keccak256( abi.encodePacked( @@ -33,6 +34,6 @@ library VaultAddress { ) ) ) - ); + )); } } diff --git a/src/VaultDeployer.sol b/src/VaultDeployer.sol index e24cef0..e714667 100644 --- a/src/VaultDeployer.sol +++ b/src/VaultDeployer.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; import "./Vault.sol"; pragma abicoder v2; @@ -32,7 +33,7 @@ contract VaultDeployer { function _deployVault(address owner, uint8 num) internal returns (address payable vault) { parameters = Parameters(owner); - vault = address(new Vault{salt: keccak256(abi.encodePacked(owner,num))}()); + vault = payable(address(new Vault{salt: keccak256(abi.encodePacked(owner,num))}())); delete parameters; emit VaultCreated( owner, num ); } diff --git a/src/interface/IVaultDeployer.sol b/src/interface/IVaultDeployer.sol index c3c6dd5..76a47b5 100644 --- a/src/interface/IVaultDeployer.sol +++ b/src/interface/IVaultDeployer.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; interface IVaultDeployer { diff --git a/test/MockEnv.sol b/test/MockEnv.sol index 1533488..19413a1 100644 --- a/test/MockEnv.sol +++ b/test/MockEnv.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "forge-std/console2.sol"; diff --git a/test/TestOrder.sol b/test/TestOrder.sol index d4d9177..3034290 100644 --- a/test/TestOrder.sol +++ b/test/TestOrder.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "./MockEnv.sol"; diff --git a/test/TestSinglePool.sol b/test/TestSinglePool.sol index 0b2b035..b5cc12b 100644 --- a/test/TestSinglePool.sol +++ b/test/TestSinglePool.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +//pragma solidity =0.7.6; +pragma solidity >=0.8.0; pragma abicoder v2; import "forge-std/console2.sol"; diff --git a/test/TestVault.sol b/test/TestVault.sol index 8d196e3..d8a9749 100644 --- a/test/TestVault.sol +++ b/test/TestVault.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.7.6; +pragma solidity >=0.8.0; +//pragma solidity =0.7.6; import "forge-std/console2.sol"; import "../src/Factory.sol";