From 20bd34b0147e0dcbd039523487035d43823ac267 Mon Sep 17 00:00:00 2001 From: Dave Puchyr Date: Thu, 25 Feb 2021 15:51:45 +0100 Subject: [PATCH] Add Starname (IOV) support --- src/js/cosmos-util.js | 8 ++++---- src/js/index.js | 26 ++++++++++++++++++++------ tests/spec/tests.js | 10 ++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/js/cosmos-util.js b/src/js/cosmos-util.js index a7f4605..e3a0ddf 100644 --- a/src/js/cosmos-util.js +++ b/src/js/cosmos-util.js @@ -1,13 +1,13 @@ -function CosmosBufferToPublic(pubBuf) { +function CosmosBufferToPublic(pubBuf, hrp = "cosmos") { const Buffer = libs.buffer.Buffer; const AminoSecp256k1PubkeyPrefix = Buffer.from("EB5AE987", "hex"); const AminoSecp256k1PubkeyLength = Buffer.from("21", "hex"); pubBuf = Buffer.concat([AminoSecp256k1PubkeyPrefix, AminoSecp256k1PubkeyLength, pubBuf]); - return libs.bech32.encode("cosmospub", libs.bech32.toWords(pubBuf)); + return libs.bech32.encode(`${hrp}pub`, libs.bech32.toWords(pubBuf)); } -function CosmosBufferToAddress(pubBuf) { +function CosmosBufferToAddress(pubBuf, hrp = "cosmos") { const sha256_ed = libs.createHash("sha256").update(pubBuf).digest(); const ripemd160_ed = libs.createHash("rmd160").update(sha256_ed).digest(); - return libs.bech32.encode("cosmos", libs.bech32.toWords(ripemd160_ed)); + return libs.bech32.encode(hrp, libs.bech32.toWords(ripemd160_ed)); } diff --git a/src/js/index.js b/src/js/index.js index c502208..0bc2506 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -1350,21 +1350,21 @@ } // ZooBC address format may vary - if (networks[DOM.network.val()].name == "ZBC - ZooBlockchain") { - + if (networks[DOM.network.val()].name == "ZBC - ZooBlockchain") { + var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); var path = "m/"; path += purpose + "'/"; path += coin + "'/" + index + "'"; var result = libs.zoobcUtil.getKeypair(path, seed); - + let publicKey = result.pubKey.slice(1, 33); let privateKey = result.key; - + privkey = privateKey.toString('hex'); pubkey = publicKey.toString('hex'); - + indexText = path; address = libs.zoobcUtil.getZBCAddress(publicKey, 'ZBC'); } @@ -1425,7 +1425,14 @@ privkey = keyPair.d.toBuffer().toString("base64"); } - //Groestlcoin Addresses are different + if (networks[DOM.network.val()].name == "IOV - Starname") { + const hrp = "star"; + address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp); + pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer(), hrp); + privkey = keyPair.d.toBuffer().toString("base64"); + } + + //Groestlcoin Addresses are different if(isGRS()) { if (isSegwit) { @@ -2851,6 +2858,13 @@ }, }, { + name: "IOV - Starname", + onSelect: function() { + network = libs.bitcoin.networks.bitcoin; + setHdCoin(234); + }, + }, + { name: "IXC - Ixcoin", onSelect: function() { network = libs.bitcoin.networks.ixcoin; diff --git a/tests/spec/tests.js b/tests/spec/tests.js index 257cd7b..e33d618 100644 --- a/tests/spec/tests.js +++ b/tests/spec/tests.js @@ -1355,6 +1355,16 @@ it('Allows selection of Iop', function(done) { }; testNetwork(done, params); }); +it('Allows selection of Starname', function(done) { + var params = { + selectText: "IOV - Starname", + phrase: "abandon abandon ability", + firstAddress: "star1xgfvgq40r7ff8ylw9l95dw56xnr0pvtjnlp7h4", + firstPubKey: "starpub1addwnpepqg9x5cft48hcgx25vyzeyygntl7pt763datr6v50hrecafyane54xlqdxkd", + firstPrivKey: "bGI4BNRvMYT1lbCOoH000HvNFPkyXms9n3Xp1X/7E80=", + }; + testNetwork(done, params); +}); it('Allows selection of Ixcoin', function(done) { var params = { selectText: "IXC - Ixcoin",