@freedomofpress/cometbft 0.1.0 → 0.1.1

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 (61) 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 +141 -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 +227 -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 +86 -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 +1 -1
@@ -0,0 +1,7 @@
1
+ import { SignedHeader } from "./proto/cometbft/types/v1/types";
2
+ import type { CommitJson } from "./types";
3
+ /**
4
+ * Parse and validate a /commit JSON and return a ts-proto SignedHeader
5
+ * (cometbft.types.v1.SignedHeader).
6
+ */
7
+ export declare function importCommit(resp: CommitJson): SignedHeader;
package/dist/commit.js ADDED
@@ -0,0 +1,175 @@
1
+ // src/commit.ts
2
+ import { base64ToUint8Array, hexToUint8Array } from "./encoding";
3
+ // ---- helpers ----
4
+ function assertLen(name, u8, expect) {
5
+ if (u8.length !== expect) {
6
+ throw new Error(`${name} must be ${expect} bytes, got ${u8.length}`);
7
+ }
8
+ }
9
+ function parseRFC3339ToTimestamp(s) {
10
+ const d = new Date(s);
11
+ if (Number.isNaN(d.getTime()))
12
+ throw new Error(`Invalid RFC3339 time: ${s}`);
13
+ // extract fractional seconds (up to 9 digits for nanos)
14
+ const fracMatch = s.match(/\.(\d+)Z$/i);
15
+ const frac = fracMatch ? fracMatch[1] : "";
16
+ const n = Math.min(frac.length, 9);
17
+ const nanos = n === 0 ? 0 : Number((frac + "0".repeat(9 - n)).slice(0, 9));
18
+ const seconds = BigInt(Math.floor(d.getTime() / 1000));
19
+ return { seconds, nanos };
20
+ }
21
+ /**
22
+ * Parse and validate a /commit JSON and return a ts-proto SignedHeader
23
+ * (cometbft.types.v1.SignedHeader).
24
+ */
25
+ export function importCommit(resp) {
26
+ const sh = resp.signed_header;
27
+ if (!sh)
28
+ throw new Error("Missing signed_header");
29
+ const h = sh.header;
30
+ const c = sh.commit;
31
+ if (!h)
32
+ throw new Error("Missing header");
33
+ if (!c)
34
+ throw new Error("Missing commit");
35
+ // Heights
36
+ if (!h.height)
37
+ throw new Error("Missing header.height");
38
+ if (c.height == null || c.height === "")
39
+ throw new Error("Missing commit.height");
40
+ const headerHeight = BigInt(h.height);
41
+ const commitHeight = BigInt(c.height);
42
+ if (headerHeight !== commitHeight) {
43
+ throw new Error(`height mismatch header=${h.height} commit=${c.height}`);
44
+ }
45
+ // Round
46
+ if (typeof c.round !== "number" ||
47
+ c.round < 0 ||
48
+ !Number.isInteger(c.round)) {
49
+ throw new Error("Invalid commit.round");
50
+ }
51
+ // version (optional)
52
+ const version = {
53
+ block: h.version?.block ? BigInt(h.version.block) : 0n,
54
+ app: h.version?.app ? BigInt(h.version.app) : 0n,
55
+ };
56
+ // last_block_id
57
+ if (!h.last_block_id || !h.last_block_id.hash || !h.last_block_id.parts) {
58
+ throw new Error("Invalid last_block_id");
59
+ }
60
+ const lastBlockIdHash = hexToUint8Array(h.last_block_id.hash);
61
+ assertLen("last_block_id.hash", lastBlockIdHash, 32);
62
+ const lastBlockPartsHash = hexToUint8Array(h.last_block_id.parts.hash);
63
+ assertLen("last_block_id.parts.hash", lastBlockPartsHash, 32);
64
+ const lastBlockId = {
65
+ hash: lastBlockIdHash,
66
+ partSetHeader: {
67
+ total: Number(h.last_block_id.parts.total),
68
+ hash: lastBlockPartsHash,
69
+ },
70
+ };
71
+ if (!lastBlockId.partSetHeader ||
72
+ !lastBlockId.partSetHeader.total ||
73
+ !Number.isInteger(lastBlockId.partSetHeader.total) ||
74
+ lastBlockId.partSetHeader.total < 0) {
75
+ throw new Error("Invalid last_block_id.parts.total");
76
+ }
77
+ // Hash fields (32 bytes unless app hash, which is app-defined length)
78
+ const lastCommitHash = hexToUint8Array(h.last_commit_hash);
79
+ assertLen("last_commit_hash", lastCommitHash, 32);
80
+ const dataHash = hexToUint8Array(h.data_hash);
81
+ assertLen("data_hash", dataHash, 32);
82
+ const validatorsHash = hexToUint8Array(h.validators_hash);
83
+ assertLen("validators_hash", validatorsHash, 32);
84
+ const nextValidatorsHash = hexToUint8Array(h.next_validators_hash);
85
+ assertLen("next_validators_hash", nextValidatorsHash, 32);
86
+ const consensusHash = hexToUint8Array(h.consensus_hash);
87
+ assertLen("consensus_hash", consensusHash, 32);
88
+ const appHash = hexToUint8Array(h.app_hash); // variable length accepted
89
+ const lastResultsHash = hexToUint8Array(h.last_results_hash);
90
+ assertLen("last_results_hash", lastResultsHash, 32);
91
+ const evidenceHash = hexToUint8Array(h.evidence_hash);
92
+ assertLen("evidence_hash", evidenceHash, 32);
93
+ // proposer_address (20 bytes)
94
+ if (!h.proposer_address)
95
+ throw new Error("Missing proposer_address");
96
+ const proposerAddress = hexToUint8Array(h.proposer_address);
97
+ assertLen("proposer_address", proposerAddress, 20);
98
+ // time
99
+ if (!h.time)
100
+ throw new Error("Missing header.time");
101
+ const time = parseRFC3339ToTimestamp(h.time);
102
+ // Commit BlockID
103
+ if (!c.block_id || !c.block_id.hash || !c.block_id.parts) {
104
+ throw new Error("Invalid commit.block_id");
105
+ }
106
+ const commitBlockHash = hexToUint8Array(c.block_id.hash);
107
+ assertLen("commit.block_id.hash", commitBlockHash, 32);
108
+ const commitPartsHash = hexToUint8Array(c.block_id.parts.hash);
109
+ assertLen("commit.block_id.parts.hash", commitPartsHash, 32);
110
+ const commitBlockId = {
111
+ hash: commitBlockHash,
112
+ partSetHeader: {
113
+ total: Number(c.block_id.parts.total),
114
+ hash: commitPartsHash,
115
+ },
116
+ };
117
+ if (!commitBlockId ||
118
+ !commitBlockId.partSetHeader ||
119
+ !Number.isInteger(commitBlockId.partSetHeader.total) ||
120
+ commitBlockId.partSetHeader.total < 0) {
121
+ throw new Error("Invalid commit.block_id.parts.total");
122
+ }
123
+ // Signatures
124
+ if (!Array.isArray(c.signatures) || c.signatures.length === 0) {
125
+ throw new Error("Commit has no signatures");
126
+ }
127
+ const signatures = c.signatures.map((s, i) => {
128
+ if (typeof s.block_id_flag !== "number") {
129
+ throw new Error(`signatures[${i}].block_id_flag must be a number`);
130
+ }
131
+ if (!s.validator_address) {
132
+ throw new Error(`signatures[${i}].validator_address missing`);
133
+ }
134
+ const validatorAddress = hexToUint8Array(s.validator_address);
135
+ assertLen(`signatures[${i}].validator_address`, validatorAddress, 20);
136
+ // bytes fields in proto3 are NOT optional -> use empty Uint8Array when absent
137
+ const sigBytes = s.signature
138
+ ? base64ToUint8Array(s.signature)
139
+ : new Uint8Array(0);
140
+ if (sigBytes.length !== 0) {
141
+ assertLen(`signatures[${i}].signature`, sigBytes, 64); // Ed25519
142
+ }
143
+ const ts = s.timestamp ? parseRFC3339ToTimestamp(s.timestamp) : undefined;
144
+ return {
145
+ blockIdFlag: s.block_id_flag,
146
+ validatorAddress,
147
+ timestamp: ts, // PbTimestamp | undefined (useDate=false)
148
+ signature: sigBytes, // always Uint8Array (maybe length 0)
149
+ };
150
+ });
151
+ const header = {
152
+ version,
153
+ chainId: h.chain_id,
154
+ height: headerHeight,
155
+ time,
156
+ lastBlockId,
157
+ lastCommitHash,
158
+ dataHash,
159
+ validatorsHash,
160
+ nextValidatorsHash,
161
+ consensusHash,
162
+ appHash,
163
+ lastResultsHash,
164
+ evidenceHash,
165
+ proposerAddress,
166
+ };
167
+ const commit = {
168
+ height: headerHeight,
169
+ round: c.round,
170
+ blockId: commitBlockId,
171
+ signatures,
172
+ };
173
+ return { header, commit };
174
+ }
175
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../src/commit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function Uint8ArrayToBase64(data: Uint8Array | ArrayBuffer): string;
2
+ export declare function hexToUint8Array(hex: string): Uint8Array;
3
+ export declare function Uint8ArrayToHex(uint8Array: Uint8Array): string;
4
+ export declare function base64ToUint8Array(base64: string): Uint8Array;
@@ -0,0 +1,31 @@
1
+ export function Uint8ArrayToBase64(data) {
2
+ const uint8 = data instanceof Uint8Array ? data : new Uint8Array(data);
3
+ const binary = String.fromCharCode(...uint8);
4
+ return btoa(binary);
5
+ }
6
+ export function hexToUint8Array(hex) {
7
+ if (!/^[0-9a-fA-F]*$/.test(hex)) {
8
+ throw new Error("Hex string contains invalid characters");
9
+ }
10
+ if (hex.length % 2 !== 0) {
11
+ throw new Error("Hex string must have an even length");
12
+ }
13
+ const uint8Array = new Uint8Array(hex.length / 2);
14
+ for (let i = 0; i < uint8Array.length; i++) {
15
+ uint8Array[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
16
+ }
17
+ return uint8Array;
18
+ }
19
+ export function Uint8ArrayToHex(uint8Array) {
20
+ return [...uint8Array].map((b) => b.toString(16).padStart(2, "0")).join("");
21
+ }
22
+ export function base64ToUint8Array(base64) {
23
+ const binaryString = atob(base64);
24
+ const length = binaryString.length;
25
+ const bytes = new Uint8Array(length);
26
+ for (let i = 0; i < length; i++) {
27
+ bytes[i] = binaryString.charCodeAt(i); // Convert binary string to byte array
28
+ }
29
+ return new Uint8Array(bytes);
30
+ }
31
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,IAA8B;IAC/D,MAAM,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAsB;IACpD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,sCAAsC;IAC/E,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { SignedHeader } from "./proto/cometbft/types/v1/types";
2
+ import { ValidatorSet as ProtoValidatorSet } from "./proto/cometbft/types/v1/validator";
3
+ import { Timestamp as PbTimestamp } from "./proto/google/protobuf/timestamp";
4
+ export type CryptoIndex = Map<string, CryptoKey>;
5
+ export interface VerifyOutcome {
6
+ ok: boolean;
7
+ quorum: boolean;
8
+ signedPower: bigint;
9
+ totalPower: bigint;
10
+ headerTime?: PbTimestamp;
11
+ appHash: Uint8Array;
12
+ blockIdHash: Uint8Array;
13
+ unknownValidators: string[];
14
+ invalidSignatures: string[];
15
+ countedSignatures: number;
16
+ }
17
+ export declare function verifyCommit(sh: SignedHeader, vset: ProtoValidatorSet, cryptoIndex: CryptoIndex): Promise<VerifyOutcome>;
@@ -0,0 +1,141 @@
1
+ // src/lightclient.ts
2
+ import { Uint8ArrayToHex } from "./encoding";
3
+ import { CanonicalVote, } from "./proto/cometbft/types/v1/canonical";
4
+ import { SignedMsgType } from "./proto/cometbft/types/v1/types";
5
+ function encodeUvarint(value) {
6
+ if (!Number.isSafeInteger(value) || value < 0)
7
+ throw new Error("encodeUvarint expects a non-negative safe integer");
8
+ const bytes = [];
9
+ let v = value;
10
+ while (v >= 0x80) {
11
+ bytes.push((v & 0x7f) | 0x80);
12
+ v >>>= 7;
13
+ }
14
+ bytes.push(v);
15
+ return new Uint8Array(bytes);
16
+ }
17
+ function makePrecommitSignBytesProto(chainId, height, round, blockIdHash, partsTotal, partsHash, timestamp) {
18
+ const psh = { total: partsTotal, hash: partsHash };
19
+ const bid = { hash: blockIdHash, partSetHeader: psh };
20
+ const vote = {
21
+ type: SignedMsgType.SIGNED_MSG_TYPE_PRECOMMIT,
22
+ height, // fixed64
23
+ round, // fixed64 (encoder omits 0)
24
+ blockId: bid,
25
+ timestamp, // omitted if undefined
26
+ chainId,
27
+ };
28
+ const body = CanonicalVote.encode(vote).finish();
29
+ // Go's protoio.MarshalDelimited length-prefixes the canonical vote. Using
30
+ // the same varint prefix keeps signatures compatible with both v0.34.x and
31
+ // v1.0.x chains.
32
+ const prefix = encodeUvarint(body.length);
33
+ const out = new Uint8Array(prefix.length + body.length);
34
+ out.set(prefix, 0);
35
+ out.set(body, prefix.length);
36
+ return out;
37
+ }
38
+ function hasTwoThirds(signed, total) {
39
+ return signed * 3n > total * 2n;
40
+ }
41
+ export async function verifyCommit(sh, vset, cryptoIndex) {
42
+ if (!sh?.header || !sh?.commit) {
43
+ throw new Error("SignedHeader missing header/commit");
44
+ }
45
+ const header = sh.header;
46
+ const commit = sh.commit;
47
+ if (header.height !== commit.height) {
48
+ throw new Error(`Header/commit height mismatch: ${header.height} vs ${commit.height}`);
49
+ }
50
+ const totalPower = vset?.totalVotingPower ?? 0n;
51
+ if (!Array.isArray(vset?.validators) || vset.validators.length === 0) {
52
+ throw new Error("ValidatorSet has no validators");
53
+ }
54
+ if (totalPower <= 0n) {
55
+ throw new Error("ValidatorSet total power must be positive");
56
+ }
57
+ // Build address -> validator map
58
+ const setByAddrHex = new Map();
59
+ for (const v of vset.validators) {
60
+ const hex = Uint8ArrayToHex(v.address).toUpperCase();
61
+ if (setByAddrHex.has(hex))
62
+ throw new Error(`Duplicate validator address in set: ${hex}`);
63
+ setByAddrHex.set(hex, v);
64
+ }
65
+ if (!commit.blockId)
66
+ throw new Error("Commit missing BlockID");
67
+ const bid = commit.blockId;
68
+ if (!bid.hash || bid.hash.length === 0)
69
+ throw new Error("Commit BlockID hash is missing");
70
+ if (!bid.partSetHeader)
71
+ throw new Error("Commit PartSetHeader is missing");
72
+ if (!bid.partSetHeader.hash || bid.partSetHeader.hash.length === 0) {
73
+ throw new Error("Commit PartSetHeader hash is missing");
74
+ }
75
+ if (!Number.isInteger(bid.partSetHeader.total) ||
76
+ bid.partSetHeader.total < 0) {
77
+ throw new Error("Commit PartSetHeader total is invalid");
78
+ }
79
+ const chainId = header.chainId;
80
+ const heightBig = header.height;
81
+ const roundBig = BigInt(commit.round);
82
+ const blockIdHash = bid.hash;
83
+ const partsHash = bid.partSetHeader.hash;
84
+ const partsTotal = bid.partSetHeader.total;
85
+ let signedPower = 0n;
86
+ const unknown = [];
87
+ const invalid = [];
88
+ let counted = 0;
89
+ for (let idx = 0; idx < commit.signatures.length; idx++) {
90
+ const s = commit.signatures[idx];
91
+ // Only COMMIT votes (BLOCK_ID_FLAG_COMMIT == 2)
92
+ if (s.blockIdFlag !== 2)
93
+ continue;
94
+ const addrHex = Uint8ArrayToHex(s.validatorAddress).toUpperCase();
95
+ const v = setByAddrHex.get(addrHex);
96
+ if (!v) {
97
+ unknown.push(addrHex);
98
+ continue;
99
+ }
100
+ if (!s.signature || s.signature.length === 0) {
101
+ invalid.push(addrHex);
102
+ continue;
103
+ }
104
+ // Count this COMMIT vote (known validator + non-empty signature)
105
+ counted++;
106
+ // Canonical sign-bytes
107
+ const signBytes = makePrecommitSignBytesProto(chainId, heightBig, roundBig, blockIdHash, partsTotal, partsHash, s.timestamp);
108
+ const key = cryptoIndex.get(addrHex);
109
+ if (!key) {
110
+ invalid.push(addrHex);
111
+ continue;
112
+ }
113
+ // Verify signature
114
+ let ok = false;
115
+ try {
116
+ ok = await crypto.subtle.verify({ name: "Ed25519" }, key, new Uint8Array(s.signature), new Uint8Array(signBytes));
117
+ }
118
+ catch {
119
+ ok = false;
120
+ }
121
+ if (!ok) {
122
+ invalid.push(addrHex);
123
+ continue;
124
+ }
125
+ signedPower += v.votingPower ?? 0n;
126
+ }
127
+ const quorum = hasTwoThirds(signedPower, totalPower);
128
+ return {
129
+ ok: quorum,
130
+ quorum,
131
+ signedPower,
132
+ totalPower,
133
+ headerTime: header.time,
134
+ appHash: header.appHash,
135
+ blockIdHash,
136
+ unknownValidators: unknown,
137
+ invalidSignatures: invalid,
138
+ countedSignatures: counted,
139
+ };
140
+ }
141
+ //# sourceMappingURL=lightclient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightclient.js","sourceRoot":"","sources":["../src/lightclient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
2
+ export declare const protobufPackage = "cometbft.crypto.v1";
3
+ /** PublicKey is a ED25519 or a secp256k1 public key. */
4
+ export interface PublicKey {
5
+ ed25519?: Uint8Array | undefined;
6
+ secp256k1?: Uint8Array | undefined;
7
+ bls12381?: Uint8Array | undefined;
8
+ }
9
+ export declare const PublicKey: MessageFns<PublicKey>;
10
+ type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined;
11
+ export type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
12
+ [K in keyof T]?: DeepPartial<T[K]>;
13
+ } : Partial<T>;
14
+ type KeysOfUnion<T> = T extends T ? keyof T : never;
15
+ export type Exact<P, I extends P> = P extends Builtin ? P : P & {
16
+ [K in keyof P]: Exact<P[K], I[K]>;
17
+ } & {
18
+ [K in Exclude<keyof I, KeysOfUnion<P>>]: never;
19
+ };
20
+ export interface MessageFns<T> {
21
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
22
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
23
+ fromJSON(object: any): T;
24
+ toJSON(message: T): unknown;
25
+ create<I extends Exact<DeepPartial<T>, I>>(base?: I): T;
26
+ fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T;
27
+ }
28
+ export {};
@@ -0,0 +1,110 @@
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: cometbft/crypto/v1/keys.proto
6
+ /* eslint-disable */
7
+ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
8
+ export const protobufPackage = "cometbft.crypto.v1";
9
+ function createBasePublicKey() {
10
+ return { ed25519: undefined, secp256k1: undefined, bls12381: undefined };
11
+ }
12
+ export const PublicKey = {
13
+ encode(message, writer = new BinaryWriter()) {
14
+ if (message.ed25519 !== undefined) {
15
+ writer.uint32(10).bytes(message.ed25519);
16
+ }
17
+ if (message.secp256k1 !== undefined) {
18
+ writer.uint32(18).bytes(message.secp256k1);
19
+ }
20
+ if (message.bls12381 !== undefined) {
21
+ writer.uint32(26).bytes(message.bls12381);
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 = createBasePublicKey();
29
+ while (reader.pos < end) {
30
+ const tag = reader.uint32();
31
+ switch (tag >>> 3) {
32
+ case 1: {
33
+ if (tag !== 10) {
34
+ break;
35
+ }
36
+ message.ed25519 = reader.bytes();
37
+ continue;
38
+ }
39
+ case 2: {
40
+ if (tag !== 18) {
41
+ break;
42
+ }
43
+ message.secp256k1 = reader.bytes();
44
+ continue;
45
+ }
46
+ case 3: {
47
+ if (tag !== 26) {
48
+ break;
49
+ }
50
+ message.bls12381 = reader.bytes();
51
+ continue;
52
+ }
53
+ }
54
+ if ((tag & 7) === 4 || tag === 0) {
55
+ break;
56
+ }
57
+ reader.skip(tag & 7);
58
+ }
59
+ return message;
60
+ },
61
+ fromJSON(object) {
62
+ return {
63
+ ed25519: isSet(object.ed25519) ? bytesFromBase64(object.ed25519) : undefined,
64
+ secp256k1: isSet(object.secp256k1) ? bytesFromBase64(object.secp256k1) : undefined,
65
+ bls12381: isSet(object.bls12381) ? bytesFromBase64(object.bls12381) : undefined,
66
+ };
67
+ },
68
+ toJSON(message) {
69
+ const obj = {};
70
+ if (message.ed25519 !== undefined) {
71
+ obj.ed25519 = base64FromBytes(message.ed25519);
72
+ }
73
+ if (message.secp256k1 !== undefined) {
74
+ obj.secp256k1 = base64FromBytes(message.secp256k1);
75
+ }
76
+ if (message.bls12381 !== undefined) {
77
+ obj.bls12381 = base64FromBytes(message.bls12381);
78
+ }
79
+ return obj;
80
+ },
81
+ create(base) {
82
+ return PublicKey.fromPartial(base ?? {});
83
+ },
84
+ fromPartial(object) {
85
+ const message = createBasePublicKey();
86
+ message.ed25519 = object.ed25519 ?? undefined;
87
+ message.secp256k1 = object.secp256k1 ?? undefined;
88
+ message.bls12381 = object.bls12381 ?? undefined;
89
+ return message;
90
+ },
91
+ };
92
+ function bytesFromBase64(b64) {
93
+ const bin = globalThis.atob(b64);
94
+ const arr = new Uint8Array(bin.length);
95
+ for (let i = 0; i < bin.length; ++i) {
96
+ arr[i] = bin.charCodeAt(i);
97
+ }
98
+ return arr;
99
+ }
100
+ function base64FromBytes(arr) {
101
+ const bin = [];
102
+ arr.forEach((byte) => {
103
+ bin.push(globalThis.String.fromCharCode(byte));
104
+ });
105
+ return globalThis.btoa(bin.join(""));
106
+ }
107
+ function isSet(value) {
108
+ return value !== null && value !== undefined;
109
+ }
110
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../../src/proto/cometbft/crypto/v1/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
2
+ export declare const protobufPackage = "cometbft.crypto.v1";
3
+ /** Proof is a Merkle proof. */
4
+ export interface Proof {
5
+ total: bigint;
6
+ index: bigint;
7
+ leafHash: Uint8Array;
8
+ aunts: Uint8Array[];
9
+ }
10
+ /** ValueOp is a Merkle proof for a single key. */
11
+ export interface ValueOp {
12
+ /** Encoded in ProofOp.Key. */
13
+ key: Uint8Array;
14
+ /** To encode in ProofOp.Data */
15
+ proof?: Proof | undefined;
16
+ }
17
+ /** DominoOp always returns the given output. */
18
+ export interface DominoOp {
19
+ key: string;
20
+ input: string;
21
+ output: string;
22
+ }
23
+ /**
24
+ * ProofOp defines an operation used for calculating Merkle root
25
+ * The data could be arbitrary format, providing necessary data
26
+ * for example neighbouring node hash
27
+ */
28
+ export interface ProofOp {
29
+ type: string;
30
+ key: Uint8Array;
31
+ data: Uint8Array;
32
+ }
33
+ /** ProofOps is Merkle proof defined by the list of ProofOps */
34
+ export interface ProofOps {
35
+ ops: ProofOp[];
36
+ }
37
+ export declare const Proof: MessageFns<Proof>;
38
+ export declare const ValueOp: MessageFns<ValueOp>;
39
+ export declare const DominoOp: MessageFns<DominoOp>;
40
+ export declare const ProofOp: MessageFns<ProofOp>;
41
+ export declare const ProofOps: MessageFns<ProofOps>;
42
+ type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined;
43
+ export type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
44
+ [K in keyof T]?: DeepPartial<T[K]>;
45
+ } : Partial<T>;
46
+ type KeysOfUnion<T> = T extends T ? keyof T : never;
47
+ export type Exact<P, I extends P> = P extends Builtin ? P : P & {
48
+ [K in keyof P]: Exact<P[K], I[K]>;
49
+ } & {
50
+ [K in Exclude<keyof I, KeysOfUnion<P>>]: never;
51
+ };
52
+ export interface MessageFns<T> {
53
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
54
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
55
+ fromJSON(object: any): T;
56
+ toJSON(message: T): unknown;
57
+ create<I extends Exact<DeepPartial<T>, I>>(base?: I): T;
58
+ fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T;
59
+ }
60
+ export {};