-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhex-build.js
executable file
·104 lines (84 loc) · 2.21 KB
/
hex-build.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
#!/usr/bin/env node
'use strict';
const fs = require('fs');
const solc = require('solc');
const solpp = require('solpp');
const buildDir = './build';
const contractDir = './contracts';
const contractName = 'HEX';
const contractFile = 'HEX.sol';
const flattenedPath = `${buildDir}/${contractFile}`;
const contractPath = `${contractDir}/${contractFile}`;
function formatJson(obj) {
return JSON.stringify(obj, null, 2) + '\n';
}
function saveTextFile(textPath, text) {
if (!fs.existsSync(textPath) || text !== fs.readFileSync(textPath, 'utf-8')) {
fs.writeFileSync(textPath, text);
console.log('Saved:', textPath);
return true;
}
return false;
}
function saveJsonFile(ext, obj) {
const jsonPath = `${buildDir}/${contractName}.${ext}.json`;
return saveTextFile(jsonPath, formatJson(obj));
}
async function flatten() {
const ppOpts = {
noPreprocessor: true,
};
let src = await solpp.processFile(contractPath, ppOpts);
if (!src.endsWith('\n')) {
src += '\n';
}
return src;
}
function compile(src) {
const input = {
language: 'Solidity',
sources: {
[contractFile]: {
content: src,
},
},
settings: {
optimizer: {
enabled: true,
runs: 200,
},
outputSelection: {
[contractFile]: {
[contractName]: [
'evm.bytecode.object',
'evm.bytecode.sourceMap',
'evm.deployedBytecode.object',
'evm.deployedBytecode.sourceMap',
'metadata',
],
},
},
},
}
const output = JSON.parse(solc.compileStandard(JSON.stringify(input)));
if (output.errors) {
console.error(formatJson(output.errors));
process.exit(1);
}
return output;
}
async function build() {
console.log('Flattening:', contractPath);
const src = await flatten();
console.log('Compiling: ', contractPath);
const output = compile(src);
const contract = output.contracts[contractFile][contractName];
const metadata = JSON.parse(contract.metadata);
const abi = metadata.output.abi;
delete metadata.output.abi;
saveJsonFile('abi', abi);
saveJsonFile('evm', contract.evm);
saveJsonFile('metadata', metadata);
saveTextFile(flattenedPath, src);
}
build();