@polygon-hermez/vm
Version:
An Ethereum VM implementation
30 lines • 1.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ethereumjs_util_1 = require("ethereumjs-util");
const evm_1 = require("../evm");
const assert = require('assert');
const bn128 = require('rustbn.js');
function default_1(opts) {
assert(opts.data);
const inputData = opts.data;
// no need to care about non-divisible-by-192, because bn128.pairing will properly fail in that case
const inputDataSize = Math.floor(inputData.length / 192);
const gasUsed = new ethereumjs_util_1.BN(opts._common.param('gasPrices', 'ecPairing') +
inputDataSize * opts._common.param('gasPrices', 'ecPairingWord'));
if (opts.gasLimit.lt(gasUsed)) {
return (0, evm_1.OOGResult)(opts.gasLimit);
}
const returnData = bn128.pairing(inputData);
// Reduce counters
opts._VM.vcm.computeFunctionCounters('preECPairing', { inputsCount: inputDataSize });
// check ecpairing success or failure by comparing the output length
if (returnData.length !== 32) {
return (0, evm_1.OOGResult)(opts.gasLimit);
}
return {
gasUsed,
returnValue: returnData,
};
}
exports.default = default_1;
//# sourceMappingURL=08-ecpairing.js.map