1 | const { assert, sign } = require('../util');
|
2 | const BaseCoder = require('./BaseCoder');
|
3 | const { WORD_BYTES, padBuffer, encodeUInt256, decodeUInt256 } = require('./util');
|
4 |
|
5 | class 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 |
|
37 |
|
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 |
|
60 |
|
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 |
|
87 | module.exports = BytesCoder;
|