@typeberry/lib 0.7.3 → 0.7.4-6a638d3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typeberry/lib",
3
- "version": "0.7.3",
3
+ "version": "0.7.4-6a638d3",
4
4
  "description": "Typeberry Library",
5
5
  "main": "./bin/lib/index.js",
6
6
  "types": "./bin/lib/index.d.ts",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"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"}
@@ -86,7 +86,8 @@ export function u32AsLeBytes(value) {
86
86
  */
87
87
  export function leBytesAsU32(uint8Array) {
88
88
  check `${uint8Array.length === 4} Input must be a Uint8Array of length 4`;
89
- return asTypedNumber(uint8Array[0] | (uint8Array[1] << 8) | (uint8Array[2] << 16) | (uint8Array[3] << 24));
89
+ // >>> 0 is needed to avoid changing sign of the number (the `<< 24` produces a signed int32)
90
+ return asTypedNumber((uint8Array[0] | (uint8Array[1] << 8) | (uint8Array[2] << 16) | (uint8Array[3] << 24)) >>> 0);
90
91
  }
91
92
  /** Get the smallest value between U64 a and values given as input parameters. */
92
93
  export const minU64 = (a, ...values) => values.reduce((min, value) => (value > min ? min : value), a);
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, it } from "node:test";
3
- import { maxU64, minU64, sumU32, sumU64, tryAsU32, tryAsU64, u32AsLeBytes } from "./index.js";
3
+ import { leBytesAsU32, maxU64, minU64, sumU32, sumU64, tryAsU32, tryAsU64, u32AsLeBytes } from "./index.js";
4
4
  describe("sumU32", () => {
5
5
  it("should sum and handle overflow", () => {
6
6
  const res1 = sumU32(tryAsU32(3), tryAsU32(5), tryAsU32(10));
@@ -40,6 +40,24 @@ describe("u32AsLittleEndian", () => {
40
40
  });
41
41
  }
42
42
  });
43
+ describe("leBytesAsU32", () => {
44
+ const createTestCase = (bytes, expectedResult) => ({
45
+ bytes: new Uint8Array(bytes),
46
+ expectedResult,
47
+ });
48
+ const testCases = [
49
+ createTestCase([5, 0, 0, 0], 5),
50
+ createTestCase([0xff, 0xff, 0xff, 0x7f], 2147483647),
51
+ createTestCase([0, 0, 0, 0x80], 2147483648),
52
+ createTestCase([0xff, 0xff, 0xff, 0xff], 2 ** 32 - 1),
53
+ ];
54
+ for (const { bytes, expectedResult } of testCases) {
55
+ it(`should decode ${bytes} as ${expectedResult}`, () => {
56
+ const result = leBytesAsU32(bytes);
57
+ assert.strictEqual(result, expectedResult);
58
+ });
59
+ }
60
+ });
43
61
  describe("tryAsU32", () => {
44
62
  it("should cast numbers", () => {
45
63
  const v = 1234;
@@ -1 +1 @@
1
- {"version":3,"file":"memory-utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/pvm-interpreter/memory/memory-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AAEzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,UAE7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,wEAE7D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,kEAErD;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,UAAU,kEAGrE"}
1
+ {"version":3,"file":"memory-utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/pvm-interpreter/memory/memory-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AAEzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,UAE7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,wEAE7D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,kEAGrD;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,UAAU,kEAGrE"}
@@ -8,7 +8,8 @@ export function getPageNumber(address) {
8
8
  return tryAsPageNumber(address >>> PAGE_SIZE_SHIFT);
9
9
  }
10
10
  export function getStartPageIndex(address) {
11
- return tryAsMemoryIndex((address >>> PAGE_SIZE_SHIFT) << PAGE_SIZE_SHIFT);
11
+ // >>> 0 is needed to avoid changing sign of the number
12
+ return tryAsMemoryIndex(((address >>> PAGE_SIZE_SHIFT) << PAGE_SIZE_SHIFT) >>> 0);
12
13
  }
13
14
  export function getStartPageIndexFromPageNumber(pageNumber) {
14
15
  // >>> 0 is needed to avoid changing sign of the number
@@ -53,6 +53,18 @@ describe("memory-utils", () => {
53
53
  const startPageIndex = getStartPageIndex(address);
54
54
  assert.strictEqual(startPageIndex, expectedAddress);
55
55
  });
56
+ it("should return a non-negative index for an address with bit 31 set", () => {
57
+ const address = tryAsMemoryIndex(0x8e64_e123);
58
+ const expectedAddress = 0x8e64_e000;
59
+ const startPageIndex = getStartPageIndex(address);
60
+ assert.strictEqual(startPageIndex, expectedAddress);
61
+ });
62
+ it("should return start index of the last page", () => {
63
+ const address = tryAsMemoryIndex(MAX_MEMORY_INDEX);
64
+ const expectedAddress = MAX_MEMORY_INDEX - PAGE_SIZE + 1;
65
+ const startPageIndex = getStartPageIndex(address);
66
+ assert.strictEqual(startPageIndex, expectedAddress);
67
+ });
56
68
  });
57
69
  describe("getStartPageIndexFromPageNumber", () => {
58
70
  it("should return a correct start index for page 0", () => {
@@ -31,7 +31,7 @@ function hashToNumberSequence(blake2b, entropy, length) {
31
31
  const newHash = blake2b.hashBytes(randomBytes);
32
32
  const numberStartIndex = (4 * i) % 32;
33
33
  const numberEndIndex = numberStartIndex + 4;
34
- const number = leBytesAsU32(newHash.raw.subarray(numberStartIndex, numberEndIndex)) >>> 0;
34
+ const number = leBytesAsU32(newHash.raw.subarray(numberStartIndex, numberEndIndex));
35
35
  result[i] = number;
36
36
  }
37
37
  return result;
@@ -42,7 +42,7 @@ export function generateNextServiceId({ serviceId, entropy, timeslot }, chainSpe
42
42
  timeslot,
43
43
  }, chainSpec);
44
44
  const result = blake2b.hashBytes(encoded).raw.subarray(0, 4);
45
- const number = leBytesAsU32(result) >>> 0;
45
+ const number = leBytesAsU32(result);
46
46
  const mod = 2 ** 32 - MIN_PUBLIC_SERVICE_INDEX - 2 ** 8;
47
47
  return tryAsServiceId((number % mod) + MIN_PUBLIC_SERVICE_INDEX);
48
48
  }