Check storage layout consistency in PRs (#3967)

Co-authored-by: Francisco <frangio.1@gmail.com>
This commit is contained in:
Hadrien Croubois
2023-01-31 21:45:24 +01:00
committed by GitHub
parent 501a78e134
commit a70ee4e3bb
6 changed files with 264 additions and 0 deletions

View File

@ -0,0 +1,40 @@
const fs = require('fs');
const { findAll } = require('solidity-ast/utils');
const { astDereferencer } = require('@openzeppelin/upgrades-core/dist/ast-dereferencer');
const { solcInputOutputDecoder } = require('@openzeppelin/upgrades-core/dist/src-decoder');
const { extractStorageLayout } = require('@openzeppelin/upgrades-core/dist/storage/extract');
const { _ } = require('yargs').argv;
const skipPath = ['contracts/mocks/', 'contracts-exposed/'];
const skipKind = ['interface', 'library'];
function extractLayouts(path) {
const layout = {};
const { input, output } = JSON.parse(fs.readFileSync(path));
const decoder = solcInputOutputDecoder(input, output);
const deref = astDereferencer(output);
for (const src in output.contracts) {
if (skipPath.some(prefix => src.startsWith(prefix))) {
continue;
}
for (const contractDef of findAll('ContractDefinition', output.sources[src].ast)) {
if (skipKind.includes(contractDef.contractKind)) {
continue;
}
layout[contractDef.name] = extractStorageLayout(
contractDef,
decoder,
deref,
output.contracts[src][contractDef.name].storageLayout,
);
}
}
return layout;
}
console.log(JSON.stringify(Object.assign(..._.map(extractLayouts))));