@waku/rln 0.1.7-2ed5ddc.0 → 0.1.7-7f9828a.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 (95) hide show
  1. package/bundle/index.js +2 -2
  2. package/bundle/packages/core/dist/lib/connection_manager/connection_limiter.js +2 -2
  3. package/bundle/packages/core/dist/lib/connection_manager/connection_manager.js +3 -2
  4. package/bundle/packages/core/dist/lib/connection_manager/dialer.js +17 -0
  5. package/bundle/packages/core/dist/lib/connection_manager/discovery_dialer.js +2 -2
  6. package/bundle/packages/core/dist/lib/connection_manager/keep_alive_manager.js +2 -2
  7. package/bundle/packages/core/dist/lib/connection_manager/shard_reader.js +2 -2
  8. package/bundle/packages/core/dist/lib/filter/filter.js +2 -2
  9. package/bundle/packages/core/dist/lib/light_push/light_push.js +2 -2
  10. package/bundle/packages/core/dist/lib/message/version_0.js +1 -1
  11. package/bundle/packages/core/dist/lib/metadata/metadata.js +2 -2
  12. package/bundle/packages/core/dist/lib/store/store.js +2 -2
  13. package/bundle/packages/interfaces/dist/connection_manager.js +1 -0
  14. package/bundle/packages/interfaces/dist/{health_indicator.js → health_status.js} +10 -5
  15. package/bundle/packages/proto/dist/generated/light_push.js +160 -1
  16. package/bundle/packages/rln/dist/codec.js +2 -2
  17. package/bundle/packages/rln/dist/contract/abi/price_calculator.js +95 -0
  18. package/bundle/packages/rln/dist/contract/constants.js +15 -3
  19. package/bundle/packages/rln/dist/contract/rln_base_contract.js +25 -6
  20. package/bundle/packages/rln/dist/contract/rln_contract.js +4 -4
  21. package/bundle/packages/rln/dist/credentials_manager.js +25 -21
  22. package/bundle/packages/rln/dist/identity.js +8 -6
  23. package/bundle/packages/rln/dist/keystore/keystore.js +40 -13
  24. package/bundle/packages/rln/dist/message.js +1 -1
  25. package/bundle/packages/rln/dist/proof.js +2 -2
  26. package/bundle/packages/rln/dist/rln.js +2 -2
  27. package/bundle/packages/rln/dist/utils/bytes.js +103 -58
  28. package/bundle/packages/rln/dist/utils/epoch.js +2 -2
  29. package/bundle/packages/rln/dist/utils/hash.js +3 -3
  30. package/bundle/packages/rln/dist/zerokit.js +17 -17
  31. package/bundle/packages/utils/dist/common/sharding/index.js +1 -1
  32. package/bundle/packages/utils/dist/{logger/index.js → logger.js} +3 -3
  33. package/dist/.tsbuildinfo +1 -1
  34. package/dist/contract/abi/price_calculator.d.ts +46 -0
  35. package/dist/contract/abi/price_calculator.js +94 -0
  36. package/dist/contract/abi/price_calculator.js.map +1 -0
  37. package/dist/contract/{abi.js → abi/rln.js} +1 -1
  38. package/dist/contract/abi/rln.js.map +1 -0
  39. package/dist/contract/constants.d.ts +57 -1
  40. package/dist/contract/constants.js +14 -2
  41. package/dist/contract/constants.js.map +1 -1
  42. package/dist/contract/rln_base_contract.d.ts +9 -0
  43. package/dist/contract/rln_base_contract.js +23 -4
  44. package/dist/contract/rln_base_contract.js.map +1 -1
  45. package/dist/contract/rln_contract.js +2 -2
  46. package/dist/contract/rln_contract.js.map +1 -1
  47. package/dist/contract/{test-setup.d.ts → test_setup.d.ts} +4 -4
  48. package/dist/contract/{test-setup.js → test_setup.js} +4 -4
  49. package/dist/contract/{test-setup.js.map → test_setup.js.map} +1 -1
  50. package/dist/contract/{test-utils.js → test_utils.js} +10 -10
  51. package/dist/contract/{test-utils.js.map → test_utils.js.map} +1 -1
  52. package/dist/credentials_manager.d.ts +4 -0
  53. package/dist/credentials_manager.js +24 -19
  54. package/dist/credentials_manager.js.map +1 -1
  55. package/dist/identity.d.ts +5 -2
  56. package/dist/identity.js +8 -5
  57. package/dist/identity.js.map +1 -1
  58. package/dist/index.d.ts +3 -3
  59. package/dist/index.js +3 -3
  60. package/dist/index.js.map +1 -1
  61. package/dist/keystore/keystore.js +38 -11
  62. package/dist/keystore/keystore.js.map +1 -1
  63. package/dist/proof.js +2 -2
  64. package/dist/proof.js.map +1 -1
  65. package/dist/utils/bytes.d.ts +42 -20
  66. package/dist/utils/bytes.js +102 -57
  67. package/dist/utils/bytes.js.map +1 -1
  68. package/dist/utils/hash.js +5 -5
  69. package/dist/utils/hash.js.map +1 -1
  70. package/dist/utils/index.d.ts +1 -1
  71. package/dist/utils/index.js +1 -1
  72. package/dist/utils/index.js.map +1 -1
  73. package/dist/zerokit.js +17 -17
  74. package/dist/zerokit.js.map +1 -1
  75. package/package.json +1 -1
  76. package/src/contract/abi/price_calculator.ts +93 -0
  77. package/src/contract/constants.ts +18 -2
  78. package/src/contract/rln_base_contract.ts +38 -5
  79. package/src/contract/rln_contract.ts +5 -2
  80. package/src/contract/{test-setup.ts → test_setup.ts} +4 -4
  81. package/src/contract/{test-utils.ts → test_utils.ts} +9 -9
  82. package/src/credentials_manager.ts +41 -27
  83. package/src/identity.ts +11 -7
  84. package/src/index.ts +3 -3
  85. package/src/keystore/keystore.ts +52 -23
  86. package/src/proof.ts +2 -2
  87. package/src/utils/bytes.ts +118 -72
  88. package/src/utils/hash.ts +15 -5
  89. package/src/utils/index.ts +1 -6
  90. package/src/zerokit.ts +30 -22
  91. package/dist/contract/abi.js.map +0 -1
  92. /package/bundle/packages/rln/dist/contract/{abi.js → abi/rln.js} +0 -0
  93. /package/dist/contract/{abi.d.ts → abi/rln.d.ts} +0 -0
  94. /package/dist/contract/{test-utils.d.ts → test_utils.d.ts} +0 -0
  95. /package/src/contract/{abi.ts → abi/rln.ts} +0 -0
