@waku/rln 0.1.6-7fba26d.0 → 0.1.6-86bbf5b.0

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 (56) hide show
  1. package/bundle/_virtual/utils.js +2 -2
  2. package/bundle/_virtual/utils2.js +2 -2
  3. package/bundle/index.js +1 -1
  4. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/_sha2.js +1 -1
  5. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/hmac.js +1 -1
  6. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/pbkdf2.js +1 -1
  7. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/scrypt.js +1 -1
  8. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/sha256.js +1 -1
  9. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/sha512.js +1 -1
  10. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/utils.js +1 -1
  11. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +1 -1
  12. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +2 -2
  13. package/bundle/packages/core/dist/lib/message/version_0.js +1 -4
  14. package/bundle/packages/rln/dist/contract/constants.js +7 -1
  15. package/bundle/packages/rln/dist/contract/rln_base_contract.js +10 -21
  16. package/bundle/packages/rln/dist/credentials_manager.js +14 -16
  17. package/bundle/packages/rln/dist/identity.js +40 -7
  18. package/bundle/packages/rln/dist/keystore/keystore.js +15 -11
  19. package/bundle/packages/rln/dist/message.js +11 -0
  20. package/bundle/packages/rln/dist/utils/bytes.js +37 -16
  21. package/dist/.tsbuildinfo +1 -1
  22. package/dist/contract/constants.d.ts +6 -0
  23. package/dist/contract/constants.js +6 -0
  24. package/dist/contract/constants.js.map +1 -1
  25. package/dist/contract/rln_base_contract.d.ts +0 -10
  26. package/dist/contract/rln_base_contract.js +10 -21
  27. package/dist/contract/rln_base_contract.js.map +1 -1
  28. package/dist/credentials_manager.js +14 -16
  29. package/dist/credentials_manager.js.map +1 -1
  30. package/dist/identity.d.ts +11 -2
  31. package/dist/identity.js +26 -6
  32. package/dist/identity.js.map +1 -1
  33. package/dist/keystore/keystore.js +15 -11
  34. package/dist/keystore/keystore.js.map +1 -1
  35. package/dist/message.d.ts +5 -4
  36. package/dist/message.js +2 -0
  37. package/dist/message.js.map +1 -1
  38. package/dist/utils/bytes.d.ts +12 -5
  39. package/dist/utils/bytes.js +36 -15
  40. package/dist/utils/bytes.js.map +1 -1
  41. package/dist/utils/index.d.ts +1 -1
  42. package/dist/utils/index.js +1 -1
  43. package/dist/utils/index.js.map +1 -1
  44. package/package.json +1 -1
  45. package/src/contract/constants.ts +9 -0
  46. package/src/contract/rln_base_contract.ts +12 -30
  47. package/src/credentials_manager.ts +21 -24
  48. package/src/identity.ts +41 -6
  49. package/src/keystore/keystore.ts +28 -24
  50. package/src/message.ts +7 -4
  51. package/src/utils/bytes.ts +46 -25
  52. package/src/utils/index.ts +1 -1
  53. package/dist/contract/test-utils.d.ts +0 -39
  54. package/dist/contract/test-utils.js +0 -118
  55. package/dist/contract/test-utils.js.map +0 -1
  56. package/src/contract/test-utils.ts +0 -179
@@ -1,3 +1,3 @@
1
- var utils = {exports: {}};
1
+ var utils = {};
2
2
 
3
- export { utils as __module };
3
+ export { utils as __exports };
@@ -1,3 +1,3 @@
1
- var utils = {};
1
+ var utils = {exports: {}};
2
2
 
3
- export { utils as __exports };
3
+ export { utils as __module };
package/bundle/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { RLNDecoder, RLNEncoder } from './packages/rln/dist/codec.js';
2
2
  export { RLN_ABI } from './packages/rln/dist/contract/abi.js';
3
3
  export { RLNContract } from './packages/rln/dist/contract/rln_contract.js';
4
- export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS } from './packages/rln/dist/contract/constants.js';
4
+ export { DEFAULT_Q, DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS } from './packages/rln/dist/contract/constants.js';
5
5
  export { MembershipState } from './packages/rln/dist/contract/types.js';
6
6
  export { RLNBaseContract } from './packages/rln/dist/contract/rln_base_contract.js';
