@haneullabs/bcs 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Change Log
2
2
 
3
+ ## 2.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 30289c1: Reject non-canonical encodings when decoding: `bool` values other than `0` or `1`,
8
+ non-minimal ULEB128 encodings (used for lengths and enum variant indices) and strings that are not
9
+ valid UTF-8. Strings now also keep a leading byte order mark instead of silently dropping it
10
+
11
+ ## 2.1.1
12
+
13
+ ### Patch Changes
14
+
15
+ - f2f7048: Upgrade workspace dependencies, remove the legacy dapp-kit package, and migrate the
16
+ remaining consumers to the current gRPC-based dapp-kit. Remove the legacy API reference while
17
+ retaining the migration guide and deprecation notice.
18
+
3
19
  ## 2.1.0
4
20
 
5
21
  ### Minor Changes
@@ -1,7 +1,6 @@
1
1
  import { BcsReader } from "./reader.mjs";
2
2
  import { EnumInputShape, EnumOutputShape, JoinString } from "./types.mjs";
3
3
  import { BcsWriter, BcsWriterOptions } from "./writer.mjs";
4
-
5
4
  //#region src/bcs-type.d.ts
6
5
  interface BcsTypeOptions<T, Input = T, Name extends string = string> {
7
6
  name?: Name;
@@ -29,12 +28,7 @@ declare class BcsType<T, Input = T, const Name extends string = string> {
29
28
  fromHex(hex: string): T;
30
29
  fromBase58(b64: string): T;
31
30
  fromBase64(b64: string): T;
32
- transform<T2 = T, Input2 = Input, NewName extends string = Name>({
33
- name,
34
- input,
35
- output,
36
- validate
37
- }: {
31
+ transform<T2 = T, Input2 = Input, NewName extends string = Name>({ name, input, output, validate }: {
38
32
  input?: (val: Input2) => Input;
39
33
  output?: (value: T) => T2;
40
34
  } & BcsTypeOptions<T2, Input2, NewName>): BcsType<T2, Input2, NewName>;
@@ -51,87 +45,58 @@ declare class SerializedBcs<T, Input = T> {
51
45
  toBase58(): string;
52
46
  parse(): T;
53
47
  }
54
- declare function fixedSizeBcsType<T, Input = T, const Name extends string = string>({
55
- size,
56
- ...options
57
- }: {
48
+ declare function fixedSizeBcsType<T, Input = T, const Name extends string = string>({ size, ...options }: {
58
49
  name: Name;
59
50
  size: number;
60
51
  read: (reader: BcsReader) => T;
61
52
  write: (value: Input, writer: BcsWriter) => void;
62
53
  } & BcsTypeOptions<T, Input, Name>): BcsType<T, Input, Name>;
63
- declare function uIntBcsType<const Name extends string = string>({
64
- readMethod,
65
- writeMethod,
66
- ...options
67
- }: {
54
+ declare function uIntBcsType<const Name extends string = string>({ readMethod, writeMethod, ...options }: {
68
55
  name: Name;
69
56
  size: number;
70
57
  readMethod: `read${8 | 16 | 32}`;
71
58
  writeMethod: `write${8 | 16 | 32}`;
72
59
  maxValue: number;
73
60
  } & BcsTypeOptions<number, number, Name>): BcsType<number, number, Name>;
74
- declare function bigUIntBcsType<const Name extends string = string>({
75
- readMethod,
76
- writeMethod,
77
- ...options
78
- }: {
61
+ declare function bigUIntBcsType<const Name extends string = string>({ readMethod, writeMethod, ...options }: {
79
62
  name: Name;
80
63
  size: number;
81
64
  readMethod: `read${64 | 128 | 256}`;
82
65
  writeMethod: `write${64 | 128 | 256}`;
83
66
  maxValue: bigint;
84
67
  } & BcsTypeOptions<string, string | number | bigint>): BcsType<string, string | number | bigint, Name>;
85
- declare function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({
86
- serialize,
87
- ...options
88
- }: {
68
+ declare function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({ serialize, ...options }: {
89
69
  name: Name;
90
70
  read: (reader: BcsReader) => T;
91
71
  serialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;
92
72
  } & BcsTypeOptions<T, Input>): BcsType<T, Input, string>;
93
- declare function stringLikeBcsType<const Name extends string = string>({
94
- toBytes,
95
- fromBytes,
96
- ...options
97
- }: {
73
+ declare function stringLikeBcsType<const Name extends string = string>({ toBytes, fromBytes, ...options }: {
98
74
  name: Name;
99
75
  toBytes: (value: string) => Uint8Array;
100
76
  fromBytes: (bytes: Uint8Array) => string;
101
77
  serializedSize?: (value: string) => number | null;
102
78
  } & BcsTypeOptions<string, string, Name>): BcsType<string, string, Name>;
103
79
  declare function lazyBcsType<T, Input>(cb: () => BcsType<T, Input>): BcsType<T, Input, string>;
104
- interface BcsStructOptions<T extends Record<string, BcsType<any>>, Name extends string = string> extends Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never }, Name>, 'name'> {
80
+ interface BcsStructOptions<T extends Record<string, BcsType<any>>, Name extends string = string> extends Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never; }, Name>, 'name'> {
105
81
  name: Name;
106
82
  fields: T;
107
83
  }
108
- declare class BcsStruct<T extends Record<string, BcsType<any>>, const Name extends string = string> extends BcsType<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never }, Name> {
109
- constructor({
110
- name,
111
- fields,
112
- ...options
113
- }: BcsStructOptions<T, Name>);
84
+ declare class BcsStruct<T extends Record<string, BcsType<any>>, const Name extends string = string> extends BcsType<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never; }, Name> {
85
+ constructor({ name, fields, ...options }: BcsStructOptions<T, Name>);
114
86
  }
115
- interface BcsEnumOptions<T extends Record<string, BcsType<any> | null>, Name extends string = string> extends Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null }>, Name>, 'name'> {
87
+ interface BcsEnumOptions<T extends Record<string, BcsType<any> | null>, Name extends string = string> extends Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true; }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null; }>, Name>, 'name'> {
116
88
  name: Name;
117
89
  fields: T;
118
90
  }
119
- declare class BcsEnum<T extends Record<string, BcsType<any> | null>, const Name extends string = string> extends BcsType<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null }>, Name> {
120
- constructor({
121
- fields,
122
- ...options
123
- }: BcsEnumOptions<T, Name>);
91
+ declare class BcsEnum<T extends Record<string, BcsType<any> | null>, const Name extends string = string> extends BcsType<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true; }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null; }>, Name> {
92
+ constructor({ fields, ...options }: BcsEnumOptions<T, Name>);
124
93
  }
125
- interface BcsTupleOptions<T extends readonly BcsType<any>[], Name extends string> extends Omit<BcsTypeOptions<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never }, Name>, 'name'> {
94
+ interface BcsTupleOptions<T extends readonly BcsType<any>[], Name extends string> extends Omit<BcsTypeOptions<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never; }, Name>, 'name'> {
126
95
  name?: Name;
127
96
  fields: T;
128
97
  }
129
- declare class BcsTuple<const T extends readonly BcsType<any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`> extends BcsType<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never }, Name> {
130
- constructor({
131
- fields,
132
- name,
133
- ...options
134
- }: BcsTupleOptions<T, Name>);
98
+ declare class BcsTuple<const T extends readonly BcsType<any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never; }, ', '>})`> extends BcsType<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never; }, Name> {
99
+ constructor({ fields, name, ...options }: BcsTupleOptions<T, Name>);
135
100
  }
136
101
  //#endregion
137
102
  export { BcsEnum, BcsEnumOptions, BcsStruct, BcsStructOptions, BcsTuple, BcsTupleOptions, BcsType, BcsTypeOptions, SerializedBcs, bigUIntBcsType, dynamicSizeBcsType, fixedSizeBcsType, isSerializedBcs, lazyBcsType, stringLikeBcsType, uIntBcsType };
@@ -1 +1 @@
1
- {"version":3,"file":"bcs-type.d.mts","names":[],"sources":["../src/bcs-type.ts"],"mappings":"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"}
1
+ {"version":3,"file":"bcs-type.d.mts","names":[],"sources":["../src/bcs-type.ts"],"mappings":"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"}
package/dist/bcs.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { EnumInputShape, EnumOutputShape, InferBcsInput, InferBcsType, JoinString } from "./types.mjs";
2
2
  import { BcsEnum, BcsStruct, BcsTuple, BcsType, BcsTypeOptions } from "./bcs-type.mjs";
3
-
4
3
  //#region src/bcs.d.ts
5
4
  declare function fixedArray<T extends BcsType<any>, Name extends string = string>(size: number, type: T, options?: BcsTypeOptions<InferBcsType<T>[], Iterable<InferBcsInput<T>> & {
6
5
  length: number;
@@ -133,7 +132,7 @@ declare const bcs: {
133
132
  * const tuple = bcs.tuple([bcs.u8(), bcs.string(), bcs.bool()])
134
133
  * tuple.serialize([1, 'a', true]).toBytes() // Uint8Array [ 1, 1, 97, 1 ]
135
134
  */
136
- tuple<const T extends readonly BcsType<any, any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T_1 extends string> ? T_1 : never }, ", ">})`>(fields: T, options?: BcsTypeOptions<{ -readonly [K_1 in keyof T]: T[K_1] extends BcsType<infer T_1, any> ? T_1 : never }, { [K_1 in keyof T]: T[K_1] extends BcsType<any, infer T_1> ? T_1 : never }, Name>): BcsTuple<T, Name>;
135
+ tuple<const T extends readonly BcsType<any, any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T_1 extends string> ? T_1 : never; }, ", ">})`>(fields: T, options?: BcsTypeOptions<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T_1, any> ? T_1 : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer T_1> ? T_1 : never; }, Name>): BcsTuple<T, Name>;
137
136
  /**
138
137
  * Creates a BcsType representing a struct of a given set of fields
139
138
  * @param name The name of the struct
@@ -146,7 +145,7 @@ declare const bcs: {
146
145
  * })
147
146
  * struct.serialize({ a: 1, b: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]
148
147
  */
149
- struct<T extends Record<string, BcsType<any>>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never }>, "name">): BcsStruct<T, string>;
148
+ struct<T extends Record<string, BcsType<any>>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never; }>, 'name'>): BcsStruct<T, string>;
150
149
  /**
151
150
  * Creates a BcsType representing an enum of a given set of options
152
151
  * @param name The name of the enum
@@ -163,7 +162,7 @@ declare const bcs: {
163
162
  * enum.serialize({ B: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]
164
163
  * enum.serialize({ C: true }).toBytes() // Uint8Array [ 2 ]
165
164
  */
166
- enum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null }>, Name>, "name">): BcsEnum<T, Name>;
165
+ enum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true; }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null; }>, Name>, 'name'>): BcsEnum<T, Name>;
167
166
  /**
168
167
  * Creates a BcsType representing a map of a given key and value type
169
168
  * @param keyType The BcsType of the key
@@ -1 +1 @@
1
- {"version":3,"file":"bcs.d.mts","names":[],"sources":["../src/bcs.ts"],"mappings":"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"}
1
+ {"version":3,"file":"bcs.d.mts","names":[],"sources":["../src/bcs.ts"],"mappings":";;;iBAyBS,WAAW,UAAU,cAAc,8BAC3C,cACA,MAAM,GACN,UAAU,eACT,aAAa,MACb,SAAS,cAAc;EAAQ;GAC/B,QAEC,QAAQ,aAAa,MAAM,SAAS,cAAc;EAAQ;GAAkB;iBACtE,WAAW,GAAG,OAAO,8BAC7B,cACA,MAAM,QAAQ,GAAG,QACjB,UAAU,eAAe,KAAK,SAAS;EAAW;GAAkB,QAClE,QAAQ,KAAK,SAAS;EAAW;GAAkB;iBAqC7C,OAAO,UAAU,cACzB,MAAM,IACJ,QAAQ,aAAa,WAAW,cAAc,iCAAiC;iBACzE,OAAO,GAAG,OAAO,8BACzB,MAAM,QAAQ,GAAG,OAAO,QACtB,QAAQ,UAAU;iBA2BZ,OAAO,UAAU,cAAc,gCAAgC,cACvE,MAAM,GACN,UAAU,eACT,aAAa,MACb,SAAS,cAAc;EAAQ;GAC/B,QAEC,QAAQ,aAAa,MAAM,SAAS,cAAc;EAAQ;GAAkB;iBACtE,OAAO,GAAG,OAAO,8BACzB,MAAM,QAAQ,GAAG,OAAO,OACxB,UAAU,eAAe,KAAK,SAAS;EAAW;aAA4B,WAC5E,QAAQ,KAAK,SAAS;EAAW;aAA4B;;;;;;iBAwChD,gBAAgB,GAAG,YAAY,GAAG;iBAUzC,IAAI,UAAU,cAAc,UAAU,cAC9C,SAAS,GACT,WAAW,IACT,QACF,IAAI,aAAa,IAAI,aAAa,KAClC,IAAI,cAAc,IAAI,cAAc,YAC7B,cAAc;iBAEb,IAAI,GAAG,GAAG,SAAS,GAAG,SAAS,GACvC,SAAS,QAAQ,GAAG,SACpB,WAAW,QAAQ,GAAG,UACpB,QAAQ,IAAI,GAAG,IAAI,IAAI,QAAQ;cAkCrB;;;;;;EAMC,GAAA,UAAA,yBAAsB;;;;;;EAgBrB,IAAA,UAAA,yBAAsB;;;;;;EAgBtB,IAAA,UAAA,yBAAsB;;;;;;EAgBtB,IAAA,UAAA,mDAAgD;;;;;;EAgB/C,KAAA,UAAA,mDAAgD;;;;;;EAgBhD,KAAA,UAAA,mDAAgD;;;;;;EAgBhD,KAAA,UAAA,0BAAuB;;;;;;EA2BpB,QAAA,UAAA,yBAAsB;;;;;;;EAiBlC,MAAA,kBAAgB,MAAQ,GAAC,UAAY,eAAe,YAAY,oBAAiB,QAAA,WAAA,kBAAA,2BAAA;;;;;;;EA2BlE,WAAA,UAAA,eAAe,YAAY,oBAAiB,QAAA,WAAA,kBAAA;;;;;;EAgChD,OAAA,UAAA,yBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6ChC,YAAA,mBAAmB,2BACnB,0BAAmB,cACN,WAAC,IAAA,EAAA,WAAA,wBAAA,sBAAA,0BAAA,QAEZ,GAAC,UACC,4BAEG,WAAW,IAAI,EAAE,WAAW,cAAc,YAAU,mBAG9D,WAAW,IAAI,EAAE,WAAW,mBAAmB,OAAK,gBAEtD,QACA,SAAA,GAAA;;;;;;;;;;;;;EAoBK,OAAA,UAAU,eAAe,qBAAqB,8BAAmB,MACjE,MAAI,QACF,GAAC,UACC,KACT,kBAEG,WAAW,IAAI,EAAE,WAAW,cAAc,UAAU,iBAGpD,WAAW,IAAI,EAAE,WAAW,mBAAmB,KAAK,yBAIvD,UAAA;;;;;;;;;;;;;;;;;EAyBG,KAAA,UAAU,eAAe,4BAA4B,8BAAmB,MACtE,MAAI,QACF,GAAC,UACC,KACT,eACC,mBACE,WAAW,IAAI,EAAE,WAAW,cAAc,eAAe,cAE3D,kBACE,WAAW,IAAI,EAAE,WAAW,mBAAmB,UAAU,iCAE3D,iBAGD,QAAA,GAAA;;;;;;;;;;;;;;EAuBG,KAAA,UAAU,cAAY,UAAY,IAAI"}
package/dist/bcs.mjs CHANGED
@@ -95,7 +95,7 @@ const bcs = {
95
95
  readMethod: "read8",
96
96
  writeMethod: "write8",
97
97
  size: 1,
98
- maxValue: 2 ** 8 - 1,
98
+ maxValue: 255,
99
99
  ...options,
100
100
  name: options?.name ?? "u8"
101
101
  });
@@ -183,7 +183,11 @@ const bcs = {
183
183
  bool(options) {
184
184
  return fixedSizeBcsType({
185
185
  size: 1,
186
- read: (reader) => reader.read8() === 1,
186
+ read: (reader) => {
187
+ const value = reader.read8();
188
+ if (value > 1) throw new TypeError(`Invalid bool value: expected 0 or 1, found ${value}`);
189
+ return value === 1;
190
+ },
187
191
  write: (value, writer) => writer.write8(value ? 1 : 0),
188
192
  ...options,
189
193
  name: options?.name ?? "bool",
@@ -267,7 +271,10 @@ const bcs = {
267
271
  string(options) {
268
272
  return stringLikeBcsType({
269
273
  toBytes: (value) => new TextEncoder().encode(value),
270
- fromBytes: (bytes) => new TextDecoder().decode(bytes),
274
+ fromBytes: (bytes) => new TextDecoder("utf-8", {
275
+ fatal: true,
276
+ ignoreBOM: true
277
+ }).decode(bytes),
271
278
  ...options,
272
279
  name: options?.name ?? "string"
273
280
  });
package/dist/bcs.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bcs.mjs","names":[],"sources":["../src/bcs.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { BcsTypeOptions } from './bcs-type.js';\nimport {\n\tBcsEnum,\n\tBcsStruct,\n\tBcsTuple,\n\tBcsType,\n\tbigUIntBcsType,\n\tdynamicSizeBcsType,\n\tfixedSizeBcsType,\n\tlazyBcsType,\n\tstringLikeBcsType,\n\tuIntBcsType,\n} from './bcs-type.js';\nimport type {\n\tEnumInputShape,\n\tEnumOutputShape,\n\tInferBcsInput,\n\tInferBcsType,\n\tJoinString,\n} from './types.js';\nimport { ulebEncode } from './uleb.js';\n\nfunction fixedArray<T extends BcsType<any>, Name extends string = string>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction fixedArray<T, Input, Name extends string = string>(\n\tsize: number,\n\ttype: BcsType<T, Input>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, Name>,\n): BcsType<T[], Iterable<Input> & { length: number }, Name>;\nfunction fixedArray<T extends BcsType<any>, Name extends string = `${T['name']}[${number}]`>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst result: InferBcsType<T>[] = new Array(size);\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `${type.name}[${size}]`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t\tif (value.length !== size) {\n\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`>;\nfunction option<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n): BcsType<T | null, Input | null | undefined>;\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`> {\n\treturn bcs\n\t\t.enum(`Option<${type.name}>`, {\n\t\t\tNone: null,\n\t\t\tSome: type,\n\t\t})\n\t\t.transform({\n\t\t\tinput: (value: InferBcsInput<T> | null | undefined) => {\n\t\t\t\tif (value == null) {\n\t\t\t\t\treturn { None: true };\n\t\t\t\t}\n\n\t\t\t\treturn { Some: value };\n\t\t\t},\n\t\t\toutput: (value) => {\n\t\t\t\tif (value.$kind === 'Some') {\n\t\t\t\t\treturn value.Some as InferBcsType<T>;\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t});\n}\n\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction vector<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>,\n): BcsType<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>;\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result: InferBcsType<T>[] = new Array(length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\twriter.writeULEB(value.length);\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `vector<${type.name}>`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * Compares two byte arrays using lexicographic ordering.\n * This matches Rust's Ord implementation for Vec<u8>/[u8] which is used for BTreeMap key ordering.\n * Comparison is done byte-by-byte first, then by length if all compared bytes are equal.\n */\nexport function compareBcsBytes(a: Uint8Array, b: Uint8Array): number {\n\tfor (let i = 0; i < Math.min(a.length, b.length); i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn a[i] - b[i];\n\t\t}\n\t}\n\n\treturn a.length - b.length;\n}\n\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n>;\nfunction map<K, V, InputK = K, InputV = V>(\n\tkeyType: BcsType<K, InputK>,\n\tvalueType: BcsType<V, InputV>,\n): BcsType<Map<K, V>, Map<InputK, InputV>, `Map<${string}, ${string}>`>;\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n> {\n\treturn new BcsType({\n\t\tname: `Map<${keyType.name}, ${valueType.name}>`,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result = new Map<InferBcsType<K>, InferBcsType<V>>();\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult.set(keyType.read(reader), valueType.read(reader));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tconst entries = [...value.entries()].map(\n\t\t\t\t([key, val]) => [keyType.serialize(key).toBytes(), val] as const,\n\t\t\t);\n\t\t\tentries.sort(([a], [b]) => compareBcsBytes(a, b));\n\n\t\t\twriter.writeULEB(entries.length);\n\t\t\tfor (const [keyBytes, val] of entries) {\n\t\t\t\twriter.writeBytes(keyBytes);\n\t\t\t\tvalueType.write(val, writer);\n\t\t\t}\n\t\t},\n\t});\n}\n\nexport const bcs = {\n\t/**\n\t * Creates a BcsType that can be used to read and write an 8-bit unsigned integer.\n\t * @example\n\t * bcs.u8().serialize(255).toBytes() // Uint8Array [ 255 ]\n\t */\n\tu8(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read8',\n\t\t\twriteMethod: 'write8',\n\t\t\tsize: 1,\n\t\t\tmaxValue: 2 ** 8 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u8') as 'u8',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 16-bit unsigned integer.\n\t * @example\n\t * bcs.u16().serialize(65535).toBytes() // Uint8Array [ 255, 255 ]\n\t */\n\tu16(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read16',\n\t\t\twriteMethod: 'write16',\n\t\t\tsize: 2,\n\t\t\tmaxValue: 2 ** 16 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u16') as 'u16',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 32-bit unsigned integer.\n\t * @example\n\t * bcs.u32().serialize(4294967295).toBytes() // Uint8Array [ 255, 255, 255, 255 ]\n\t */\n\tu32(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read32',\n\t\t\twriteMethod: 'write32',\n\t\t\tsize: 4,\n\t\t\tmaxValue: 2 ** 32 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u32') as 'u32',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 64-bit unsigned integer.\n\t * @example\n\t * bcs.u64().serialize(1).toBytes() // Uint8Array [ 1, 0, 0, 0, 0, 0, 0, 0 ]\n\t */\n\tu64(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read64',\n\t\t\twriteMethod: 'write64',\n\t\t\tsize: 8,\n\t\t\tmaxValue: 2n ** 64n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u64') as 'u64',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 128-bit unsigned integer.\n\t * @example\n\t * bcs.u128().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu128(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read128',\n\t\t\twriteMethod: 'write128',\n\t\t\tsize: 16,\n\t\t\tmaxValue: 2n ** 128n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u128') as 'u128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 256-bit unsigned integer.\n\t * @example\n\t * bcs.u256().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu256(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read256',\n\t\t\twriteMethod: 'write256',\n\t\t\tsize: 32,\n\t\t\tmaxValue: 2n ** 256n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u256') as 'u256',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write boolean values.\n\t * @example\n\t * bcs.bool().serialize(true).toBytes() // Uint8Array [ 1 ]\n\t */\n\tbool(options?: BcsTypeOptions<boolean>) {\n\t\treturn fixedSizeBcsType({\n\t\t\tsize: 1,\n\t\t\tread: (reader) => reader.read8() === 1,\n\t\t\twrite: (value, writer) => writer.write8(value ? 1 : 0),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'bool') as 'bool',\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'boolean') {\n\t\t\t\t\tthrow new TypeError(`Expected boolean, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write unsigned LEB encoded integers\n\t * @example\n\t *\n\t */\n\tuleb128(options?: BcsTypeOptions<number>) {\n\t\treturn dynamicSizeBcsType({\n\t\t\tread: (reader) => reader.readULEB(),\n\t\t\tserialize: (value) => {\n\t\t\t\treturn Uint8Array.from(ulebEncode(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'uleb128') as 'uleb128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a fixed length byte array\n\t * @param size The number of bytes this types represents\n\t * @example\n\t * bcs.bytes(3).serialize(new Uint8Array([1, 2, 3])).toBytes() // Uint8Array [1, 2, 3]\n\t */\n\tbytes<T extends number>(size: T, options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn fixedSizeBcsType<Uint8Array, Iterable<number>, `bytes[${T}]`>({\n\t\t\tsize,\n\t\t\tread: (reader) => reader.readBytes(size),\n\t\t\twrite: (value, writer) => {\n\t\t\t\twriter.writeBytes(new Uint8Array(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? `bytes[${size}]`) as `bytes[${T}]`,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== size) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a variable length byte array\n\t *\n\t * @example\n\t * bcs.byteVector().serialize([1, 2, 3]).toBytes() // Uint8Array [3, 1, 2, 3]\n\t */\n\tbyteVector(options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn new BcsType<Uint8Array, Iterable<number>, 'vector<u8>'>({\n\t\t\tread: (reader) => {\n\t\t\t\tconst length = reader.readULEB();\n\n\t\t\t\treturn reader.readBytes(length);\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst array = new Uint8Array(value);\n\t\t\t\twriter.writeULEB(array.length);\n\t\t\t\twriter.writeBytes(array);\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'vector<u8>') as 'vector<u8>',\n\t\t\tserializedSize: (value) => {\n\t\t\t\tconst length = 'length' in value ? (value.length as number) : null;\n\t\t\t\treturn length == null ? null : ulebEncode(length).length + length;\n\t\t\t},\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can ser/de string values. Strings will be UTF-8 encoded\n\t * @example\n\t * bcs.string().serialize('a').toBytes() // Uint8Array [ 1, 97 ]\n\t */\n\tstring(options?: BcsTypeOptions<string>) {\n\t\treturn stringLikeBcsType({\n\t\t\ttoBytes: (value) => new TextEncoder().encode(value),\n\t\t\tfromBytes: (bytes) => new TextDecoder().decode(bytes),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'string') as 'string',\n\t\t});\n\t},\n\t/**\n\t * Creates a BcsType that represents a fixed length array of a given type\n\t * @param size The number of elements in the array\n\t * @param type The BcsType of each element in the array\n\t * @example\n\t * bcs.fixedArray(3, bcs.u8()).serialize([1, 2, 3]).toBytes() // Uint8Array [ 1, 2, 3 ]\n\t */\n\tfixedArray,\n\n\t/**\n\t * Creates a BcsType representing an optional value\n\t * @param type The BcsType of the optional value\n\t * @example\n\t * bcs.option(bcs.u8()).serialize(null).toBytes() // Uint8Array [ 0 ]\n\t * bcs.option(bcs.u8()).serialize(1).toBytes() // Uint8Array [ 1, 1 ]\n\t */\n\toption,\n\n\t/**\n\t * Creates a BcsType representing a variable length vector of a given type\n\t * @param type The BcsType of each element in the vector\n\t *\n\t * @example\n\t * bcs.vector(bcs.u8()).toBytes([1, 2, 3]) // Uint8Array [ 3, 1, 2, 3 ]\n\t */\n\tvector,\n\n\t/**\n\t * Creates a BcsType representing a tuple of a given set of types\n\t * @param types The BcsTypes for each element in the tuple\n\t *\n\t * @example\n\t * const tuple = bcs.tuple([bcs.u8(), bcs.string(), bcs.bool()])\n\t * tuple.serialize([1, 'a', true]).toBytes() // Uint8Array [ 1, 1, 97, 1 ]\n\t */\n\ttuple<\n\t\tconst T extends readonly BcsType<any, any>[],\n\t\tconst Name extends string =\n\t\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n\t>(\n\t\tfields: T,\n\t\toptions?: BcsTypeOptions<\n\t\t\t{\n\t\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t\t},\n\t\t\t{\n\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t\t},\n\t\t\tName\n\t\t>,\n\t) {\n\t\treturn new BcsTuple<T, Name>({\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a struct of a given set of fields\n\t * @param name The name of the struct\n\t * @param fields The fields of the struct. The order of the fields affects how data is serialized and deserialized\n\t *\n\t * @example\n\t * const struct = bcs.struct('MyStruct', {\n\t * a: bcs.u8(),\n\t * b: bcs.string(),\n\t * })\n\t * struct.serialize({ a: 1, b: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t */\n\tstruct<T extends Record<string, BcsType<any>>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t\t\t}\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsStruct<T>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing an enum of a given set of options\n\t * @param name The name of the enum\n\t * @param values The values of the enum. The order of the values affects how data is serialized and deserialized.\n\t * null can be used to represent a variant with no data.\n\t *\n\t * @example\n\t * const enum = bcs.enum('MyEnum', {\n\t * A: bcs.u8(),\n\t * B: bcs.string(),\n\t * C: null,\n\t * })\n\t * enum.serialize({ A: 1 }).toBytes() // Uint8Array [ 0, 1 ]\n\t * enum.serialize({ B: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t * enum.serialize({ C: true }).toBytes() // Uint8Array [ 2 ]\n\t */\n\tenum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\tEnumOutputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t\t\t}>,\n\t\t\t\tEnumInputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t\t\t}>,\n\t\t\t\tName\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsEnum<T, Name>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a map of a given key and value type\n\t * @param keyType The BcsType of the key\n\t * @param valueType The BcsType of the value\n\t * @example\n\t * const map = bcs.map(bcs.u8(), bcs.string())\n\t * map.serialize(new Map([[2, 'a']])).toBytes() // Uint8Array [ 1, 2, 1, 97 ]\n\t */\n\tmap,\n\n\t/**\n\t * Creates a BcsType that wraps another BcsType which is lazily evaluated. This is useful for creating recursive types.\n\t * @param cb A callback that returns the BcsType\n\t */\n\tlazy<T extends BcsType<any>>(cb: () => T): T {\n\t\treturn lazyBcsType(cb) as T;\n\t},\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"bcs.mjs","names":[],"sources":["../src/bcs.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { BcsTypeOptions } from './bcs-type.js';\nimport {\n\tBcsEnum,\n\tBcsStruct,\n\tBcsTuple,\n\tBcsType,\n\tbigUIntBcsType,\n\tdynamicSizeBcsType,\n\tfixedSizeBcsType,\n\tlazyBcsType,\n\tstringLikeBcsType,\n\tuIntBcsType,\n} from './bcs-type.js';\nimport type {\n\tEnumInputShape,\n\tEnumOutputShape,\n\tInferBcsInput,\n\tInferBcsType,\n\tJoinString,\n} from './types.js';\nimport { ulebEncode } from './uleb.js';\n\nfunction fixedArray<T extends BcsType<any>, Name extends string = string>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction fixedArray<T, Input, Name extends string = string>(\n\tsize: number,\n\ttype: BcsType<T, Input>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, Name>,\n): BcsType<T[], Iterable<Input> & { length: number }, Name>;\nfunction fixedArray<T extends BcsType<any>, Name extends string = `${T['name']}[${number}]`>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst result: InferBcsType<T>[] = new Array(size);\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `${type.name}[${size}]`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t\tif (value.length !== size) {\n\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`>;\nfunction option<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n): BcsType<T | null, Input | null | undefined>;\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`> {\n\treturn bcs\n\t\t.enum(`Option<${type.name}>`, {\n\t\t\tNone: null,\n\t\t\tSome: type,\n\t\t})\n\t\t.transform({\n\t\t\tinput: (value: InferBcsInput<T> | null | undefined) => {\n\t\t\t\tif (value == null) {\n\t\t\t\t\treturn { None: true };\n\t\t\t\t}\n\n\t\t\t\treturn { Some: value };\n\t\t\t},\n\t\t\toutput: (value) => {\n\t\t\t\tif (value.$kind === 'Some') {\n\t\t\t\t\treturn value.Some as InferBcsType<T>;\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t});\n}\n\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction vector<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>,\n): BcsType<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>;\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result: InferBcsType<T>[] = new Array(length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\twriter.writeULEB(value.length);\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `vector<${type.name}>`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * Compares two byte arrays using lexicographic ordering.\n * This matches Rust's Ord implementation for Vec<u8>/[u8] which is used for BTreeMap key ordering.\n * Comparison is done byte-by-byte first, then by length if all compared bytes are equal.\n */\nexport function compareBcsBytes(a: Uint8Array, b: Uint8Array): number {\n\tfor (let i = 0; i < Math.min(a.length, b.length); i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn a[i] - b[i];\n\t\t}\n\t}\n\n\treturn a.length - b.length;\n}\n\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n>;\nfunction map<K, V, InputK = K, InputV = V>(\n\tkeyType: BcsType<K, InputK>,\n\tvalueType: BcsType<V, InputV>,\n): BcsType<Map<K, V>, Map<InputK, InputV>, `Map<${string}, ${string}>`>;\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n> {\n\treturn new BcsType({\n\t\tname: `Map<${keyType.name}, ${valueType.name}>`,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result = new Map<InferBcsType<K>, InferBcsType<V>>();\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult.set(keyType.read(reader), valueType.read(reader));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tconst entries = [...value.entries()].map(\n\t\t\t\t([key, val]) => [keyType.serialize(key).toBytes(), val] as const,\n\t\t\t);\n\t\t\tentries.sort(([a], [b]) => compareBcsBytes(a, b));\n\n\t\t\twriter.writeULEB(entries.length);\n\t\t\tfor (const [keyBytes, val] of entries) {\n\t\t\t\twriter.writeBytes(keyBytes);\n\t\t\t\tvalueType.write(val, writer);\n\t\t\t}\n\t\t},\n\t});\n}\n\nexport const bcs = {\n\t/**\n\t * Creates a BcsType that can be used to read and write an 8-bit unsigned integer.\n\t * @example\n\t * bcs.u8().serialize(255).toBytes() // Uint8Array [ 255 ]\n\t */\n\tu8(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read8',\n\t\t\twriteMethod: 'write8',\n\t\t\tsize: 1,\n\t\t\tmaxValue: 2 ** 8 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u8') as 'u8',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 16-bit unsigned integer.\n\t * @example\n\t * bcs.u16().serialize(65535).toBytes() // Uint8Array [ 255, 255 ]\n\t */\n\tu16(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read16',\n\t\t\twriteMethod: 'write16',\n\t\t\tsize: 2,\n\t\t\tmaxValue: 2 ** 16 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u16') as 'u16',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 32-bit unsigned integer.\n\t * @example\n\t * bcs.u32().serialize(4294967295).toBytes() // Uint8Array [ 255, 255, 255, 255 ]\n\t */\n\tu32(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read32',\n\t\t\twriteMethod: 'write32',\n\t\t\tsize: 4,\n\t\t\tmaxValue: 2 ** 32 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u32') as 'u32',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 64-bit unsigned integer.\n\t * @example\n\t * bcs.u64().serialize(1).toBytes() // Uint8Array [ 1, 0, 0, 0, 0, 0, 0, 0 ]\n\t */\n\tu64(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read64',\n\t\t\twriteMethod: 'write64',\n\t\t\tsize: 8,\n\t\t\tmaxValue: 2n ** 64n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u64') as 'u64',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 128-bit unsigned integer.\n\t * @example\n\t * bcs.u128().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu128(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read128',\n\t\t\twriteMethod: 'write128',\n\t\t\tsize: 16,\n\t\t\tmaxValue: 2n ** 128n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u128') as 'u128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 256-bit unsigned integer.\n\t * @example\n\t * bcs.u256().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu256(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read256',\n\t\t\twriteMethod: 'write256',\n\t\t\tsize: 32,\n\t\t\tmaxValue: 2n ** 256n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u256') as 'u256',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write boolean values.\n\t * @example\n\t * bcs.bool().serialize(true).toBytes() // Uint8Array [ 1 ]\n\t */\n\tbool(options?: BcsTypeOptions<boolean>) {\n\t\treturn fixedSizeBcsType({\n\t\t\tsize: 1,\n\t\t\tread: (reader) => {\n\t\t\t\tconst value = reader.read8();\n\t\t\t\tif (value > 1) {\n\t\t\t\t\tthrow new TypeError(`Invalid bool value: expected 0 or 1, found ${value}`);\n\t\t\t\t}\n\t\t\t\treturn value === 1;\n\t\t\t},\n\t\t\twrite: (value, writer) => writer.write8(value ? 1 : 0),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'bool') as 'bool',\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'boolean') {\n\t\t\t\t\tthrow new TypeError(`Expected boolean, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write unsigned LEB encoded integers\n\t * @example\n\t *\n\t */\n\tuleb128(options?: BcsTypeOptions<number>) {\n\t\treturn dynamicSizeBcsType({\n\t\t\tread: (reader) => reader.readULEB(),\n\t\t\tserialize: (value) => {\n\t\t\t\treturn Uint8Array.from(ulebEncode(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'uleb128') as 'uleb128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a fixed length byte array\n\t * @param size The number of bytes this types represents\n\t * @example\n\t * bcs.bytes(3).serialize(new Uint8Array([1, 2, 3])).toBytes() // Uint8Array [1, 2, 3]\n\t */\n\tbytes<T extends number>(size: T, options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn fixedSizeBcsType<Uint8Array, Iterable<number>, `bytes[${T}]`>({\n\t\t\tsize,\n\t\t\tread: (reader) => reader.readBytes(size),\n\t\t\twrite: (value, writer) => {\n\t\t\t\twriter.writeBytes(new Uint8Array(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? `bytes[${size}]`) as `bytes[${T}]`,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== size) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a variable length byte array\n\t *\n\t * @example\n\t * bcs.byteVector().serialize([1, 2, 3]).toBytes() // Uint8Array [3, 1, 2, 3]\n\t */\n\tbyteVector(options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn new BcsType<Uint8Array, Iterable<number>, 'vector<u8>'>({\n\t\t\tread: (reader) => {\n\t\t\t\tconst length = reader.readULEB();\n\n\t\t\t\treturn reader.readBytes(length);\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst array = new Uint8Array(value);\n\t\t\t\twriter.writeULEB(array.length);\n\t\t\t\twriter.writeBytes(array);\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'vector<u8>') as 'vector<u8>',\n\t\t\tserializedSize: (value) => {\n\t\t\t\tconst length = 'length' in value ? (value.length as number) : null;\n\t\t\t\treturn length == null ? null : ulebEncode(length).length + length;\n\t\t\t},\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can ser/de string values. Strings will be UTF-8 encoded\n\t * @example\n\t * bcs.string().serialize('a').toBytes() // Uint8Array [ 1, 97 ]\n\t */\n\tstring(options?: BcsTypeOptions<string>) {\n\t\treturn stringLikeBcsType({\n\t\t\ttoBytes: (value) => new TextEncoder().encode(value),\n\t\t\tfromBytes: (bytes) =>\n\t\t\t\tnew TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'string') as 'string',\n\t\t});\n\t},\n\t/**\n\t * Creates a BcsType that represents a fixed length array of a given type\n\t * @param size The number of elements in the array\n\t * @param type The BcsType of each element in the array\n\t * @example\n\t * bcs.fixedArray(3, bcs.u8()).serialize([1, 2, 3]).toBytes() // Uint8Array [ 1, 2, 3 ]\n\t */\n\tfixedArray,\n\n\t/**\n\t * Creates a BcsType representing an optional value\n\t * @param type The BcsType of the optional value\n\t * @example\n\t * bcs.option(bcs.u8()).serialize(null).toBytes() // Uint8Array [ 0 ]\n\t * bcs.option(bcs.u8()).serialize(1).toBytes() // Uint8Array [ 1, 1 ]\n\t */\n\toption,\n\n\t/**\n\t * Creates a BcsType representing a variable length vector of a given type\n\t * @param type The BcsType of each element in the vector\n\t *\n\t * @example\n\t * bcs.vector(bcs.u8()).toBytes([1, 2, 3]) // Uint8Array [ 3, 1, 2, 3 ]\n\t */\n\tvector,\n\n\t/**\n\t * Creates a BcsType representing a tuple of a given set of types\n\t * @param types The BcsTypes for each element in the tuple\n\t *\n\t * @example\n\t * const tuple = bcs.tuple([bcs.u8(), bcs.string(), bcs.bool()])\n\t * tuple.serialize([1, 'a', true]).toBytes() // Uint8Array [ 1, 1, 97, 1 ]\n\t */\n\ttuple<\n\t\tconst T extends readonly BcsType<any, any>[],\n\t\tconst Name extends string =\n\t\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n\t>(\n\t\tfields: T,\n\t\toptions?: BcsTypeOptions<\n\t\t\t{\n\t\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t\t},\n\t\t\t{\n\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t\t},\n\t\t\tName\n\t\t>,\n\t) {\n\t\treturn new BcsTuple<T, Name>({\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a struct of a given set of fields\n\t * @param name The name of the struct\n\t * @param fields The fields of the struct. The order of the fields affects how data is serialized and deserialized\n\t *\n\t * @example\n\t * const struct = bcs.struct('MyStruct', {\n\t * a: bcs.u8(),\n\t * b: bcs.string(),\n\t * })\n\t * struct.serialize({ a: 1, b: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t */\n\tstruct<T extends Record<string, BcsType<any>>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t\t\t}\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsStruct<T>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing an enum of a given set of options\n\t * @param name The name of the enum\n\t * @param values The values of the enum. The order of the values affects how data is serialized and deserialized.\n\t * null can be used to represent a variant with no data.\n\t *\n\t * @example\n\t * const enum = bcs.enum('MyEnum', {\n\t * A: bcs.u8(),\n\t * B: bcs.string(),\n\t * C: null,\n\t * })\n\t * enum.serialize({ A: 1 }).toBytes() // Uint8Array [ 0, 1 ]\n\t * enum.serialize({ B: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t * enum.serialize({ C: true }).toBytes() // Uint8Array [ 2 ]\n\t */\n\tenum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\tEnumOutputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t\t\t}>,\n\t\t\t\tEnumInputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t\t\t}>,\n\t\t\t\tName\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsEnum<T, Name>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a map of a given key and value type\n\t * @param keyType The BcsType of the key\n\t * @param valueType The BcsType of the value\n\t * @example\n\t * const map = bcs.map(bcs.u8(), bcs.string())\n\t * map.serialize(new Map([[2, 'a']])).toBytes() // Uint8Array [ 1, 2, 1, 97 ]\n\t */\n\tmap,\n\n\t/**\n\t * Creates a BcsType that wraps another BcsType which is lazily evaluated. This is useful for creating recursive types.\n\t * @param cb A callback that returns the BcsType\n\t */\n\tlazy<T extends BcsType<any>>(cb: () => T): T {\n\t\treturn lazyBcsType(cb) as T;\n\t},\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.mts","names":[],"sources":["../src/reader.ts"],"mappings":";;AAmCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,SAAA;EAAA,QACJ,QAAA;EAAA,QACA,YAAA;EA8GyD;;;cAzGrD,IAAA,EAAM,UAAA;;;;;;;EASlB,KAAA,CAAM,KAAA;;;;;EAQN,KAAA;;;;;EASA,MAAA;;;;;EASA,MAAA;;;;;EASA,MAAA;;;;EAWA,OAAA;;;;;EAWA,OAAA;;;;;EAWA,SAAA,CAAU,GAAA,WAAc,UAAA;;;;;;EAaxB,QAAA;;;;;;;EAeA,OAAA,CAAQ,EAAA,GAAK,MAAA,EAAQ,SAAA,EAAW,CAAA,UAAW,MAAA;AAAA"}
1
+ {"version":3,"file":"reader.d.mts","names":[],"sources":["../src/reader.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmCa;UACJ;UACA;;;;EAKR,YAAY,MAAM;;;;;;;EASlB,MAAM;;;;;EAQN;;;;;EASA;;;;;EASA;;;;;EASA;;;;EAWA;;;;;EAWA;;;;;EAWA,UAAU,cAAc;;;;;;EAaxB;;;;;;;EAeA,QAAQ,KAAK,QAAQ,WAAW,WAAW"}
package/dist/reader.mjs CHANGED
@@ -118,7 +118,8 @@ var BcsReader = class {
118
118
  */
119
119
  readULEB() {
120
120
  const start = this.bytePosition + this.dataView.byteOffset;
121
- const { value, length } = ulebDecode(new Uint8Array(this.dataView.buffer, start));
121
+ const buffer = new Uint8Array(this.dataView.buffer, start);
122
+ const { value, length } = ulebDecode(buffer);
122
123
  this.shift(length);
123
124
  return value;
124
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reader.mjs","names":[],"sources":["../src/reader.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ulebDecode } from './uleb.js';\n\n/**\n * Class used for reading BCS data chunk by chunk. Meant to be used\n * by some wrapper, which will make sure that data is valid and is\n * matching the desired format.\n *\n * @example\n * // data for this example is:\n * // { a: u8, b: u32, c: bool, d: u64 }\n *\n * let reader = new BcsReader(\"647f1a060001ffffe7890423c78a050102030405\");\n * let field1 = reader.read8();\n * let field2 = reader.read32();\n * let field3 = reader.read8() === '1'; // bool\n * let field4 = reader.read64();\n * // ....\n *\n * Reading vectors is another deal in bcs. To read a vector, you first need to read\n * its length using {@link readULEB}. Here's an example:\n * @example\n * // data encoded: { field: [1, 2, 3, 4, 5] }\n * let reader = new BcsReader(\"050102030405\");\n * let vec_length = reader.readULEB();\n * let elements = [];\n * for (let i = 0; i < vec_length; i++) {\n * elements.push(reader.read8());\n * }\n * console.log(elements); // [1,2,3,4,5]\n *\n * @param {String} data HEX-encoded data (serialized BCS)\n */\nexport class BcsReader {\n\tprivate dataView: DataView;\n\tprivate bytePosition: number = 0;\n\n\t/**\n\t * @param {Uint8Array} data Data to use as a buffer.\n\t */\n\tconstructor(data: Uint8Array) {\n\t\tthis.dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\t}\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number) {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Read U8 value from the buffer and shift cursor by 1.\n\t * @returns\n\t */\n\tread8(): number {\n\t\tconst value = this.dataView.getUint8(this.bytePosition);\n\t\tthis.shift(1);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U16 value from the buffer and shift cursor by 2.\n\t * @returns\n\t */\n\tread16(): number {\n\t\tconst value = this.dataView.getUint16(this.bytePosition, true);\n\t\tthis.shift(2);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U32 value from the buffer and shift cursor by 4.\n\t * @returns\n\t */\n\tread32(): number {\n\t\tconst value = this.dataView.getUint32(this.bytePosition, true);\n\t\tthis.shift(4);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U64 value from the buffer and shift cursor by 8.\n\t * @returns\n\t */\n\tread64(): string {\n\t\tconst value1 = this.read32();\n\t\tconst value2 = this.read32();\n\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(8, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 16.\n\t */\n\tread128(): string {\n\t\tconst value1 = BigInt(this.read64());\n\t\tconst value2 = BigInt(this.read64());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(16, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 32.\n\t * @returns\n\t */\n\tread256(): string {\n\t\tconst value1 = BigInt(this.read128());\n\t\tconst value2 = BigInt(this.read128());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(32, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read `num` number of bytes from the buffer and shift cursor by `num`.\n\t * @param num Number of bytes to read.\n\t */\n\treadBytes(num: number): Uint8Array {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst value = new Uint8Array(this.dataView.buffer, start, num);\n\n\t\tthis.shift(num);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read ULEB value - an integer of varying size. Used for enum indexes and\n\t * vector lengths.\n\t * @returns {Number} The ULEB value.\n\t */\n\treadULEB(): number {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst buffer = new Uint8Array(this.dataView.buffer, start);\n\t\tconst { value, length } = ulebDecode(buffer);\n\n\t\tthis.shift(length);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read a BCS vector: read a length and then apply function `cb` X times\n\t * where X is the length of the vector, defined as ULEB in BCS bytes.\n\t * @param cb Callback to process elements of vector.\n\t * @returns {Array<Any>} Array of the resulting values, returned by callback.\n\t */\n\treadVec(cb: (reader: BcsReader, i: number, length: number) => any): any[] {\n\t\tconst length = this.readULEB();\n\t\tconst result = [];\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult.push(cb(this, i, length));\n\t\t}\n\t\treturn result;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAa,YAAb,MAAuB;;;;CAOtB,YAAY,MAAkB;sBALC;EAM9B,KAAK,WAAW,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CAC3E;;;;;;;CAOA,MAAM,OAAe;EACpB,KAAK,gBAAgB;EACrB,OAAO;CACR;;;;;CAKA,QAAgB;EACf,MAAM,QAAQ,KAAK,SAAS,SAAS,KAAK,YAAY;EACtD,KAAK,MAAM,CAAC;EACZ,OAAO;CACR;;;;;CAKA,SAAiB;EAChB,MAAM,QAAQ,KAAK,SAAS,UAAU,KAAK,cAAc,IAAI;EAC7D,KAAK,MAAM,CAAC;EACZ,OAAO;CACR;;;;;CAKA,SAAiB;EAChB,MAAM,QAAQ,KAAK,SAAS,UAAU,KAAK,cAAc,IAAI;EAC7D,KAAK,MAAM,CAAC;EACZ,OAAO;CACR;;;;;CAKA,SAAiB;EAChB,MAAM,SAAS,KAAK,OAAO;EAG3B,MAAM,SAFS,KAAK,OAEA,CAAC,CAAC,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;EAExE,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE;CACzC;;;;CAIA,UAAkB;EACjB,MAAM,SAAS,OAAO,KAAK,OAAO,CAAC;EAEnC,MAAM,SADS,OAAO,KAAK,OAAO,CACd,CAAC,CAAC,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG;EAEzE,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE;CACzC;;;;;CAKA,UAAkB;EACjB,MAAM,SAAS,OAAO,KAAK,QAAQ,CAAC;EAEpC,MAAM,SADS,OAAO,KAAK,QAAQ,CACf,CAAC,CAAC,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG;EAEzE,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE;CACzC;;;;;CAKA,UAAU,KAAyB;EAClC,MAAM,QAAQ,KAAK,eAAe,KAAK,SAAS;EAChD,MAAM,QAAQ,IAAI,WAAW,KAAK,SAAS,QAAQ,OAAO,GAAG;EAE7D,KAAK,MAAM,GAAG;EAEd,OAAO;CACR;;;;;;CAMA,WAAmB;EAClB,MAAM,QAAQ,KAAK,eAAe,KAAK,SAAS;EAEhD,MAAM,EAAE,OAAO,WAAW,WAAW,IADlB,WAAW,KAAK,SAAS,QAAQ,KACV,CAAC;EAE3C,KAAK,MAAM,MAAM;EAEjB,OAAO;CACR;;;;;;;CAOA,QAAQ,IAAkE;EACzE,MAAM,SAAS,KAAK,SAAS;EAC7B,MAAM,SAAS,CAAC;EAChB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAC3B,OAAO,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;EAEhC,OAAO;CACR;AACD"}
1
+ {"version":3,"file":"reader.mjs","names":[],"sources":["../src/reader.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ulebDecode } from './uleb.js';\n\n/**\n * Class used for reading BCS data chunk by chunk. Meant to be used\n * by some wrapper, which will make sure that data is valid and is\n * matching the desired format.\n *\n * @example\n * // data for this example is:\n * // { a: u8, b: u32, c: bool, d: u64 }\n *\n * let reader = new BcsReader(\"647f1a060001ffffe7890423c78a050102030405\");\n * let field1 = reader.read8();\n * let field2 = reader.read32();\n * let field3 = reader.read8() === '1'; // bool\n * let field4 = reader.read64();\n * // ....\n *\n * Reading vectors is another deal in bcs. To read a vector, you first need to read\n * its length using {@link readULEB}. Here's an example:\n * @example\n * // data encoded: { field: [1, 2, 3, 4, 5] }\n * let reader = new BcsReader(\"050102030405\");\n * let vec_length = reader.readULEB();\n * let elements = [];\n * for (let i = 0; i < vec_length; i++) {\n * elements.push(reader.read8());\n * }\n * console.log(elements); // [1,2,3,4,5]\n *\n * @param {String} data HEX-encoded data (serialized BCS)\n */\nexport class BcsReader {\n\tprivate dataView: DataView;\n\tprivate bytePosition: number = 0;\n\n\t/**\n\t * @param {Uint8Array} data Data to use as a buffer.\n\t */\n\tconstructor(data: Uint8Array) {\n\t\tthis.dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\t}\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number) {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Read U8 value from the buffer and shift cursor by 1.\n\t * @returns\n\t */\n\tread8(): number {\n\t\tconst value = this.dataView.getUint8(this.bytePosition);\n\t\tthis.shift(1);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U16 value from the buffer and shift cursor by 2.\n\t * @returns\n\t */\n\tread16(): number {\n\t\tconst value = this.dataView.getUint16(this.bytePosition, true);\n\t\tthis.shift(2);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U32 value from the buffer and shift cursor by 4.\n\t * @returns\n\t */\n\tread32(): number {\n\t\tconst value = this.dataView.getUint32(this.bytePosition, true);\n\t\tthis.shift(4);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U64 value from the buffer and shift cursor by 8.\n\t * @returns\n\t */\n\tread64(): string {\n\t\tconst value1 = this.read32();\n\t\tconst value2 = this.read32();\n\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(8, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 16.\n\t */\n\tread128(): string {\n\t\tconst value1 = BigInt(this.read64());\n\t\tconst value2 = BigInt(this.read64());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(16, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 32.\n\t * @returns\n\t */\n\tread256(): string {\n\t\tconst value1 = BigInt(this.read128());\n\t\tconst value2 = BigInt(this.read128());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(32, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read `num` number of bytes from the buffer and shift cursor by `num`.\n\t * @param num Number of bytes to read.\n\t */\n\treadBytes(num: number): Uint8Array {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst value = new Uint8Array(this.dataView.buffer, start, num);\n\n\t\tthis.shift(num);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read ULEB value - an integer of varying size. Used for enum indexes and\n\t * vector lengths.\n\t * @returns {Number} The ULEB value.\n\t */\n\treadULEB(): number {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst buffer = new Uint8Array(this.dataView.buffer, start);\n\t\tconst { value, length } = ulebDecode(buffer);\n\n\t\tthis.shift(length);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read a BCS vector: read a length and then apply function `cb` X times\n\t * where X is the length of the vector, defined as ULEB in BCS bytes.\n\t * @param cb Callback to process elements of vector.\n\t * @returns {Array<Any>} Array of the resulting values, returned by callback.\n\t */\n\treadVec(cb: (reader: BcsReader, i: number, length: number) => any): any[] {\n\t\tconst length = this.readULEB();\n\t\tconst result = [];\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult.push(cb(this, i, length));\n\t\t}\n\t\treturn result;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAa,YAAb,MAAuB;;;;CAOtB,YAAY,MAAkB;EALC,KAAA,eAAA;EAM9B,KAAK,WAAW,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CAC3E;;;;;;;CAOA,MAAM,OAAe;EACpB,KAAK,gBAAgB;EACrB,OAAO;CACR;;;;;CAKA,QAAgB;EACf,MAAM,QAAQ,KAAK,SAAS,SAAS,KAAK,YAAY;EACtD,KAAK,MAAM,CAAC;EACZ,OAAO;CACR;;;;;CAKA,SAAiB;EAChB,MAAM,QAAQ,KAAK,SAAS,UAAU,KAAK,cAAc,IAAI;EAC7D,KAAK,MAAM,CAAC;EACZ,OAAO;CACR;;;;;CAKA,SAAiB;EAChB,MAAM,QAAQ,KAAK,SAAS,UAAU,KAAK,cAAc,IAAI;EAC7D,KAAK,MAAM,CAAC;EACZ,OAAO;CACR;;;;;CAKA,SAAiB;EAChB,MAAM,SAAS,KAAK,OAAO;EAG3B,MAAM,SAFS,KAAK,OAEA,CAAC,CAAC,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;EAExE,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE;CACzC;;;;CAIA,UAAkB;EACjB,MAAM,SAAS,OAAO,KAAK,OAAO,CAAC;EAEnC,MAAM,SADS,OAAO,KAAK,OAAO,CACd,CAAC,CAAC,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG;EAEzE,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE;CACzC;;;;;CAKA,UAAkB;EACjB,MAAM,SAAS,OAAO,KAAK,QAAQ,CAAC;EAEpC,MAAM,SADS,OAAO,KAAK,QAAQ,CACf,CAAC,CAAC,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG;EAEzE,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE;CACzC;;;;;CAKA,UAAU,KAAyB;EAClC,MAAM,QAAQ,KAAK,eAAe,KAAK,SAAS;EAChD,MAAM,QAAQ,IAAI,WAAW,KAAK,SAAS,QAAQ,OAAO,GAAG;EAE7D,KAAK,MAAM,GAAG;EAEd,OAAO;CACR;;;;;;CAMA,WAAmB;EAClB,MAAM,QAAQ,KAAK,eAAe,KAAK,SAAS;EAChD,MAAM,SAAS,IAAI,WAAW,KAAK,SAAS,QAAQ,KAAK;EACzD,MAAM,EAAE,OAAO,WAAW,WAAW,MAAM;EAE3C,KAAK,MAAM,MAAM;EAEjB,OAAO;CACR;;;;;;;CAOA,QAAQ,IAAkE;EACzE,MAAM,SAAS,KAAK,SAAS;EAC7B,MAAM,SAAS,CAAC;EAChB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAC3B,OAAO,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;EAEhC,OAAO;CACR;AACD"}
package/dist/types.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { BcsType } from "./bcs-type.mjs";
2
2
  import { Simplify } from "@haneullabs/utils";
3
-
4
3
  //#region src/types.d.ts
5
4
  /**
6
5
  * Supported encodings.
@@ -9,11 +8,11 @@ import { Simplify } from "@haneullabs/utils";
9
8
  type Encoding = 'base58' | 'base64' | 'hex';
10
9
  type InferBcsType<T extends BcsType<any>> = T extends BcsType<infer U, any> ? U : never;
11
10
  type InferBcsInput<T extends BcsType<any, any>> = T extends BcsType<any, infer U> ? U : never;
12
- type EnumOutputShape<T extends Record<string, unknown>, Keys extends string = Extract<keyof T, string>, Values = (T[keyof T] extends infer Type ? (Type extends BcsType<infer U> ? U : never) : never)> = 0 extends Values ? EnumOutputShapeWithKeys<T, never> : 0n extends Values ? EnumOutputShapeWithKeys<T, never> : '' extends Values ? EnumOutputShapeWithKeys<T, never> : false extends Values ? EnumOutputShapeWithKeys<T, never> : EnumOutputShapeWithKeys<T, Keys>;
13
- type EnumOutputShapeWithKeys<T extends Record<string, unknown>, Keys extends string> = { [K in keyof T]: Exclude<Keys, K> extends infer Empty extends string ? Simplify<{ [K2 in K]: T[K] } & { [K in Empty]?: never } & {
11
+ type EnumOutputShape<T extends Record<string, unknown>, Keys extends string = Extract<keyof T, string>, Values = T[keyof T] extends (infer Type) ? (Type extends BcsType<infer U> ? U : never) : never> = 0 extends Values ? EnumOutputShapeWithKeys<T, never> : 0n extends Values ? EnumOutputShapeWithKeys<T, never> : '' extends Values ? EnumOutputShapeWithKeys<T, never> : false extends Values ? EnumOutputShapeWithKeys<T, never> : EnumOutputShapeWithKeys<T, Keys>;
12
+ type EnumOutputShapeWithKeys<T extends Record<string, unknown>, Keys extends string> = { [K in keyof T]: Exclude<Keys, K> extends (infer Empty extends string) ? Simplify<{ [K2 in K]: T[K]; } & { [K in Empty]?: never; } & {
14
13
  $kind: K;
15
- }> : never }[keyof T];
16
- type EnumInputShape<T extends Record<string, unknown>> = { [K in keyof T]: { [K2 in K]: T[K] } }[keyof T];
14
+ }> : never; }[keyof T];
15
+ type EnumInputShape<T extends Record<string, unknown>> = { [K in keyof T]: { [K2 in K]: T[K]; }; }[keyof T];
17
16
  type JoinString<T, Sep extends string> = T extends readonly [infer F extends string, ...infer R extends string[]] ? [] extends R ? F : `${F}${Sep}${JoinString<R, Sep>}` : '';
18
17
  //#endregion
19
18
  export { Encoding, EnumInputShape, EnumOutputShape, EnumOutputShapeWithKeys, InferBcsInput, InferBcsType, JoinString };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;AAUA;;KAAY,QAAA;AAAA,KAEA,YAAA,WAAuB,OAAA,SAAgB,CAAA,SAAU,OAAA,iBAAwB,CAAA;AAAA,KACzE,aAAA,WAAwB,OAAA,cACnC,CAAA,SAAU,OAAA,iBAAwB,CAAA;AAAA,KAEvB,eAAA,WACD,MAAA,yCACY,OAAA,OAAc,CAAA,qBAC3B,CAAA,OAAQ,CAAA,wBAAyB,IAAA,SAAa,OAAA,YAAmB,CAAA,gCAC7D,MAAA,GACX,uBAAA,CAAwB,CAAA,sBACb,MAAA,GACV,uBAAA,CAAwB,CAAA,sBACb,MAAA,GACV,uBAAA,CAAwB,CAAA,yBACV,MAAA,GACb,uBAAA,CAAwB,CAAA,WACxB,uBAAA,CAAwB,CAAA,EAAG,IAAA;AAAA,KAErB,uBAAA,WAAkC,MAAA,wDACjC,CAAA,GAAI,OAAA,CAAQ,IAAA,EAAM,CAAA,uCAC3B,QAAA,UACS,CAAA,GAAI,CAAA,CAAE,CAAA,cAAe,KAAA;EAC7B,KAAA,EAAO,CAAA;AAAA,mBAIJ,CAAA;AAAA,KAEI,cAAA,WAAyB,MAAA,mCACxB,CAAA,YAAa,CAAA,GAAI,CAAA,CAAE,CAAA,YACxB,CAAA;AAAA,KAEI,UAAA,0BAAoC,CAAA,qFAIlC,CAAA,GACV,CAAA,MACG,CAAA,GAAI,GAAA,GAAM,UAAA,CAAW,CAAA,EAAG,GAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;KAUY;KAEA,aAAa,UAAU,gBAAgB,UAAU,cAAc,UAAU;KACzE,cAAc,UAAU,qBACnC,UAAU,mBAAmB,KAAK;KAEvB,gBACX,UAAU,yBACV,sBAAsB,cAAc,YACpC,SAAS,QAAQ,kBAAiB,SAAQ,aAAa,cAAc,KAAK,gCAC7D,SACX,wBAAwB,uBACb,SACV,wBAAwB,uBACb,SACV,wBAAwB,0BACV,SACb,wBAAwB,YACxB,wBAAwB,GAAG;KAErB,wBAAwB,UAAU,yBAAyB,0BACrE,WAAW,IAAI,QAAQ,MAAM,kBAAiB,wBAC5C,YACG,MAAM,IAAI,EAAE,WAAU,KAAK;EAC7B,OAAO;oBAIJ;KAEI,eAAe,UAAU,8BACnC,WAAW,OAAO,MAAM,IAAI,EAAE,eACxB;KAEI,WAAW,GAAG,sBAAsB,0BACzC,2BACG,iCAEI,IACV,OACG,IAAI,MAAM,WAAW,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"uleb.d.mts","names":[],"sources":["../src/uleb.ts"],"mappings":";iBAKgB,UAAA,CAAW,GAAoB;AAAA,iBAuB/B,UAAA,CAAW,GAAA,aAAgB,UAAU;EACpD,KAAA;EACA,MAAA;AAAA"}
1
+ {"version":3,"file":"uleb.d.mts","names":[],"sources":["../src/uleb.ts"],"mappings":";iBAKgB,WAAW;iBAuBX,WAAW,gBAAgB;EAC1C;EACA"}
package/dist/uleb.mjs CHANGED
@@ -21,7 +21,10 @@ function ulebDecode(arr) {
21
21
  const byte = arr[len];
22
22
  len += 1;
23
23
  total += BigInt(byte & 127) << shift;
24
- if ((byte & 128) === 0) break;
24
+ if ((byte & 128) === 0) {
25
+ if (byte === 0 && len > 1) throw new Error("ULEB decode error: non-canonical encoding");
26
+ break;
27
+ }
25
28
  shift += 7n;
26
29
  }
27
30
  if (total > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error("ULEB decode error: value exceeds MAX_SAFE_INTEGER");
package/dist/uleb.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"uleb.mjs","names":[],"sources":["../src/uleb.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// Helper utility: write number as an ULEB array.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebEncode(num: number | bigint): number[] {\n\tlet bigNum = BigInt(num);\n\tconst arr: number[] = [];\n\tlet len = 0;\n\n\tif (bigNum === 0n) {\n\t\treturn [0];\n\t}\n\n\twhile (bigNum > 0) {\n\t\tarr[len] = Number(bigNum & 0x7fn);\n\t\tbigNum >>= 7n;\n\t\tif (bigNum > 0n) {\n\t\t\tarr[len] |= 0x80;\n\t\t}\n\t\tlen += 1;\n\t}\n\n\treturn arr;\n}\n\n// Helper utility: decode ULEB as an array of numbers.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebDecode(arr: number[] | Uint8Array): {\n\tvalue: number;\n\tlength: number;\n} {\n\tlet total = 0n;\n\tlet shift = 0n;\n\tlet len = 0;\n\n\twhile (true) {\n\t\tif (len >= arr.length) {\n\t\t\tthrow new Error('ULEB decode error: buffer overflow');\n\t\t}\n\n\t\tconst byte = arr[len];\n\t\tlen += 1;\n\t\ttotal += BigInt(byte & 0x7f) << shift;\n\t\tif ((byte & 0x80) === 0) {\n\t\t\tbreak;\n\t\t}\n\t\tshift += 7n;\n\t}\n\n\t// TODO: return bigint in next major version\n\tif (total > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new Error('ULEB decode error: value exceeds MAX_SAFE_INTEGER');\n\t}\n\n\treturn {\n\t\tvalue: Number(total),\n\t\tlength: len,\n\t};\n}\n"],"mappings":";AAKA,SAAgB,WAAW,KAAgC;CAC1D,IAAI,SAAS,OAAO,GAAG;CACvB,MAAM,MAAgB,CAAC;CACvB,IAAI,MAAM;CAEV,IAAI,WAAW,IACd,OAAO,CAAC,CAAC;CAGV,OAAO,SAAS,GAAG;EAClB,IAAI,OAAO,OAAO,SAAS,IAAK;EAChC,WAAW;EACX,IAAI,SAAS,IACZ,IAAI,QAAQ;EAEb,OAAO;CACR;CAEA,OAAO;AACR;AAIA,SAAgB,WAAW,KAGzB;CACD,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,IAAI,MAAM;CAEV,OAAO,MAAM;EACZ,IAAI,OAAO,IAAI,QACd,MAAM,IAAI,MAAM,oCAAoC;EAGrD,MAAM,OAAO,IAAI;EACjB,OAAO;EACP,SAAS,OAAO,OAAO,GAAI,KAAK;EAChC,KAAK,OAAO,SAAU,GACrB;EAED,SAAS;CACV;CAGA,IAAI,QAAQ,OAAO,OAAO,gBAAgB,GACzC,MAAM,IAAI,MAAM,mDAAmD;CAGpE,OAAO;EACN,OAAO,OAAO,KAAK;EACnB,QAAQ;CACT;AACD"}
1
+ {"version":3,"file":"uleb.mjs","names":[],"sources":["../src/uleb.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// Helper utility: write number as an ULEB array.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebEncode(num: number | bigint): number[] {\n\tlet bigNum = BigInt(num);\n\tconst arr: number[] = [];\n\tlet len = 0;\n\n\tif (bigNum === 0n) {\n\t\treturn [0];\n\t}\n\n\twhile (bigNum > 0) {\n\t\tarr[len] = Number(bigNum & 0x7fn);\n\t\tbigNum >>= 7n;\n\t\tif (bigNum > 0n) {\n\t\t\tarr[len] |= 0x80;\n\t\t}\n\t\tlen += 1;\n\t}\n\n\treturn arr;\n}\n\n// Helper utility: decode ULEB as an array of numbers.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebDecode(arr: number[] | Uint8Array): {\n\tvalue: number;\n\tlength: number;\n} {\n\tlet total = 0n;\n\tlet shift = 0n;\n\tlet len = 0;\n\n\twhile (true) {\n\t\tif (len >= arr.length) {\n\t\t\tthrow new Error('ULEB decode error: buffer overflow');\n\t\t}\n\n\t\tconst byte = arr[len];\n\t\tlen += 1;\n\t\ttotal += BigInt(byte & 0x7f) << shift;\n\t\tif ((byte & 0x80) === 0) {\n\t\t\t// A trailing zero group adds no value, so the encoding is not minimal\n\t\t\tif (byte === 0 && len > 1) {\n\t\t\t\tthrow new Error('ULEB decode error: non-canonical encoding');\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tshift += 7n;\n\t}\n\n\t// TODO: return bigint in next major version\n\tif (total > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new Error('ULEB decode error: value exceeds MAX_SAFE_INTEGER');\n\t}\n\n\treturn {\n\t\tvalue: Number(total),\n\t\tlength: len,\n\t};\n}\n"],"mappings":";AAKA,SAAgB,WAAW,KAAgC;CAC1D,IAAI,SAAS,OAAO,GAAG;CACvB,MAAM,MAAgB,CAAC;CACvB,IAAI,MAAM;CAEV,IAAI,WAAW,IACd,OAAO,CAAC,CAAC;CAGV,OAAO,SAAS,GAAG;EAClB,IAAI,OAAO,OAAO,SAAS,IAAK;EAChC,WAAW;EACX,IAAI,SAAS,IACZ,IAAI,QAAQ;EAEb,OAAO;CACR;CAEA,OAAO;AACR;AAIA,SAAgB,WAAW,KAGzB;CACD,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,IAAI,MAAM;CAEV,OAAO,MAAM;EACZ,IAAI,OAAO,IAAI,QACd,MAAM,IAAI,MAAM,oCAAoC;EAGrD,MAAM,OAAO,IAAI;EACjB,OAAO;EACP,SAAS,OAAO,OAAO,GAAI,KAAK;EAChC,KAAK,OAAO,SAAU,GAAG;GAExB,IAAI,SAAS,KAAK,MAAM,GACvB,MAAM,IAAI,MAAM,2CAA2C;GAE5D;EACD;EACA,SAAS;CACV;CAGA,IAAI,QAAQ,OAAO,OAAO,gBAAgB,GACzC,MAAM,IAAI,MAAM,mDAAmD;CAGpE,OAAO;EACN,OAAO,OAAO,KAAK;EACnB,QAAQ;CACT;AACD"}
package/dist/utils.d.mts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { Encoding } from "./types.mjs";
2
-
3
2
  //#region src/utils.d.ts
4
3
  /**
5
4
  * Encode data with either `hex` or `base64`.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","names":[],"sources":["../src/utils.ts"],"mappings":";;;;;AAaA;;;;;iBAAgB,SAAA,CAAU,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,QAAQ;;;;AAAA;AAoB9D;;;iBAAgB,SAAA,CAAU,IAAA,UAAc,QAAA,EAAU,QAAA,GAAW,UAAU;AAAA,iBAavD,sBAAA,CACf,GAAA,UACA,iBAAgD"}
1
+ {"version":3,"file":"utils.d.mts","names":[],"sources":["../src/utils.ts"],"mappings":";;;;;;;;;iBAagB,UAAU,MAAM,YAAY,UAAU;;;;;;;;iBAoBtC,UAAU,cAAc,UAAU,WAAW;iBAa7C,uBACf,aACA"}
package/dist/writer.d.mts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { Encoding } from "./types.mjs";
2
-
3
2
  //#region src/writer.d.ts
4
3
  interface BcsWriterOptions {
5
4
  /** The initial size (in bytes) of the buffer tht will be allocated */
@@ -32,11 +31,7 @@ declare class BcsWriter {
32
31
  private size;
33
32
  private maxSize;
34
33
  private allocateSize;
35
- constructor({
36
- initialSize,
37
- maxSize,
38
- allocateSize
39
- }?: BcsWriterOptions);
34
+ constructor({ initialSize, maxSize, allocateSize }?: BcsWriterOptions);
40
35
  private ensureSizeOrGrow;
41
36
  /**
42
37
  * Shift current cursor position by `bytes`.
@@ -1 +1 @@
1
- {"version":3,"file":"writer.d.mts","names":[],"sources":["../src/writer.ts"],"mappings":";;;UAOiB,gBAAA;;EAEhB,WAAA;EAFgC;EAIhC,OAAA;EAJgC;EAMhC,YAAA;AAAA;;;AAAY;AAqBb;;;;;;;;;;;;;;cAAa,SAAA;EAAA,QACJ,QAAA;EAAA,QACA,YAAA;EAAA,QACA,IAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;;IAGP,WAAA;IACA,OAAA;IACA;EAAA,IACE,gBAAA;EAAA,QAOK,gBAAA;;;;;;;EA0BR,KAAA,CAAM,KAAA;EAjCH;;;;;EA0CH,MAAA,CAAO,KAAA;EAWP;;;;;EAAA,UAAA,CAAW,KAAA,EAAO,UAAA;EAwBV;;;;;EAVR,OAAA,CAAQ,KAAA;EA0CC;;;;;EAhCT,OAAA,CAAQ,KAAA;EAuDqB;;;;;EA7C7B,OAAA,CAAQ,KAAA;EAwDC;;;;;;EA7CT,QAAA,CAAS,KAAA;EAgEU;;;AAAQ;;;EArD3B,QAAA,CAAS,KAAA;;;;;;;EAWT,SAAA,CAAU,KAAA;;;;;;;;;EAYV,QAAA,CAAS,MAAA,SAAe,EAAA,GAAK,MAAA,EAAQ,SAAA,EAAW,EAAA,OAAS,CAAA,UAAW,GAAA;;;;;GAWlE,MAAA,CAAO,QAAA,KAAa,QAAA,SAAiB,QAAA;;;;;EAWvC,OAAA,IAAW,UAAA,CAAW,WAAA;;;;;EAQtB,QAAA,CAAS,QAAA,EAAU,QAAA;AAAA"}
1
+ {"version":3,"file":"writer.d.mts","names":[],"sources":["../src/writer.ts"],"mappings":";;UAOiB;;EAEhB;;EAEA;;EAEA;;;;;;;;;;;;;;;;;;;cAqBY;UACJ;UACA;UACA;UACA;UACA;EAER,cACC,aACA,SACA,iBACE;UAOK;;;;;;;EA0BR,MAAM;;;;;;EASN,OAAO;;;;;;EAWP,WAAW,OAAO;;;;;;EAclB,QAAQ;;;;;;EAUR,QAAQ;;;;;;EAUR,QAAQ;;;;;;;EAWR,SAAS;;;;;;;EAWT,SAAS;;;;;;;EAWT,UAAU;;;;;;;;;EAYV,SAAS,eAAe,KAAK,QAAQ,WAAW,SAAS,WAAW;;;;;GAWlE,OAAO,aAAa,iBAAiB;;;;;EAWvC,WAAW,WAAW;;;;;EAQtB,SAAS,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"writer.mjs","names":[],"sources":["../src/writer.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Encoding } from './types.js';\nimport { ulebEncode } from './uleb.js';\nimport { encodeStr } from './utils.js';\n\nexport interface BcsWriterOptions {\n\t/** The initial size (in bytes) of the buffer tht will be allocated */\n\tinitialSize?: number;\n\t/** The maximum size (in bytes) that the buffer is allowed to grow to */\n\tmaxSize?: number;\n\t/** The amount of bytes that will be allocated whenever additional memory is required */\n\tallocateSize?: number;\n}\n\n/**\n * Class used to write BCS data into a buffer. Initializer requires\n * some size of a buffer to init; default value for this buffer is 1KB.\n *\n * Most methods are chainable, so it is possible to write them in one go.\n *\n * @example\n * let serialized = new BcsWriter()\n * .write8(10)\n * .write32(1000000)\n * .write64(10000001000000)\n * .hex();\n */\n\n/**\n * Set of methods that allows data encoding/decoding as standalone\n * BCS value or a part of a composed structure/vector.\n */\nexport class BcsWriter {\n\tprivate dataView: DataView<ArrayBuffer>;\n\tprivate bytePosition: number = 0;\n\tprivate size: number;\n\tprivate maxSize: number;\n\tprivate allocateSize: number;\n\n\tconstructor({\n\t\tinitialSize = 1024,\n\t\tmaxSize = Infinity,\n\t\tallocateSize = 1024,\n\t}: BcsWriterOptions = {}) {\n\t\tthis.size = initialSize;\n\t\tthis.maxSize = maxSize;\n\t\tthis.allocateSize = allocateSize;\n\t\tthis.dataView = new DataView(new ArrayBuffer(initialSize));\n\t}\n\n\tprivate ensureSizeOrGrow(bytes: number) {\n\t\tconst requiredSize = this.bytePosition + bytes;\n\t\tif (requiredSize > this.size) {\n\t\t\tconst nextSize = Math.min(\n\t\t\t\tthis.maxSize,\n\t\t\t\tMath.max(this.size + requiredSize, this.size + this.allocateSize),\n\t\t\t);\n\t\t\tif (requiredSize > nextSize) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Attempting to serialize to BCS, but buffer does not have enough size. Allocated size: ${this.size}, Max size: ${this.maxSize}, Required size: ${requiredSize}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.size = nextSize;\n\t\t\tconst nextBuffer = new ArrayBuffer(this.size);\n\t\t\tnew Uint8Array(nextBuffer).set(new Uint8Array(this.dataView.buffer));\n\t\t\tthis.dataView = new DataView(nextBuffer);\n\t\t}\n\t}\n\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number): this {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite8(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(1);\n\t\tthis.dataView.setUint8(this.bytePosition, Number(value));\n\t\treturn this.shift(1);\n\t}\n\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteBytes(bytes: Uint8Array): this {\n\t\tthis.ensureSizeOrGrow(bytes.length);\n\n\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\tthis.dataView.setUint8(this.bytePosition + i, bytes[i]);\n\t\t}\n\n\t\treturn this.shift(bytes.length);\n\t}\n\t/**\n\t * Write a U16 value into a buffer and shift cursor position by 2.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite16(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(2);\n\t\tthis.dataView.setUint16(this.bytePosition, Number(value), true);\n\t\treturn this.shift(2);\n\t}\n\t/**\n\t * Write a U32 value into a buffer and shift cursor position by 4.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite32(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(4);\n\t\tthis.dataView.setUint32(this.bytePosition, Number(value), true);\n\t\treturn this.shift(4);\n\t}\n\t/**\n\t * Write a U64 value into a buffer and shift cursor position by 8.\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite64(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 8).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U128 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite128(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 16).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U256 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite256(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 32).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a ULEB value into a buffer and shift cursor position by number of bytes\n\t * written.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteULEB(value: number): this {\n\t\tulebEncode(value).forEach((el) => this.write8(el));\n\t\treturn this;\n\t}\n\t/**\n\t * Write a vector into a buffer by first writing the vector length and then calling\n\t * a callback on each passed value.\n\t *\n\t * @param {Array<Any>} vector Array of elements to write.\n\t * @param {WriteVecCb} cb Callback to call on each element of the vector.\n\t * @returns {this}\n\t */\n\twriteVec(vector: any[], cb: (writer: BcsWriter, el: any, i: number, len: number) => void): this {\n\t\tthis.writeULEB(vector.length);\n\t\tArray.from(vector).forEach((el, i) => cb(this, el, i, vector.length));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds support for iterations over the object.\n\t * @returns {Uint8Array}\n\t */\n\t// oxlint-disable-next-line require-yields\n\t*[Symbol.iterator](): Iterator<number, Iterable<number>> {\n\t\tfor (let i = 0; i < this.bytePosition; i++) {\n\t\t\tyield this.dataView.getUint8(i);\n\t\t}\n\t\treturn this.toBytes();\n\t}\n\n\t/**\n\t * Get underlying buffer taking only value bytes (in case initial buffer size was bigger).\n\t * @returns {Uint8Array} Resulting bcs.\n\t */\n\ttoBytes(): Uint8Array<ArrayBuffer> {\n\t\treturn new Uint8Array(this.dataView.buffer.slice(0, this.bytePosition));\n\t}\n\n\t/**\n\t * Represent data as 'hex' or 'base64'\n\t * @param encoding Encoding to use: 'base64' or 'hex'\n\t */\n\ttoString(encoding: Encoding): string {\n\t\treturn encodeStr(this.toBytes(), encoding);\n\t}\n}\n\nfunction toLittleEndian(bigint: bigint, size: number) {\n\tconst result = new Uint8Array(size);\n\tlet i = 0;\n\twhile (bigint > 0) {\n\t\tresult[i] = Number(bigint % BigInt(256));\n\t\tbigint = bigint / BigInt(256);\n\t\ti += 1;\n\t}\n\treturn result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"writer.mjs","names":[],"sources":["../src/writer.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Encoding } from './types.js';\nimport { ulebEncode } from './uleb.js';\nimport { encodeStr } from './utils.js';\n\nexport interface BcsWriterOptions {\n\t/** The initial size (in bytes) of the buffer tht will be allocated */\n\tinitialSize?: number;\n\t/** The maximum size (in bytes) that the buffer is allowed to grow to */\n\tmaxSize?: number;\n\t/** The amount of bytes that will be allocated whenever additional memory is required */\n\tallocateSize?: number;\n}\n\n/**\n * Class used to write BCS data into a buffer. Initializer requires\n * some size of a buffer to init; default value for this buffer is 1KB.\n *\n * Most methods are chainable, so it is possible to write them in one go.\n *\n * @example\n * let serialized = new BcsWriter()\n * .write8(10)\n * .write32(1000000)\n * .write64(10000001000000)\n * .hex();\n */\n\n/**\n * Set of methods that allows data encoding/decoding as standalone\n * BCS value or a part of a composed structure/vector.\n */\nexport class BcsWriter {\n\tprivate dataView: DataView<ArrayBuffer>;\n\tprivate bytePosition: number = 0;\n\tprivate size: number;\n\tprivate maxSize: number;\n\tprivate allocateSize: number;\n\n\tconstructor({\n\t\tinitialSize = 1024,\n\t\tmaxSize = Infinity,\n\t\tallocateSize = 1024,\n\t}: BcsWriterOptions = {}) {\n\t\tthis.size = initialSize;\n\t\tthis.maxSize = maxSize;\n\t\tthis.allocateSize = allocateSize;\n\t\tthis.dataView = new DataView(new ArrayBuffer(initialSize));\n\t}\n\n\tprivate ensureSizeOrGrow(bytes: number) {\n\t\tconst requiredSize = this.bytePosition + bytes;\n\t\tif (requiredSize > this.size) {\n\t\t\tconst nextSize = Math.min(\n\t\t\t\tthis.maxSize,\n\t\t\t\tMath.max(this.size + requiredSize, this.size + this.allocateSize),\n\t\t\t);\n\t\t\tif (requiredSize > nextSize) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Attempting to serialize to BCS, but buffer does not have enough size. Allocated size: ${this.size}, Max size: ${this.maxSize}, Required size: ${requiredSize}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.size = nextSize;\n\t\t\tconst nextBuffer = new ArrayBuffer(this.size);\n\t\t\tnew Uint8Array(nextBuffer).set(new Uint8Array(this.dataView.buffer));\n\t\t\tthis.dataView = new DataView(nextBuffer);\n\t\t}\n\t}\n\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number): this {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite8(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(1);\n\t\tthis.dataView.setUint8(this.bytePosition, Number(value));\n\t\treturn this.shift(1);\n\t}\n\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteBytes(bytes: Uint8Array): this {\n\t\tthis.ensureSizeOrGrow(bytes.length);\n\n\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\tthis.dataView.setUint8(this.bytePosition + i, bytes[i]);\n\t\t}\n\n\t\treturn this.shift(bytes.length);\n\t}\n\t/**\n\t * Write a U16 value into a buffer and shift cursor position by 2.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite16(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(2);\n\t\tthis.dataView.setUint16(this.bytePosition, Number(value), true);\n\t\treturn this.shift(2);\n\t}\n\t/**\n\t * Write a U32 value into a buffer and shift cursor position by 4.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite32(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(4);\n\t\tthis.dataView.setUint32(this.bytePosition, Number(value), true);\n\t\treturn this.shift(4);\n\t}\n\t/**\n\t * Write a U64 value into a buffer and shift cursor position by 8.\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite64(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 8).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U128 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite128(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 16).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U256 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite256(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 32).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a ULEB value into a buffer and shift cursor position by number of bytes\n\t * written.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteULEB(value: number): this {\n\t\tulebEncode(value).forEach((el) => this.write8(el));\n\t\treturn this;\n\t}\n\t/**\n\t * Write a vector into a buffer by first writing the vector length and then calling\n\t * a callback on each passed value.\n\t *\n\t * @param {Array<Any>} vector Array of elements to write.\n\t * @param {WriteVecCb} cb Callback to call on each element of the vector.\n\t * @returns {this}\n\t */\n\twriteVec(vector: any[], cb: (writer: BcsWriter, el: any, i: number, len: number) => void): this {\n\t\tthis.writeULEB(vector.length);\n\t\tArray.from(vector).forEach((el, i) => cb(this, el, i, vector.length));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds support for iterations over the object.\n\t * @returns {Uint8Array}\n\t */\n\t// oxlint-disable-next-line require-yields\n\t*[Symbol.iterator](): Iterator<number, Iterable<number>> {\n\t\tfor (let i = 0; i < this.bytePosition; i++) {\n\t\t\tyield this.dataView.getUint8(i);\n\t\t}\n\t\treturn this.toBytes();\n\t}\n\n\t/**\n\t * Get underlying buffer taking only value bytes (in case initial buffer size was bigger).\n\t * @returns {Uint8Array} Resulting bcs.\n\t */\n\ttoBytes(): Uint8Array<ArrayBuffer> {\n\t\treturn new Uint8Array(this.dataView.buffer.slice(0, this.bytePosition));\n\t}\n\n\t/**\n\t * Represent data as 'hex' or 'base64'\n\t * @param encoding Encoding to use: 'base64' or 'hex'\n\t */\n\ttoString(encoding: Encoding): string {\n\t\treturn encodeStr(this.toBytes(), encoding);\n\t}\n}\n\nfunction toLittleEndian(bigint: bigint, size: number) {\n\tconst result = new Uint8Array(size);\n\tlet i = 0;\n\twhile (bigint > 0) {\n\t\tresult[i] = Number(bigint % BigInt(256));\n\t\tbigint = bigint / BigInt(256);\n\t\ti += 1;\n\t}\n\treturn result;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haneullabs/bcs",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "BCS - Canonical Binary Serialization implementation for JavaScript",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Haneul Labs <build@haneul-labs.com>",
@@ -44,14 +44,14 @@
44
44
  ],
45
45
  "homepage": "https://sdk.haneul-labs.com/bcs",
46
46
  "devDependencies": {
47
- "@size-limit/preset-small-lib": "^12.1.0",
48
- "size-limit": "^12.1.0",
49
- "typescript": "^6.0.3",
50
- "vitest": "^4.1.8"
47
+ "@size-limit/preset-small-lib": "^13.0.3",
48
+ "size-limit": "^13.0.3",
49
+ "typescript": "^7.0.2",
50
+ "vitest": "^4.1.11"
51
51
  },
52
52
  "dependencies": {
53
- "@scure/base": "^2.2.0",
54
- "@haneullabs/utils": "^0.4.0"
53
+ "@scure/base": "^2.3.0",
54
+ "@haneullabs/utils": "^0.4.1"
55
55
  },
56
56
  "scripts": {
57
57
  "clean": "rm -rf tsconfig.tsbuildinfo ./dist",
package/src/bcs.ts CHANGED
@@ -316,7 +316,13 @@ export const bcs = {
316
316
  bool(options?: BcsTypeOptions<boolean>) {
317
317
  return fixedSizeBcsType({
318
318
  size: 1,
319
- read: (reader) => reader.read8() === 1,
319
+ read: (reader) => {
320
+ const value = reader.read8();
321
+ if (value > 1) {
322
+ throw new TypeError(`Invalid bool value: expected 0 or 1, found ${value}`);
323
+ }
324
+ return value === 1;
325
+ },
320
326
  write: (value, writer) => writer.write8(value ? 1 : 0),
321
327
  ...options,
322
328
  name: (options?.name ?? 'bool') as 'bool',
@@ -413,7 +419,8 @@ export const bcs = {
413
419
  string(options?: BcsTypeOptions<string>) {
414
420
  return stringLikeBcsType({
415
421
  toBytes: (value) => new TextEncoder().encode(value),
416
- fromBytes: (bytes) => new TextDecoder().decode(bytes),
422
+ fromBytes: (bytes) =>
423
+ new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes),
417
424
  ...options,
418
425
  name: (options?.name ?? 'string') as 'string',
419
426
  });
package/src/uleb.ts CHANGED
@@ -43,6 +43,10 @@ export function ulebDecode(arr: number[] | Uint8Array): {
43
43
  len += 1;
44
44
  total += BigInt(byte & 0x7f) << shift;
45
45
  if ((byte & 0x80) === 0) {
46
+ // A trailing zero group adds no value, so the encoding is not minimal
47
+ if (byte === 0 && len > 1) {
48
+ throw new Error('ULEB decode error: non-canonical encoding');
49
+ }
46
50
  break;
47
51
  }
48
52
  shift += 7n;