UNPKG

@pharosnames/address-encoder

Version:

Encodes and decodes address formats for various cryptocurrencies with Pharos network support

56 lines 1.96 kB
import { blake2b } from "@noble/hashes/blake2b"; import { utils } from "@scure/base"; const name = "nano"; const coinType = 165; const convertRadixNano = (data, from, to) => { const leftover = (data.length * from) % to; const offset = leftover === 0 ? 0 : to - leftover; let carry = 0; let pos = 0; const mask = 2 ** to - 1; const res = []; for (let i = 0; i < data.length; i++) { const n = data[i]; if (n >= 2 ** from) throw new Error(`convertRadixNano: invalid data word=${n} from=${from}`); carry = (carry << from) | n; if (pos + from > 32) throw new Error(`convertRadixNano: carry overflow pos=${pos} from=${from}`); pos += from; for (; pos >= to; pos -= to) { res.push((carry >>> (pos + offset - to)) & mask); } } carry = (carry << (to - (pos + offset))) & mask; if (pos > 0) res.push(carry >>> 0); return res; }; const radixNano = { encode: (source) => convertRadixNano(source, 8, 5), decode: (source) => { const leftover = (source.length * 5) % 8; let result = convertRadixNano(source, 5, 8); if (leftover !== 0) result = result.slice(1); return Uint8Array.from(result); }, }; const base32Nano = utils.chain(radixNano, utils.alphabet("13456789abcdefghijkmnopqrstuwxyz"), utils.join("")); export const encodeNanoAddress = (source) => { const encoded = base32Nano.encode(source); const checksum = blake2b(source, { dkLen: 5 }).reverse(); const checksumEncoded = base32Nano.encode(checksum); return `nano_${encoded}${checksumEncoded}`; }; export const decodeNanoAddress = (source) => { const decoded = base32Nano.decode(source.slice(5)); return Uint8Array.from(decoded.slice(0, -5)); }; export const nano = { name, coinType, encode: encodeNanoAddress, decode: decodeNanoAddress, }; //# sourceMappingURL=nano.js.map