Bump pragma to 0.8.22 for all contract that depend on ERC1967Utils (#5273)
This commit is contained in:
5
.changeset/seven-donkeys-tap.md
Normal file
5
.changeset/seven-donkeys-tap.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'openzeppelin-solidity': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Update some pragma directives to ensure that all file requirements match that of the files they import.
|
||||||
4
.github/workflows/checks.yml
vendored
4
.github/workflows/checks.yml
vendored
@ -41,6 +41,8 @@ jobs:
|
|||||||
run: npm run test
|
run: npm run test
|
||||||
- name: Check linearisation of the inheritance graph
|
- name: Check linearisation of the inheritance graph
|
||||||
run: npm run test:inheritance
|
run: npm run test:inheritance
|
||||||
|
- name: Check pragma consistency between files
|
||||||
|
run: npm run test:pragma
|
||||||
- name: Check proceduraly generated contracts are up-to-date
|
- name: Check proceduraly generated contracts are up-to-date
|
||||||
run: npm run test:generation
|
run: npm run test:generation
|
||||||
- name: Compare gas costs
|
- name: Compare gas costs
|
||||||
@ -68,6 +70,8 @@ jobs:
|
|||||||
run: npm run test
|
run: npm run test
|
||||||
- name: Check linearisation of the inheritance graph
|
- name: Check linearisation of the inheritance graph
|
||||||
run: npm run test:inheritance
|
run: npm run test:inheritance
|
||||||
|
- name: Check pragma consistency between files
|
||||||
|
run: npm run test:pragma
|
||||||
- name: Check storage layout
|
- name: Check storage layout
|
||||||
uses: ./.github/actions/storage-layout
|
uses: ./.github/actions/storage-layout
|
||||||
continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'breaking change') }}
|
continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'breaking change') }}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {ERC1967Utils} from "../proxy/ERC1967/ERC1967Utils.sol";
|
import {ERC1967Utils} from "../proxy/ERC1967/ERC1967Utils.sol";
|
||||||
import {StorageSlot} from "../utils/StorageSlot.sol";
|
import {StorageSlot} from "../utils/StorageSlot.sol";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
pragma solidity ^0.8.0;
|
pragma solidity ^0.8.20;
|
||||||
|
|
||||||
import {MerkleTree} from "../utils/structs/MerkleTree.sol";
|
import {MerkleTree} from "../utils/structs/MerkleTree.sol";
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
// We keep these imports and a dummy contract just to we can run the test suite after transpilation.
|
// We keep these imports and a dummy contract just to we can run the test suite after transpilation.
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
pragma solidity ^0.8.19;
|
pragma solidity ^0.8.20;
|
||||||
|
|
||||||
import {IGovernor, Governor} from "../../governance/Governor.sol";
|
import {IGovernor, Governor} from "../../governance/Governor.sol";
|
||||||
import {GovernorTimelockControl} from "../../governance/extensions/GovernorTimelockControl.sol";
|
import {GovernorTimelockControl} from "../../governance/extensions/GovernorTimelockControl.sol";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {UUPSUpgradeable} from "../../proxy/utils/UUPSUpgradeable.sol";
|
import {UUPSUpgradeable} from "../../proxy/utils/UUPSUpgradeable.sol";
|
||||||
import {ERC1967Utils} from "../../proxy/ERC1967/ERC1967Utils.sol";
|
import {ERC1967Utils} from "../../proxy/ERC1967/ERC1967Utils.sol";
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Proxy.sol)
|
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Proxy.sol)
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {Proxy} from "../Proxy.sol";
|
import {Proxy} from "../Proxy.sol";
|
||||||
import {ERC1967Utils} from "./ERC1967Utils.sol";
|
import {ERC1967Utils} from "./ERC1967Utils.sol";
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Utils.sol)
|
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Utils.sol)
|
||||||
|
|
||||||
pragma solidity ^0.8.21;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {IBeacon} from "../beacon/IBeacon.sol";
|
import {IBeacon} from "../beacon/IBeacon.sol";
|
||||||
import {IERC1967} from "../../interfaces/IERC1967.sol";
|
import {IERC1967} from "../../interfaces/IERC1967.sol";
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/beacon/BeaconProxy.sol)
|
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/beacon/BeaconProxy.sol)
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {IBeacon} from "./IBeacon.sol";
|
import {IBeacon} from "./IBeacon.sol";
|
||||||
import {Proxy} from "../Proxy.sol";
|
import {Proxy} from "../Proxy.sol";
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/transparent/ProxyAdmin.sol)
|
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/transparent/ProxyAdmin.sol)
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {ITransparentUpgradeableProxy} from "./TransparentUpgradeableProxy.sol";
|
import {ITransparentUpgradeableProxy} from "./TransparentUpgradeableProxy.sol";
|
||||||
import {Ownable} from "../../access/Ownable.sol";
|
import {Ownable} from "../../access/Ownable.sol";
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/transparent/TransparentUpgradeableProxy.sol)
|
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/transparent/TransparentUpgradeableProxy.sol)
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
|
import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
|
||||||
import {ERC1967Proxy} from "../ERC1967/ERC1967Proxy.sol";
|
import {ERC1967Proxy} from "../ERC1967/ERC1967Proxy.sol";
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/utils/UUPSUpgradeable.sol)
|
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/utils/UUPSUpgradeable.sol)
|
||||||
|
|
||||||
pragma solidity ^0.8.20;
|
pragma solidity ^0.8.22;
|
||||||
|
|
||||||
import {IERC1822Proxiable} from "../../interfaces/draft-IERC1822.sol";
|
import {IERC1822Proxiable} from "../../interfaces/draft-IERC1822.sol";
|
||||||
import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
|
import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
|
||||||
|
|||||||
@ -26,8 +26,9 @@
|
|||||||
"generate": "scripts/generate/run.js",
|
"generate": "scripts/generate/run.js",
|
||||||
"version": "scripts/release/version.sh",
|
"version": "scripts/release/version.sh",
|
||||||
"test": "hardhat test",
|
"test": "hardhat test",
|
||||||
"test:inheritance": "scripts/checks/inheritance-ordering.js artifacts/build-info/*",
|
|
||||||
"test:generation": "scripts/checks/generation.sh",
|
"test:generation": "scripts/checks/generation.sh",
|
||||||
|
"test:inheritance": "scripts/checks/inheritance-ordering.js artifacts/build-info/*",
|
||||||
|
"test:pragma": "scripts/checks/pragma-consistency.js artifacts/build-info/*",
|
||||||
"gas-report": "env ENABLE_GAS_REPORT=true npm run test",
|
"gas-report": "env ENABLE_GAS_REPORT=true npm run test",
|
||||||
"slither": "npm run clean && slither ."
|
"slither": "npm run clean && slither ."
|
||||||
},
|
},
|
||||||
|
|||||||
@ -2,9 +2,13 @@
|
|||||||
|
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const graphlib = require('graphlib');
|
const graphlib = require('graphlib');
|
||||||
|
const match = require('micromatch');
|
||||||
const { findAll } = require('solidity-ast/utils');
|
const { findAll } = require('solidity-ast/utils');
|
||||||
const { _: artifacts } = require('yargs').argv;
|
const { _: artifacts } = require('yargs').argv;
|
||||||
|
|
||||||
|
// files to skip
|
||||||
|
const skipPatterns = ['contracts-exposed/**', 'contracts/mocks/**'];
|
||||||
|
|
||||||
for (const artifact of artifacts) {
|
for (const artifact of artifacts) {
|
||||||
const { output: solcOutput } = require(path.resolve(__dirname, '../..', artifact));
|
const { output: solcOutput } = require(path.resolve(__dirname, '../..', artifact));
|
||||||
|
|
||||||
@ -13,10 +17,7 @@ for (const artifact of artifacts) {
|
|||||||
const linearized = [];
|
const linearized = [];
|
||||||
|
|
||||||
for (const source in solcOutput.contracts) {
|
for (const source in solcOutput.contracts) {
|
||||||
if (['contracts-exposed/', 'contracts/mocks/'].some(pattern => source.startsWith(pattern))) {
|
if (match.any(source, skipPatterns)) continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const contractDef of findAll('ContractDefinition', solcOutput.sources[source].ast)) {
|
for (const contractDef of findAll('ContractDefinition', solcOutput.sources[source].ast)) {
|
||||||
names[contractDef.id] = contractDef.name;
|
names[contractDef.id] = contractDef.name;
|
||||||
linearized.push(contractDef.linearizedBaseContracts);
|
linearized.push(contractDef.linearizedBaseContracts);
|
||||||
|
|||||||
49
scripts/checks/pragma-consistency.js
Executable file
49
scripts/checks/pragma-consistency.js
Executable file
@ -0,0 +1,49 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const semver = require('semver');
|
||||||
|
const match = require('micromatch');
|
||||||
|
const { findAll } = require('solidity-ast/utils');
|
||||||
|
const { _: artifacts } = require('yargs').argv;
|
||||||
|
|
||||||
|
// files to skip
|
||||||
|
const skipPatterns = ['contracts-exposed/**', 'contracts/mocks/WithInit.sol'];
|
||||||
|
|
||||||
|
for (const artifact of artifacts) {
|
||||||
|
const { output: solcOutput } = require(path.resolve(__dirname, '../..', artifact));
|
||||||
|
|
||||||
|
const pragma = {};
|
||||||
|
|
||||||
|
// Extract pragma directive for all files
|
||||||
|
for (const source in solcOutput.contracts) {
|
||||||
|
if (match.any(source, skipPatterns)) continue;
|
||||||
|
for (const { literals } of findAll('PragmaDirective', solcOutput.sources[source].ast)) {
|
||||||
|
// There should only be one.
|
||||||
|
const [first, ...rest] = literals;
|
||||||
|
if (first === 'solidity') pragma[source] = rest.join('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compare the pragma directive of the file, to that of the files it imports
|
||||||
|
for (const source in solcOutput.contracts) {
|
||||||
|
if (match.any(source, skipPatterns)) continue;
|
||||||
|
// minimum version of the compiler that matches source's pragma
|
||||||
|
const minVersion = semver.minVersion(pragma[source]);
|
||||||
|
// loop over all imports in source
|
||||||
|
for (const { absolutePath } of findAll('ImportDirective', solcOutput.sources[source].ast)) {
|
||||||
|
// So files that only import without declaring anything cause issues, because they don't shop in in "pragma"
|
||||||
|
if (!pragma[absolutePath]) continue;
|
||||||
|
// Check that the minVersion for source satisfies the requirements of the imported files
|
||||||
|
if (!semver.satisfies(minVersion, pragma[absolutePath])) {
|
||||||
|
console.log(
|
||||||
|
`- ${source} uses ${pragma[source]} but depends on ${absolutePath} that requires ${pragma[absolutePath]}`,
|
||||||
|
);
|
||||||
|
process.exitCode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!process.exitCode) {
|
||||||
|
console.log('Pragma directives are consistent.');
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user