mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-28 05:10:41 +00:00
fix: calculate RSK addresses with EIP-155 compliant checksums
This commit is contained in:
@@ -1140,6 +1140,34 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RSK values are different
|
||||||
|
if (networkIsRsk()) {
|
||||||
|
var pubkeyBuffer = keyPair.getPublicKeyBuffer();
|
||||||
|
var ethPubkey = libs.ethUtil.importPublic(pubkeyBuffer);
|
||||||
|
var addressBuffer = libs.ethUtil.publicToAddress(ethPubkey);
|
||||||
|
var hexAddress = addressBuffer.toString('hex');
|
||||||
|
// Use chainId based on selected network
|
||||||
|
// Ref: https://developers.rsk.co/rsk/architecture/account-based/#chainid
|
||||||
|
var chainId;
|
||||||
|
var rskNetworkName = networks[DOM.network.val()].name;
|
||||||
|
switch (rskNetworkName) {
|
||||||
|
case "R-BTC - RSK":
|
||||||
|
chainId = 30;
|
||||||
|
break;
|
||||||
|
case "tR-BTC - RSK Testnet":
|
||||||
|
chainId = 31;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
chainId = null;
|
||||||
|
}
|
||||||
|
var checksumAddress = toChecksumAddressForRsk(hexAddress, chainId);
|
||||||
|
address = libs.ethUtil.addHexPrefix(checksumAddress);
|
||||||
|
pubkey = libs.ethUtil.addHexPrefix(pubkey);
|
||||||
|
if (hasPrivkey) {
|
||||||
|
privkey = libs.ethUtil.bufferToHex(keyPair.d.toBuffer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Stellar is different
|
// Stellar is different
|
||||||
if (networks[DOM.network.val()].name == "XLM - Stellar") {
|
if (networks[DOM.network.val()].name == "XLM - Stellar") {
|
||||||
var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44);
|
var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44);
|
||||||
@@ -1849,6 +1877,12 @@
|
|||||||
|| (name == "ERE - EtherCore")
|
|| (name == "ERE - EtherCore")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function networkIsRsk() {
|
||||||
|
var name = networks[DOM.network.val()].name;
|
||||||
|
return (name == "R-BTC - RSK")
|
||||||
|
|| (name == "tR-BTC - RSK Testnet");
|
||||||
|
}
|
||||||
|
|
||||||
function networkHasSegwit() {
|
function networkHasSegwit() {
|
||||||
var n = network;
|
var n = network;
|
||||||
if ("baseNetwork" in network) {
|
if ("baseNetwork" in network) {
|
||||||
@@ -3349,6 +3383,46 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
// RSK - RSK functions - begin
|
||||||
|
function stripHexPrefix(address) {
|
||||||
|
if (typeof address !== "string") {
|
||||||
|
throw new Error("address parameter should be a string.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasPrefix = (address.substring(0, 2) === "0x" ||
|
||||||
|
address.substring(0, 2) === "0X");
|
||||||
|
|
||||||
|
return hasPrefix ? address.slice(2) : address;
|
||||||
|
};
|
||||||
|
|
||||||
|
function toChecksumAddressForRsk(address, chainId = null) {
|
||||||
|
if (typeof address !== "string") {
|
||||||
|
throw new Error("address parameter should be a string.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) {
|
||||||
|
throw new Error("Given address is not a valid RSK address: " + address);
|
||||||
|
}
|
||||||
|
|
||||||
|
var stripAddress = stripHexPrefix(address).toLowerCase();
|
||||||
|
var prefix = chainId != null ? chainId.toString() + "0x" : "";
|
||||||
|
var keccakHash = libs.ethUtil.keccak256(prefix + stripAddress)
|
||||||
|
.toString("hex")
|
||||||
|
.replace(/^0x/i, "");
|
||||||
|
var checksumAddress = "0x";
|
||||||
|
|
||||||
|
for (var i = 0; i < stripAddress.length; i++) {
|
||||||
|
checksumAddress +=
|
||||||
|
parseInt(keccakHash[i], 16) >= 8 ?
|
||||||
|
stripAddress[i].toUpperCase() :
|
||||||
|
stripAddress[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return checksumAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RSK - RSK functions - end
|
||||||
|
|
||||||
// ELA - Elastos functions - begin
|
// ELA - Elastos functions - begin
|
||||||
function displayBip44InfoForELA() {
|
function displayBip44InfoForELA() {
|
||||||
if (!isELA()) {
|
if (!isELA()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user