/
compile-contracts.js
134 lines (115 loc) · 3.36 KB
/
compile-contracts.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
'use strict'
const _ = require('lodash')
const crypto = require('crypto')
const execAsync = require('./exec-async')
const generateVerifierContracts = require('@appliedblockchain/k0-eth-generate-verifier-contracts')
const path = require('path')
const asyncFs = require('./async-fs')
const k0ContractsSrcDir = path.join(
path.parse(module.filename).dir,
'..',
'node_modules',
'@appliedblockchain',
'k0-eth-contracts'
)
const testContractsSrcDir = path.join(
path.parse(module.filename).dir,
'..',
'contracts'
)
// Path to openzeppelin contracts
const ozDir = path.join(
__dirname,
'..',
'node_modules',
'openzeppelin-solidity'
)
// Extracts abi and bytecode from solc output
function extractContractArtefacts(result, contractName) {
const contractInfo = result.contracts[`${contractName}.sol:${contractName}`]
return {
abi: JSON.parse(contractInfo.abi),
bytecode: '0x' + contractInfo.bin
}
}
async function compileContracts(tmpDir = '/tmp/k0keys') {
const paths = {
commitmentPk: path.join(tmpDir, 'commitment_pk'),
commitmentVkAlt: path.join(tmpDir, 'commitment_vk_alt'),
additionPk: path.join(tmpDir, 'addition_pk'),
additionVkAlt: path.join(tmpDir, 'addition_vk_alt'),
transferPk: path.join(tmpDir, 'transfer_pk'),
transferVkAlt: path.join(tmpDir, 'transfer_vk_alt'),
withdrawalPk: path.join(tmpDir, 'withdrawal_pk'),
withdrawalVkAlt: path.join(tmpDir, 'withdrawal_vk_alt')
}
const contractsDir = path.join(tmpDir, crypto.randomBytes(32).toString('hex'))
await asyncFs.mkdir(contractsDir)
const verifiers = [
'AdditionVerifier',
'CommitmentVerifier',
'WithdrawalVerifier',
'TransferVerifier'
]
const normalK0Contracts = [
'Callee',
'MVPPT',
'Pairing'
]
let contractNames = verifiers.concat(normalK0Contracts)
const testContracts = [
'CarToken',
'DollarCoin',
'HiddenPriceCarTrade',
'MoneyShower'
]
contractNames = contractNames.concat(testContracts)
await generateVerifierContracts(
contractsDir,
paths.commitmentVkAlt,
paths.additionVkAlt,
paths.transferVkAlt,
paths.withdrawalVkAlt
)
await Promise.all(normalK0Contracts.map(name => {
const filename = name + '.sol'
return asyncFs.copyFile(
path.join(k0ContractsSrcDir, filename),
path.join(contractsDir, filename)
)
}))
await Promise.all(testContracts.map(name => {
const filename = name + '.sol'
return asyncFs.copyFile(
path.join(testContractsSrcDir, filename),
path.join(contractsDir, filename)
)
}))
console.log(contractsDir)
const outputPath = path.join(contractsDir, 'output.json')
const command = [
`solc --combined-json abi,bin openzeppelin-solidity=${ozDir}`,
'*.sol > output.json'
].join(' ')
const options = {
cwd: contractsDir,
maxBuffer: 1024 * 1024
}
const { stderr } = await execAsync(command, options)
if (stderr) {
console.log(stderr)
}
const json = await asyncFs.readTextFile(outputPath)
await Promise.all(contractNames.map(name => {
return asyncFs.unlink(path.join(contractsDir, `${name}.sol`))
}))
// await asyncFs.unlink(contractsDir)
const compilationResult = JSON.parse(json)
return _.zipObject(
contractNames,
contractNames.map(contractName => {
return extractContractArtefacts(compilationResult, contractName)
})
)
}
module.exports = compileContracts