@@ -1,10 +1,10 @@
1
1
  import '../../../interfaces/dist/protocols.js';
2
2
  import '../../../interfaces/dist/connection_manager.js';
3
- import '../../../interfaces/dist/health_indicator.js';
3
+ import '../../../interfaces/dist/health_status.js';
4
4
  import { hexToBytes } from '../../../utils/dist/bytes/index.js';
5
- import { Logger } from '../../../utils/dist/logger/index.js';
5
+ import { Logger } from '../../../utils/dist/logger.js';
6
6
  import { MerkleRootTracker } from '../root_tracker.js';
7
- import { zeroPadLE } from '../utils/bytes.js';
7
+ import { BytesUtils } from '../utils/bytes.js';
8
8
  import { RLNBaseContract } from './rln_base_contract.js';
9
9
  import { BigNumber } from '../../../../node_modules/@ethersproject/bignumber/lib.esm/bignumber.js';
10
10
 
@@ -83,7 +83,7 @@ class RLNContract extends RLNBaseContract {
83
83
  if (typeof index === "number" || typeof index === "string") {
84
84
  index = BigNumber.from(index);
85
85
  }
86
- const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
86
+ const idCommitment = BytesUtils.zeroPadLE(hexToBytes(_idCommitment), 32);
87
87
  rlnInstance.zerokit.insertMember(idCommitment);
88
88
  const numericIndex = index.toNumber();
89
89
  this._members.set(numericIndex, {
@@ -1,8 +1,8 @@
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
- import '../../interfaces/dist/health_indicator.js';
5
+ import '../../interfaces/dist/health_status.js';
6
6
  import '../../../node_modules/multiformats/dist/src/bases/base10.js';
7
7
  import '../../../node_modules/multiformats/dist/src/bases/base16.js';
8
8
  import '../../../node_modules/multiformats/dist/src/bases/base2.js';
@@ -14,13 +14,13 @@ import '../../../node_modules/multiformats/dist/src/bases/base64.js';
14
14
  import '../../../node_modules/multiformats/dist/src/bases/base8.js';
15
15
  import '../../../node_modules/multiformats/dist/src/bases/identity.js';
16
16
  import '../../../node_modules/multiformats/dist/src/codecs/json.js';
17
- import { Logger } from '../../utils/dist/logger/index.js';
18
- import { LINEA_CONTRACT } from './contract/constants.js';
17
+ import { Logger } from '../../utils/dist/logger.js';
18
+ import { RLN_CONTRACT, RLN_Q } from './contract/constants.js';
19
19
  import { RLNBaseContract } from './contract/rln_base_contract.js';
20
20
  import { IdentityCredential } from './identity.js';
21
21
  import { Keystore } from './keystore/keystore.js';
22
+ import { BytesUtils } from './utils/bytes.js';
22
23
  import { extractMetaMaskSigner } from './utils/metamask.js';
23
- import { buildBigIntFromUint8Array } from './utils/bytes.js';
24
24
  import './utils/epoch.js';
25
25
 
26
26
  const log = new Logger("waku:credentials");
@@ -95,7 +95,7 @@ class RLNCredentialsManager {
95
95
  }
96
96
  else {
97
97
  log.info("Using local implementation to generate identity");
98
- identity = this.generateSeededIdentityCredential(options.signature);
98
+ identity = await this.generateSeededIdentityCredential(options.signature);
99
99
  }
100
100
  }
101
101
  if (!identity) {
@@ -124,9 +124,9 @@ class RLNCredentialsManager {
124
124
  let chainId = credentials?.membership.chainId;
125
125
  const address = credentials?.membership.address ||
126
126
  options.address ||
127
- LINEA_CONTRACT.address;
128
- if (address === LINEA_CONTRACT.address) {
129
- chainId = LINEA_CONTRACT.chainId.toString();
127
+ RLN_CONTRACT.address;
128
+ if (address === RLN_CONTRACT.address) {
129
+ chainId = RLN_CONTRACT.chainId.toString();
130
130
  log.info(`Using Linea contract with chainId: ${chainId}`);
131
131
  }
132
132
  const signer = options.signer || (await extractMetaMaskSigner());
@@ -191,24 +191,28 @@ class RLNCredentialsManager {
191
191
  * @param seed A string seed to generate the identity from
192
192
  * @returns IdentityCredential
193
193
  */
194
- generateSeededIdentityCredential(seed) {
194
+ async generateSeededIdentityCredential(seed) {
195
195
  log.info("Generating seeded identity credential");
196
196
  // Convert the seed to bytes
197
197
  const encoder = new TextEncoder();
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
- // Generate IDSecretHash as a hash of IDTrapdoor and IDNullifier
204
- const combinedBytes = new Uint8Array([...idTrapdoor, ...idNullifier]);
205
- const idSecretHash = sha256(combinedBytes);
206
- // Generate IDCommitment as a hash of IDSecretHash
207
- const idCommitment = sha256(idSecretHash);
208
- // Convert IDCommitment to BigInt
209
- const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment);
210
- log.info("Successfully generated identity credential");
211
- return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment, idCommitmentBigInt);
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 idCommitmentRawBE = sha256(idSecretHashBE);
206
+ const idCommitmentBE = this.reduceIdCommitment(idCommitmentRawBE);
207
+ log.info("Successfully generated identity credential, storing in Big Endian format");
208
+ return new IdentityCredential(idTrapdoorBE, idNullifierBE, idSecretHashBE, idCommitmentBE);
209
+ }
210
+ /**
211
+ * Helper: take 32-byte BE, reduce mod Q, return 32-byte BE
212
+ */
213
+ reduceIdCommitment(bytesBE, limit = RLN_Q) {
214
+ const nBE = BytesUtils.buildBigIntFromUint8ArrayBE(bytesBE);
215
+ return BytesUtils.bigIntToUint8Array32BE(nBE % limit);
212
216
  }
213
217
  }
214
218
 
@@ -1,5 +1,4 @@
1
- import { buildBigIntFromUint8Array } from './utils/bytes.js';
2
- import './utils/epoch.js';
1
+ import { BytesUtils } from './utils/bytes.js';
3
2
 
4
3
  class IdentityCredential {
5
4
  IDTrapdoor;
@@ -7,12 +6,16 @@ class IdentityCredential {
7
6
  IDSecretHash;
8
7
  IDCommitment;
9
8
  IDCommitmentBigInt;
10
- constructor(IDTrapdoor, IDNullifier, IDSecretHash, IDCommitment, IDCommitmentBigInt) {
9
+ /**
10
+ * All variables are in little-endian format
11
+ */
12
+ constructor(IDTrapdoor, IDNullifier, IDSecretHash, IDCommitment) {
11
13
  this.IDTrapdoor = IDTrapdoor;
12
14
  this.IDNullifier = IDNullifier;
13
15
  this.IDSecretHash = IDSecretHash;
14
16
  this.IDCommitment = IDCommitment;
15
- this.IDCommitmentBigInt = IDCommitmentBigInt;
17
+ this.IDCommitmentBigInt =
18
+ BytesUtils.buildBigIntFromUint8ArrayBE(IDCommitment);
16
19
  }
17
20
  static fromBytes(memKeys) {
18
21
  if (memKeys.length < 128) {
@@ -22,8 +25,7 @@ class IdentityCredential {
22
25
  const idNullifier = memKeys.subarray(32, 64);
23
26
  const idSecretHash = memKeys.subarray(64, 96);
24
27
  const idCommitment = memKeys.subarray(96, 128);
25
- const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment, 32);
26
- return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment, idCommitmentBigInt);
28
+ return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment);
27
29
  }
28
30
  }
29
31
 
@@ -1,7 +1,7 @@
1
1
  import '../../../../node_modules/@chainsafe/bls-keystore/lib/index.js';
2
2
  import '../../../interfaces/dist/protocols.js';
3
3
  import '../../../interfaces/dist/connection_manager.js';
4
- import '../../../interfaces/dist/health_indicator.js';
4
+ import '../../../interfaces/dist/health_status.js';
5
5
  import '../../../../node_modules/multiformats/dist/src/bases/base10.js';
6
6
  import '../../../../node_modules/multiformats/dist/src/bases/base16.js';
7
7
  import '../../../../node_modules/multiformats/dist/src/bases/base2.js';
@@ -13,11 +13,11 @@ import '../../../../node_modules/multiformats/dist/src/bases/base64.js';
13
13
  import '../../../../node_modules/multiformats/dist/src/bases/base8.js';
14
14
  import '../../../../node_modules/multiformats/dist/src/bases/identity.js';
15
15
  import '../../../../node_modules/multiformats/dist/src/codecs/json.js';
16
- import { Logger } from '../../../utils/dist/logger/index.js';
16
+ import { Logger } from '../../../utils/dist/logger.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';
20
+ import { BytesUtils } from '../utils/bytes.js';
21
21
  import { keccak256Checksum, decryptEipKeystore } from './cipher.js';
22
22
  import { isKeystoreValid, isCredentialValid } from './schema_validator.js';
23
23
  import { __exports as lib } from '../../../../_virtual/index.js';
@@ -164,14 +164,24 @@ class Keystore {
164
164
  try {
165
165
  const str = bytesToUtf8(bytes);
166
166
  const obj = JSON.parse(str);
167
- // TODO: add runtime validation of nwaku credentials
167
+ // Little Endian
168
+ const idCommitmentLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", []));
169
+ const idTrapdoorLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idTrapdoor", []));
170
+ const idNullifierLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idNullifier", []));
171
+ const idSecretHashLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", []));
172
+ // Big Endian
173
+ const idCommitmentBE = BytesUtils.switchEndianness(idCommitmentLE);
174
+ const idTrapdoorBE = BytesUtils.switchEndianness(idTrapdoorLE);
175
+ const idNullifierBE = BytesUtils.switchEndianness(idNullifierLE);
176
+ const idSecretHashBE = BytesUtils.switchEndianness(idSecretHashLE);
177
+ const idCommitmentBigInt = BytesUtils.buildBigIntFromUint8ArrayBE(idCommitmentBE);
168
178
  return {
169
179
  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", []))
180
+ IDCommitment: idCommitmentBE,
181
+ IDTrapdoor: idTrapdoorBE,
182
+ IDNullifier: idNullifierBE,
183
+ IDSecretHash: idSecretHashBE,
184
+ IDCommitmentBigInt: idCommitmentBigInt
175
185
  },
176
186
  membership: {
177
187
  treeIndex: _.get(obj, "treeIndex"),
@@ -207,14 +217,31 @@ class Keystore {
207
217
  }
208
218
  // follows nwaku implementation
209
219
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L98
220
+ // IdentityCredential is stored in Big Endian format => switch to Little Endian
210
221
  static fromIdentityToBytes(options) {
222
+ const { IDCommitment, IDNullifier, IDSecretHash, IDTrapdoor } = options.identity;
223
+ const idCommitmentLE = BytesUtils.switchEndianness(IDCommitment);
224
+ const idNullifierLE = BytesUtils.switchEndianness(IDNullifier);
225
+ const idSecretHashLE = BytesUtils.switchEndianness(IDSecretHash);
226
+ const idTrapdoorLE = BytesUtils.switchEndianness(IDTrapdoor);
227
+ // eslint-disable-next-line no-console
228
+ console.log({
229
+ idCommitmentBE: IDCommitment,
230
+ idCommitmentLE,
231
+ idNullifierBE: IDNullifier,
232
+ idNullifierLE,
233
+ idSecretHashBE: IDSecretHash,
234
+ idSecretHashLE,
235
+ idTrapdoorBE: IDTrapdoor,
236
+ idTrapdoorLE
237
+ });
211
238
  return utf8ToBytes(JSON.stringify({
212
239
  treeIndex: options.membership.treeIndex,
213
240
  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)
241
+ idCommitment: Array.from(idCommitmentLE),
242
+ idNullifier: Array.from(idNullifierLE),
243
+ idSecretHash: Array.from(idSecretHashLE),
244
+ idTrapdoor: Array.from(idTrapdoorLE)
218
245
  },
219
246
  membershipContract: {
220
247
  chainId: options.membership.chainId,
@@ -5,7 +5,7 @@ import '../../core/dist/lib/store/store.js';
5
5
  import '../../core/dist/lib/connection_manager/connection_manager.js';
6
6
  import '../../interfaces/dist/protocols.js';
7
7
  import '../../interfaces/dist/connection_manager.js';
8
- import '../../interfaces/dist/health_indicator.js';
8
+ import '../../interfaces/dist/health_status.js';
9
9
  import { utf8ToBytes } from '../../utils/dist/bytes/index.js';
10
10
  import '../../../node_modules/debug/src/browser.js';
11
11
  import '../../core/dist/lib/metadata/metadata.js';
@@ -1,4 +1,4 @@
1
- import { concatenate } from './utils/bytes.js';
1
+ import { BytesUtils } from './utils/bytes.js';
2
2
  import { poseidonHash } from './utils/hash.js';
3
3
  import './utils/epoch.js';
4
4
 
@@ -48,7 +48,7 @@ class Proof {
48
48
  }
49
49
  }
50
50
  function proofToBytes(p) {
51
- return concatenate(p.proof, p.merkleRoot, p.epoch, p.shareX, p.shareY, p.nullifier, p.rlnIdentifier);
51
+ return BytesUtils.concatenate(p.proof, p.merkleRoot, p.epoch, p.shareX, p.shareY, p.nullifier, p.rlnIdentifier);
52
52
  }
53
53
 
54
54
  export { Proof, proofToBytes };
@@ -5,7 +5,7 @@ import '../../core/dist/lib/store/store.js';
5
5
  import '../../core/dist/lib/connection_manager/connection_manager.js';
6
6
  import '../../interfaces/dist/protocols.js';
7
7
  import '../../interfaces/dist/connection_manager.js';
8
- import '../../interfaces/dist/health_indicator.js';
8
+ import '../../interfaces/dist/health_status.js';
9
9
  import '../../../node_modules/multiformats/dist/src/bases/base10.js';
10
10
  import '../../../node_modules/multiformats/dist/src/bases/base16.js';
11
11
  import '../../../node_modules/multiformats/dist/src/bases/base2.js';
@@ -17,7 +17,7 @@ import '../../../node_modules/multiformats/dist/src/bases/base64.js';
17
17
  import '../../../node_modules/multiformats/dist/src/bases/base8.js';
18
18
  import '../../../node_modules/multiformats/dist/src/bases/identity.js';
19
19
  import '../../../node_modules/multiformats/dist/src/codecs/json.js';
20
- import { Logger } from '../../utils/dist/logger/index.js';
20
+ import { Logger } from '../../utils/dist/logger.js';
21
21
  import '../../core/dist/lib/metadata/metadata.js';
22
22
  import __wbg_init, { init_panic_hook, newRLN } from '../../../node_modules/@waku/zerokit-rln-wasm/rln_wasm.js';
23
23
  import { createRLNEncoder, createRLNDecoder } from './codec.js';
@@ -1,65 +1,110 @@
1
- /**
2
- * Concatenate Uint8Arrays
3
- * @param input
4
- * @returns concatenation of all Uint8Array received as input
5
- */
6
- function concatenate(...input) {
7
- let totalLength = 0;
8
- for (const arr of input) {
9
- totalLength += arr.length;
1
+ class BytesUtils {
2
+ /**
3
+ * Switches endianness of a byte array
4
+ */
5
+ static switchEndianness(bytes) {
6
+ return new Uint8Array([...bytes].reverse());
10
7
  }
11
- const result = new Uint8Array(totalLength);
12
- let offset = 0;
13
- for (const arr of input) {
14
- result.set(arr, offset);
15
- offset += arr.length;
8
+ /**
9
+ * Builds a BigInt from a big-endian Uint8Array
10
+ * @param bytes The big-endian bytes to convert
11
+ * @returns The resulting BigInt in big-endian format
12
+ */
13
+ static buildBigIntFromUint8ArrayBE(bytes) {
14
+ let result = 0n;
15
+ for (let i = 0; i < bytes.length; i++) {
16
+ result = (result << 8n) + BigInt(bytes[i]);
17
+ }
18
+ return result;
16
19
  }
17
- return result;
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");
25
- }
26
- function writeUIntLE(buf, value, offset, byteLength, noAssert) {
27
- value = +value;
28
- offset = offset >>> 0;
29
- byteLength = byteLength >>> 0;
30
- {
31
- const maxBytes = Math.pow(2, 8 * byteLength) - 1;
32
- checkInt(buf, value, offset, byteLength, maxBytes, 0);
20
+ /**
21
+ * Switches endianness of a bigint value
22
+ * @param value The bigint value to switch endianness for
23
+ * @returns The bigint value with reversed endianness
24
+ */
25
+ static switchEndiannessBigInt(value) {
26
+ // Convert bigint to byte array
27
+ const bytes = [];
28
+ let tempValue = value;
29
+ while (tempValue > 0n) {
30
+ bytes.push(Number(tempValue & 0xffn));
31
+ tempValue >>= 8n;
32
+ }
33
+ // Reverse bytes and convert back to bigint
34
+ return bytes
35
+ .reverse()
36
+ .reduce((acc, byte) => (acc << 8n) + BigInt(byte), 0n);
33
37
  }
34
- let mul = 1;
35
- let i = 0;
36
- buf[offset] = value & 0xff;
37
- while (++i < byteLength && (mul *= 0x100)) {
38
- buf[offset + i] = (value / mul) & 0xff;
38
+ /**
39
+ * Converts a big-endian bigint to a 32-byte big-endian Uint8Array
40
+ * @param value The big-endian bigint to convert
41
+ * @returns A 32-byte big-endian Uint8Array
42
+ */
43
+ static bigIntToUint8Array32BE(value) {
44
+ const bytes = new Uint8Array(32);
45
+ for (let i = 31; i >= 0; i--) {
46
+ bytes[i] = Number(value & 0xffn);
47
+ value >>= 8n;
48
+ }
49
+ return bytes;
39
50
  }
40
- return buf;
41
- }
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
- /**
52
- * Fills with zeros to set length
53
- * @param array little endian Uint8Array
54
- * @param length amount to pad
55
- * @returns little endian Uint8Array padded with zeros to set length
56
- */
57
- function zeroPadLE(array, length) {
58
- const result = new Uint8Array(length);
59
- for (let i = 0; i < length; i++) {
60
- result[i] = array[i] || 0;
51
+ /**
52
+ * Writes an unsigned integer to a buffer in little-endian format
53
+ */
54
+ static writeUIntLE(buf, value, offset, byteLength, noAssert) {
55
+ value = +value;
56
+ offset = offset >>> 0;
57
+ byteLength = byteLength >>> 0;
58
+ if (!noAssert) {
59
+ const maxBytes = Math.pow(2, 8 * byteLength) - 1;
60
+ BytesUtils.checkInt(buf, value, offset, byteLength, maxBytes, 0);
61
+ }
62
+ let mul = 1;
63
+ let i = 0;
64
+ buf[offset] = value & 0xff;
65
+ while (++i < byteLength && (mul *= 0x100)) {
66
+ buf[offset + i] = (value / mul) & 0xff;
67
+ }
68
+ return buf;
69
+ }
70
+ /**
71
+ * Fills with zeros to set length
72
+ * @param array little endian Uint8Array
73
+ * @param length amount to pad
74
+ * @returns little endian Uint8Array padded with zeros to set length
75
+ */
76
+ static zeroPadLE(array, length) {
77
+ const result = new Uint8Array(length);
78
+ for (let i = 0; i < length; i++) {
79
+ result[i] = array[i] || 0;
80
+ }
81
+ return result;
82
+ }
83
+ // Adapted from https://github.com/feross/buffer
84
+ static checkInt(buf, value, offset, ext, max, min) {
85
+ if (value > max || value < min)
86
+ throw new RangeError('"value" argument is out of bounds');
87
+ if (offset + ext > buf.length)
88
+ throw new RangeError("Index out of range");
89
+ }
90
+ /**
91
+ * Concatenate Uint8Arrays
92
+ * @param input
93
+ * @returns concatenation of all Uint8Array received as input
94
+ */
95
+ static concatenate(...input) {
96
+ let totalLength = 0;
97
+ for (const arr of input) {
98
+ totalLength += arr.length;
99
+ }
100
+ const result = new Uint8Array(totalLength);
101
+ let offset = 0;
102
+ for (const arr of input) {
103
+ result.set(arr, offset);
104
+ offset += arr.length;
105
+ }
106
+ return result;
61
107
  }
62
- return result;
63
108
  }
64
109
 
65
- export { buildBigIntFromUint8Array, concatenate, writeUIntLE, zeroPadLE };
110
+ export { BytesUtils };
@@ -1,6 +1,6 @@
1
1
  import '../../../interfaces/dist/protocols.js';
2
2
  import '../../../interfaces/dist/connection_manager.js';
3
- import '../../../interfaces/dist/health_indicator.js';
3
+ import '../../../interfaces/dist/health_status.js';
4
4
  import '../../../../node_modules/multiformats/dist/src/bases/base10.js';
5
5
  import '../../../../node_modules/multiformats/dist/src/bases/base16.js';
6
6
  import '../../../../node_modules/multiformats/dist/src/bases/base2.js';
@@ -12,7 +12,7 @@ import '../../../../node_modules/multiformats/dist/src/bases/base64.js';
12
12
  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
- import { Logger } from '../../../utils/dist/logger/index.js';
15
+ import { Logger } from '../../../utils/dist/logger.js';
16
16
 
17
17
  const DefaultEpochUnitSeconds = 10; // the rln-relay epoch length in seconds
18
18
  const log = new Logger("waku:rln:epoch");
@@ -1,9 +1,9 @@
1
1
  import { poseidonHash as poseidonHash$1 } from '../../../../node_modules/@waku/zerokit-rln-wasm/rln_wasm.js';
2
- import { writeUIntLE, concatenate } from './bytes.js';
2
+ import { BytesUtils } from './bytes.js';
3
3
 
4
4
  function poseidonHash(...input) {
5
- const inputLen = writeUIntLE(new Uint8Array(8), input.length, 0, 8);
6
- const lenPrefixedData = concatenate(inputLen, ...input);
5
+ const inputLen = BytesUtils.writeUIntLE(new Uint8Array(8), input.length, 0, 8);
6
+ const lenPrefixedData = BytesUtils.concatenate(inputLen, ...input);
7
7
  return poseidonHash$1(lenPrefixedData);
8
8
  }
9
9
 
@@ -2,7 +2,7 @@ import { generateExtendedMembershipKey, generateSeededExtendedMembershipKey, ins
2
2
  import { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from './contract/constants.js';
3
3
  import { IdentityCredential } from './identity.js';
4
4
  import { Proof, proofToBytes } from './proof.js';
5
- import { writeUIntLE, concatenate } from './utils/bytes.js';
5
+ import { BytesUtils } from './utils/bytes.js';
6
6
  import { epochIntToBytes, dateToEpoch } from './utils/epoch.js';
7
7
 
8
8
  class Zerokit {
@@ -40,8 +40,8 @@ class Zerokit {
40
40
  insertMembers(index, ...idCommitments) {
41
41
  // serializes a seq of IDCommitments to a byte seq
42
42
  // the order of serialization is |id_commitment_len<8>|id_commitment<var>|
43
- const idCommitmentLen = writeUIntLE(new Uint8Array(8), idCommitments.length, 0, 8);
44
- const idCommitmentBytes = concatenate(idCommitmentLen, ...idCommitments);
43
+ const idCommitmentLen = BytesUtils.writeUIntLE(new Uint8Array(8), idCommitments.length, 0, 8);
44
+ const idCommitmentBytes = BytesUtils.concatenate(idCommitmentLen, ...idCommitments);
45
45
  setLeavesFrom(this.zkRLN, index, idCommitmentBytes);
46
46
  }
47
47
  deleteMember(index) {
@@ -52,11 +52,11 @@ class Zerokit {
52
52
  }
53
53
  serializeMessage(uint8Msg, memIndex, epoch, idKey, rateLimit) {
54
54
  // calculate message length
55
- const msgLen = writeUIntLE(new Uint8Array(8), uint8Msg.length, 0, 8);
56
- const memIndexBytes = writeUIntLE(new Uint8Array(8), memIndex, 0, 8);
57
- const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
55
+ const msgLen = BytesUtils.writeUIntLE(new Uint8Array(8), uint8Msg.length, 0, 8);
56
+ const memIndexBytes = BytesUtils.writeUIntLE(new Uint8Array(8), memIndex, 0, 8);
57
+ const rateLimitBytes = BytesUtils.writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
58
58
  // [ id_key<32> | id_index<8> | epoch<32> | signal_len<8> | signal<var> | rate_limit<8> ]
59
- return concatenate(idKey, memIndexBytes, epoch, msgLen, uint8Msg, rateLimitBytes);
59
+ return BytesUtils.concatenate(idKey, memIndexBytes, epoch, msgLen, uint8Msg, rateLimitBytes);
60
60
  }
61
61
  async generateRLNProof(msg, index, epoch, idSecretHash, rateLimit) {
62
62
  if (epoch === undefined) {
@@ -92,9 +92,9 @@ class Zerokit {
92
92
  pBytes = proofToBytes(proof);
93
93
  }
94
94
  // calculate message length
95
- const msgLen = writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
96
- const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
97
- return verifyRLNProof(this.zkRLN, concatenate(pBytes, msgLen, msg, rateLimitBytes));
95
+ const msgLen = BytesUtils.writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
96
+ const rateLimitBytes = BytesUtils.writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
97
+ return verifyRLNProof(this.zkRLN, BytesUtils.concatenate(pBytes, msgLen, msg, rateLimitBytes));
98
98
  }
99
99
  verifyWithRoots(proof, msg, roots, rateLimit) {
100
100
  let pBytes;
@@ -105,10 +105,10 @@ class Zerokit {
105
105
  pBytes = proofToBytes(proof);
106
106
  }
107
107
  // calculate message length
108
- const msgLen = writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
109
- const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
110
- const rootsBytes = concatenate(...roots);
111
- return verifyWithRoots(this.zkRLN, concatenate(pBytes, msgLen, msg, rateLimitBytes), rootsBytes);
108
+ const msgLen = BytesUtils.writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
109
+ const rateLimitBytes = BytesUtils.writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
110
+ const rootsBytes = BytesUtils.concatenate(...roots);
111
+ return verifyWithRoots(this.zkRLN, BytesUtils.concatenate(pBytes, msgLen, msg, rateLimitBytes), rootsBytes);
112
112
  }
113
113
  verifyWithNoRoot(proof, msg, rateLimit) {
114
114
  let pBytes;
@@ -119,9 +119,9 @@ class Zerokit {
119
119
  pBytes = proofToBytes(proof);
120
120
  }
121
121
  // calculate message length
122
- const msgLen = writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
123
- const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
124
- return verifyWithRoots(this.zkRLN, concatenate(pBytes, msgLen, msg, rateLimitBytes), new Uint8Array());
122
+ const msgLen = BytesUtils.writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
123
+ const rateLimitBytes = BytesUtils.writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
124
+ return verifyWithRoots(this.zkRLN, BytesUtils.concatenate(pBytes, msgLen, msg, rateLimitBytes), new Uint8Array());
125
125
  }
126
126
  }
127
127
 
@@ -2,7 +2,7 @@ import { sha256 } from '../../../../../node_modules/@noble/hashes/esm/sha256.js'
2
2
  import '../../../../interfaces/dist/protocols.js';
3
3
  import '../../../../interfaces/dist/connection_manager.js';
4
4
  import { DEFAULT_CLUSTER_ID } from '../../../../interfaces/dist/constants.js';
5
- import '../../../../interfaces/dist/health_indicator.js';
5
+ import '../../../../interfaces/dist/health_status.js';
6
6
  import { concat, utf8ToBytes } from '../../bytes/index.js';
7
7
 
8
8
  const singleShardInfoToPubsubTopic = (shardInfo) => {
@@ -1,4 +1,4 @@
1
- import debug from '../../../../node_modules/debug/src/browser.js';
1
+ import debug from '../../../node_modules/debug/src/browser.js';
2
2
 
3
3
  const APP_NAME = "waku";
4
4
  class Logger {
@@ -6,7 +6,7 @@ class Logger {
6
6
  _warn;
7
7
  _error;
8
8
  static createDebugNamespace(level, prefix) {
9
- return prefix ? `${APP_NAME}:${level}:${prefix}` : `${APP_NAME}:${level}`;
9
+ return prefix ? `${APP_NAME}:${prefix}:${level}` : `${APP_NAME}:${level}`;
10
10
  }
11
11
  constructor(prefix) {
12
12
  this._info = debug(Logger.createDebugNamespace("info", prefix));
@@ -23,7 +23,7 @@ class Logger {
23
23
  return this._error;
24
24
  }
25
25
  log(level, ...args) {
26
- const logger = this[level];
26
+ const logger = this[level] || this.log;
27
27
  logger(...args);
28
28
  }
29
29
  }