extract-layout.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. const fs = require('fs');
  2. const { findAll } = require('solidity-ast/utils');
  3. const { astDereferencer } = require('@openzeppelin/upgrades-core/dist/ast-dereferencer');
  4. const { solcInputOutputDecoder } = require('@openzeppelin/upgrades-core/dist/src-decoder');
  5. const { extractStorageLayout } = require('@openzeppelin/upgrades-core/dist/storage/extract');
  6. const { _ } = require('yargs').argv;
  7. const skipPath = ['contracts/mocks/', 'contracts-exposed/'];
  8. const skipKind = ['interface', 'library'];
  9. function extractLayouts(path) {
  10. const layout = {};
  11. const { input, output } = JSON.parse(fs.readFileSync(path));
  12. const decoder = solcInputOutputDecoder(input, output);
  13. const deref = astDereferencer(output);
  14. for (const src in output.contracts) {
  15. if (skipPath.some(prefix => src.startsWith(prefix))) {
  16. continue;
  17. }
  18. for (const contractDef of findAll('ContractDefinition', output.sources[src].ast)) {
  19. if (skipKind.includes(contractDef.contractKind)) {
  20. continue;
  21. }
  22. layout[contractDef.name] = extractStorageLayout(
  23. contractDef,
  24. decoder,
  25. deref,
  26. output.contracts[src][contractDef.name].storageLayout,
  27. );
  28. }
  29. }
  30. return layout;
  31. }
  32. console.log(JSON.stringify(Object.assign(..._.map(extractLayouts))));