diff --git a/test/coprocessorUtils.ts b/test/coprocessorUtils.ts index c2b8606..12bab6b 100644 --- a/test/coprocessorUtils.ts +++ b/test/coprocessorUtils.ts @@ -66,20 +66,6 @@ export const getClearText = async (handle: bigint): Promise => { executeQuery(); }); }; -/*export const getClearText = async (handle: bigint): Promise => { - const handleStr = '0x' + handle.toString(16).padStart(64, '0'); - return new Promise((resolve, reject) => { - db.get('SELECT clearText FROM ciphertexts WHERE handle = ?', [handleStr], (err, row) => { - if (err) { - reject(new Error(`Error querying database: ${err.message}`)); - } else if (row) { - resolve(row.clearText); - } else { - reject(new Error('No record found')); - } - }); - }); -};*/ db.serialize(() => db.run("CREATE TABLE IF NOT EXISTS ciphertexts (handle BINARY PRIMARY KEY,clearText TEXT)")); @@ -195,12 +181,12 @@ function getRandomBigInt(numBits: number): bigint { return randomBigInt; } -async function insertHandle(obj: EvmState) { +async function insertHandle(obj2: EvmState, validIdxes: [number]) { + const obj = obj2.value; if (isCoprocAdd(obj!.stack.at(-2))) { const argsOffset = Number(`0x${obj!.stack.at(-4)}`); const argsSize = Number(`0x${obj!.stack.at(-5)}`); const calldata = extractCalldata(obj.memory, argsOffset, argsSize); - //console.log('calldata : ', calldata); const currentSelector = "0x" + calldata.slice(0, 8); const decodedData = iface.decodeFunctionData(currentSelector, "0x" + calldata); @@ -669,68 +655,75 @@ async function insertHandle(obj: EvmState) { insertSQL(handle, clearText); break; - case "verifyCiphertext(bytes32,address,bytes,bytes1)": { - handle = decodedData[0]; - const type = parseInt(handle.slice(-4, -2), 16); - if (type !== 11) { - //not an ebytes256 - const typeSize = TypesBytesSize[type]; - const idx = parseInt(handle.slice(-6, -4), 16); - const inputProof = decodedData[2].replace(/^0x/, ""); - clearText = BigInt("0x" + inputProof.slice(2 + 2 * 53 * idx, 2 + 2 * typeSize + 2 * 53 * idx)); - insertSQL(handle, clearText); - } else { - const inputProof = decodedData[2].replace(/^0x/, ""); - clearText = BigInt("0x" + inputProof.slice(2, 2 + 2 * 256)); - insertSQL(handle, clearText); + case "verifyCiphertext(bytes32,address,bytes,bytes1)": + { + handle = decodedData[0]; + const type = parseInt(handle.slice(-4, -2), 16); + if (type !== 11) { + //not an ebytes256 + const typeSize = TypesBytesSize[type]; + const idx = parseInt(handle.slice(-6, -4), 16); + const inputProof = decodedData[2].replace(/^0x/, ""); + clearText = BigInt("0x" + inputProof.slice(2 + 2 * 53 * idx, 2 + 2 * typeSize + 2 * 53 * idx)); + insertSQL(handle, clearText); + } else { + const inputProof = decodedData[2].replace(/^0x/, ""); + clearText = BigInt("0x" + inputProof.slice(2, 2 + 2 * 256)); + insertSQL(handle, clearText); + } } break; - } - case "fheIfThenElse(uint256,uint256,uint256)": { - resultType = parseInt(decodedData[1].toString(16).slice(-4, -2), 16); - handle = ethers.keccak256( - ethers.solidityPacked( - ["uint8", "uint256", "uint256", "uint256"], - [Operators.fheIfThenElse, decodedData[0], decodedData[1], decodedData[2]], - ), - ); - handle = appendType(handle, resultType); - const clearControl = BigInt(await getClearText(decodedData[0])); - const clearIfTrue = BigInt(await getClearText(decodedData[1])); - const clearIfFalse = BigInt(await getClearText(decodedData[2])); - if (clearControl === 1n) { - clearText = clearIfTrue; - } else { - clearText = clearIfFalse; + + case "fheIfThenElse(uint256,uint256,uint256)": + { + resultType = parseInt(decodedData[1].toString(16).slice(-4, -2), 16); + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "uint256"], + [Operators.fheIfThenElse, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, resultType); + const clearControl = BigInt(await getClearText(decodedData[0])); + const clearIfTrue = BigInt(await getClearText(decodedData[1])); + const clearIfFalse = BigInt(await getClearText(decodedData[2])); + if (clearControl === 1n) { + clearText = clearIfTrue; + } else { + clearText = clearIfFalse; + } + insertSQL(handle, clearText); } - insertSQL(handle, clearText); break; - } - case "fheRand(bytes1)": { - resultType = parseInt(decodedData[0], 16); - handle = ethers.keccak256( - ethers.solidityPacked(["uint8", "bytes1", "uint256"], [Operators.fheRand, decodedData[0], counterRand]), - ); - handle = appendType(handle, resultType); - clearText = getRandomBigInt(Number(NumBits[resultType])); - insertSQL(handle, clearText, true); - counterRand++; + + case "fheRand(bytes1)": + if (validIdxes.includes(obj2.index)) { + resultType = parseInt(decodedData[0], 16); + handle = ethers.keccak256( + ethers.solidityPacked(["uint8", "bytes1", "uint256"], [Operators.fheRand, decodedData[0], counterRand]), + ); + handle = appendType(handle, resultType); + clearText = getRandomBigInt(Number(NumBits[resultType])); + insertSQL(handle, clearText, true); + counterRand++; + } break; - } - case "fheRandBounded(uint256,bytes1)": { - resultType = parseInt(decodedData[1], 16); - handle = ethers.keccak256( - ethers.solidityPacked( - ["uint8", "uint256", "bytes1", "uint256"], - [Operators.fheRandBounded, decodedData[0], decodedData[1], counterRand], - ), - ); - handle = appendType(handle, resultType); - clearText = getRandomBigInt(Number(log2(BigInt(decodedData[0])))); - insertSQL(handle, clearText, true); - counterRand++; + + case "fheRandBounded(uint256,bytes1)": + if (validIdxes.includes(obj2.index)) { + resultType = parseInt(decodedData[1], 16); + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "bytes1", "uint256"], + [Operators.fheRandBounded, decodedData[0], decodedData[1], counterRand], + ), + ); + handle = appendType(handle, resultType); + clearText = getRandomBigInt(Number(log2(BigInt(decodedData[0])))); + insertSQL(handle, clearText, true); + counterRand++; + } break; - } } } } @@ -755,9 +748,11 @@ function isCoprocAdd(longString: string): boolean { return normalizedLongString === coprocAdd; } -async function processLogs(trace, blockNo) { - for (const obj of trace.structLogs.filter((obj) => obj.op === "CALL")) { - await insertHandle(obj, blockNo); +async function processLogs(trace, validSubcallsIndexes) { + for (const obj of trace.structLogs + .map((value, index) => ({ value, index })) + .filter((obj) => obj.value.op === "CALL")) { + await insertHandle(obj, validSubcallsIndexes); } } @@ -767,7 +762,9 @@ export const awaitCoprocessor = async (): Promise => { const trace = await ethers.provider.send("debug_traceTransaction", [txHash[0]]); if (!trace.failed) { - await processLogs(trace, txHash[1]); + const callTree = await buildCallTree(trace, txHash[1]); + const validSubcallsIndexes = getValidSubcallsIds(callTree)[1]; + await processLogs(trace, validSubcallsIndexes); } } }; @@ -775,7 +772,7 @@ export const awaitCoprocessor = async (): Promise => { async function getAllPastTransactionHashes() { const provider = ethers.provider; const latestBlockNumber = await provider.getBlockNumber(); - const txHashes: [string, number][] = []; + const txHashes = []; if (hre.__SOLIDITY_COVERAGE_RUNNING !== true) { // evm_snapshot is not supported in coverage mode @@ -788,9 +785,10 @@ async function getAllPastTransactionHashes() { // Iterate through all blocks and collect transaction hashes for (let i = firstBlockListening; i <= latestBlockNumber; i++) { - const block = await provider.getBlock(i); - block!.transactions.forEach((tx) => { - txHashes.push([tx, i]); + const block = await provider.getBlock(i, true); + block!.transactions.forEach((tx, index) => { + const rcpt = block?.prefetchedTransactions[index]; + txHashes.push([tx, { to: rcpt.to, status: rcpt.status }]); }); } firstBlockListening = latestBlockNumber + 1; @@ -801,74 +799,95 @@ async function getAllPastTransactionHashes() { return txHashes; } -// async function buildCallTree(receipt: TransactionReceipt) { -// const txHash = receipt.hash; -// const trace = await ethers.provider.send("debug_traceTransaction", [txHash, {}]); -// const structLogs = trace.structLogs; - -// const callStack = []; -// const callTree = { -// id: 0, -// type: !!receipt.to ? "TOPCALL" : "TOPCREATE", -// revert: receipt.status === 1 ? false : true, -// to: !!receipt.to ? receipt.to : null, -// calls: [], -// }; -// let currentNode = callTree; -// const lenStructLogs = structLogs.length; -// let index = 1; -// for (const [i, log] of structLogs.entries()) { -// if (i < lenStructLogs - 1) { -// if (structLogs[i].depth - structLogs[i + 1].depth === 1) { -// if (!["RETURN", "SELFDESTRUCT", "STOP", "REVERT", "INVALID"].includes(structLogs[i].op)) { -// currentNode.outofgasOrOther = true; -// currentNode = callStack.pop(); -// } -// } -// } - -// switch (log.op) { -// case "CALL": -// case "DELEGATECALL": -// case "CALLCODE": -// case "STATICCALL": -// case "CREATE": -// case "CREATE2": -// if (i < lenStructLogs - 1) { -// if (structLogs[i + 1].depth - structLogs[i].depth === 1) { -// const newNode = { -// id: index, -// type: log.op, -// to: log.stack[log.stack.length - 2], -// calls: [], -// revert: true, -// outofgasOrOther: false, -// }; -// currentNode.calls.push(newNode); -// callStack.push(currentNode); -// currentNode = newNode; -// index += 1; -// } -// } -// break; -// case "RETURN": // some edge case probably not handled well : if memory expansion cost on RETURN exceeds the remaining gas in current subcall, but it's OK for a mocked mode -// case "SELFDESTRUCT": // some edge case probably not handled well : if there is not enough gas remaining on SELFDESTRUCT, but it's OK for a mocked mode -// case "STOP": -// currentNode.revert = false; -// currentNode = callStack.pop(); -// break; -// case "REVERT": -// case "INVALID": -// currentNode = callStack.pop(); -// break; -// } - -// switch (log.op) { -// case "CREATE": -// case "CREATE2": -// currentNode.to = null; -// break; -// } -// } -// return callTree; -// } +async function buildCallTree(trace, receipt) { + const structLogs = trace.structLogs; + + const callStack = []; + const callTree = { + id: 0, + type: receipt.to ? "TOPCALL" : "TOPCREATE", + revert: receipt.status === 1 ? false : true, + to: receipt.to ? receipt.to : null, + calls: [], + indexTrace: 0, + }; + let currentNode = callTree; + const lenStructLogs = structLogs.length; + let index = 1; + for (const [i, log] of structLogs.entries()) { + if (i < lenStructLogs - 1) { + if (structLogs[i].depth - structLogs[i + 1].depth === 1) { + if (!["RETURN", "SELFDESTRUCT", "STOP", "REVERT", "INVALID"].includes(structLogs[i].op)) { + currentNode.outofgasOrOther = true; + currentNode = callStack.pop(); + } + } + } + + switch (log.op) { + case "CALL": + case "DELEGATECALL": + case "CALLCODE": + case "STATICCALL": + case "CREATE": + case "CREATE2": + if (i < lenStructLogs - 1) { + if (structLogs[i + 1].depth - structLogs[i].depth === 1) { + const newNode = { + id: index, + type: log.op, + to: log.stack[log.stack.length - 2], + calls: [], + revert: true, + outofgasOrOther: false, + indexTrace: i, + }; + currentNode.calls.push(newNode); + callStack.push(currentNode); + currentNode = newNode; + index += 1; + } + } + break; + case "RETURN": // some edge case probably not handled well : if memory expansion cost on RETURN exceeds the remaining gas in current subcall, but it's OK for a mocked mode + case "SELFDESTRUCT": // some edge case probably not handled well : if there is not enough gas remaining on SELFDESTRUCT, but it's OK for a mocked mode + case "STOP": + currentNode.revert = false; + currentNode = callStack.pop(); + break; + case "REVERT": + case "INVALID": + currentNode = callStack.pop(); + break; + } + + switch (log.op) { + case "CREATE": + case "CREATE2": + currentNode.to = null; + break; + } + } + return callTree; +} + +function getValidSubcallsIds(tree) { + const result = []; + const resultIndexes = []; + + function traverse(node, ancestorReverted) { + if (ancestorReverted || node.revert) { + ancestorReverted = true; + } else { + result.push(node.id); + resultIndexes.push(node.indexTrace); + } + for (const child of node.calls) { + traverse(child, ancestorReverted); + } + } + + traverse(tree, false); + + return [result, resultIndexes]; +} diff --git a/tf.json b/tf.json deleted file mode 100644 index de1af26..0000000 --- a/tf.json +++ /dev/null @@ -1,790 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "TFHEExecutor", - "sourceName": "fhevmTemp/fhevm/lib/TFHEExecutor.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "uint256", - "name": "ct", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "toType", - "type": "bytes1" - } - ], - "name": "cast", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cleanTransientStorage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheAdd", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheBitAnd", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheBitOr", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheBitXor", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheDiv", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheEq", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheGe", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheGt", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "control", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "ifTrue", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "ifFalse", - "type": "uint256" - } - ], - "name": "fheIfThenElse", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheLe", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheLt", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheMax", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheMin", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheMul", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheNe", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "ct", - "type": "uint256" - } - ], - "name": "fheNeg", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "ct", - "type": "uint256" - } - ], - "name": "fheNot", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes1", - "name": "randType", - "type": "bytes1" - } - ], - "name": "fheRand", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "upperBound", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "randType", - "type": "bytes1" - } - ], - "name": "fheRandBounded", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheRem", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheRotl", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheRotr", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheShl", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheShr", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lhs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rhs", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "scalarByte", - "type": "bytes1" - } - ], - "name": "fheSub", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "plaintext", - "type": "uint256" - }, - { - "internalType": "bytes1", - "name": "toType", - "type": "bytes1" - } - ], - "name": "trivialEncrypt", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "inputHandle", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "inputProof", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "inputType", - "type": "bytes1" - } - ], - "name": "verifyCiphertext", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561000f575f80fd5b506125ba8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c8063816d57d3116100fe578063a8b42a891161009e578063ec4057dc1161006e578063ec4057dc146103a6578063eee1833c146103b9578063f953e427146103cc578063fa33b7af146103df575f80fd5b8063a8b42a891461035a578063cb3b94071461036d578063e0c516ae14610380578063e71746b814610393575f80fd5b8063900d294e116100d9578063900d294e1461030e5780639675211f14610321578063a86e9de514610334578063a87deac414610347575f80fd5b8063816d57d3146102d557806389a4314b146102e85780638c14cc21146102fb575f80fd5b806336cdd31b116101695780634be68d20116101445780634be68d2014610289578063666a35881461029c578063694daf72146102af5780636be31758146102c2575f80fd5b806336cdd31b146102505780633e63c50a1461026357806344ae9c5c14610276575f80fd5b806319271081116101a457806319271081146102155780632c7d67b7146102285780632e817ff01461023b57806335334c231461024e575f80fd5b8063052896f1146101ca57806305907343146101ef57806313801ffa14610202575b5f80fd5b6101dd6101d8366004612305565b6103f2565b60405190815260200160405180910390f35b6101dd6101fd366004612305565b6105d7565b6101dd610210366004612337565b610718565b6101dd610223366004612305565b61085a565b6101dd610236366004612305565b61099b565b6101dd610249366004612362565b610acb565b005b6101dd61025e366004612305565b610ba2565b6101dd610271366004612305565b610c59565b6101dd610284366004612305565b610d9a565b6101dd610297366004612451565b610edb565b6101dd6102aa366004612305565b61102e565b6101dd6102bd366004612305565b61115e565b6101dd6102d0366004612305565b61129f565b6101dd6102e3366004612305565b6113e0565b6101dd6102f6366004612305565b611521565b6101dd610309366004612305565b611662565b6101dd61031c36600461247b565b6117a3565b6101dd61032f366004612305565b6117f1565b6101dd610342366004612305565b611932565b6101dd610355366004612305565b611a73565b6101dd610368366004612337565b611bb4565b6101dd61037b36600461249b565b611c54565b6101dd61038e366004612305565b611df4565b6101dd6103a1366004612451565b611eab565b6101dd6103b4366004612305565b611ee2565b6101dd6103c7366004612305565b612012565b6101dd6103da366004612305565b612153565b6101dd6103ed366004612451565b612294565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610441573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046591906124c4565b61046d575f80fd5b6001600160f81b031982165f036104f757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156104cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ef91906124c4565b6104f7575f80fd5b60405163052896f160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063052896f1906064015b602060405180830381865afa15801561054a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056e91906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b1580156105ba575f80fd5b505af11580156105cc573d5f803e3d5ffd5b505050509392505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610626573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a91906124c4565b610652575f80fd5b6001600160f81b031982165f036106dc57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156106b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d491906124c4565b6106dc575f80fd5b604051630590734360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063059073439060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610767573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078b91906124c4565b610793575f80fd5b6040516309c00ffd60e11b815260048101839052605d906313801ffa906024015b602060405180830381865afa1580156107cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f391906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b15801561083f575f80fd5b505af1158015610851573d5f803e3d5ffd5b50505050919050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156108a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd91906124c4565b6108d5575f80fd5b6001600160f81b031982165f0361095f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610933573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095791906124c4565b61095f575f80fd5b604051631927108160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063192710819060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156109ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0e91906124c4565b610a16575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610a63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8791906124c4565b610a8f575f80fd5b604051632c7d67b760e01b815260048101859052602481018490526001600160f81b031983166044820152605d90632c7d67b79060640161052f565b604051633ef43c9560e11b81525f90605d90637de8792a90610af990889088903390899089906004016124fa565b602060405180830381865afa158015610b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3891906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015610b84575f80fd5b505af1158015610b96573d5f803e3d5ffd5b50505050949350505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1591906124c4565b610c1d575f80fd5b6040516336cdd31b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906336cdd31b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccc91906124c4565b610cd4575f80fd5b6001600160f81b031982165f03610d5e57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5691906124c4565b610d5e575f80fd5b604051631f31e28560e11b815260048101859052602481018490526001600160f81b031983166044820152605d90633e63c50a9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0d91906124c4565b610e15575f80fd5b6001600160f81b031982165f03610e9f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610e73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9791906124c4565b610e9f575f80fd5b60405163112ba71760e21b815260048101859052602481018490526001600160f81b031983166044820152605d906344ae9c5c9060640161052f565b604051632fd514cd60e11b8152600481018390523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610f2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4e91906124c4565b610f56575f80fd5b60405163025f346960e51b8152600481018490526001600160f81b031983166024820152605d90634be68d20906044015b602060405180830381865afa158015610fa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc691906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015611012575f80fd5b505af1158015611024573d5f803e3d5ffd5b5050505092915050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a191906124c4565b6110a9575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156110f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a91906124c4565b611122575f80fd5b604051630ccd46b160e31b815260048101859052602481018490526001600160f81b031983166044820152605d9063666a35889060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156111ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d191906124c4565b6111d9575f80fd5b6001600160f81b031982165f0361126357604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125b91906124c4565b611263575f80fd5b6040516334a6d7b960e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063694daf729060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156112ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131291906124c4565b61131a575f80fd5b6001600160f81b031982165f036113a457604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611378573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c91906124c4565b6113a4575f80fd5b604051630d7c62eb60e31b815260048101859052602481018490526001600160f81b031983166044820152605d90636be317589060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561142f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145391906124c4565b61145b575f80fd5b6001600160f81b031982165f036114e557604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156114b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114dd91906124c4565b6114e5575f80fd5b60405163816d57d360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063816d57d39060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611570573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159491906124c4565b61159c575f80fd5b6001600160f81b031982165f0361162657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156115fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906124c4565b611626575f80fd5b6040516389a4314b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906389a4314b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156116b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d591906124c4565b6116dd575f80fd5b6001600160f81b031982165f0361176757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561173b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175f91906124c4565b611767575f80fd5b604051638c14cc2160e01b815260048101859052602481018490526001600160f81b031983166044820152605d90638c14cc219060640161052f565b604051635966f2b360e01b81526001600160f81b0319821660048201525f6024820181905290605d90635966f2b3906044016020604051808303815f875af11580156107cf573d5f803e3d5ffd5b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611840573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186491906124c4565b61186c575f80fd5b6001600160f81b031982165f036118f657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156118ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ee91906124c4565b6118f6575f80fd5b604051639675211f60e01b815260048101859052602481018490526001600160f81b031983166044820152605d90639675211f9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a591906124c4565b6119ad575f80fd5b6001600160f81b031982165f03611a3757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2f91906124c4565b611a37575f80fd5b60405163a86e9de560e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063a86e9de59060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae691906124c4565b611aee575f80fd5b6001600160f81b031982165f03611b7857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7091906124c4565b611b78575f80fd5b604051632a1f7ab160e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063a87deac49060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2791906124c4565b611c2f575f80fd5b60405163a8b42a8960e01b815260048101839052605d9063a8b42a89906024016107b4565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc791906124c4565b611ccf575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4091906124c4565b611d48575f80fd5b604051632fd514cd60e11b8152600481018390523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db991906124c4565b611dc1575f80fd5b60405163cb3b940760e01b8152600481018590526024810184905260448101839052605d9063cb3b94079060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6791906124c4565b611e6f575f80fd5b6040516370628b5760e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063e0c516ae9060640161052f565b604051631ce2e8d760e31b8152600481018390526001600160f81b0319821660248201525f90605d9063e71746b890604401610f87565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611f31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5591906124c4565b611f5d575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fce91906124c4565b611fd6575f80fd5b604051633b1015f760e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063ec4057dc9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015612061573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208591906124c4565b61208d575f80fd5b6001600160f81b031982165f0361211757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156120eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210f91906124c4565b612117575f80fd5b604051633bb860cf60e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063eee1833c9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156121a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121c691906124c4565b6121ce575f80fd5b6001600160f81b031982165f0361225857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561222c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225091906124c4565b612258575f80fd5b60405163f953e42760e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063f953e4279060640161052f565b604051636e76b8b960e11b8152600481018390526001600160f81b0319821660248201525f6044820181905290605d9063dced7172906064016020604051808303815f875af1158015610fa2573d5f803e3d5ffd5b80356001600160f81b031981168114612300575f80fd5b919050565b5f805f60608486031215612317575f80fd5b833592506020840135915061232e604085016122e9565b90509250925092565b5f60208284031215612347575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612375575f80fd5b84359350602085013573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b9250604085013567ffffffffffffffff808211156123bb575f80fd5b818701915087601f8301126123ce575f80fd5b8135818111156123e0576123e061234e565b604051601f8201601f19908116603f011681019083821181831017156124085761240861234e565b816040528281528a6020848701011115612420575f80fd5b826020860160208301375f602084830101528096505050505050612446606086016122e9565b905092959194509250565b5f8060408385031215612462575f80fd5b82359150612472602084016122e9565b90509250929050565b5f6020828403121561248b575f80fd5b612494826122e9565b9392505050565b5f805f606084860312156124ad575f80fd5b505081359360208301359350604090920135919050565b5f602082840312156124d4575f80fd5b81518015158114612494575f80fd5b5f602082840312156124f3575f80fd5b5051919050565b8581525f602073ffffffffffffffffffffffffffffffffffffffff808816602085015280871660408501525060a0606084015284518060a08501525f5b818110156125535786810183015185820160c001528201612537565b505f60c0828601015260c0601f19601f8301168501019250505061258360808301846001600160f81b0319169052565b969550505050505056fe0000000000000000000000002fb4341027eb1d2ad8b5d9708187df8633cafa92a164736f6c6343000818000a", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c8063816d57d3116100fe578063a8b42a891161009e578063ec4057dc1161006e578063ec4057dc146103a6578063eee1833c146103b9578063f953e427146103cc578063fa33b7af146103df575f80fd5b8063a8b42a891461035a578063cb3b94071461036d578063e0c516ae14610380578063e71746b814610393575f80fd5b8063900d294e116100d9578063900d294e1461030e5780639675211f14610321578063a86e9de514610334578063a87deac414610347575f80fd5b8063816d57d3146102d557806389a4314b146102e85780638c14cc21146102fb575f80fd5b806336cdd31b116101695780634be68d20116101445780634be68d2014610289578063666a35881461029c578063694daf72146102af5780636be31758146102c2575f80fd5b806336cdd31b146102505780633e63c50a1461026357806344ae9c5c14610276575f80fd5b806319271081116101a457806319271081146102155780632c7d67b7146102285780632e817ff01461023b57806335334c231461024e575f80fd5b8063052896f1146101ca57806305907343146101ef57806313801ffa14610202575b5f80fd5b6101dd6101d8366004612305565b6103f2565b60405190815260200160405180910390f35b6101dd6101fd366004612305565b6105d7565b6101dd610210366004612337565b610718565b6101dd610223366004612305565b61085a565b6101dd610236366004612305565b61099b565b6101dd610249366004612362565b610acb565b005b6101dd61025e366004612305565b610ba2565b6101dd610271366004612305565b610c59565b6101dd610284366004612305565b610d9a565b6101dd610297366004612451565b610edb565b6101dd6102aa366004612305565b61102e565b6101dd6102bd366004612305565b61115e565b6101dd6102d0366004612305565b61129f565b6101dd6102e3366004612305565b6113e0565b6101dd6102f6366004612305565b611521565b6101dd610309366004612305565b611662565b6101dd61031c36600461247b565b6117a3565b6101dd61032f366004612305565b6117f1565b6101dd610342366004612305565b611932565b6101dd610355366004612305565b611a73565b6101dd610368366004612337565b611bb4565b6101dd61037b36600461249b565b611c54565b6101dd61038e366004612305565b611df4565b6101dd6103a1366004612451565b611eab565b6101dd6103b4366004612305565b611ee2565b6101dd6103c7366004612305565b612012565b6101dd6103da366004612305565b612153565b6101dd6103ed366004612451565b612294565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610441573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046591906124c4565b61046d575f80fd5b6001600160f81b031982165f036104f757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156104cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ef91906124c4565b6104f7575f80fd5b60405163052896f160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063052896f1906064015b602060405180830381865afa15801561054a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056e91906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b1580156105ba575f80fd5b505af11580156105cc573d5f803e3d5ffd5b505050509392505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610626573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a91906124c4565b610652575f80fd5b6001600160f81b031982165f036106dc57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156106b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d491906124c4565b6106dc575f80fd5b604051630590734360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063059073439060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610767573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078b91906124c4565b610793575f80fd5b6040516309c00ffd60e11b815260048101839052605d906313801ffa906024015b602060405180830381865afa1580156107cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f391906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b15801561083f575f80fd5b505af1158015610851573d5f803e3d5ffd5b50505050919050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156108a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd91906124c4565b6108d5575f80fd5b6001600160f81b031982165f0361095f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610933573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095791906124c4565b61095f575f80fd5b604051631927108160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063192710819060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156109ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0e91906124c4565b610a16575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610a63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8791906124c4565b610a8f575f80fd5b604051632c7d67b760e01b815260048101859052602481018490526001600160f81b031983166044820152605d90632c7d67b79060640161052f565b604051633ef43c9560e11b81525f90605d90637de8792a90610af990889088903390899089906004016124fa565b602060405180830381865afa158015610b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3891906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015610b84575f80fd5b505af1158015610b96573d5f803e3d5ffd5b50505050949350505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1591906124c4565b610c1d575f80fd5b6040516336cdd31b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906336cdd31b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccc91906124c4565b610cd4575f80fd5b6001600160f81b031982165f03610d5e57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5691906124c4565b610d5e575f80fd5b604051631f31e28560e11b815260048101859052602481018490526001600160f81b031983166044820152605d90633e63c50a9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0d91906124c4565b610e15575f80fd5b6001600160f81b031982165f03610e9f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610e73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9791906124c4565b610e9f575f80fd5b60405163112ba71760e21b815260048101859052602481018490526001600160f81b031983166044820152605d906344ae9c5c9060640161052f565b604051632fd514cd60e11b8152600481018390523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610f2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4e91906124c4565b610f56575f80fd5b60405163025f346960e51b8152600481018490526001600160f81b031983166024820152605d90634be68d20906044015b602060405180830381865afa158015610fa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc691906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015611012575f80fd5b505af1158015611024573d5f803e3d5ffd5b5050505092915050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a191906124c4565b6110a9575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156110f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a91906124c4565b611122575f80fd5b604051630ccd46b160e31b815260048101859052602481018490526001600160f81b031983166044820152605d9063666a35889060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156111ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d191906124c4565b6111d9575f80fd5b6001600160f81b031982165f0361126357604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125b91906124c4565b611263575f80fd5b6040516334a6d7b960e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063694daf729060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156112ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131291906124c4565b61131a575f80fd5b6001600160f81b031982165f036113a457604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611378573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c91906124c4565b6113a4575f80fd5b604051630d7c62eb60e31b815260048101859052602481018490526001600160f81b031983166044820152605d90636be317589060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561142f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145391906124c4565b61145b575f80fd5b6001600160f81b031982165f036114e557604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156114b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114dd91906124c4565b6114e5575f80fd5b60405163816d57d360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063816d57d39060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611570573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159491906124c4565b61159c575f80fd5b6001600160f81b031982165f0361162657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156115fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906124c4565b611626575f80fd5b6040516389a4314b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906389a4314b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156116b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d591906124c4565b6116dd575f80fd5b6001600160f81b031982165f0361176757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561173b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175f91906124c4565b611767575f80fd5b604051638c14cc2160e01b815260048101859052602481018490526001600160f81b031983166044820152605d90638c14cc219060640161052f565b604051635966f2b360e01b81526001600160f81b0319821660048201525f6024820181905290605d90635966f2b3906044016020604051808303815f875af11580156107cf573d5f803e3d5ffd5b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611840573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186491906124c4565b61186c575f80fd5b6001600160f81b031982165f036118f657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156118ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ee91906124c4565b6118f6575f80fd5b604051639675211f60e01b815260048101859052602481018490526001600160f81b031983166044820152605d90639675211f9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a591906124c4565b6119ad575f80fd5b6001600160f81b031982165f03611a3757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2f91906124c4565b611a37575f80fd5b60405163a86e9de560e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063a86e9de59060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae691906124c4565b611aee575f80fd5b6001600160f81b031982165f03611b7857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7091906124c4565b611b78575f80fd5b604051632a1f7ab160e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063a87deac49060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2791906124c4565b611c2f575f80fd5b60405163a8b42a8960e01b815260048101839052605d9063a8b42a89906024016107b4565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc791906124c4565b611ccf575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4091906124c4565b611d48575f80fd5b604051632fd514cd60e11b8152600481018390523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db991906124c4565b611dc1575f80fd5b60405163cb3b940760e01b8152600481018590526024810184905260448101839052605d9063cb3b94079060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6791906124c4565b611e6f575f80fd5b6040516370628b5760e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063e0c516ae9060640161052f565b604051631ce2e8d760e31b8152600481018390526001600160f81b0319821660248201525f90605d9063e71746b890604401610f87565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611f31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5591906124c4565b611f5d575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fce91906124c4565b611fd6575f80fd5b604051633b1015f760e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063ec4057dc9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015612061573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208591906124c4565b61208d575f80fd5b6001600160f81b031982165f0361211757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156120eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210f91906124c4565b612117575f80fd5b604051633bb860cf60e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063eee1833c9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156121a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121c691906124c4565b6121ce575f80fd5b6001600160f81b031982165f0361225857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561222c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225091906124c4565b612258575f80fd5b60405163f953e42760e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063f953e4279060640161052f565b604051636e76b8b960e11b8152600481018390526001600160f81b0319821660248201525f6044820181905290605d9063dced7172906064016020604051808303815f875af1158015610fa2573d5f803e3d5ffd5b80356001600160f81b031981168114612300575f80fd5b919050565b5f805f60608486031215612317575f80fd5b833592506020840135915061232e604085016122e9565b90509250925092565b5f60208284031215612347575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612375575f80fd5b84359350602085013573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b9250604085013567ffffffffffffffff808211156123bb575f80fd5b818701915087601f8301126123ce575f80fd5b8135818111156123e0576123e061234e565b604051601f8201601f19908116603f011681019083821181831017156124085761240861234e565b816040528281528a6020848701011115612420575f80fd5b826020860160208301375f602084830101528096505050505050612446606086016122e9565b905092959194509250565b5f8060408385031215612462575f80fd5b82359150612472602084016122e9565b90509250929050565b5f6020828403121561248b575f80fd5b612494826122e9565b9392505050565b5f805f606084860312156124ad575f80fd5b505081359360208301359350604090920135919050565b5f602082840312156124d4575f80fd5b81518015158114612494575f80fd5b5f602082840312156124f3575f80fd5b5051919050565b8581525f602073ffffffffffffffffffffffffffffffffffffffff808816602085015280871660408501525060a0606084015284518060a08501525f5b818110156125535786810183015185820160c001528201612537565b505f60c0828601015260c0601f19601f8301168501019250505061258360808301846001600160f81b0319169052565b969550505050505056fe0000000000000000000000002fb4341027eb1d2ad8b5d9708187df8633cafa92a164736f6c6343000818000a", - "linkReferences": {}, - "deployedLinkReferences": {} -}