Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,4 @@ Network Trash Folder
Temporary Items
.apdisk

bench.js
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# CHANGELOG

## v1.3.5

1. Add four address checker `isZeroAddress`, `isInternalContractAddress`, `isValidHexAddress`, `isValidCfxHexAddress`
2. Use `conflux-address-rust` to boost address convert performance if in Node.js environment.
25 changes: 23 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# conflux-address-js

The simple encoder and decoder for Conflux address.

Check [CIP-37](https://github.com/Conflux-Chain/CIPs/pull/53/) for the protocols.
Expand All @@ -8,7 +9,7 @@ Check [CIP-37](https://github.com/Conflux-Chain/CIPs/pull/53/) for the protocols
### Encoding

```javascript
const confluxAddr = require('conflux-address-js')
const confluxAddr = require('@conflux-dev/conflux-address-js')
const hexBuffer = Buffer.from('106d49f8505410eb4e671d51f7d96d2c87807b09', 'hex')
const netId = 1029 // Conflux main-net

Expand All @@ -20,8 +21,9 @@ console.log(confluxAddr.encode(hexBuffer, netId, true)) // verbose mode to gener
```

### Decoding

```javascript
const confluxAddr = require('conflux-address-js')
const confluxAddr = require('@conflux-dev/conflux-address-js')
console.log(confluxAddr.decode('cfx:aajg4wt2mbmbb44sp6szd783ry0jtad5bea80xdy7p'))
/*
{ hexAddress:
Expand All @@ -39,3 +41,22 @@ console.log(confluxAddr.decode('CFX:TYPE.USER:AAJG4WT2MBMBB44SP6SZD783RY0JTAD5BE
type: 'user' }
*/
```

### API

* `encode`: Low level encode method
* `decode`: Low level decode method
* `isValidCfxAddress`: Return a boolean value indicating whether the address is valid
* `verifyCfxAddress`: Check whether a address is valid, if not will throw an error
* `hasNetworkPrefix`: Check a string whether has an network prefix
* `simplifyCfxAddress`: Return a non verbose address
* `shortenCfxAddress`: Return a shorten address
* `isZeroAddress`: Check whether a address is zero address
* `isInternalContractAddress`: Check where a address is Conflux InternalContract address
* `isValidHexAddress`: Check whether a address is valid hex address
* `isValidCfxHexAddress`: Check where a address is valid Conflux hex address


## Performance

To gain a address conversion performance boost, you can install [`@conflux-dev/conflux-address-rust`](https://github.com/conflux-fans/conflux-address-rust-binding) in your project. Which will be used to relace the purejs version and can gain a `10-100` performance boost.
116 changes: 116 additions & 0 deletions lib/address-utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
"use strict";

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

var CONST = require('./const');

var _require = require('./utils'),
isHexString = _require.isHexString,
isString = _require.isString;
/**
* Check conflux address's prefix
*
* @param address {string}
* @return {boolean}
*
* @example
*/


function hasNetworkPrefix(address) {
if (!isString(address)) {
return false;
}

var parts = address.toLowerCase().split(':');

if (parts.length !== 2 && parts.length !== 3) {
return false;
}

var prefix = parts[0];

if (prefix === CONST.PREFIX_CFX || prefix === CONST.PREFIX_CFXTEST) {
return true;
}

return prefix.startsWith(CONST.PREFIX_NET) && /^([1-9]\d*)$/.test(prefix.slice(3));
}
/**
* simplify a verbose address(return a non-verbose address)
*
* @param address {string}
* @return {string}
*
*/


function simplifyCfxAddress(address) {
if (!hasNetworkPrefix(address)) {
throw new Error('invalid base32 address');
}

var parts = address.toLocaleLowerCase().split(':');

if (parts.length !== 3) {
return address;
}

return "".concat(parts[0], ":").concat(parts[2]);
}

function shortenCfxAddress(address) {
var compress = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
address = simplifyCfxAddress(address);

var _address$split = address.split(':'),
_address$split2 = _slicedToArray(_address$split, 2),
netPre = _address$split2[0],
body = _address$split2[1];

var tailLen = netPre === 'cfx' && !compress ? 8 : 4;
var pre = body.slice(0, 3);
var tail = body.slice(body.length - tailLen);
return "".concat(netPre, ":").concat(pre, "...").concat(tail);
}

function isZeroAddress(address) {
if (!isHexString(address)) throw new Error('Only hex is allowed');
return address === CONST.ZERO_ADDRESS_HEX;
}

function isInternalContractAddress(address) {
if (!isHexString(address)) throw new Error('Only hex is allowed');
return address === CONST.ADMIN_CONTROL || address === CONST.SPONSOR_CONTROL || address === CONST.STAKING || address === CONST.CONFLUX_CONTEXT || address === CONST.POS_REGISTER;
}

function isValidHexAddress(address) {
return isHexString(address) && address.length === 42;
} // TOOD check address's checksum


function isValidCfxHexAddress(address) {
if (address.length !== 42) return false;
if (isZeroAddress(address) || isInternalContractAddress(address)) return true;
return address.startsWith('0x1') || address.startsWith('0x8');
}

module.exports = {
hasNetworkPrefix: hasNetworkPrefix,
simplifyCfxAddress: simplifyCfxAddress,
shortenCfxAddress: shortenCfxAddress,
isZeroAddress: isZeroAddress,
isInternalContractAddress: isInternalContractAddress,
isValidHexAddress: isValidHexAddress,
isValidCfxHexAddress: isValidCfxHexAddress
};
210 changes: 0 additions & 210 deletions lib/base32.js

This file was deleted.

Loading