UNPKG

2.04 kBJavaScriptView Raw
1const { assert, sign } = require('../util');
2const BaseCoder = require('./BaseCoder');
3const { WORD_BYTES, padBuffer, encodeUInt256, decodeUInt256 } = require('./util');
4
5class BytesCoder extends BaseCoder {
6 static from({ type, name }) {
7 const match = type.match(/^bytes([0-9]*)$/);
8 if (!match) {
9 return undefined;
10 }
11
12 const [, size] = match;
13 return new this({
14 name,
15 size: size ? parseInt(size, 10) : undefined,
16 });
17 }
18
19 constructor({ name, size }) {
20 if (size !== undefined) {
21 assert(Number.isInteger(size) && size <= WORD_BYTES, {
22 message: 'invalid size',
23 expect: `integer && <=${WORD_BYTES}`,
24 got: size,
25 coder: { name },
26 });
27 }
28
29 super({ name });
30 this.type = `bytes${size > 0 ? size : ''}`;
31 this.size = size;
32 this.dynamic = Boolean(size === undefined);
33 }
34
35 /**
36 * @param value {ArrayLike}
37 * @return {Buffer}
38 */
39 encode(value) {
40 value = Buffer.isBuffer(value) ? value : Buffer.from(value);
41
42 if (this.size !== undefined) {
43 assert(value.length === this.size, {
44 message: 'length not match',
45 expect: this.size,
46 got: value.length,
47 coder: this,
48 });
49 }
50
51 let buffer = padBuffer(value, true);
52 if (this.size === undefined) {
53 buffer = Buffer.concat([encodeUInt256(value.length), buffer]);
54 }
55 return buffer;
56 }
57
58 /**
59 * @param stream {HexStream}
60 * @return {Buffer}
61 */
62 decode(stream) {
63 let length = this.size;
64 if (length === undefined) {
65 length = Number(decodeUInt256(stream));
66 }
67
68 return Buffer.from(stream.read(length * 2, true), 'hex');
69 }
70
71 encodeIndex(value) {
72 assert(Buffer.isBuffer(value), {
73 message: 'value type error',
74 expect: Buffer.name,
75 got: value.constructor.name,
76 coder: this,
77 });
78
79 return sign.sha3(value);
80 }
81
82 decodeIndex(hex) {
83 return hex;
84 }
85}
86
87module.exports = BytesCoder;