From d9ad938b521ad316f5fb6a80f260b77b80a0e864 Mon Sep 17 00:00:00 2001 From: Ian Coleman Date: Thu, 11 Feb 2021 02:13:23 +0000 Subject: [PATCH] Add Cosmos Hub (ATOM) support Closes #452, thanks @conr2d --- libs/combined/index.js | 4 ++++ libs/combined/package.json | 1 + src/index.html | 1 + src/js/cosmos-util.js | 13 +++++++++++++ src/js/index.js | 13 +++++++++++++ tests/spec/tests.js | 10 ++++++++++ 6 files changed, 42 insertions(+) create mode 100644 src/js/cosmos-util.js diff --git a/libs/combined/index.js b/libs/combined/index.js index d3bc7a5..b020f59 100644 --- a/libs/combined/index.js +++ b/libs/combined/index.js @@ -14,6 +14,10 @@ module.exports.bchaddr = require('bchaddrjs') module.exports.bchaddrSlp = require('bchaddrjs-slp') +/* bech32 */ + +module.exports.bech32 = require('bech32') + /* biginteger */ module.exports.BigInteger = require('javascript-biginteger') diff --git a/libs/combined/package.json b/libs/combined/package.json index 5b47f74..ed60059 100644 --- a/libs/combined/package.json +++ b/libs/combined/package.json @@ -8,6 +8,7 @@ "base-x": "3.0.7", "bchaddrjs": "0.4.4", "bchaddrjs-slp": "git://github.com/simpleledger/bchaddrjs.git#af16e44a6bfbe4b3980a62dba50e2f68ed864c6b", + "bech32": "1.1.4", "bip38": "2.0.2", "bip38grs": "git://github.com/Groestlcoin/bip38grs.git#091975b01679b74dc0a4136bb743fe17791b0151", "bip85": "0.0.3", diff --git a/src/index.html b/src/index.html index 4b61424..34b43ec 100644 --- a/src/index.html +++ b/src/index.html @@ -1101,6 +1101,7 @@ + diff --git a/src/js/cosmos-util.js b/src/js/cosmos-util.js new file mode 100644 index 0000000..a7f4605 --- /dev/null +++ b/src/js/cosmos-util.js @@ -0,0 +1,13 @@ +function CosmosBufferToPublic(pubBuf) { + 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)); +} + +function CosmosBufferToAddress(pubBuf) { + 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)); +} diff --git a/src/js/index.js b/src/js/index.js index 713b5e8..96fc451 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -1419,6 +1419,12 @@ privkey = FIObufferToPrivate(keyPair.d.toBuffer(32)); } + if (networks[DOM.network.val()].name == "ATOM - Cosmos Hub") { + address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer()); + pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer()); + privkey = keyPair.d.toBuffer().toString("base64"); + } + //Groestlcoin Addresses are different if(isGRS()) { @@ -2234,6 +2240,13 @@ setHdCoin(357); }, }, + { + name: "ATOM - Cosmos Hub", + onSelect: function() { + network = libs.bitcoin.networks.bitcoin; + setHdCoin(118); + }, + }, { name: "AUR - Auroracoin", onSelect: function() { diff --git a/tests/spec/tests.js b/tests/spec/tests.js index f350fa7..7e553af 100644 --- a/tests/spec/tests.js +++ b/tests/spec/tests.js @@ -917,6 +917,16 @@ it('Allows selection of Aryacoin', function(done) { }; testNetwork(done, params); }); +it('Allows selection of Cosmos Hub', function(done) { + var params = { + selectText: "ATOM - Cosmos Hub", + phrase: "abandon abandon ability", + firstAddress: "cosmos17mkch9syem8gtf6wh7p38thdgav6dwezpkylny", + firstPubKey: "cosmospub1addwnpepq0sgn66ty4suk5vx3hsmxxqd5z3amegqwlu59funrzyz5u8r9758qhl84ys", + firstPrivKey: "zUnETPxmE2vkHzLHTAlO9wg8PL/GEEBc1I4yVwvSV8M=", + }; + testNetwork(done, params); +}); it('Allows selection of Auroracoin', function(done) { var params = { selectText: "AUR - Auroracoin", -- 2.41.0