Giter VIP home page Giter VIP logo

bchaddrjs's Introduction

BchAddr.js: Bitcoin Cash general purpose address translation for Node.js and web browsers.

Build Status Coverage Status JavaScript Style Guide

NPM

JavaScript Style Guide

Plug & Play JavaScript library for all Bitcoin Cash address format translation needs. Easy-to-use, thoroughly tested, and feature complete.

Support for the new Bitcoin Cash address format which improves upon BIP 173, as well as the Bitpay and Legacy formats.

Test out a demo address translator powered by BchAddr.js here.

Installation

Using NPM or Yarn

$ npm install bchaddrjs
$ yarn add bchaddrjs

Manually

You may also download the distribution file manually and place it within your third-party scripts directory: dist/bchaddrjs-0.5.2.min.js.

Usage

In Node.js

// Common-JS
var bchaddr = require('bchaddrjs');

// ES6 modules
import bchaddr from 'bchaddrjs';

Browser

Script Tag

You may include a script tag in your HTML and the bchaddr module will be defined globally on subsequent scripts.

<html>
  <head>
    ...
    <script src="https://unpkg.com/[email protected]/dist/bchaddrjs-0.5.2.min.js"></script>
  </head>
  ...
</html>

Code Examples

Supported formats, networks and address types.

var Format = bchaddr.Format; // Legacy, Bitpay or Cashaddr.
var Network = bchaddr.Network; // Mainnet or Testnet.
var Type = bchaddr.Type; // P2PKH or P2SH.

Test if a string is a valid Bitcoin Cash address of any type, in any format.

var isValidAddress = bchaddr.isValidAddress;

isValidAddress(null) // false
isValidAddress('') // false
isValidAddress('some invalid address') // false
isValidAddress('bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq') // false
isValidAddress('1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR') // true
isValidAddress('CScMwvXjdooDnGevHgfHjGWFi9cjk75Aaj') // true
isValidAddress('qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk') // true
isValidAddress('bitcoincash:qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk') // true

Note: You can use this function to check if any input is a valid Bitcoin Cash address.
Other functions in this library will throw an InvalidAddressError on invalid inputs.

Test for address format.

var isLegacyAddress = bchaddr.isLegacyAddress;
var isBitpayAddress = bchaddr.isBitpayAddress;
var isCashAddress = bchaddr.isCashAddress;

isLegacyAddress('1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR') // true
isLegacyAddress('qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk') // false
isBitpayAddress('CScMwvXjdooDnGevHgfHjGWFi9cjk75Aaj') // true
isBitpayAddress('1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR') // false
isCashAddress('qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk') // true
isCashAddress('CScMwvXjdooDnGevHgfHjGWFi9cjk75Aaj') // false

Test for address network.

var isMainnetAddress = bchaddr.isMainnetAddress;
var isTestnetAddress = bchaddr.isTestnetAddress;

isMainnetAddress('1P238gziZdeS5Wj9nqLhQHSBK2Lz6zPSke') // true
isMainnetAddress('mnbGP2FeRsbgdQCzDT35zPWDcYSKm4wrcg') // false
isTestnetAddress('qqdcsl6c879esyxyacmz7g6vtzwjjwtznsggspc457') // true
isTestnetAddress('CeUvhjLnSgcxyedaUafcyo4Cw9ZPwGq9JJ') // false

Test for address type.

var isP2PKHAddress = bchaddr.isP2PKHAddress;
var isP2SHAddress = bchaddr.isP2SHAddress;

isP2PKHAddress('1Mdob5JY1yuwoj6y76Vf3AQpoqUH5Aft8z') // true
isP2PKHAddress('2NFGG7yRBizUANU48b4dASrnNftqsNwzSM1') // false
isP2SHAddress('H92i9XpREZiBscxGu6Vx3M8jNGBKqscBBB') // true
isP2SHAddress('CeUvhjLnSgcxyedaUafcyo4Cw9ZPwGq9JJ') // false

Detect address format.

var detectAddressFormat = bchaddr.detectAddressFormat;

detectAddressFormat('qqdcsl6c879esyxyacmz7g6vtzwjjwtznsggspc457') // Format.Cashaddr
detectAddressFormat('CScMwvXjdooDnGevHgfHjGWFi9cjk75Aaj') // Format.Bitpay

Detect address network.

var detectAddressNetwork = bchaddr.detectAddressNetwork;

detectAddressNetwork('1P238gziZdeS5Wj9nqLhQHSBK2Lz6zPSke') // Network.Mainnet
detectAddressNetwork('qqdcsl6c879esyxyacmz7g6vtzwjjwtznsggspc457') // Network.Testnet

Detect address type.

var detectAddressType = bchaddr.detectAddressType;

detectAddressType('1P238gziZdeS5Wj9nqLhQHSBK2Lz6zPSke') // Type.P2PKH
detectAddressType('3NKpWcnyZtEKttoQECAFTnmkxMkzgbT4WX') // Type.P2SH

