UNPKG

4.92 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.isValidXAddress = exports.decodeXAddress = exports.xAddressToClassicAddress = exports.encodeXAddress = exports.classicAddressToXAddress = exports.isValidClassicAddress = exports.decodeAccountPublic = exports.encodeAccountPublic = exports.decodeNodePublic = exports.encodeNodePublic = exports.decodeAccountID = exports.encodeAccountID = exports.decodeSeed = exports.encodeSeed = exports.codec = void 0;
4const xrp_codec_1 = require("./xrp-codec");
5Object.defineProperty(exports, "codec", { enumerable: true, get: function () { return xrp_codec_1.codec; } });
6Object.defineProperty(exports, "encodeSeed", { enumerable: true, get: function () { return xrp_codec_1.encodeSeed; } });
7Object.defineProperty(exports, "decodeSeed", { enumerable: true, get: function () { return xrp_codec_1.decodeSeed; } });
8Object.defineProperty(exports, "encodeAccountID", { enumerable: true, get: function () { return xrp_codec_1.encodeAccountID; } });
9Object.defineProperty(exports, "decodeAccountID", { enumerable: true, get: function () { return xrp_codec_1.decodeAccountID; } });
10Object.defineProperty(exports, "encodeNodePublic", { enumerable: true, get: function () { return xrp_codec_1.encodeNodePublic; } });
11Object.defineProperty(exports, "decodeNodePublic", { enumerable: true, get: function () { return xrp_codec_1.decodeNodePublic; } });
12Object.defineProperty(exports, "encodeAccountPublic", { enumerable: true, get: function () { return xrp_codec_1.encodeAccountPublic; } });
13Object.defineProperty(exports, "decodeAccountPublic", { enumerable: true, get: function () { return xrp_codec_1.decodeAccountPublic; } });
14Object.defineProperty(exports, "isValidClassicAddress", { enumerable: true, get: function () { return xrp_codec_1.isValidClassicAddress; } });
15const assert = require("assert");
16const PREFIX_BYTES = {
17 MAIN: Buffer.from([0x05, 0x44]),
18 TEST: Buffer.from([0x04, 0x93]), // 4, 147
19};
20function classicAddressToXAddress(classicAddress, tag, test) {
21 const accountId = (0, xrp_codec_1.decodeAccountID)(classicAddress);
22 return encodeXAddress(accountId, tag, test);
23}
24exports.classicAddressToXAddress = classicAddressToXAddress;
25function encodeXAddress(accountId, tag, test) {
26 if (accountId.length !== 20) {
27 // RIPEMD160 is 160 bits = 20 bytes
28 throw new Error('Account ID must be 20 bytes');
29 }
30 const MAX_32_BIT_UNSIGNED_INT = 4294967295;
31 const flag = tag === false ? 0 : tag <= MAX_32_BIT_UNSIGNED_INT ? 1 : 2;
32 if (flag === 2) {
33 throw new Error('Invalid tag');
34 }
35 if (tag === false) {
36 tag = 0;
37 }
38 const bytes = Buffer.concat([
39 test ? PREFIX_BYTES.TEST : PREFIX_BYTES.MAIN,
40 accountId,
41 Buffer.from([
42 flag,
43 tag & 0xff,
44 (tag >> 8) & 0xff,
45 (tag >> 16) & 0xff,
46 (tag >> 24) & 0xff,
47 0,
48 0,
49 0,
50 0, // four zero bytes (reserved for 64-bit tags)
51 ]),
52 ]);
53 const xAddress = xrp_codec_1.codec.encodeChecked(bytes);
54 return xAddress;
55}
56exports.encodeXAddress = encodeXAddress;
57function xAddressToClassicAddress(xAddress) {
58 const { accountId, tag, test } = decodeXAddress(xAddress);
59 const classicAddress = (0, xrp_codec_1.encodeAccountID)(accountId);
60 return {
61 classicAddress,
62 tag,
63 test,
64 };
65}
66exports.xAddressToClassicAddress = xAddressToClassicAddress;
67function decodeXAddress(xAddress) {
68 const decoded = xrp_codec_1.codec.decodeChecked(xAddress);
69 const test = isBufferForTestAddress(decoded);
70 const accountId = decoded.slice(2, 22);
71 const tag = tagFromBuffer(decoded);
72 return {
73 accountId,
74 tag,
75 test,
76 };
77}
78exports.decodeXAddress = decodeXAddress;
79function isBufferForTestAddress(buf) {
80 const decodedPrefix = buf.slice(0, 2);
81 if (PREFIX_BYTES.MAIN.equals(decodedPrefix)) {
82 return false;
83 }
84 else if (PREFIX_BYTES.TEST.equals(decodedPrefix)) {
85 return true;
86 }
87 else {
88 throw new Error('Invalid X-address: bad prefix');
89 }
90}
91function tagFromBuffer(buf) {
92 const flag = buf[22];
93 if (flag >= 2) {
94 // No support for 64-bit tags at this time
95 throw new Error('Unsupported X-address');
96 }
97 if (flag === 1) {
98 // Little-endian to big-endian
99 return buf[23] + buf[24] * 0x100 + buf[25] * 0x10000 + buf[26] * 0x1000000;
100 }
101 assert.strictEqual(flag, 0, 'flag must be zero to indicate no tag');
102 assert.ok(Buffer.from('0000000000000000', 'hex').equals(buf.slice(23, 23 + 8)), 'remaining bytes must be zero');
103 return false;
104}
105function isValidXAddress(xAddress) {
106 try {
107 decodeXAddress(xAddress);
108 }
109 catch (e) {
110 return false;
111 }
112 return true;
113}
114exports.isValidXAddress = isValidXAddress;
115//# sourceMappingURL=index.js.map
\No newline at end of file