7
7
  export { createRLN } from './packages/rln/dist/create.js';
@@ -1,7 +1,7 @@
1
1
  import { __exports as _sha2 } from '../../../../../../_virtual/_sha2.js';
2
2
  import './_assert.js';
3
3
  import './utils.js';
4
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
4
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
5
5
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
6
6
 
7
7
  Object.defineProperty(_sha2, "__esModule", { value: true });
@@ -1,7 +1,7 @@
1
1
  import { __exports as hmac } from '../../../../../../_virtual/hmac.js';
2
2
  import './_assert.js';
3
3
  import './utils.js';
4
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
4
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
5
5
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
6
6
 
7
7
  (function (exports) {
@@ -2,7 +2,7 @@ import { __exports as pbkdf2$1 } from '../../../../../../_virtual/pbkdf22.js';
2
2
  import './_assert.js';
3
3
  import './hmac.js';
4
4
  import './utils.js';
5
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
5
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
6
6
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
7
7
  import { __exports as hmac } from '../../../../../../_virtual/hmac.js';
8
8
 
@@ -3,7 +3,7 @@ import './_assert.js';
3
3
  import './sha256.js';
4
4
  import './pbkdf2.js';
5
5
  import './utils.js';
6
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
6
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
7
7
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
8
8
  import { __exports as pbkdf2 } from '../../../../../../_virtual/pbkdf22.js';
9
9
  import { __exports as sha256 } from '../../../../../../_virtual/sha2562.js';
@@ -2,7 +2,7 @@ import { __exports as sha256 } from '../../../../../../_virtual/sha2562.js';
2
2
  import './_sha2.js';
3
3
  import './utils.js';
4
4
  import { __exports as _sha2 } from '../../../../../../_virtual/_sha2.js';
5
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
5
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
6
6
 
7
7
  Object.defineProperty(sha256, "__esModule", { value: true });
8
8
  sha256.sha224 = sha256.sha256 = void 0;
@@ -4,7 +4,7 @@ import './_u64.js';
4
4
  import './utils.js';
5
5
  import { __exports as _u64 } from '../../../../../../_virtual/_u64.js';
6
6
  import { __exports as _sha2 } from '../../../../../../_virtual/_sha2.js';
7
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
7
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
8
8
 
9
9
  Object.defineProperty(sha512, "__esModule", { value: true });
10
10
  sha512.sha384 = sha512.sha512_256 = sha512.sha512_224 = sha512.sha512 = sha512.SHA512 = void 0;
@@ -1,4 +1,4 @@
1
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
1
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
2
2
  import './cryptoBrowser.js';
3
3
  import { __exports as cryptoBrowser } from '../../../../../../_virtual/cryptoBrowser.js';
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { __exports as random } from '../../../../../_virtual/random.js';
2
2
  import '../@noble/hashes/utils.js';
3
- import { __exports as utils } from '../../../../../_virtual/utils2.js';
3
+ import { __exports as utils } from '../../../../../_virtual/utils.js';
4
4
 
5
5
  Object.defineProperty(random, "__esModule", { value: true });
6
6
  random.getRandomBytes = random.getRandomBytesSync = void 0;
@@ -1,10 +1,10 @@
1
1
  import { commonjsGlobal } from '../../../../../_virtual/_commonjsHelpers.js';
2
2
  import { commonjsRequire } from '../../../../../_virtual/_commonjs-dynamic-modules.js';
3
- import { __module as utils } from '../../../../../_virtual/utils.js';
3
+ import { __module as utils } from '../../../../../_virtual/utils2.js';
4
4
  import '../@noble/hashes/_assert.js';
5
5
  import '../@noble/hashes/utils.js';
6
6
  import { __exports as _assert } from '../../../../../_virtual/_assert.js';
7
- import { __exports as utils$1 } from '../../../../../_virtual/utils2.js';
7
+ import { __exports as utils$1 } from '../../../../../_virtual/utils.js';
8
8
 
9
9
  utils.exports;
10
10
 
@@ -29,9 +29,6 @@ class DecodedMessage {
29
29
  get contentTopic() {
30
30
  return this.proto.contentTopic;
31
31
  }
32
- get _rawTimestamp() {
33
- return this.proto.timestamp;
34
- }
35
32
  get timestamp() {
36
33
  // In the case we receive a value that is bigger than JS's max number,
37
34
  // we catch the error and return undefined.
@@ -53,7 +50,7 @@ class DecodedMessage {
53
50
  get version() {
54
51
  // https://rfc.vac.dev/spec/14/
55
52
  // > If omitted, the value SHOULD be interpreted as version 0.
56
- return this.proto.version ?? 0;
53
+ return this.proto.version ?? Version;
57
54
  }
58
55
  get rateLimitProof() {
59
56
  return this.proto.rateLimitProof;
@@ -22,6 +22,12 @@ const RATE_LIMIT_PARAMS = {
22
22
  MAX_TOTAL_RATE: 160_000, // Maximum total rate limit across all memberships
23
23
  EPOCH_LENGTH: 600 // Epoch length in seconds (10 minutes)
24
24
  };
25
+ /**
26
+ * Default Q value for the RLN contract
27
+ * This is the upper bound for the ID commitment
28
+ * @see https://github.com/waku-org/specs/blob/master/standards/core/rln-contract.md#implementation-suggestions
29
+ */
30
+ const DEFAULT_Q = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");
25
31
  const DEFAULT_RATE_LIMIT = RATE_LIMIT_PARAMS.MAX_RATE;
26
32
 
27
- export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
33
+ export { DEFAULT_Q, DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
@@ -13,6 +13,7 @@ import '../../../../node_modules/multiformats/dist/src/bases/base8.js';
13
13
  import '../../../../node_modules/multiformats/dist/src/bases/identity.js';
14
14
  import '../../../../node_modules/multiformats/dist/src/codecs/json.js';
15
15
  import { Logger } from '../../../utils/dist/logger/index.js';
16
+ import { IdentityCredential } from '../identity.js';
16
17
  import { RLN_ABI } from './abi.js';
17
18
  import { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from './constants.js';
18
19
  import { MembershipState } from './types.js';
@@ -26,11 +27,6 @@ class RLNBaseContract {
26
27
  rateLimit;
27
28
  minRateLimit;
28
29
  maxRateLimit;
29
- /**
30
- * Default Q value for the RLN contract.
31
- * @see https://github.com/waku-org/waku-rlnv2-contract/blob/b7e9a9b1bc69256a2a3076c1f099b50ce84e7eff/src/WakuRlnV2.sol#L25
32
- */
33
- Q;
34
30
  _members = new Map();
35
31
  _membersFilter;
36
32
  _membershipErasedFilter;
@@ -71,24 +67,14 @@ class RLNBaseContract {
71
67
  const instance = new RLNBaseContract(options);
72
68
  const [min, max] = await Promise.all([
73
69
  instance.contract.minMembershipRateLimit(),
74
- instance.contract.maxMembershipRateLimit()
70
+ instance.contract.maxMembershipRateLimit(),
71
+ instance.contract.Q()
75
72
  ]);
76
73
  instance.minRateLimit = BigNumber.from(min).toNumber();
77
74
  instance.maxRateLimit = BigNumber.from(max).toNumber();
78
75
  instance.validateRateLimit(instance.rateLimit);
79
76
  return instance;
80
77
  }
81
- /**
82
- * Fetches and caches the Q value from the contract.
83
- * @returns Promise<bigint> The Q value from the contract
84
- */
85
- async getQ() {
86
- if (this.Q !== undefined)
87
- return this.Q;
88
- const q = await this.contract.Q();
89
- this.Q = BigInt(q.toString());
90
- return this.Q;
91
- }
92
78
  /**
93
79
  * Gets the current rate limit for this contract instance
94
80
  */
@@ -356,8 +342,9 @@ class RLNBaseContract {
356
342
  async registerWithIdentity(identity) {
357
343
  try {
358
344
  log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
345
+ const idCommitmentBigInt = IdentityCredential.getIdCommitmentBigInt(identity.IDCommitment);
359
346
  // Check if the ID commitment is already registered
360
- const existingIndex = await this.getMemberIndex(identity.IDCommitmentBigInt);
347
+ const existingIndex = await this.getMemberIndex(idCommitmentBigInt);
361
348
  if (existingIndex) {
362
349
  throw new Error(`ID commitment is already registered with index ${existingIndex}`);
363
350
  }
@@ -366,9 +353,11 @@ class RLNBaseContract {
366
353
  if (remainingRateLimit < this.rateLimit) {
367
354
  throw new Error(`Not enough remaining rate limit. Requested: ${this.rateLimit}, Available: ${remainingRateLimit}`);
368
355
  }
369
- const estimatedGas = await this.contract.estimateGas.register(identity.IDCommitmentBigInt, this.rateLimit, []);
356
+ const estimatedGas = await this.contract.estimateGas.register(idCommitmentBigInt, this.rateLimit, []);
370
357
  const gasLimit = estimatedGas.add(10000);
371
- const txRegisterResponse = await this.contract.register(identity.IDCommitmentBigInt, this.rateLimit, [], { gasLimit });
358
+ const txRegisterResponse = await this.contract.register(idCommitmentBigInt, this.rateLimit, [], {
359
+ gasLimit
360
+ });
372
361
  const txRegisterReceipt = await txRegisterResponse.wait();
373
362
  if (txRegisterReceipt.status === 0) {
374
363
  throw new Error("Transaction failed on-chain");
@@ -430,7 +419,7 @@ class RLNBaseContract {
430
419
  async registerWithPermitAndErase(identity, permit, idCommitmentsToErase) {
431
420
  try {
432
421
  log.info(`Registering identity with permit and rate limit: ${this.rateLimit} messages/epoch`);
433
- const txRegisterResponse = await this.contract.registerWithPermit(permit.owner, permit.deadline, permit.v, permit.r, permit.s, identity.IDCommitmentBigInt, this.rateLimit, idCommitmentsToErase.map((id) => BigNumber.from(id)));
422
+ const txRegisterResponse = await this.contract.registerWithPermit(permit.owner, permit.deadline, permit.v, permit.r, permit.s, IdentityCredential.getIdCommitmentBigInt(identity.IDCommitment), this.rateLimit, idCommitmentsToErase.map((id) => BigNumber.from(id)));
434
423
  const txRegisterReceipt = await txRegisterResponse.wait();
435
424
  const memberRegistered = txRegisterReceipt.events?.find((event) => event.event === "MembershipRegistered");
436
425
  if (!memberRegistered || !memberRegistered.args) {
@@ -1,5 +1,5 @@
1
1
  import { hmac } from '../../../node_modules/@noble/hashes/esm/hmac.js';
2
- import { sha256 } from '../../../node_modules/@noble/hashes/esm/sha256.js';
2
+ import { sha256 } from '../../../node_modules/@noble/hashes/esm/sha2.js';
3
3
  import '../../interfaces/dist/protocols.js';
4
4
  import '../../interfaces/dist/connection_manager.js';
5
5
  import '../../interfaces/dist/health_indicator.js';
@@ -20,7 +20,7 @@ import { RLNBaseContract } from './contract/rln_base_contract.js';
20
20
  import { IdentityCredential } from './identity.js';
21
21
  import { Keystore } from './keystore/keystore.js';
22
22
  import { extractMetaMaskSigner } from './utils/metamask.js';
23
- import { buildBigIntFromUint8Array } from './utils/bytes.js';
23
+ import { switchEndianness } from './utils/bytes.js';
24
24
  import './utils/epoch.js';
25
25
 
26
26
  const log = new Logger("waku:credentials");
@@ -198,21 +198,19 @@ class RLNCredentialsManager {
198
198
  const seedBytes = encoder.encode(seed);
199
199
  // Generate deterministic values using HMAC-SHA256
200
200
  // We use different context strings for each component to ensure they're different
201
- const idTrapdoor = hmac(sha256, seedBytes, encoder.encode("IDTrapdoor"));
202
- const idNullifier = hmac(sha256, seedBytes, encoder.encode("IDNullifier"));
203
- const combinedBytes = new Uint8Array([...idTrapdoor, ...idNullifier]);
204
- const idSecretHash = sha256(combinedBytes);
205
- const idCommitment = sha256(idSecretHash);
206
- let idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment);
207
- if (!this.contract) {
208
- throw Error("RLN contract is not initialized");
209
- }
210
- const Q = await this.contract.getQ();
211
- if (idCommitmentBigInt >= Q) {
212
- idCommitmentBigInt = idCommitmentBigInt % Q;
213
- }
201
+ const idTrapdoorBE = hmac(sha256, seedBytes, encoder.encode("IDTrapdoor"));
202
+ const idNullifierBE = hmac(sha256, seedBytes, encoder.encode("IDNullifier"));
203
+ const combinedBytes = new Uint8Array([...idTrapdoorBE, ...idNullifierBE]);
204
+ const idSecretHashBE = sha256(combinedBytes);
205
+ const idCommitmentBE = sha256(idSecretHashBE);
206
+ // All hashing functions return big-endian bytes
207
+ // We need to switch to little-endian for the identity credential
208
+ const idTrapdoorLE = switchEndianness(idTrapdoorBE);
209
+ const idNullifierLE = switchEndianness(idNullifierBE);
210
+ const idSecretHashLE = switchEndianness(idSecretHashBE);
211
+ const idCommitmentLE = switchEndianness(idCommitmentBE);
214
212
  log.info("Successfully generated identity credential");
215
- return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment, idCommitmentBigInt);
213
+ return new IdentityCredential(idTrapdoorLE, idNullifierLE, idSecretHashLE, idCommitmentLE);
216
214
  }
217
215
  }
218
216
 
@@ -1,18 +1,35 @@
1
- import { buildBigIntFromUint8Array } from './utils/bytes.js';
2
- import './utils/epoch.js';
1
+ import '../../interfaces/dist/protocols.js';
2
+ import '../../interfaces/dist/connection_manager.js';
3
+ import '../../interfaces/dist/health_indicator.js';
4
+ import '../../../node_modules/multiformats/dist/src/bases/base10.js';
5
+ import '../../../node_modules/multiformats/dist/src/bases/base16.js';
6
+ import '../../../node_modules/multiformats/dist/src/bases/base2.js';
7
+ import '../../../node_modules/multiformats/dist/src/bases/base256emoji.js';
8
+ import '../../../node_modules/multiformats/dist/src/bases/base32.js';
9
+ import '../../../node_modules/multiformats/dist/src/bases/base36.js';
10
+ import '../../../node_modules/multiformats/dist/src/bases/base58.js';
11
+ import '../../../node_modules/multiformats/dist/src/bases/base64.js';
12
+ import '../../../node_modules/multiformats/dist/src/bases/base8.js';
13
+ import '../../../node_modules/multiformats/dist/src/bases/identity.js';
14
+ import '../../../node_modules/multiformats/dist/src/codecs/json.js';
15
+ import { Logger } from '../../utils/dist/logger/index.js';
16
+ import { DEFAULT_Q } from './contract/constants.js';
17
+ import { buildBigIntFromUint8ArrayLE, switchEndiannessBigInt } from './utils/bytes.js';
3
18
 
19
+ const log = new Logger("waku:rln:identity");
4
20
  class IdentityCredential {
5
21
  IDTrapdoor;
6
22
  IDNullifier;
7
23
  IDSecretHash;
8
24
  IDCommitment;
9
- IDCommitmentBigInt;
10
- constructor(IDTrapdoor, IDNullifier, IDSecretHash, IDCommitment, IDCommitmentBigInt) {
25
+ /**
26
+ * All variables are in little-endian format
27
+ */
28
+ constructor(IDTrapdoor, IDNullifier, IDSecretHash, IDCommitment) {
11
29
  this.IDTrapdoor = IDTrapdoor;
12
30
  this.IDNullifier = IDNullifier;
13
31
  this.IDSecretHash = IDSecretHash;
14
32
  this.IDCommitment = IDCommitment;
15
- this.IDCommitmentBigInt = IDCommitmentBigInt;
16
33
  }
17
34
  static fromBytes(memKeys) {
18
35
  if (memKeys.length < 128) {
@@ -22,8 +39,24 @@ class IdentityCredential {
22
39
  const idNullifier = memKeys.subarray(32, 64);
23
40
  const idSecretHash = memKeys.subarray(64, 96);
24
41
  const idCommitment = memKeys.subarray(96, 128);
25
- const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment, 32);
26
- return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment, idCommitmentBigInt);
42
+ return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment);
43
+ }
44
+ /**
45
+ * Converts an ID commitment from bytes to a BigInt, normalizing it against a limit if needed
46
+ * @param bytes The ID commitment bytes to convert
47
+ * @param limit Optional limit to normalize against (Q value)
48
+ * @returns The ID commitment as a BigInt
49
+ */
50
+ static getIdCommitmentBigInt(idCommitment, returnType = "big-endian", limit = DEFAULT_Q) {
51
+ let idCommitmentBigIntLE = buildBigIntFromUint8ArrayLE(idCommitment);
52
+ if (limit && idCommitmentBigIntLE >= limit) {
53
+ log.warn(`ID commitment is greater than Q, reducing it by Q: ${idCommitmentBigIntLE} % ${limit}`);
54
+ idCommitmentBigIntLE = idCommitmentBigIntLE % limit;
55
+ }
56
+ if (returnType === "big-endian") {
57
+ return switchEndiannessBigInt(idCommitmentBigIntLE);
58
+ }
59
+ return idCommitmentBigIntLE;
27
60
  }
28
61
  }
29
62
 
@@ -17,7 +17,6 @@ import { Logger } from '../../../utils/dist/logger/index.js';
17
17
  import { sha256 } from '../../../../node_modules/ethereum-cryptography/esm/sha256.js';
18
18
  import { bytesToUtf8 } from '../../../../node_modules/ethereum-cryptography/esm/utils.js';
19
19
  import _ from '../../../../node_modules/lodash/lodash.js';
20
- import { buildBigIntFromUint8Array } from '../utils/bytes.js';
21
20
  import { keccak256Checksum, decryptEipKeystore } from './cipher.js';
22
21
  import { isKeystoreValid, isCredentialValid } from './schema_validator.js';
23
22
  import { __exports as lib } from '../../../../_virtual/index.js';
@@ -164,14 +163,16 @@ class Keystore {
164
163
  try {
165
164
  const str = bytesToUtf8(bytes);
166
165
  const obj = JSON.parse(str);
167
- // TODO: add runtime validation of nwaku credentials
166
+ const idCommitmentLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", []));
167
+ const idTrapdoorLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idTrapdoor", []));
168
+ const idNullifierLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idNullifier", []));
169
+ const idSecretHashLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", []));
168
170
  return {
169
171
  identity: {
170
- IDCommitment: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", [])),
171
- IDTrapdoor: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idTrapdoor", [])),
172
- IDNullifier: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idNullifier", [])),
173
- IDCommitmentBigInt: buildBigIntFromUint8Array(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", []))),
174
- IDSecretHash: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", []))
172
+ IDCommitment: idCommitmentLE,
173
+ IDTrapdoor: idTrapdoorLE,
174
+ IDNullifier: idNullifierLE,
175
+ IDSecretHash: idSecretHashLE
175
176
  },
176
177
  membership: {
177
178
  treeIndex: _.get(obj, "treeIndex"),
@@ -208,13 +209,16 @@ class Keystore {
208
209
  // follows nwaku implementation
209
210
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L98
210
211
  static fromIdentityToBytes(options) {
212
+ function toLittleEndian(bytes) {
213
+ return new Uint8Array(bytes).reverse();
214
+ }
211
215
  return utf8ToBytes(JSON.stringify({
212
216
  treeIndex: options.membership.treeIndex,
213
217
  identityCredential: {
214
- idCommitment: Array.from(options.identity.IDCommitment),
215
- idNullifier: Array.from(options.identity.IDNullifier),
216
- idSecretHash: Array.from(options.identity.IDSecretHash),
217
- idTrapdoor: Array.from(options.identity.IDTrapdoor)
218
+ idCommitment: Array.from(toLittleEndian(options.identity.IDCommitment)),
219
+ idNullifier: Array.from(toLittleEndian(options.identity.IDNullifier)),
220
+ idSecretHash: Array.from(toLittleEndian(options.identity.IDSecretHash)),
221
+ idTrapdoor: Array.from(toLittleEndian(options.identity.IDTrapdoor))
218
222
  },
219
223
  membershipContract: {
220
224
  chainId: options.membership.chainId,
@@ -1,4 +1,14 @@
1
+ import { Version } from '../../core/dist/lib/message/version_0.js';
2
+ import '../../core/dist/lib/filter/filter.js';
3
+ import '../../core/dist/lib/light_push/light_push.js';
4
+ import '../../core/dist/lib/store/store.js';
5
+ import '../../core/dist/lib/connection_manager/connection_manager.js';
6
+ import '../../interfaces/dist/protocols.js';
7
+ import '../../interfaces/dist/connection_manager.js';
8
+ import '../../interfaces/dist/health_indicator.js';
1
9
  import { utf8ToBytes } from '../../utils/dist/bytes/index.js';
10
+ import '../../../node_modules/debug/src/browser.js';
11
+ import '../../core/dist/lib/metadata/metadata.js';
2
12
  import { epochBytesToInt } from './utils/epoch.js';
3
13
 
4
14
  function toRLNSignal(contentTopic, msg) {
@@ -10,6 +20,7 @@ class RlnMessage {
10
20
  msg;
11
21
  rateLimitProof;
12
22
  pubsubTopic = "";
23
+ version = Version;
13
24
  constructor(rlnInstance, msg, rateLimitProof) {
14
25
  this.rlnInstance = rlnInstance;
15
26
  this.msg = msg;
@@ -16,12 +16,35 @@ function concatenate(...input) {
16
16
  }
17
17
  return result;
18
18
  }
19
- // Adapted from https://github.com/feross/buffer
20
- function checkInt(buf, value, offset, ext, max, min) {
21
- if (value > max || value < min)
22
- throw new RangeError('"value" argument is out of bounds');
23
- if (offset + ext > buf.length)
24
- throw new RangeError("Index out of range");
19
+ function switchEndianness(bytes) {
20
+ return new Uint8Array(bytes.reverse());
21
+ }
22
+ /**
23
+ * Builds a BigInt from a little-endian Uint8Array
24
+ * @param bytes The little-endian bytes to convert
25
+ * @returns The resulting BigInt in little-endian format
26
+ */
27
+ function buildBigIntFromUint8ArrayLE(bytes) {
28
+ let result = 0n;
29
+ for (let i = bytes.length - 1; i >= 0; i--) {
30
+ result = (result << 8n) + BigInt(bytes[i]);
31
+ }
32
+ return result;
33
+ }
34
+ /**
35
+ * Switches endianness of a bigint value
36
+ * @param value The bigint value to switch endianness for
37
+ * @returns The bigint value with reversed endianness
38
+ */
39
+ function switchEndiannessBigInt(value) {
40
+ // Convert bigint to byte array
41
+ const bytes = [];
42
+ while (value > 0n) {
43
+ bytes.push(Number(value & 0xffn));
44
+ value >>= 8n;
45
+ }
46
+ // Reverse bytes and convert back to bigint
47
+ return bytes.reverse().reduce((acc, byte) => (acc << 8n) + BigInt(byte), 0n);
25
48
  }
26
49
  function writeUIntLE(buf, value, offset, byteLength, noAssert) {
27
50
  value = +value;
@@ -39,15 +62,6 @@ function writeUIntLE(buf, value, offset, byteLength, noAssert) {
39
62
  }
40
63
  return buf;
41
64
  }
42
- /**
43
- * Transforms Uint8Array into BigInt
44
- * @param array: Uint8Array
45
- * @returns BigInt
46
- */
47
- function buildBigIntFromUint8Array(array, byteOffset = 0) {
48
- const dataView = new DataView(array.buffer);
49
- return dataView.getBigUint64(byteOffset, true);
50
- }
51
65
  /**
52
66
  * Fills with zeros to set length
53
67
  * @param array little endian Uint8Array
@@ -61,5 +75,12 @@ function zeroPadLE(array, length) {
61
75
  }
62
76
  return result;
63
77
  }
78
+ // Adapted from https://github.com/feross/buffer
79
+ function checkInt(buf, value, offset, ext, max, min) {
80
+ if (value > max || value < min)
81
+ throw new RangeError('"value" argument is out of bounds');
82
+ if (offset + ext > buf.length)
83
+ throw new RangeError("Index out of range");
84
+ }
64
85
 
65
- export { buildBigIntFromUint8Array, concatenate, writeUIntLE, zeroPadLE };
86
+ export { buildBigIntFromUint8ArrayLE, concatenate, switchEndianness, switchEndiannessBigInt, writeUIntLE, zeroPadLE };