1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.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;
|
4 | const xrp_codec_1 = require("./xrp-codec");
|
5 | Object.defineProperty(exports, "codec", { enumerable: true, get: function () { return xrp_codec_1.codec; } });
|
6 | Object.defineProperty(exports, "encodeSeed", { enumerable: true, get: function () { return xrp_codec_1.encodeSeed; } });
|
7 | Object.defineProperty(exports, "decodeSeed", { enumerable: true, get: function () { return xrp_codec_1.decodeSeed; } });
|
8 | Object.defineProperty(exports, "encodeAccountID", { enumerable: true, get: function () { return xrp_codec_1.encodeAccountID; } });
|
9 | Object.defineProperty(exports, "decodeAccountID", { enumerable: true, get: function () { return xrp_codec_1.decodeAccountID; } });
|
10 | Object.defineProperty(exports, "encodeNodePublic", { enumerable: true, get: function () { return xrp_codec_1.encodeNodePublic; } });
|
11 | Object.defineProperty(exports, "decodeNodePublic", { enumerable: true, get: function () { return xrp_codec_1.decodeNodePublic; } });
|
12 | Object.defineProperty(exports, "encodeAccountPublic", { enumerable: true, get: function () { return xrp_codec_1.encodeAccountPublic; } });
|
13 | Object.defineProperty(exports, "decodeAccountPublic", { enumerable: true, get: function () { return xrp_codec_1.decodeAccountPublic; } });
|
14 | Object.defineProperty(exports, "isValidClassicAddress", { enumerable: true, get: function () { return xrp_codec_1.isValidClassicAddress; } });
|
15 | const assert = require("assert");
|
16 | const PREFIX_BYTES = {
|
17 | MAIN: Buffer.from([0x05, 0x44]),
|
18 | TEST: Buffer.from([0x04, 0x93]),
|
19 | };
|
20 | function classicAddressToXAddress(classicAddress, tag, test) {
|
21 | const accountId = (0, xrp_codec_1.decodeAccountID)(classicAddress);
|
22 | return encodeXAddress(accountId, tag, test);
|
23 | }
|
24 | exports.classicAddressToXAddress = classicAddressToXAddress;
|
25 | function encodeXAddress(accountId, tag, test) {
|
26 | if (accountId.length !== 20) {
|
27 |
|
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,
|
51 | ]),
|
52 | ]);
|
53 | const xAddress = xrp_codec_1.codec.encodeChecked(bytes);
|
54 | return xAddress;
|
55 | }
|
56 | exports.encodeXAddress = encodeXAddress;
|
57 | function 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 | }
|
66 | exports.xAddressToClassicAddress = xAddressToClassicAddress;
|
67 | function 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 | }
|
78 | exports.decodeXAddress = decodeXAddress;
|
79 | function 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 | }
|
91 | function tagFromBuffer(buf) {
|
92 | const flag = buf[22];
|
93 | if (flag >= 2) {
|
94 |
|
95 | throw new Error('Unsupported X-address');
|
96 | }
|
97 | if (flag === 1) {
|
98 |
|
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 | }
|
105 | function isValidXAddress(xAddress) {
|
106 | try {
|
107 | decodeXAddress(xAddress);
|
108 | }
|
109 | catch (e) {
|
110 | return false;
|
111 | }
|
112 | return true;
|
113 | }
|
114 | exports.isValidXAddress = isValidXAddress;
|
115 |
|
\ | No newline at end of file |