-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolc.js
executable file
·106 lines (87 loc) · 3.22 KB
/
solc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const c = require('chalk');
const byteSize = require('byte-size');
const formath = hash => hash.slice(0, 4) + '..' + hash.slice(60);
const formatv = ver => ver.replace('commit.', '');
const sources = base => Object.fromEntries(fs.readdirSync(base)
.filter(file => file.endsWith('.sol'))
.map(sol => [sol, {
content: fs.readFileSync(path.join(base, sol), 'utf8'),
}])
);
function compile(hash, base, version, solc) {
const metadata = JSON.parse(fs.readFileSync(path.join(base, 'metadata.json'), 'utf8'));
if (metadata.CompilerVersion !== version) {
throw new Error(`Version mismatch: ${metadata.CompilerVersion} != ${version}`);
}
process.stdout.write(`${c.magenta(hash)} ${c.cyan(metadata.ContractName)} ${formatv(metadata.CompilerVersion)} ${c.dim('|')} `);
let output = undefined;
try {
output = fs.readFileSync(path.join(base, 'output.jsonc'), 'utf8');
} catch (err) { }
if (output) {
const m = output.match(/^\/\/(sol|json)\n/);
output = output.slice(m[0].length);
output = JSON.parse(output);
const sym = m[1];
if (sym && output && output.contracts) {
console.info(c.dim(`${c.green(sym + '\u2713')}`));
return;
}
}
const tries = [
['sol', () => JSON.stringify({
language: 'Solidity',
sources: sources(base),
settings: {
outputSelection: {
'*': {
'*': ['abi'],
},
},
},
})],
['json', () => fs.readFileSync(path.join(base, 'contract.json'), 'utf8')],
];
for (const [sym, tryFn] of tries) {
try {
const input = tryFn();
process.stdout.write(`${c.green(sym)} ${byteSize(input.length)} `);
const output = solc.compile(input);
fs.writeFileSync(path.join(base, `output.jsonc`), `//${sym}\n${output}`);
process.stdout.write(`${c.green('\u2713')}`);
break;
} catch (err) {
process.stdout.write(`${c.red(c.strikethrough(sym))} `);
}
}
console.info();
}
function main() {
const info = (message, ...optionalParams) => console.info(c.dim('[info]'), message, ...optionalParams);
const config = require('./.config.js');
const version = process.argv[2];
const solc = function () {
const path = `./.solc/${version}.js`;
info('Loading solc', c.yellow(version));
try {
return require('solc').setupMethods(require(path));
} catch (err) {
console.error(c.red('Failed to load solc'), err);
process.exit(1);
}
}();
info(c.blue('solc.version'), solc.version());
info(c.blue('solc.sermver'), solc.semver());
const filter = process.argv[3];
info(c.blue('filter'), filter ?? 'all');
for (const base of JSON.parse(fs.readFileSync(path.join('.solc', version + '.hashes.json')))) {
const hash = formath(base.slice(3));
if (!filter || hash.startsWith(filter)) {
compile(hash, `${config.contracts}/${base}`, version, solc);
}
}
}
main();