rchain-toolkit
Version:
Node JS utils and methods to interact with rchain's rnode api and proto interfaces
37 lines (36 loc) • 1.9 kB
JavaScript
;
exports.__esModule = true;
exports.revAddressFromPublicKey = void 0;
var keccak256 = require("keccak256");
var blakejs_1 = require("blakejs");
var base58 = require("../base58");
var ethAddressFromPublicKey_1 = require("./ethAddressFromPublicKey");
var bytesFromHex_1 = require("./bytesFromHex");
var toBase58 = function (hexStr) {
var bytes = (0, bytesFromHex_1.bytesFromHex)(hexStr);
return base58.encode(bytes);
};
// Address and public key
// Algorithm to generate ETH and REV address is taken from RNode source
// https://github.com/rchain/rchain/blob/bf7a30e1d388d46aa9e5f4b8c04089fc8e31d771/rholang/src/main/scala/coop/rchain/rholang/interpreter/util/AddressTools.scala#L47
// Prefix as defined in https://github.com/rchain/rchain/blob/c6721a6/rholang/src/main/scala/coop/rchain/rholang/interpreter/util/RevAddress.scala#L13
var prefix = { coinId: "000000", version: "00" };
var getAddrFromEth = function (ethAddr) {
if (!ethAddr || ethAddr.length !== 40) {
throw new Error("ETH address must contain 130 characters");
}
// Hash ETH address
var ethAddrBytes = (0, bytesFromHex_1.bytesFromHex)(ethAddr);
var ethHash = keccak256(Buffer.from(ethAddrBytes)).toString("hex");
// Add prefix with hash and calculate checksum (blake2b-256 hash)
var payload = "".concat(prefix.coinId).concat(prefix.version).concat(ethHash);
var payloadBytes = (0, bytesFromHex_1.bytesFromHex)(payload);
var checksum = (0, blakejs_1.blake2bHex)(payloadBytes, void 666, 32).slice(0, 8);
// Return REV address
return toBase58("".concat(payload).concat(checksum));
};
var revAddressFromPublicKey = function (publicKey) {
var ethAddressWithoutPrefix = (0, ethAddressFromPublicKey_1.ethAddressFromPublicKey)(publicKey).slice(2);
return getAddrFromEth(ethAddressWithoutPrefix);
};
exports.revAddressFromPublicKey = revAddressFromPublicKey;