Translate address from any address format into a specific format.

var toLegacyAddress = bchaddr.toLegacyAddress;
var toBitpayAddress = bchaddr.toBitpayAddress;
var toCashAddress = bchaddr.toCashAddress;

toLegacyAddress('qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk') // 1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR
toBitpayAddress('1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR') // CScMwvXjdooDnGevHgfHjGWFi9cjk75Aaj
toCashAddress('1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR') // bitcoincash:qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk

Documentation

Generate and Browse Locally

$ npm run docs

Online

Browse automatically generated jsdocs online.

bchaddrjs's People

Contributors

dependabot[bot] avatar dhruvdangi avatar ealmansi avatar joshmh avatar knoxcard avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

bchaddrjs's Issues

does ie support this

when i use this lib in ie11, it throws error:
object does't support property or method fill.
And I found it is this line :
const BASE_MAP = new Uint8Array(256); BASE_MAP.fill(255) ;

So i add polyfill for TypedArray.prototype.fill().
But then it throw: InvalidAddressError: Received an invalid Bitcoin Cash address as input.
This works fine in other browers such as chrome.

What is BitpayAddress?

I didn't find any resources about this type address.
I use bitpay and the address begin with '1' not 'C'
What kind of address is this?

BCH address is invalid

Was searching web for js lib to verify bch address, and found you lib.

Cant get my coinomi wallet address to validate, lib shows that it invalid:

qqvek95wvh6gxg5aeyv6u4huxtwxmpm575rsvn40yz

bchaddr.isMainnetAddress('qqvek95wvh6gxg5aeyv6u4huxtwxmpm575rsvn40yz')

And all other functions (cashAddress, etc)

What is wrong with that address?

Zcash address is wrongly recognized as P2PKH address

Zcash address is wrongly recognized as BCH's P2PKH address, as the title say.
Confirmed on 3 addresses but the result is same.

Expected

isBitpayAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
isMainnetAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
isP2PKHAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
toCashAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
// Everything listed above must throw error

Actual

isBitpayAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
isMainnetAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
isP2PKHAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
// Everything listed above return true
toCashAddress("t1LuPdPkGH5QoNSewQrr8EzNbM27ktPdgQX")
// toCashAddress throws error, that's OK

Error throw

Hi!
Thanks a lot for your library. It was implemented in time!

I've got one idea
Why do u throw error if f.e. BCH address was invalid?
Validation method is named as isCashAddress, i think it's better (in case of invalid address) return just false
What do u think?
Regards

decodeAddress (and its variations) should be public

Doing so will make many operations way easier, for example in order to get all the information for an address, one needs to run isValidAddress first (or wrap all operations in try-catch), and then call all detectAddress methods individually (which are already using decodeAddress as source);

Also, there may be cases where one wants to check the output of cashaddr decode directly (for example, accessing prefix property which do includes bchreg and detectNetwork treats it as testnet)

SLP address

Hello,

Does this library also support validation of SLP addresses?

TypeError on client side

I am using bchaddrjs on client side to convert address to LegacyAddress and CashAddress.

this is the environment and packages:

node: v18.16.0
browser: Version 115.0.5790.170 (Official Build) (x86_64)

{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "serve": "vite preview",
    "type-check": "tsc --noEmit",
    "scripts:svgr:build": "sh ./scripts/svgr/run.sh && npm run prettier:fix && npm run lint:fix",
    "lint": "eslint ./src --ext .jsx,.js,.ts,.tsx --quiet --ignore-path ./.gitignore",
    "lint:fix": "eslint ./src --ext .jsx,.js,.ts,.tsx --quiet --fix --ignore-path ./.gitignore",
    "prettier": "prettier --check \"src/**/*.{ts,tsx}\"",
    "prettier:fix": "prettier --write \"src/**/*.{ts,tsx}\"",
    "prepare": "husky install",
    "test": "jest"
  },
  "dependencies": {
    "bchaddrjs": "^0.5.2",
    "bignumber.js": "^9.1.1",
    "date-fns": "^2.30.0",
    "jwt-decode": "^3.1.2",
    "react": "^18.2.0",
    "react-admin": "^4.11.1",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@babel/core": "^7.22.5",
    "@babel/preset-env": "^7.22.5",
    "@svgr/cli": "^6.5.1",
    "@types/bchaddrjs": "^0.4.0",
    "@types/jest": "^29.5.2",
    "@types/lodash": "^4.14.195",
    "@types/node": "^18.16.1",
    "@types/react": "^18.0.22",
    "@types/react-dom": "^18.0.7",
    "@typescript-eslint/eslint-plugin": "^5.59.7",
    "@typescript-eslint/parser": "^5.59.7",
    "@vitejs/plugin-react": "^2.2.0",
    "babel-jest": "^29.5.0",
    "eslint": "^8.41.0",
    "eslint-config-prettier": "^8.8.0",
    "eslint-config-standard": "^17.0.0",
    "eslint-plugin-lodash": "^7.4.0",
    "eslint-plugin-react": "^7.32.2",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-simple-import-sort": "^10.0.0",
    "husky": "^8.0.0",
    "jest": "^29.5.0",
    "prettier": "^2.8.8",
    "ts-jest": "^29.1.0",
    "typescript": "^4.6.4",
    "vite": "^3.2.0"
  }
}

