extract-layout.js 1.1 KB

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