pragma-validity.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env node
  2. const semver = require('semver');
  3. const pLimit = require('p-limit').default;
  4. const { hideBin } = require('yargs/helpers');
  5. const yargs = require('yargs/yargs');
  6. const getContractsMetadata = require('../get-contracts-metadata');
  7. const { compile } = require('../solc-versions');
  8. const {
  9. argv: { pattern, skipPatterns, verbose, concurrency, _: artifacts },
  10. } = yargs(hideBin(process.argv))
  11. .env('')
  12. .options({
  13. pattern: { alias: 'p', type: 'string', default: 'contracts/**/*.sol' },
  14. skipPatterns: { alias: 's', type: 'string', default: 'contracts/mocks/**/*.sol' },
  15. concurrency: { alias: 'c', type: 'number', default: 8 },
  16. verbose: { alias: 'v', type: 'count' },
  17. });
  18. const limit = pLimit(concurrency);
  19. Promise.all(
  20. Object.entries(getContractsMetadata(pattern, skipPatterns, artifacts)).map(([source, { pragma }]) =>
  21. limit(
  22. (file, version) =>
  23. compile(file, version).then(
  24. () => {
  25. verbose && console.log(`Compile ${file} using solc ${version}: ok`);
  26. },
  27. error => {
  28. console.error(`Failed to compile ${file} using solc ${version}\n${error}`);
  29. process.exitCode = 1;
  30. },
  31. ),
  32. source,
  33. semver.minVersion(pragma),
  34. ),
  35. ),
  36. ).finally(() => {
  37. if (!process.exitCode) {
  38. console.log('All files can be compiled with the specified pragma.');
  39. }
  40. });