this is the code snippet:
in general, im using react admin to display a field on client side.
and this part of code is just getting the data from client side and use bchaddr to convert the address to desired format.

const BchAddressField = () => {
    const record = useRecordContext();
    try {
      const toLegacyAddress = bchaddr.toLegacyAddress(record.verifiableAddress);
      const toCashAddress = bchaddr.toCashAddress(record.verifiableAddress);
    } catch (e) {
      // TODO: fix typeError: Cannot read properties of undefined (reading 'call')
      console.log(e);
    }
  };

this the error:

TypeError: Cannot read properties of undefined (reading 'call')
    at Hash.CipherBase (index.js:7:13)
    at new Hash (browser.js:9:8)
    at createHash (browser.js:29:10)
    at sha256x2 (index.js:8:13)
    at Object.encode (base.js:9:20)
    at encodeAsLegacy (bchaddr.js:321:20)
    at Object.toLegacyAddress (bchaddr.js:110:10)
    at BchAddressField (DfcTokensTabs.tsx?t=1691657617814:84:39)
    at renderWithHooks (react-dom.development.js:16305:18)
    at mountIndeterminateComponent (react-dom.development.js:20074:13)

this is the warning coming from browser console:

browser-external:events:9 Module "events" has been externalized for browser compatibility. Cannot access "events.EventEmitter" in client code.
get @ browser-external:events:9
node_modules/readable-stream/lib/_stream_readable.js @ _stream_readable.js:33
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/readable-stream/readable-browser.js @ readable-browser.js:1
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/hash-base/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/md5.js/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/create-hash/browser.js @ browser.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bs58check/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bchaddrjs/src/bchaddr.js @ bchaddr.js:9
__require @ chunk-J43GMYXM.js?v=09e9a855:11
(anonymous) @ bchaddr.js:461
browser-external:events:9 Module "events" has been externalized for browser compatibility. Cannot access "events.EventEmitter" in client code.
get @ browser-external:events:9
node_modules/readable-stream/lib/internal/streams/stream-browser.js @ stream-browser.js:1
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/readable-stream/lib/_stream_readable.js @ _stream_readable.js:40
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/readable-stream/readable-browser.js @ readable-browser.js:1
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/hash-base/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/md5.js/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/create-hash/browser.js @ browser.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bs58check/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bchaddrjs/src/bchaddr.js @ bchaddr.js:9
__require @ chunk-J43GMYXM.js?v=09e9a855:11
(anonymous) @ bchaddr.js:461
browser-external:util:9 Module "util" has been externalized for browser compatibility. Cannot access "util.debuglog" in client code.
get @ browser-external:util:9
node_modules/readable-stream/lib/_stream_readable.js @ _stream_readable.js:55
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/readable-stream/readable-browser.js @ readable-browser.js:1
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/hash-base/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/md5.js/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/create-hash/browser.js @ browser.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bs58check/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bchaddrjs/src/bchaddr.js @ bchaddr.js:9
__require @ chunk-J43GMYXM.js?v=09e9a855:11
(anonymous) @ bchaddr.js:461
browser-external:util:9 Module "util" has been externalized for browser compatibility. Cannot access "util.inspect" in client code.
get @ browser-external:util:9
node_modules/readable-stream/lib/internal/streams/buffer_list.js @ buffer_list.js:14
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/readable-stream/lib/_stream_readable.js @ _stream_readable.js:62
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/readable-stream/readable-browser.js @ readable-browser.js:1
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/hash-base/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/md5.js/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/create-hash/browser.js @ browser.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bs58check/index.js @ index.js:3
__require @ chunk-J43GMYXM.js?v=09e9a855:11
node_modules/bchaddrjs/src/bchaddr.js @ bchaddr.js:9
__require @ chunk-J43GMYXM.js?v=09e9a855:11
(anonymous) @ bchaddr.js:461
browser-external:stream:9 Module "stream" has been externalized for browser compatibility. Cannot access "stream.Transform" in client code.

Package not actually in bower

If you try to install this package via bower as indicated in the README, you get these results:

bower i --save bchaddrjs
bower                        ENOTFOUND Package bchaddrjs not found

You can also confirm this by searching the packages at https://bower.io/.

In the mean time, I have the package installed and running next to my other bower modules with:

bower i --save https://github.com/bitcoincashjs/bchaddrjs.git

Is this library ready for use?

Hi, I'm about to publicly release a tool which uses this library for Bitcoin Cash address translation.

Is this tool considered to be ready for use? Any comments on tests, community review, general reliability or upcoming development?

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.