extract-layout.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  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 { hideBin } = require('yargs/helpers');
  5. const { argv } = require('yargs/yargs')(hideBin(process.argv));
  6. const skipPath = ['contracts/mocks/', 'contracts-exposed/'];
  7. const skipKind = ['interface', 'library'];
  8. function extractLayouts(path) {
  9. const layout = {};
  10. const { input, output } = JSON.parse(fs.readFileSync(path));
  11. const decoder = srcDecoder(input, output);
  12. const deref = astDereferencer(output);
  13. for (const src in output.contracts) {
  14. if (skipPath.some(prefix => src.startsWith(prefix))) {
  15. continue;
  16. }
  17. for (const contractDef of findAll('ContractDefinition', output.sources[src].ast)) {
  18. if (skipKind.includes(contractDef.contractKind)) {
  19. continue;
  20. }
  21. layout[contractDef.name] = extractStorageLayout(
  22. contractDef,
  23. decoder,
  24. deref,
  25. output.contracts[src][contractDef.name].storageLayout,
  26. );
  27. }
  28. }
  29. return layout;
  30. }
  31. console.log(JSON.stringify(Object.assign(...argv._.map(extractLayouts))));