web3x
Version:
Typescript port of web3.js
74 lines (71 loc) • 9.06 kB
JavaScript
;
/*
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ldGgtbGliL2FjY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7RUFlRTs7O0FBRUYsNERBQTRCO0FBQzVCLHdEQUF3QjtBQUN4QixnRUFBZ0M7QUFDaEMsaUNBQStDO0FBRS9DLE1BQU0sU0FBUyxHQUFHLElBQUksa0JBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFbEMsUUFBQSxNQUFNLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtJQUN4QyxNQUFNLFFBQVEsR0FBRyxnQkFBUyxDQUFDLGVBQUssQ0FBQyxNQUFNLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxlQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRyxNQUFNLFNBQVMsR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDLGVBQUssQ0FBQyxNQUFNLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxRQUFRLEdBQUcsZ0JBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxPQUFPLG1CQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQyxDQUFDO0FBRVcsUUFBQSxVQUFVLEdBQUcsT0FBTyxDQUFDLEVBQUU7SUFDbEMsTUFBTSxXQUFXLEdBQUcsaUJBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3pCLGVBQWUsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUcsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBRVcsUUFBQSxXQUFXLEdBQUcsQ0FBQyxVQUFrQixFQUFFLEVBQUU7SUFDaEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLGdCQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sT0FBTyxHQUFHLGtCQUFVLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE9BQU87UUFDTCxPQUFPO1FBQ1AsVUFBVTtRQUNWLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRVcsUUFBQSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxlQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXhGLFFBQUEsZUFBZSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQztJQUM5QyxlQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQztJQUN2QyxlQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0lBQ3ZCLGVBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDekIsQ0FBQztBQUVXLFFBQUEsVUFBVSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBa0IsRUFBRSxFQUFFO0lBQy9ELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BILE9BQU8sdUJBQWUsQ0FBQztRQUNyQixhQUFHLENBQUMsVUFBVSxDQUFDLGVBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRSxlQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxlQUFLLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdELGVBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGVBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDOUQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRVcsUUFBQSxJQUFJLEdBQUcsa0JBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtBQUVuRCxRQUFBLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRTtJQUN6QyxNQUFNLElBQUksR0FBRyx1QkFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLGVBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQ2pDLEdBQUcsRUFDSCxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDcEMsQ0FBQyxDQUFDLDZFQUE2RTtJQUNoRixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sVUFBVSxHQUFHLGdCQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsa0JBQVUsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsa0JBQWUsRUFBRSxNQUFNLEVBQU4sY0FBTSxFQUFFLFVBQVUsRUFBVixrQkFBVSxFQUFFLFdBQVcsRUFBWCxtQkFBVyxFQUFFLElBQUksRUFBSixZQUFJLEVBQUUsVUFBVSxFQUFWLGtCQUFVLEVBQUUsT0FBTyxFQUFQLGVBQU8sRUFBRSxlQUFlLEVBQWYsdUJBQWUsRUFBRSxlQUFlLEVBQWYsdUJBQWUsRUFBRSxDQUFDIn0=