Skip to content

Commit 42c4bd4

Browse files
committed
Merge remote-tracking branch 'TRX/master' into add_coins
2 parents 162458a + b530844 commit 42c4bd4

File tree

6 files changed

+216
-2
lines changed

6 files changed

+216
-2
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ npm install getdelta/wallet-address-validator
9393

9494
* ZenCash/ZEN, `'zencash'` or `'ZEN'`
9595

96+
* TRON/TRX, `'tron'` or `'trx'`
97+
9698

9799
### Usage example
98100

dist/wallet-address-validator.js

+71-1
Original file line numberDiff line numberDiff line change
@@ -6456,6 +6456,7 @@ var jsSHA = require('jssha/src/sha256');
64566456
var Blake256 = require('./blake256');
64576457
var keccak256 = require('./sha3')['keccak256'];
64586458
var Blake2B = require('./blake2b');
6459+
var base58 = require('./base58');
64596460

64606461
function numberToHex (number) {
64616462
var hex = Math.round(number).toString(16);
@@ -6474,6 +6475,72 @@ function hexToUint8(hexString) {
64746475
return new Uint8Array(arr);
64756476
}
64766477

6478+
/* Convert a byte to string */
6479+
function byte2hexStr(byte) {
6480+
var hexByteMap = "0123456789ABCDEF";
6481+
var str = "";
6482+
str += hexByteMap.charAt(byte >> 4);
6483+
str += hexByteMap.charAt(byte & 0x0f);
6484+
return str;
6485+
}
6486+
6487+
//byteArray格式数据转为16进制的ASCII字符串。
6488+
function byteArray2hexStr(byteArray) {
6489+
var str = "";
6490+
for (var i = 0; i < (byteArray.length - 1); i++) {
6491+
str += byte2hexStr(byteArray[i]);
6492+
}
6493+
str += byte2hexStr(byteArray[i]);
6494+
return str;
6495+
}
6496+
6497+
/* Check if a char is hex char */
6498+
function isHexChar(c) {
6499+
if ((c >= 'A' && c <= 'F') ||
6500+
(c >= 'a' && c <= 'f') ||
6501+
(c >= '0' && c <= '9')) {
6502+
return 1;
6503+
}
6504+
return 0;
6505+
}
6506+
6507+
/* Convert a hex char to value */
6508+
function hexChar2byte(c) {
6509+
var d = 0;
6510+
if (c >= 'A' && c <= 'F') {
6511+
d = c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;
6512+
}
6513+
else if (c >= 'a' && c <= 'f') {
6514+
d = c.charCodeAt(0) - 'a'.charCodeAt(0) + 10;
6515+
}
6516+
else if (c >= '0' && c <= '9') {
6517+
d = c.charCodeAt(0) - '0'.charCodeAt(0);
6518+
}
6519+
return d;
6520+
}
6521+
6522+
function hexStr2byteArray(str) {
6523+
var byteArray = Array();
6524+
var d = 0;
6525+
var i = 0;
6526+
var j = 0;
6527+
var k = 0;
6528+
6529+
for (i = 0; i < str.length; i++) {
6530+
var c = str.charAt(i);
6531+
if (isHexChar(c)) {
6532+
d <<= 4;
6533+
d += hexChar2byte(c);
6534+
j++;
6535+
if (0 === (j % 2)) {
6536+
byteArray[k++] = d;
6537+
d = 0;
6538+
}
6539+
}
6540+
}
6541+
return byteArray;
6542+
}
6543+
64776544
module.exports = {
64786545
toHex: function (arrayOfBytes) {
64796546
var hex = '';
@@ -6504,7 +6571,10 @@ module.exports = {
65046571
},
65056572
keccak256Checksum: function (payload) {
65066573
return keccak256(payload).toString().substr(0, 8);
6507-
}
6574+
},
6575+
base58: base58.decode,
6576+
byteArray2hexStr: byteArray2hexStr,
6577+
hexStr2byteArray: hexStr2byteArray
65086578
};
65096579

65106580
},{"./blake256":38,"./blake2b":39,"./sha3":43,"jssha/src/sha256":30}],45:[function(require,module,exports){

src/crypto/utils.js

+71-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var jsSHA = require('jssha/src/sha256');
22
var Blake256 = require('./blake256');
33
var keccak256 = require('./sha3')['keccak256'];
44
var Blake2B = require('./blake2b');
5+
var base58 = require('./base58');
56

67
function numberToHex (number) {
78
var hex = Math.round(number).toString(16);
@@ -20,6 +21,72 @@ function hexToUint8(hexString) {
2021
return new Uint8Array(arr);
2122
}
2223

24+
/* Convert a byte to string */
25+
function byte2hexStr(byte) {
26+
var hexByteMap = "0123456789ABCDEF";
27+
var str = "";
28+
str += hexByteMap.charAt(byte >> 4);
29+
str += hexByteMap.charAt(byte & 0x0f);
30+
return str;
31+
}
32+
33+
//byteArray格式数据转为16进制的ASCII字符串。
34+
function byteArray2hexStr(byteArray) {
35+
var str = "";
36+
for (var i = 0; i < (byteArray.length - 1); i++) {
37+
str += byte2hexStr(byteArray[i]);
38+
}
39+
str += byte2hexStr(byteArray[i]);
40+
return str;
41+
}
42+
43+
/* Check if a char is hex char */
44+
function isHexChar(c) {
45+
if ((c >= 'A' && c <= 'F') ||
46+
(c >= 'a' && c <= 'f') ||
47+
(c >= '0' && c <= '9')) {
48+
return 1;
49+
}
50+
return 0;
51+
}
52+
53+
/* Convert a hex char to value */
54+
function hexChar2byte(c) {
55+
var d = 0;
56+
if (c >= 'A' && c <= 'F') {
57+
d = c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;
58+
}
59+
else if (c >= 'a' && c <= 'f') {
60+
d = c.charCodeAt(0) - 'a'.charCodeAt(0) + 10;
61+
}
62+
else if (c >= '0' && c <= '9') {
63+
d = c.charCodeAt(0) - '0'.charCodeAt(0);
64+
}
65+
return d;
66+
}
67+
68+
function hexStr2byteArray(str) {
69+
var byteArray = Array();
70+
var d = 0;
71+
var i = 0;
72+
var j = 0;
73+
var k = 0;
74+
75+
for (i = 0; i < str.length; i++) {
76+
var c = str.charAt(i);
77+
if (isHexChar(c)) {
78+
d <<= 4;
79+
d += hexChar2byte(c);
80+
j++;
81+
if (0 === (j % 2)) {
82+
byteArray[k++] = d;
83+
d = 0;
84+
}
85+
}
86+
}
87+
return byteArray;
88+
}
89+
2390
module.exports = {
2491
toHex: function (arrayOfBytes) {
2592
var hex = '';
@@ -50,5 +117,8 @@ module.exports = {
50117
},
51118
keccak256Checksum: function (payload) {
52119
return keccak256(payload).toString().substr(0, 8);
53-
}
120+
},
121+
base58: base58.decode,
122+
byteArray2hexStr: byteArray2hexStr,
123+
hexStr2byteArray: hexStr2byteArray
54124
};

src/currencies.js

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var XMRValidator = require('./monero_validator');
55
var NANOValidator = require('./nano_validator');
66
var XLMValidator = require('./stellar_validator');
77
var ADAValidator = require('./cardano_validator');
8+
var TRXValidator = require('./tron_validator');
89

910
// defines P2PKH and P2SH address types for standard (prod) and testnet networks
1011
var CURRENCIES = [{
@@ -224,6 +225,11 @@ var CURRENCIES = [{
224225
name: 'vechain',
225226
symbol: 'vet',
226227
validator: ETHValidator,
228+
},{
229+
name: 'tron',
230+
symbol: 'trx',
231+
addressTypes: {prod: [0x41], testnet: [0xa0]},
232+
validator: TRXValidator
227233
}];
228234

229235

src/tron_validator.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
var cryptoUtils = require('./crypto/utils');
2+
3+
function decodeBase58Address(base58Sting) {
4+
if (typeof (base58Sting) !== 'string') {
5+
return false;
6+
}
7+
if (base58Sting.length <= 4) {
8+
return false;
9+
}
10+
11+
try {
12+
var address = cryptoUtils.base58(base58Sting);
13+
} catch (e) {
14+
return false
15+
}
16+
17+
if (base58Sting.length <= 4) {
18+
return false;
19+
}
20+
var len = address.length;
21+
var offset = len - 4;
22+
var checkSum = address.slice(offset);
23+
address = address.slice(0, offset);
24+
var hash0 = cryptoUtils.sha256(cryptoUtils.byteArray2hexStr(address));
25+
var hash1 = cryptoUtils.hexStr2byteArray(cryptoUtils.sha256(hash0));
26+
var checkSum1 = hash1.slice(0, 4);
27+
if (checkSum[0] === checkSum1[0] && checkSum[1] === checkSum1[1] && checkSum[2]
28+
=== checkSum1[2] && checkSum[3] === checkSum1[3]
29+
) {
30+
return address;
31+
}
32+
33+
return false;
34+
}
35+
36+
function getEnv(currency, networkType) {
37+
var evn = networkType || 'prod';
38+
39+
if (evn !== 'prod' && evn !== 'testnet') evn = 'prod';
40+
41+
return currency.addressTypes[evn][0]
42+
}
43+
44+
module.exports = {
45+
/**
46+
* tron address validation
47+
*/
48+
isValidAddress: function (mainAddress, currency, networkType) {
49+
var address = decodeBase58Address(mainAddress);
50+
51+
if (!address) {
52+
return false;
53+
}
54+
55+
if (address.length !== 21) {
56+
return false;
57+
}
58+
59+
return getEnv(currency, networkType) === address[0];
60+
}
61+
};

test/wallet_address_validator.js

+5
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,11 @@ describe('WAValidator.validate()', function () {
407407
valid('0x6bf76c6f76e0971130e72055b6445ee10eabf48b', 'vechain');
408408
valid('0x1671a3e4A2519A653E66E827ef6eaE690ee86729', 'vechain');
409409
});
410+
411+
it('should return true for correct trx addresses', function () {
412+
valid('TNDzfERDpxLDS2w1q6yaFC7pzqaSQ3Bg3r', 'trx');
413+
valid('27bLJCYjbH6MT8DBF9xcrK6yZnm43vx7MNQ', 'trx', 'testnet');
414+
});
410415
});
411416

412417
describe('invalid results', function () {

0 commit comments

Comments
 (0)