module.exports = async function builder(code, options) { options = options || {}; let wasmModule; try { wasmModule = await WebAssembly.compile(code); } catch (err) { console.log(err); console.log("\nTry to run circom --c in order to generate c++ code instead\n"); throw new Error(err); } let wc; let errStr = ""; let msgStr = ""; const instance = await WebAssembly.instantiate(wasmModule, { runtime: { exceptionHandler : function(code) { let err; if (code == 1) { err = "Signal not found.\n"; } else if (code == 2) { err = "Too many signals set.\n"; } else if (code == 3) { err = "Signal already set.\n"; } else if (code == 4) { err = "Assert Failed.\n"; } else if (code == 5) { err = "Not enough memory.\n"; } else if (code == 6) { err = "Input signal array access exceeds the size.\n"; } else { err = "Unknown error.\n"; } throw new Error(err + errStr); }, printErrorMessage : function() { errStr += getMessage() + "\n"; // console.error(getMessage()); }, writeBufferMessage : function() { const msg = getMessage(); // Any calls to `log()` will always end with a `\n`, so that's when we print and reset if (msg === "\n") { console.log(msgStr); msgStr = ""; } else { // If we've buffered other content, put a space in between the items if (msgStr !== "") { msgStr += " " } // Then append the message to the message we are creating msgStr += msg; } }, showSharedRWMemory : function() { printSharedRWMemory (); } } }); const sanityCheck = options // options && // ( // options.sanityCheck || // options.logGetSignal || // options.logSetSignal || // options.logStartComponent || // options.logFinishComponent // ); wc = new WitnessCalculator(instance, sanityCheck); return wc; function getMessage() { var message = ""; var c = instance.exports.getMessageChar(); while ( c != 0 ) { message += String.fromCharCode(c); c = instance.exports.getMessageChar(); } return message; } function printSharedRWMemory () { const shared_rw_memory_size = instance.exports.getFieldNumLen32(); const arr = new Uint32Array(shared_rw_memory_size); for (let j=0; j { const h = fnvHash(k); const hMSB = parseInt(h.slice(0,8), 16); const hLSB = parseInt(h.slice(8,16), 16); const fArr = flatArray(input[k]); let signalSize = this.instance.exports.getInputSignalSize(hMSB, hLSB); if (signalSize < 0){ throw new Error(`Signal ${k} not found\n`); } if (fArr.length < signalSize) { throw new Error(`Not enough values for input signal ${k}\n`); } if (fArr.length > signalSize) { throw new Error(`Too many values for input signal ${k}\n`); } for (let i=0; i0) { res.unshift(0); i--; } } return res; } function fromArray32(arr) { //returns a BigInt var res = BigInt(0); const radix = BigInt(0x100000000); for (let i = 0; i