From f79465ed9a1fcef37f707b176c87fcd7e520482d Mon Sep 17 00:00:00 2001 From: wrap-that-potassium Date: Wed, 31 May 2023 15:53:20 +0200 Subject: [PATCH] Banano support --- README.md | 1 + src/__tests__/index.test.ts | 14 ++++++++++++++ src/index.ts | 17 +++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/README.md b/README.md index 453b0d53..c3aa6ed4 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ This library currently supports the following cryptocurrencies and address forma - ATOM (bech32) - AVAX (bech32) - AVAXC (checksummed-hex) +- BANANO (banano-base32) - BCD (base58check P2PKH and P2SH, and bech32 segwit) - BCH (base58check and cashAddr; decodes to cashAddr) - BCN (base58xmr) diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index 99cb1dc6..25b67aeb 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -441,6 +441,20 @@ const vectors: Array = [ { text: 'TJCnKsPa7y5okkXvQAidZBzqx3QyQ6sxMW', hex: '415a523b449890854c8fc460ab602df9f31fe4293f' }, ], }, + { + name: 'BAN', + coinType: 198, + passingVectors: [ + { + text: 'ban_15dng9kx49xfumkm4q6qpaxneie6oynebiwpums3ktdd6t3f3dhp69nxgb38', + hex: '0d7471e5d11faddce5315c97b23b464184afa8c4c396dcf219696b2682d0adf6' + }, + { + text: 'ban_1anrzcuwe64rwxzcco8dkhpyxpi8kd7zsjc1oeimpc3ppca4mrjtwnqposrs', + hex: '2298fab7c61058e77ea554cb93edeeda0692cbfcc540ab213b2836b29029e23a' + } + ], + }, { name: 'BCN', coinType: 204, diff --git a/src/index.ts b/src/index.ts index cd566be8..30b84576 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1261,6 +1261,22 @@ function nanoAddressDecoder(data: string): Buffer { return Buffer.from(decoded).slice(0, -5); } +function bananoAddressEncoder(data: Buffer): string { + const encoded = nanoBase32Encode(Uint8Array.from(data)); + const checksum = blake2b(Uint8Array.from(data), null, 5).reverse(); + const checksumEncoded = nanoBase32Encode(checksum); + + const address = `ban_${encoded}${checksumEncoded}`; + + return address; +} + +function bananoAddressDecoder(data: string): Buffer { + const decoded = nanoBase32Decode(data.slice(4)); + + return Buffer.from(decoded).slice(0, -5); +} + function etnAddressEncoder(data: Buffer): string { const buf = Buffer.concat([Buffer.from([18]), data]); @@ -1507,6 +1523,7 @@ export const formats: IFormat[] = [ bitcoinChain('LCC', 192, 'lcc', [[0x1c]], [[0x32], [0x05]]), eosioChain('EOS', 194, 'EOS'), getConfig('TRX', 195, bs58Encode, bs58Decode), + getConfig('BAN', 198, bananoAddressEncoder, bananoAddressDecoder), getConfig('BCN', 204, bcnAddressEncoder, bcnAddressDecoder), eosioChain('FIO', 235, 'FIO'), getConfig('BSV', 236, bsvAddresEncoder, bsvAddressDecoder),