UNPKG

web3x

Version:

Typescript port of web3.js

74 lines (71 loc) 9.06 kB
"use strict"; /* This file is part of web3x. web3x is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. web3x is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with web3x. If not, see <http://www.gnu.org/licenses/>. */ Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const bytes_1 = tslib_1.__importDefault(require("./bytes")); const nat_1 = tslib_1.__importDefault(require("./nat")); const elliptic_1 = tslib_1.__importDefault(require("elliptic")); const hash_1 = require("./hash"); const secp256k1 = new elliptic_1.default.ec('secp256k1'); exports.create = (entropy) => { const innerHex = hash_1.keccak256(bytes_1.default.concat(bytes_1.default.random(32), '0x' + entropy.toString('hex') || bytes_1.default.random(32))); const middleHex = bytes_1.default.concat(bytes_1.default.concat(bytes_1.default.random(32), innerHex), bytes_1.default.random(32)); const outerHex = hash_1.keccak256(middleHex); return exports.fromPrivate(Buffer.from(outerHex.slice(2), 'hex')); }; exports.toChecksum = address => { const addressHash = hash_1.keccak256s(address.slice(2)); let checksumAddress = '0x'; for (let i = 0; i < 40; i++) checksumAddress += parseInt(addressHash[i + 2], 16) > 7 ? address[i + 2].toUpperCase() : address[i + 2]; return checksumAddress; }; exports.fromPrivate = (privateKey) => { const ecKey = secp256k1.keyFromPrivate(privateKey); const publicKey = Buffer.from(ecKey.getPublic(false, 'hex'), 'hex'); const publicHash = hash_1.keccak256(publicKey.slice(1)); const address = exports.toChecksum('0x' + publicHash.slice(-40)); return { address, privateKey, publicKey, }; }; exports.encodeSignature = ([v, r, s]) => bytes_1.default.flatten([bytes_1.default.pad(32, r), bytes_1.default.pad(32, s), v]); exports.decodeSignature = (hex) => [ bytes_1.default.slice(64, bytes_1.default.length(hex), hex), bytes_1.default.slice(0, 32, hex), bytes_1.default.slice(32, 64, hex), ]; exports.makeSigner = addToV => (hash, privateKey) => { const signature = secp256k1.keyFromPrivate(privateKey).sign(Buffer.from(hash.slice(2), 'hex'), { canonical: true }); return exports.encodeSignature([ nat_1.default.fromString(bytes_1.default.fromNumber(addToV + signature.recoveryParam)), bytes_1.default.pad(32, bytes_1.default.fromNat('0x' + signature.r.toString(16))), bytes_1.default.pad(32, bytes_1.default.fromNat('0x' + signature.s.toString(16))), ]); }; exports.sign = exports.makeSigner(27); // v=27|28 instead of 0|1... exports.recover = (hash, signature) => { const vals = exports.decodeSignature(signature); const vrs = { v: bytes_1.default.toNumber(vals[0]), r: vals[1].slice(2), s: vals[2].slice(2) }; const ecPublicKey = secp256k1.recoverPubKey(Buffer.from(hash.slice(2), 'hex'), vrs, vrs.v < 2 ? vrs.v : 1 - (vrs.v % 2)); // because odd vals mean v=0... sadly that means v=0 means v=1... I hate that const publicKey = '0x' + ecPublicKey.encode('hex', false).slice(2); const publicHash = hash_1.keccak256(publicKey); const address = exports.toChecksum('0x' + publicHash.slice(-40)); return address; }; exports.default = { create: exports.create, toChecksum: exports.toChecksum, fromPrivate: exports.fromPrivate, sign: exports.sign, makeSigner: exports.makeSigner, recover: exports.recover, encodeSignature: exports.encodeSignature, decodeSignature: exports.decodeSignature }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ldGgtbGliL2FjY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7RUFlRTs7O0FBRUYsNERBQTRCO0FBQzVCLHdEQUF3QjtBQUN4QixnRUFBZ0M7QUFDaEMsaUNBQStDO0FBRS9DLE1BQU0sU0FBUyxHQUFHLElBQUksa0JBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFbEMsUUFBQSxNQUFNLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtJQUN4QyxNQUFNLFFBQVEsR0FBRyxnQkFBUyxDQUFDLGVBQUssQ0FBQyxNQUFNLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxlQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRyxNQUFNLFNBQVMsR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDLGVBQUssQ0FBQyxNQUFNLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxRQUFRLEdBQUcsZ0JBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxPQUFPLG1CQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQyxDQUFDO0FBRVcsUUFBQSxVQUFVLEdBQUcsT0FBTyxDQUFDLEVBQUU7SUFDbEMsTUFBTSxXQUFXLEdBQUcsaUJBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsSUFB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