UNPKG

19.2 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const client_common_1 = require("@neo-one/client-common");
5const bn_js_1 = require("bn.js");
6const lodash_1 = tslib_1.__importDefault(require("lodash"));
7class BinaryReader {
8 constructor(buffer, index = 0) {
9 this.buffer = buffer;
10 this.mutableIndex = index;
11 }
12 get index() {
13 return this.mutableIndex;
14 }
15 get remaining() {
16 return this.buffer.length - this.mutableIndex;
17 }
18 get remainingBuffer() {
19 return this.buffer.slice(this.mutableIndex);
20 }
21 hasMore() {
22 return this.mutableIndex < this.buffer.byteLength;
23 }
24 clone() {
25 return new BinaryReader(this.buffer, this.mutableIndex);
26 }
27 readBytes(numBytes) {
28 this.checkRead(numBytes);
29 const result = this.buffer.slice(this.mutableIndex, this.mutableIndex + numBytes);
30 this.mutableIndex += numBytes;
31 return result;
32 }
33 readInt8() {
34 this.checkRead(1);
35 const result = this.buffer.readInt8(this.mutableIndex);
36 this.mutableIndex += 1;
37 return result;
38 }
39 readUInt8() {
40 this.checkRead(1);
41 const result = this.buffer.readUInt8(this.mutableIndex);
42 this.mutableIndex += 1;
43 return result;
44 }
45 readBoolean() {
46 return this.readBytes(1)[0] !== 0;
47 }
48 readInt16LE() {
49 this.checkRead(2);
50 const result = this.buffer.readInt16LE(this.mutableIndex);
51 this.mutableIndex += 2;
52 return result;
53 }
54 readUInt16LE() {
55 this.checkRead(2);
56 const result = this.buffer.readUInt16LE(this.mutableIndex);
57 this.mutableIndex += 2;
58 return result;
59 }
60 readUInt16BE() {
61 this.checkRead(2);
62 const result = this.buffer.readUInt16BE(this.mutableIndex);
63 this.mutableIndex += 2;
64 return result;
65 }
66 readInt32LE() {
67 this.checkRead(4);
68 const result = this.buffer.readInt32LE(this.mutableIndex);
69 this.mutableIndex += 4;
70 return result;
71 }
72 readUInt32LE() {
73 this.checkRead(4);
74 const result = this.buffer.readUInt32LE(this.mutableIndex);
75 this.mutableIndex += 4;
76 return result;
77 }
78 readUInt64LE() {
79 return new bn_js_1.BN(this.readBytes(8), 'le');
80 }
81 readInt64LE() {
82 const buffer = this.readBytes(8);
83 return new bn_js_1.BN(buffer, 'le').fromTwos(buffer.length * 8);
84 }
85 readUInt160() {
86 return client_common_1.common.bufferToUInt160(this.readBytes(client_common_1.common.UINT160_BUFFER_BYTES));
87 }
88 readUInt256() {
89 return client_common_1.common.bufferToUInt256(this.readBytes(client_common_1.common.UINT256_BUFFER_BYTES));
90 }
91 readFixed8() {
92 return this.readInt64LE();
93 }
94 readFixedString(length) {
95 const values = lodash_1.default.takeWhile([...this.readBytes(length)], (value) => value !== 0);
96 return Buffer.from(values).toString('utf8');
97 }
98 readArray(read, max = 0x1000000) {
99 const count = this.readVarUIntLE(new bn_js_1.BN(max)).toNumber();
100 return lodash_1.default.range(count).map(read);
101 }
102 readObject(read, max = 0x1000000) {
103 const count = this.readVarUIntLE(new bn_js_1.BN(max)).toNumber();
104 return lodash_1.default.range(count).reduce((acc) => {
105 const { key, value } = read();
106 return Object.assign({}, acc, { [key]: value });
107 }, {});
108 }
109 readVarBytesLE(max = 0x1000000) {
110 return this.readBytes(this.readVarUIntLE(new bn_js_1.BN(max)).toNumber());
111 }
112 readVarUIntLE(max = new bn_js_1.BN('18446744073709551615', 10)) {
113 const fb = this.readUInt8();
114 let value;
115 switch (fb) {
116 case 0xfd:
117 value = new bn_js_1.BN(this.readUInt16LE());
118 break;
119 case 0xfe:
120 value = new bn_js_1.BN(this.readUInt32LE());
121 break;
122 case 0xff:
123 value = this.readUInt64LE();
124 break;
125 default:
126 value = new bn_js_1.BN(fb);
127 }
128 if (value.gt(max)) {
129 throw new client_common_1.InvalidFormatError(`Integer too large: ${value.toString(10)} > ${max.toString(10)}`);
130 }
131 return value;
132 }
133 readVarString(max = 0x1000000) {
134 return this.readVarBytesLE(max).toString('utf8');
135 }
136 readECPoint() {
137 const firstByte = this.readBytes(1);
138 if (firstByte[0] === client_common_1.common.ECPOINT_INFINITY_BYTE) {
139 return client_common_1.common.ECPOINT_INFINITY;
140 }
141 return client_common_1.common.bufferToECPoint(Buffer.concat([firstByte, this.readBytes(client_common_1.common.ECPOINT_BUFFER_BYTES - 1)]));
142 }
143 checkRead(numBytes) {
144 if (this.remaining < numBytes) {
145 throw new client_common_1.InvalidFormatError(`Insufficient bytes remaining (${this.remaining}): ${numBytes}`);
146 }
147 }
148}
149exports.BinaryReader = BinaryReader;
150
151//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFHLEdBQUcsU0FBUztRQUNsQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxXQUFXO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssc0JBQU0sQ0FBQyxxQkFBcUIsRUFBRTtZQUNqRCxPQUFPLHNCQUFNLENBQUMsZ0JBQWdCLENBQUM7U0FDaEM7UUFFRCxPQUFPLHNCQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBTSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFTyxTQUFTLENBQUMsUUFBZ0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsRUFBRTtZQUM3QixNQUFNLElBQUksa0NBQWtCLENBQUMsaUNBQWlDLElBQUksQ0FBQyxTQUFTLE1BQU0sUUFBUSxFQUFFLENBQUMsQ0FBQztTQUMvRjtJQUNILENBQUM7Q0FDRjtBQXZNRCxvQ0F1TUMiLCJmaWxlIjoibmVvLW9uZS1ub2RlLWNvcmUvc3JjL3V0aWxzL0JpbmFyeVJlYWRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbW1vbiwgRUNQb2ludCwgSW52YWxpZEZvcm1hdEVycm9yLCBVSW50MTYwLCBVSW50MjU2IH0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbic7XG5pbXBvcnQgeyBCTiB9IGZyb20gJ2JuLmpzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnlSZWFkZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVmZmVyOiBCdWZmZXI7XG4gIHByaXZhdGUgbXV0YWJsZUluZGV4OiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJ1ZmZlcjogQnVmZmVyLCBpbmRleCA9IDApIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICB0aGlzLm11dGFibGVJbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm11dGFibGVJbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVtYWluaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCAtIHRoaXMubXV0YWJsZUluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCByZW1haW5pbmdCdWZmZXIoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UodGhpcy5tdXRhYmxlSW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGhhc01vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXV0YWJsZUluZGV4IDwgdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpOiBCaW5hcnlSZWFkZXIge1xuICAgIHJldHVybiBuZXcgQmluYXJ5UmVhZGVyKHRoaXMuYnVmZmVyLCB0aGlzLm11dGFibGVJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEJ5dGVzKG51bUJ5dGVzOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKG51bUJ5dGVzKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLm11dGFibGVJbmRleCwgdGhpcy5tdXRhYmxlSW5kZXggKyBudW1CeXRlcyk7XG4gICAgdGhpcy5tdXRhYmxlSW5kZXggKz0gbnVtQnl0ZXM7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRJbnQ4KCk6IG51bWJlciB7XG4gICAgdGhpcy5jaGVja1JlYWQoMSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5idWZmZXIucmVhZEludDgodGhpcy5tdXRhYmxlSW5kZXgpO1xuICAgIHRoaXMubXV0YWJsZUluZGV4ICs9IDE7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRVSW50OCgpOiBudW1iZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKDEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50OCh0aGlzLm11dGFibGVJbmRleCk7XG4gICAgdGhpcy5tdXRhYmxlSW5kZXggKz0gMTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgcmVhZEJvb2xlYW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJ5dGVzKDEpWzBdICE9PSAwO1xuICB9XG5cbiAgcHVibGljIHJlYWRJbnQxNkxFKCk6IG51bWJlciB7XG4gICAgdGhpcy5jaGVja1JlYWQoMik7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5idWZmZXIucmVhZEludDE2TEUodGhpcy5tdXRhYmxlSW5kZXgpO1xuICAgIHRoaXMubXV0YWJsZUluZGV4ICs9IDI7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRVSW50MTZMRSgpOiBudW1iZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKDIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZMRSh0aGlzLm11dGFibGVJbmRleCk7XG4gICAgdGhpcy5tdXRhYmxlSW5kZXggKz0gMjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgcmVhZFVJbnQxNkJFKCk6IG51bWJlciB7XG4gICAgdGhpcy5jaGVja1JlYWQoMik7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKHRoaXMubXV0YWJsZUluZGV4KTtcbiAgICB0aGlzLm11dGFibGVJbmRleCArPSAyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyByZWFkSW50MzJMRSgpOiBudW1iZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKDQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYnVmZmVyLnJlYWRJbnQzMkxFKHRoaXMubXV0YWJsZUluZGV4KTtcbiAgICB0aGlzLm11dGFibGVJbmRleCArPSA0O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyByZWFkVUludDMyTEUoKTogbnVtYmVyIHtcbiAgICB0aGlzLmNoZWNrUmVhZCg0KTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5tdXRhYmxlSW5kZXgpO1xuICAgIHRoaXMubXV0YWJsZUluZGV4ICs9IDQ7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRVSW50NjRMRSgpOiBCTiB7XG4gICAgcmV0dXJuIG5ldyBCTih0aGlzLnJlYWRCeXRlcyg4KSwgJ2xlJyk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEludDY0TEUoKTogQk4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMucmVhZEJ5dGVzKDgpO1xuXG4gICAgcmV0dXJuIG5ldyBCTihidWZmZXIsICdsZScpLmZyb21Ud29zKGJ1ZmZlci5sZW5ndGggKiA4KTtcbiAgfVxuXG4gIC8vIE5FTyBzcGVjaWZpY1xuICBwdWJsaWMgcmVhZFVJbnQxNjAoKTogVUludDE2MCB7XG4gICAgcmV0dXJuIGNvbW1vbi5idWZmZXJUb1VJbnQxNjAodGhpcy5yZWFkQnl0ZXMoY29tbW9uLlVJTlQxNjBfQlVGRkVSX0JZVEVTKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZFVJbnQyNTYoKTogVUludDI1NiB7XG4gICAgcmV0dXJuIGNvbW1vbi5idWZmZXJUb1VJbnQyNTYodGhpcy5yZWFkQnl0ZXMoY29tbW9uLlVJTlQyNTZfQlVGRkVSX0JZVEVTKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEZpeGVkOCgpOiBCTiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEludDY0TEUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkRml4ZWRTdHJpbmcobGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IF8udGFrZVdoaWxlKFsuLi50aGlzLnJlYWRCeXRlcyhsZW5ndGgpXSwgKHZhbHVlKSA9PiB2YWx1ZSAhPT0gMCk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVzKS50b1N0cmluZygndXRmOCcpO1xuICB9XG5cbiAgcHVibGljIHJlYWRBcnJheTxUPihyZWFkOiAoKSA9PiBULCBtYXggPSAweDEwMDAwMDApOiByZWFkb25seSBUW10ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yZWFkVmFyVUludExFKG5ldyBCTihtYXgpKS50b051bWJlcigpO1xuXG4gICAgcmV0dXJuIF8ucmFuZ2UoY291bnQpLm1hcChyZWFkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkT2JqZWN0PFY+KFxuICAgIHJlYWQ6ICgpID0+IHsgcmVhZG9ubHkga2V5OiBudW1iZXI7IHJlYWRvbmx5IHZhbHVlOiBWIH0sXG4gICAgbWF4PzogbnVtYmVyLFxuICApOiB7IHJlYWRvbmx5IFtrZXk6IG51bWJlcl06IFYgfTtcbiAgcHVibGljIHJlYWRPYmplY3Q8Vj4oXG4gICAgcmVhZDogKCkgPT4geyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgdmFsdWU6IFYgfSxcbiAgICBtYXg/OiBudW1iZXIsXG4gICk6IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogViB9O1xuICBwdWJsaWMgcmVhZE9iamVjdDxWPihcbiAgICByZWFkOiAoKSA9PiB7IHJlYWRvbmx5IGtleTogc3RyaW5nIHwgbnVtYmVyOyByZWFkb25seSB2YWx1ZTogViB9LFxuICAgIG1heCA9IDB4MTAwMDAwMCxcbiAgKTogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBWIH0ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yZWFkVmFyVUludExFKG5ldyBCTihtYXgpKS50b051bWJlcigpO1xuXG4gICAgcmV0dXJuIF8ucmFuZ2UoY291bnQpLnJlZHVjZTx7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFYgfT4oKGFjYykgPT4ge1xuICAgICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSByZWFkKCk7XG5cbiAgICAgIHJldHVybiB7IC4uLmFjYywgW2tleV06IHZhbHVlIH07XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHVibGljIHJlYWRWYXJCeXRlc0xFKG1heCA9IDB4MTAwMDAwMCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJ5dGVzKHRoaXMucmVhZFZhclVJbnRMRShuZXcgQk4obWF4KSkudG9OdW1iZXIoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZFZhclVJbnRMRShtYXg6IEJOID0gbmV3IEJOKCcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIDEwKSk6IEJOIHtcbiAgICBjb25zdCBmYiA9IHRoaXMucmVhZFVJbnQ4KCk7XG4gICAgbGV0IHZhbHVlOiBCTjtcbiAgICBzd2l0Y2ggKGZiKSB7XG4gICAgICBjYXNlIDB4ZmQ6XG4gICAgICAgIHZhbHVlID0gbmV3IEJOKHRoaXMucmVhZFVJbnQxNkxFKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMHhmZTpcbiAgICAgICAgdmFsdWUgPSBuZXcgQk4odGhpcy5yZWFkVUludDMyTEUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAweGZmOlxuICAgICAgICB2YWx1ZSA9IHRoaXMucmVhZFVJbnQ2NExFKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFsdWUgPSBuZXcgQk4oZmIpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5ndChtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEZvcm1hdEVycm9yKGBJbnRlZ2VyIHRvbyBsYXJnZTogJHt2YWx1ZS50b1N0cmluZygxMCl9ID4gJHttYXgudG9TdHJpbmcoMTApfWApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkVmFyU3RyaW5nKG1heCA9IDB4MTAwMDAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVhZFZhckJ5dGVzTEUobWF4KS50b1N0cmluZygndXRmOCcpO1xuICB9XG5cbiAgcHVibGljIHJlYWRFQ1BvaW50KCk6IEVDUG9pbnQge1xuICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IHRoaXMucmVhZEJ5dGVzKDEpO1xuICAgIGlmIChmaXJzdEJ5dGVbMF0gPT09IGNvbW1vbi5FQ1BPSU5UX0lORklOSVRZX0JZVEUpIHtcbiAgICAgIHJldHVybiBjb21tb24uRUNQT0lOVF9JTkZJTklUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbW9uLmJ1ZmZlclRvRUNQb2ludChCdWZmZXIuY29uY2F0KFtmaXJzdEJ5dGUsIHRoaXMucmVhZEJ5dGVzKGNvbW1vbi5FQ1BPSU5UX0JVRkZFUl9CWVRFUyAtIDEpXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlYWQobnVtQnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbWFpbmluZyA8IG51bUJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEZvcm1hdEVycm9yKGBJbnN1ZmZpY2llbnQgYnl0ZXMgcmVtYWluaW5nICgke3RoaXMucmVtYWluaW5nfSk6ICR7bnVtQnl0ZXN9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=