|
|
@ -75,13 +75,16 @@ async function runCertora(spec, contract, files, options = []) { |
|
|
|
|
|
|
|
|
|
|
|
// as soon as we have a jobStatus link, print it
|
|
|
|
// as soon as we have a jobStatus link, print it
|
|
|
|
stream.on('data', function logStatusUrl(data) { |
|
|
|
stream.on('data', function logStatusUrl(data) { |
|
|
|
const urls = data.toString('utf8').match(/https?:\S*/g); |
|
|
|
const { '-DjobId': jobId, '-DuserId': userId } = Object.fromEntries( |
|
|
|
for (const url of urls ?? []) { |
|
|
|
data |
|
|
|
if (url.includes('/jobStatus/')) { |
|
|
|
.toString('utf8') |
|
|
|
console.error(`[${spec}] ${url.replace('/jobStatus/', '/output/')}`); |
|
|
|
.match(/-D\S+=\S+/g) |
|
|
|
|
|
|
|
?.map(s => s.split('=')) || [], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (jobId && userId) { |
|
|
|
|
|
|
|
console.error(`[${spec}] https://prover.certora.com/output/${userId}/${jobId}/`); |
|
|
|
stream.off('data', logStatusUrl); |
|
|
|
stream.off('data', logStatusUrl); |
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
@ -98,7 +101,7 @@ async function runCertora(spec, contract, files, options = []) { |
|
|
|
stream.end(); |
|
|
|
stream.end(); |
|
|
|
|
|
|
|
|
|
|
|
// write results in markdown format
|
|
|
|
// write results in markdown format
|
|
|
|
writeEntry(spec, contract, code || signal, (await output).match(/https:\S*/)?.[0]); |
|
|
|
writeEntry(spec, contract, code || signal, (await output).match(/https:\/\/prover.certora.com\/output\/\S*/)?.[0]); |
|
|
|
|
|
|
|
|
|
|
|
// write all details
|
|
|
|
// write all details
|
|
|
|
console.error(`+ certoraRun ${args.join(' ')}\n` + (await output)); |
|
|
|
console.error(`+ certoraRun ${args.join(' ')}\n` + (await output)); |
|
|
|