@freedomofpress/cometbft 0.1.0 → 0.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.
Files changed (64) hide show
  1. package/dist/commit.d.ts +7 -0
  2. package/dist/commit.js +175 -0
  3. package/dist/commit.js.map +1 -0
  4. package/dist/encoding.d.ts +4 -0
  5. package/dist/encoding.js +31 -0
  6. package/dist/encoding.js.map +1 -0
  7. package/dist/lightclient.d.ts +17 -0
  8. package/dist/lightclient.js +275 -0
  9. package/dist/lightclient.js.map +1 -0
  10. package/dist/proto/cometbft/crypto/v1/keys.d.ts +28 -0
  11. package/dist/proto/cometbft/crypto/v1/keys.js +110 -0
  12. package/dist/proto/cometbft/crypto/v1/keys.js.map +1 -0
  13. package/dist/proto/cometbft/crypto/v1/proof.d.ts +60 -0
  14. package/dist/proto/cometbft/crypto/v1/proof.js +416 -0
  15. package/dist/proto/cometbft/crypto/v1/proof.js.map +1 -0
  16. package/dist/proto/cometbft/types/v1/canonical.d.ts +85 -0
  17. package/dist/proto/cometbft/types/v1/canonical.js +586 -0
  18. package/dist/proto/cometbft/types/v1/canonical.js.map +1 -0
  19. package/dist/proto/cometbft/types/v1/types.d.ts +206 -0
  20. package/dist/proto/cometbft/types/v1/types.js +1794 -0
  21. package/dist/proto/cometbft/types/v1/types.js.map +1 -0
  22. package/dist/proto/cometbft/types/v1/validator.d.ts +64 -0
  23. package/dist/proto/cometbft/types/v1/validator.js +382 -0
  24. package/dist/proto/cometbft/types/v1/validator.js.map +1 -0
  25. package/dist/proto/cometbft/version/v1/types.d.ts +41 -0
  26. package/dist/proto/cometbft/version/v1/types.js +154 -0
  27. package/dist/proto/cometbft/version/v1/types.js.map +1 -0
  28. package/dist/proto/gogoproto/gogo.d.ts +1 -0
  29. package/dist/proto/gogoproto/gogo.js +8 -0
  30. package/dist/proto/gogoproto/gogo.js.map +1 -0
  31. package/dist/proto/google/protobuf/descriptor.d.ts +1228 -0
  32. package/dist/proto/google/protobuf/descriptor.js +5056 -0
  33. package/dist/proto/google/protobuf/descriptor.js.map +1 -0
  34. package/dist/proto/google/protobuf/timestamp.d.ts +128 -0
  35. package/dist/proto/google/protobuf/timestamp.js +83 -0
  36. package/dist/proto/google/protobuf/timestamp.js.map +1 -0
  37. package/dist/tests/commit.test.d.ts +1 -0
  38. package/dist/tests/commit.test.js +219 -0
  39. package/dist/tests/commit.test.js.map +1 -0
  40. package/dist/tests/encoding.test.d.ts +1 -0
  41. package/dist/tests/encoding.test.js +31 -0
  42. package/dist/tests/encoding.test.js.map +1 -0
  43. package/dist/tests/fixtures/commit-12.json +64 -0
  44. package/dist/tests/fixtures/validators-12.json +41 -0
  45. package/dist/tests/fixtures/webcat.json +71 -0
  46. package/dist/tests/lightclient.test.d.ts +1 -0
  47. package/dist/tests/lightclient.test.js +234 -0
  48. package/dist/tests/lightclient.test.js.map +1 -0
  49. package/dist/tests/validators.test.d.ts +1 -0
  50. package/dist/tests/validators.test.js +184 -0
  51. package/dist/tests/validators.test.js.map +1 -0
  52. package/dist/tests/webcat.test.d.ts +1 -0
  53. package/dist/tests/webcat.test.js +52 -0
  54. package/dist/tests/webcat.test.js.map +1 -0
  55. package/dist/types.d.ts +62 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/validators.d.ts +6 -0
  59. package/dist/validators.js +55 -0
  60. package/dist/validators.js.map +1 -0
  61. package/package.json +5 -5
  62. package/src/lightclient.ts +176 -0
  63. package/src/tests/lightclient.test.ts +20 -5
  64. package/src/tests/webcat.test.ts +17 -47
@@ -0,0 +1,83 @@
1
+ // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
2
+ // versions:
3
+ // protoc-gen-ts_proto v2.6.1
4
+ // protoc unknown
5
+ // source: google/protobuf/timestamp.proto
6
+ /* eslint-disable */
7
+ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
8
+ export const protobufPackage = "google.protobuf";
9
+ function createBaseTimestamp() {
10
+ return { seconds: 0n, nanos: 0 };
11
+ }
12
+ export const Timestamp = {
13
+ encode(message, writer = new BinaryWriter()) {
14
+ if (message.seconds !== 0n) {
15
+ if (BigInt.asIntN(64, message.seconds) !== message.seconds) {
16
+ throw new globalThis.Error("value provided for field message.seconds of type int64 too large");
17
+ }
18
+ writer.uint32(8).int64(message.seconds);
19
+ }
20
+ if (message.nanos !== 0) {
21
+ writer.uint32(16).int32(message.nanos);
22
+ }
23
+ return writer;
24
+ },
25
+ decode(input, length) {
26
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
27
+ let end = length === undefined ? reader.len : reader.pos + length;
28
+ const message = createBaseTimestamp();
29
+ while (reader.pos < end) {
30
+ const tag = reader.uint32();
31
+ switch (tag >>> 3) {
32
+ case 1: {
33
+ if (tag !== 8) {
34
+ break;
35
+ }
36
+ message.seconds = reader.int64();
37
+ continue;
38
+ }
39
+ case 2: {
40
+ if (tag !== 16) {
41
+ break;
42
+ }
43
+ message.nanos = reader.int32();
44
+ continue;
45
+ }
46
+ }
47
+ if ((tag & 7) === 4 || tag === 0) {
48
+ break;
49
+ }
50
+ reader.skip(tag & 7);
51
+ }
52
+ return message;
53
+ },
54
+ fromJSON(object) {
55
+ return {
56
+ seconds: isSet(object.seconds) ? BigInt(object.seconds) : 0n,
57
+ nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0,
58
+ };
59
+ },
60
+ toJSON(message) {
61
+ const obj = {};
62
+ if (message.seconds !== 0n) {
63
+ obj.seconds = message.seconds.toString();
64
+ }
65
+ if (message.nanos !== 0) {
66
+ obj.nanos = Math.round(message.nanos);
67
+ }
68
+ return obj;
69
+ },
70
+ create(base) {
71
+ return Timestamp.fromPartial(base ?? {});
72
+ },
73
+ fromPartial(object) {
74
+ const message = createBaseTimestamp();
75
+ message.seconds = object.seconds ?? 0n;
76
+ message.nanos = object.nanos ?? 0;
77
+ return message;
78
+ },
79
+ };
80
+ function isSet(value) {
81
+ return value !== null && value !== undefined;
82
+ }
83
+ //# sourceMappingURL=timestamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../../src/proto/google/protobuf/timestamp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,219 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { importCommit } from "../commit";
3
+ import { base64ToUint8Array, Uint8ArrayToBase64 } from "../encoding";
4
+ import commitFixture from "./fixtures/commit-12.json";
5
+ // Deep-clone plain JSON-like objects
6
+ function clone(x) {
7
+ return JSON.parse(JSON.stringify(x));
8
+ }
9
+ describe("importCommit: happy path (fixture)", () => {
10
+ it("parses a valid signed_header into SignedHeader (ts-proto, useDate=false)", () => {
11
+ const resp = commitFixture;
12
+ const sh = importCommit(resp);
13
+ // header basics
14
+ expect(sh.header.chainId).toBe("chain-ORcSeX");
15
+ expect(sh.header.height).toBe(12n);
16
+ expect(sh.header.version?.block).toBe(11n);
17
+ expect(sh.header.version?.app).toBe(1n);
18
+ expect(sh.header.time).toEqual({
19
+ seconds: expect.any(BigInt),
20
+ nanos: expect.any(Number),
21
+ });
22
+ // 32-byte hashes (app hash can be any length; in the fixture it's 8 bytes)
23
+ expect(sh.header.lastCommitHash.length).toBe(32);
24
+ expect(sh.header.dataHash.length).toBe(32);
25
+ expect(sh.header.validatorsHash.length).toBe(32);
26
+ expect(sh.header.nextValidatorsHash.length).toBe(32);
27
+ expect(sh.header.consensusHash.length).toBe(32);
28
+ expect(sh.header.appHash.length).toBe(8);
29
+ expect(sh.header.lastResultsHash.length).toBe(32);
30
+ expect(sh.header.evidenceHash.length).toBe(32);
31
+ // proposer 20 bytes
32
+ expect(sh.header.proposerAddress.length).toBe(20);
33
+ // last_block_id + commit.block_id parts
34
+ expect(sh.header.lastBlockId.hash.length).toBe(32);
35
+ expect(sh.header.lastBlockId.partSetHeader.hash.length).toBe(32);
36
+ expect(typeof sh.header.lastBlockId.partSetHeader.total).toBe("number");
37
+ expect(sh.commit.height).toBe(12n);
38
+ expect(sh.commit.round).toBe(0);
39
+ expect(sh.commit.blockId.hash.length).toBe(32);
40
+ expect(sh.commit.blockId.partSetHeader.hash.length).toBe(32);
41
+ expect(sh.commit.signatures.length).toBeGreaterThan(0);
42
+ for (const s of sh.commit.signatures) {
43
+ expect(typeof s.blockIdFlag).toBe("number");
44
+ expect(s.validatorAddress.length).toBe(20);
45
+ expect(s.signature.length).toBe(64); // fixture has present signatures
46
+ expect(s.timestamp).toEqual({
47
+ seconds: expect.any(BigInt),
48
+ nanos: expect.any(Number),
49
+ });
50
+ }
51
+ });
52
+ });
53
+ describe("importCommit: validation errors", () => {
54
+ it("fails on missing signed_header", () => {
55
+ const bad = {};
56
+ expect(() => importCommit(bad)).toThrow(/Missing signed_header/);
57
+ });
58
+ it("fails on missing header", () => {
59
+ const bad = clone(commitFixture);
60
+ delete bad.signed_header.header;
61
+ expect(() => importCommit(bad)).toThrow(/Missing header/);
62
+ });
63
+ it("fails on missing commit", () => {
64
+ const bad = clone(commitFixture);
65
+ delete bad.signed_header.commit;
66
+ expect(() => importCommit(bad)).toThrow(/Missing commit/);
67
+ });
68
+ it("fails on missing header.height", () => {
69
+ const bad = clone(commitFixture);
70
+ delete bad.signed_header.header.height;
71
+ expect(() => importCommit(bad)).toThrow(/Missing header\.height/);
72
+ });
73
+ it("fails on missing commit.height", () => {
74
+ const bad = clone(commitFixture);
75
+ bad.signed_header.commit.height = "";
76
+ expect(() => importCommit(bad)).toThrow(/Missing commit\.height/);
77
+ });
78
+ it("fails on mismatched header/commit heights", () => {
79
+ const bad = clone(commitFixture);
80
+ bad.signed_header.header.height = "13";
81
+ expect(() => importCommit(bad)).toThrow(/height mismatch/);
82
+ });
83
+ it("fails on invalid commit.round (negative / non-integer)", () => {
84
+ const bad1 = clone(commitFixture);
85
+ bad1.signed_header.commit.round = -1;
86
+ expect(() => importCommit(bad1)).toThrow(/Invalid commit\.round/);
87
+ const bad2 = clone(commitFixture);
88
+ bad2.signed_header.commit.round = 0.5;
89
+ expect(() => importCommit(bad2)).toThrow(/Invalid commit\.round/);
90
+ });
91
+ it("fails on invalid last_block_id (missing fields)", () => {
92
+ const bad = clone(commitFixture);
93
+ delete bad.signed_header.header.last_block_id.parts;
94
+ expect(() => importCommit(bad)).toThrow(/Invalid last_block_id/);
95
+ });
96
+ it("fails on bad last_block_id.parts.total (negative / non-integer)", () => {
97
+ const bad1 = clone(commitFixture);
98
+ bad1.signed_header.header.last_block_id.parts.total = -1;
99
+ expect(() => importCommit(bad1)).toThrow(/Invalid last_block_id\.parts\.total/);
100
+ const bad2 = clone(commitFixture);
101
+ bad2.signed_header.header.last_block_id.parts.total = 1.2;
102
+ expect(() => importCommit(bad2)).toThrow(/Invalid last_block_id\.parts\.total/);
103
+ });
104
+ it("fails on malformed header hash lengths (32 bytes expected)", () => {
105
+ const fields = [
106
+ "last_commit_hash",
107
+ "data_hash",
108
+ "validators_hash",
109
+ "next_validators_hash",
110
+ "consensus_hash",
111
+ "last_results_hash",
112
+ "evidence_hash",
113
+ ];
114
+ for (const f of fields) {
115
+ const bad = clone(commitFixture);
116
+ // Make hex too short (trim 2 chars -> 31 bytes)
117
+ bad.signed_header.header[f] = bad.signed_header.header[f].slice(0, -2);
118
+ expect(() => importCommit(bad)).toThrow(new RegExp(`${f.replace(/_/g, "\\_")}`));
119
+ }
120
+ });
121
+ it("fails on missing header.time", () => {
122
+ const bad = clone(commitFixture);
123
+ delete bad.signed_header.header.time;
124
+ expect(() => importCommit(bad)).toThrow(/Missing header\.time/);
125
+ });
126
+ it("fails on invalid header.time (not RFC3339)", () => {
127
+ const bad = clone(commitFixture);
128
+ bad.signed_header.header.time = "not-a-time";
129
+ expect(() => importCommit(bad)).toThrow(/Invalid RFC3339 time/);
130
+ });
131
+ it("fails on missing proposer_address", () => {
132
+ const bad = clone(commitFixture);
133
+ delete bad.signed_header.header.proposer_address;
134
+ expect(() => importCommit(bad)).toThrow(/Missing proposer_address/);
135
+ });
136
+ it("fails on proposer_address wrong length", () => {
137
+ const bad = clone(commitFixture);
138
+ bad.signed_header.header.proposer_address =
139
+ bad.signed_header.header.proposer_address.slice(0, 38); // 19 bytes
140
+ expect(() => importCommit(bad)).toThrow(/proposer_address must be 20 bytes/);
141
+ });
142
+ it("fails on invalid commit.block_id (missing parts)", () => {
143
+ const bad = clone(commitFixture);
144
+ delete bad.signed_header.commit.block_id.parts;
145
+ expect(() => importCommit(bad)).toThrow(/Invalid commit\.block_id/);
146
+ });
147
+ it("fails on bad commit.block_id.parts.total", () => {
148
+ const bad = clone(commitFixture);
149
+ bad.signed_header.commit.block_id.parts.total = -1;
150
+ expect(() => importCommit(bad)).toThrow(/Invalid commit\.block_id\.parts\.total/);
151
+ });
152
+ it("fails when commit has no signatures", () => {
153
+ const bad = clone(commitFixture);
154
+ bad.signed_header.commit.signatures = [];
155
+ expect(() => importCommit(bad)).toThrow(/Commit has no signatures/);
156
+ });
157
+ it("fails on invalid signatures[*].block_id_flag type", () => {
158
+ const bad = clone(commitFixture);
159
+ bad.signed_header.commit.signatures[0].block_id_flag = "2";
160
+ expect(() => importCommit(bad)).toThrow(/block_id_flag must be a number/);
161
+ });
162
+ it("fails on missing validator_address", () => {
163
+ const bad = clone(commitFixture);
164
+ delete bad.signed_header.commit.signatures[0].validator_address;
165
+ expect(() => importCommit(bad)).toThrow(/validator_address missing/);
166
+ });
167
+ it("fails on short validator_address (hex < 40 chars)", () => {
168
+ const bad = clone(commitFixture);
169
+ bad.signed_header.commit.signatures[0].validator_address =
170
+ bad.signed_header.commit.signatures[0].validator_address.slice(0, 38);
171
+ expect(() => importCommit(bad)).toThrow(/validator_address.*20 bytes/);
172
+ });
173
+ it("defaults header.version.{block,app} to 0n when version is missing", () => {
174
+ const resp = clone(commitFixture);
175
+ delete resp.signed_header.header.version;
176
+ const sh = importCommit(resp);
177
+ expect(sh.header.version?.block).toBe(0n);
178
+ expect(sh.header.version?.app).toBe(0n);
179
+ });
180
+ it("parses header.time without fractional seconds (nanos=0)", () => {
181
+ const resp = clone(commitFixture);
182
+ resp.signed_header.header.time = "2025-08-18T13:39:10Z"; // no .fraction
183
+ const sh = importCommit(resp);
184
+ expect(sh.header.time?.nanos).toBe(0);
185
+ expect(typeof sh.header.time?.seconds).toBe("bigint");
186
+ });
187
+ it("allows a signature with no timestamp (kept undefined)", () => {
188
+ const resp = clone(commitFixture);
189
+ delete resp.signed_header.commit.signatures[0].timestamp;
190
+ const sh = importCommit(resp);
191
+ expect(sh.commit.signatures[0].timestamp).toBeUndefined();
192
+ });
193
+ it("allows missing signature (proto3 bytes -> empty) and sets length to 0", () => {
194
+ const good = clone(commitFixture);
195
+ delete good.signed_header.commit.signatures[0].signature;
196
+ const sh = importCommit(good);
197
+ expect(sh.commit.signatures[0].signature).toBeInstanceOf(Uint8Array);
198
+ expect(sh.commit.signatures[0].signature.length).toBe(0);
199
+ });
200
+ it("fails on wrong signature length (not 64 bytes) without Buffer", () => {
201
+ const bad = clone(commitFixture);
202
+ const sigB64 = bad.signed_header.commit.signatures[0].signature;
203
+ const sigBytes = base64ToUint8Array(sigB64);
204
+ const shorter = sigBytes.slice(0, 63);
205
+ bad.signed_header.commit.signatures[0].signature =
206
+ Uint8ArrayToBase64(shorter);
207
+ expect(() => importCommit(bad)).toThrow(/signature.*64 bytes/);
208
+ });
209
+ it("parses timestamps with fractional seconds (nano padding/truncation)", () => {
210
+ const withFrac = clone(commitFixture);
211
+ withFrac.signed_header.header.time = "2025-08-18T13:39:10.618857123Z";
212
+ withFrac.signed_header.commit.signatures[0].timestamp =
213
+ "2025-08-18T13:39:11.9Z";
214
+ const sh = importCommit(withFrac);
215
+ expect(sh.header.time?.nanos).toBe(618857123);
216
+ expect(sh.commit.signatures[0].timestamp?.nanos).toBe(900000000);
217
+ });
218
+ });
219
+ //# sourceMappingURL=commit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.test.js","sourceRoot":"","sources":["../../src/tests/commit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { hexToUint8Array, Uint8ArrayToBase64, Uint8ArrayToHex, } from "../encoding";
3
+ describe("encoding", () => {
4
+ it("converts Uint8Array to Base64", () => {
5
+ const input = new Uint8Array([72, 101, 108, 108, 111]);
6
+ const result = Uint8ArrayToBase64(input);
7
+ expect(result).toBe("SGVsbG8=");
8
+ });
9
+ it("converts ArrayBuffer to Base64", () => {
10
+ const buffer = new TextEncoder().encode("Hi").buffer;
11
+ const result = Uint8ArrayToBase64(buffer);
12
+ expect(result).toBe("SGk=");
13
+ });
14
+ it("parses valid hex string", () => {
15
+ const hex = "48656c6c6f";
16
+ const uint8 = hexToUint8Array(hex);
17
+ expect([...uint8]).toEqual([72, 101, 108, 108, 111]);
18
+ });
19
+ it("throws on invalid characters", () => {
20
+ expect(() => hexToUint8Array("zz12")).toThrow("Hex string contains invalid characters");
21
+ });
22
+ it("throws on odd-length hex string", () => {
23
+ expect(() => hexToUint8Array("abc")).toThrow("Hex string must have an even length");
24
+ });
25
+ it("encodes Uint8Array to hex string", () => {
26
+ const input = new Uint8Array([72, 101, 108, 108, 111]);
27
+ const hex = Uint8ArrayToHex(input);
28
+ expect(hex).toBe("48656c6c6f");
29
+ });
30
+ });
31
+ //# sourceMappingURL=encoding.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.test.js","sourceRoot":"","sources":["../../src/tests/encoding.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,GAAG,GAAG,YAAY,CAAC;QACzB,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAC3C,wCAAwC,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAC1C,qCAAqC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,64 @@
1
+ {
2
+ "signed_header": {
3
+ "header": {
4
+ "version": { "block": "11", "app": "1" },
5
+ "chain_id": "chain-ORcSeX",
6
+ "height": "12",
7
+ "time": "2025-08-18T13:39:10.618857Z",
8
+ "last_block_id": {
9
+ "hash": "980DF9A358F01668EB6F289D223065C8A496A56411C11842FF89677AE427C3DF",
10
+ "parts": {
11
+ "total": 1,
12
+ "hash": "4CEBEE9DBC12129AED6B8D834FC7C5CED8F519C10EF6DE7A46376631A91E3FA6"
13
+ }
14
+ },
15
+ "last_commit_hash": "B3FAAB00E85339EED6ADE15BDCB136C3994F536ADF3BB6C45FAB3CD9F8E40B2A",
16
+ "data_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
17
+ "validators_hash": "3340D40CE35BC4A025795BBE753A1A1E0026D0904326DD20438ED0BE7A73EE94",
18
+ "next_validators_hash": "3340D40CE35BC4A025795BBE753A1A1E0026D0904326DD20438ED0BE7A73EE94",
19
+ "consensus_hash": "68ECD6F333119CE43751ECE583B981F23508AEAF4221FF582B1BB33BE42BCEFA",
20
+ "app_hash": "0600000000000000",
21
+ "last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
22
+ "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
23
+ "proposer_address": "CCF25785244316D4A5EAFC187E0EAA36C5665599"
24
+ },
25
+ "commit": {
26
+ "height": "12",
27
+ "round": 0,
28
+ "block_id": {
29
+ "hash": "93232036CF95FF1890654092D560742F9305DD85F4FD80B3DFA71A1FF3A9B6D6",
30
+ "parts": {
31
+ "total": 1,
32
+ "hash": "08DAFA6B9653A474F6D9C18302B904C15BF1D72FD4B1B72B6390D55AC0CCB3E8"
33
+ }
34
+ },
35
+ "signatures": [
36
+ {
37
+ "block_id_flag": 2,
38
+ "validator_address": "4DBA7206E6BF35AFAEE7AEF523D450A4B10DC955",
39
+ "timestamp": "2025-08-18T13:39:11.924425Z",
40
+ "signature": "mLNmsIOnQgD/dIg5To83ig94MhgrUqGVWzFvmPWKv5A9kFDzhp7dAvn1FGSeS9yjA12WFc7oV9dNZk9+IxeNDg=="
41
+ },
42
+ {
43
+ "block_id_flag": 2,
44
+ "validator_address": "9A9BC61D31EF1673F6975AA7ACE356E7B6BE2412",
45
+ "timestamp": "2025-08-18T13:39:11.920418Z",
46
+ "signature": "/zzgiepmyjyASMZMsKmp1xdSmOnin0mW3g6irkU7DJX52oFuI9d3WNDX4VUzOccKrLS/vwLLiELOQBdcnAAVAg=="
47
+ },
48
+ {
49
+ "block_id_flag": 2,
50
+ "validator_address": "CAD8E57D78ABDFF7DF23C81C330335430EE97808",
51
+ "timestamp": "2025-08-18T13:39:11.916389Z",
52
+ "signature": "p1sbdl3iEH5RG/HhroyGqx3+p4VV42aNpcsEme31dq0rlLd4F8RHnmcsIbtqLCIs2L8MzlVEebuCVJheVJeqCg=="
53
+ },
54
+ {
55
+ "block_id_flag": 2,
56
+ "validator_address": "CCF25785244316D4A5EAFC187E0EAA36C5665599",
57
+ "timestamp": "2025-08-18T13:39:11.92732Z",
58
+ "signature": "aW7m0l/5yX2B9DeJ5qcuWdGoOp7Crj6Nwj6WbQA24B4NRgaY1PmBzDNr4SDSGOJUu4HnnVtm0zp6qNNm8JaNAA=="
59
+ }
60
+ ]
61
+ }
62
+ },
63
+ "canonical": true
64
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "block_height": "12",
3
+ "validators": [
4
+ {
5
+ "address": "4DBA7206E6BF35AFAEE7AEF523D450A4B10DC955",
6
+ "pub_key": {
7
+ "type": "tendermint/PubKeyEd25519",
8
+ "value": "BBqAcUZ6IPWzOZyUOHVK95ihP7s0McuRaYjbn6CqWfk="
9
+ },
10
+ "voting_power": "1",
11
+ "proposer_priority": "0"
12
+ },
13
+ {
14
+ "address": "9A9BC61D31EF1673F6975AA7ACE356E7B6BE2412",
15
+ "pub_key": {
16
+ "type": "tendermint/PubKeyEd25519",
17
+ "value": "/nX4LxZwh87dNEYD9t2cw8+HHwbwuBmq34Q7z7tvqEc="
18
+ },
19
+ "voting_power": "1",
20
+ "proposer_priority": "0"
21
+ },
22
+ {
23
+ "address": "CAD8E57D78ABDFF7DF23C81C330335430EE97808",
24
+ "pub_key": {
25
+ "type": "tendermint/PubKeyEd25519",
26
+ "value": "w3pPpAwVxmK0oTHeAmQFk8JviQAJUn7CGo7vAHtMqfg="
27
+ },
28
+ "voting_power": "1",
29
+ "proposer_priority": "0"
30
+ },
31
+ {
32
+ "address": "CCF25785244316D4A5EAFC187E0EAA36C5665599",
33
+ "pub_key": {
34
+ "type": "tendermint/PubKeyEd25519",
35
+ "value": "DZY3DLVKC8ZML3I/kuqMUaoXyAj+UGXskuWlDMAcnC0="
36
+ },
37
+ "voting_power": "1",
38
+ "proposer_priority": "0"
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "signed_header": {
3
+ "header": {
4
+ "version": {
5
+ "block": "11",
6
+ "app": "0"
7
+ },
8
+ "chain_id": "test-chain-hGjZNv",
9
+ "height": "493",
10
+ "time": "2025-11-26T21:34:06.159025Z",
11
+ "last_block_id": {
12
+ "hash": "6ABE9483553796549941230EFFC982A4B389FE475D37C43815E6B735E5AEDE7B",
13
+ "parts": {
14
+ "total": 1,
15
+ "hash": "FA7002E34B341CC2625B2A2EB546ED9A1D2B77D1146A5650D9D2E3682940EE29"
16
+ }
17
+ },
18
+ "last_commit_hash": "C7B78BBAF834E298EB6570836DAA9116A56BED2F652D8BAF6C28B1F33ABC8AE8",
19
+ "data_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
20
+ "validators_hash": "04C72627103FD466C7B4C30C0E654D2B58EA140493C009B8BAB66749FFEBE60C",
21
+ "next_validators_hash": "04C72627103FD466C7B4C30C0E654D2B58EA140493C009B8BAB66749FFEBE60C",
22
+ "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
23
+ "app_hash": "180B4624DAB5D631EAD41DC7BEC0F63D2A25DF826B068604B7D858206ED92DD6",
24
+ "last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
25
+ "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
26
+ "proposer_address": "F588CF8C0CA8D88CDD2F909C8262018B361CF5D5"
27
+ },
28
+ "commit": {
29
+ "height": "493",
30
+ "round": 0,
31
+ "block_id": {
32
+ "hash": "2A1D00CC2A092465E85EA2C24986BEE0105285039DC1873BB6B0CA7F610EC89D",
33
+ "parts": {
34
+ "total": 1,
35
+ "hash": "379E62CC2B2741AD07E1F325307BBDECDAA10F2405A22C9B9350615A5DAF2725"
36
+ }
37
+ },
38
+ "signatures": [
39
+ {
40
+ "block_id_flag": 2,
41
+ "validator_address": "F588CF8C0CA8D88CDD2F909C8262018B361CF5D5",
42
+ "timestamp": "2025-11-26T21:34:07.1855Z",
43
+ "signature": "ttukjhivwXmf9YKEFSceZe0b6D98esb+9nMCeEz6e1z5MDfxMKun7O0nPis0PoDWcqBifWJy2NdbfO0zySILDQ=="
44
+ }
45
+ ]
46
+ }
47
+ },
48
+ "validator_set": {
49
+ "validators": [
50
+ {
51
+ "address": "F588CF8C0CA8D88CDD2F909C8262018B361CF5D5",
52
+ "pub_key": {
53
+ "type": "tendermint/PubKeyEd25519",
54
+ "value": "Pn7hPwDPYkoBBTKxdxL0QZLdPCupGXyds/qSyOIBSZg="
55
+ },
56
+ "power": "10",
57
+ "name": null
58
+ }
59
+ ],
60
+ "proposer": {
61
+ "address": "F588CF8C0CA8D88CDD2F909C8262018B361CF5D5",
62
+ "pub_key": {
63
+ "type": "tendermint/PubKeyEd25519",
64
+ "value": "Pn7hPwDPYkoBBTKxdxL0QZLdPCupGXyds/qSyOIBSZg="
65
+ },
66
+ "power": "10",
67
+ "name": null
68
+ },
69
+ "total_voting_power": "10"
70
+ }
71
+ }
@@ -0,0 +1 @@
1
+ export {};