@waku/rln 0.1.5-053bb95.0 → 0.1.5-164df63.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 (158) hide show
  1. package/bundle/_virtual/utils.js +2 -2
  2. package/bundle/_virtual/utils2.js +2 -2
  3. package/bundle/index.js +2 -1
  4. package/bundle/packages/rln/dist/contract/constants.js +6 -2
  5. package/bundle/packages/rln/dist/contract/rln_base_contract.js +282 -146
  6. package/bundle/packages/rln/dist/contract/rln_contract.js +74 -89
  7. package/bundle/packages/rln/dist/credentials_manager.js +1 -1
  8. package/bundle/packages/rln/dist/identity.js +0 -8
  9. package/bundle/packages/rln/dist/keystore/keystore.js +28 -15
  10. package/bundle/packages/rln/dist/utils/bytes.js +8 -2
  11. package/bundle/packages/rln/dist/utils/metamask.js +2 -2
  12. package/bundle/packages/rln/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +1 -1
  13. package/bundle/packages/rln/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +2 -2
  14. package/bundle/packages/rln/node_modules/@noble/hashes/_sha2.js +1 -1
  15. package/bundle/packages/rln/node_modules/@noble/hashes/hmac.js +1 -1
  16. package/bundle/packages/rln/node_modules/@noble/hashes/pbkdf2.js +1 -1
  17. package/bundle/packages/rln/node_modules/@noble/hashes/scrypt.js +1 -1
  18. package/bundle/packages/rln/node_modules/@noble/hashes/sha256.js +1 -1
  19. package/bundle/packages/rln/node_modules/@noble/hashes/sha512.js +1 -1
  20. package/bundle/packages/rln/node_modules/@noble/hashes/utils.js +1 -1
  21. package/dist/.tsbuildinfo +1 -1
  22. package/dist/contract/constants.d.ts +1 -1
  23. package/dist/contract/constants.js +1 -1
  24. package/dist/contract/constants.js.map +1 -1
  25. package/dist/contract/index.d.ts +1 -0
  26. package/dist/contract/index.js +1 -0
  27. package/dist/contract/index.js.map +1 -1
  28. package/dist/contract/rln_base_contract.d.ts +27 -25
  29. package/dist/contract/rln_base_contract.js +280 -144
  30. package/dist/contract/rln_base_contract.js.map +1 -1
  31. package/dist/contract/rln_contract.d.ts +4 -24
  32. package/dist/contract/rln_contract.js +74 -89
  33. package/dist/contract/rln_contract.js.map +1 -1
  34. package/dist/contract/types.d.ts +5 -0
  35. package/dist/contract/types.js.map +1 -1
  36. package/dist/credentials_manager.js +1 -1
  37. package/dist/credentials_manager.js.map +1 -1
  38. package/dist/identity.d.ts +0 -1
  39. package/dist/identity.js +0 -8
  40. package/dist/identity.js.map +1 -1
  41. package/dist/index.d.ts +2 -1
  42. package/dist/index.js +1 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/keystore/keystore.d.ts +1 -0
  45. package/dist/keystore/keystore.js +28 -15
  46. package/dist/keystore/keystore.js.map +1 -1
  47. package/dist/keystore/types.d.ts +2 -2
  48. package/dist/utils/bytes.js +8 -2
  49. package/dist/utils/bytes.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/contract/constants.ts +1 -1
  52. package/src/contract/index.ts +1 -0
  53. package/src/contract/rln_base_contract.ts +428 -216
  54. package/src/contract/rln_contract.ts +95 -120
  55. package/src/contract/types.ts +5 -0
  56. package/src/credentials_manager.ts +1 -1
  57. package/src/identity.ts +0 -9
  58. package/src/index.ts +3 -1
  59. package/src/keystore/keystore.ts +54 -29
  60. package/src/keystore/types.ts +2 -2
  61. package/src/utils/bytes.ts +10 -2
  62. package/bundle/_virtual/__node-resolve_empty.js +0 -6
  63. package/bundle/_virtual/_node-resolve_empty.js +0 -3
  64. package/bundle/_virtual/bn.js +0 -3
  65. package/bundle/_virtual/common.js +0 -3
  66. package/bundle/_virtual/common2.js +0 -3
  67. package/bundle/_virtual/hash.js +0 -3
  68. package/bundle/_virtual/inherits_browser.js +0 -3
  69. package/bundle/_virtual/ripemd.js +0 -3
  70. package/bundle/_virtual/sha.js +0 -3
  71. package/bundle/_virtual/sha3.js +0 -3
  72. package/bundle/_virtual/utils3.js +0 -3
  73. package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +0 -3
  74. package/bundle/node_modules/@ethersproject/abi/lib.esm/abi-coder.js +0 -96
  75. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js +0 -148
  76. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/address.js +0 -26
  77. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js +0 -20
  78. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/array.js +0 -210
  79. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/boolean.js +0 -18
  80. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/bytes.js +0 -30
  81. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js +0 -26
  82. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/null.js +0 -22
  83. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/number.js +0 -43
  84. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/string.js +0 -19
  85. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/tuple.js +0 -58
  86. package/bundle/node_modules/@ethersproject/abi/lib.esm/fragments.js +0 -854
  87. package/bundle/node_modules/@ethersproject/abi/lib.esm/interface.js +0 -609
  88. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +0 -3
  89. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/index.js +0 -66
  90. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +0 -3
  91. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/index.js +0 -302
  92. package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +0 -3
  93. package/bundle/node_modules/@ethersproject/address/lib.esm/index.js +0 -110
  94. package/bundle/node_modules/@ethersproject/base64/lib.esm/base64.js +0 -20
  95. package/bundle/node_modules/@ethersproject/basex/lib.esm/index.js +0 -120
  96. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +0 -3
  97. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/bignumber.js +0 -287
  98. package/bundle/node_modules/@ethersproject/bytes/lib.esm/_version.js +0 -3
  99. package/bundle/node_modules/@ethersproject/bytes/lib.esm/index.js +0 -402
  100. package/bundle/node_modules/@ethersproject/constants/lib.esm/addresses.js +0 -3
  101. package/bundle/node_modules/@ethersproject/constants/lib.esm/bignumbers.js +0 -8
  102. package/bundle/node_modules/@ethersproject/constants/lib.esm/hashes.js +0 -3
  103. package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +0 -3
  104. package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +0 -893
  105. package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +0 -3
  106. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/decoder.js +0 -256
  107. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/include.js +0 -36
  108. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/lib.js +0 -135
  109. package/bundle/node_modules/@ethersproject/hash/lib.esm/id.js +0 -8
  110. package/bundle/node_modules/@ethersproject/hash/lib.esm/namehash.js +0 -64
  111. package/bundle/node_modules/@ethersproject/hash/lib.esm/typed-data.js +0 -443
  112. package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +0 -8
  113. package/bundle/node_modules/@ethersproject/keccak256/node_modules/js-sha3/src/sha3.js +0 -660
  114. package/bundle/node_modules/@ethersproject/logger/lib.esm/_version.js +0 -3
  115. package/bundle/node_modules/@ethersproject/logger/lib.esm/index.js +0 -352
  116. package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +0 -3
  117. package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +0 -248
  118. package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +0 -3
  119. package/bundle/node_modules/@ethersproject/properties/lib.esm/index.js +0 -127
  120. package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +0 -3
  121. package/bundle/node_modules/@ethersproject/providers/lib.esm/base-provider.js +0 -2007
  122. package/bundle/node_modules/@ethersproject/providers/lib.esm/formatter.js +0 -422
  123. package/bundle/node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js +0 -674
  124. package/bundle/node_modules/@ethersproject/providers/lib.esm/web3-provider.js +0 -132
  125. package/bundle/node_modules/@ethersproject/rlp/lib.esm/_version.js +0 -3
  126. package/bundle/node_modules/@ethersproject/rlp/lib.esm/index.js +0 -120
  127. package/bundle/node_modules/@ethersproject/sha2/lib.esm/sha2.js +0 -8
  128. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +0 -3
  129. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +0 -2430
  130. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/index.js +0 -76
  131. package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +0 -3
  132. package/bundle/node_modules/@ethersproject/strings/lib.esm/utf8.js +0 -219
  133. package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +0 -3
  134. package/bundle/node_modules/@ethersproject/transactions/lib.esm/index.js +0 -279
  135. package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +0 -3
  136. package/bundle/node_modules/@ethersproject/web/lib.esm/geturl.js +0 -69
  137. package/bundle/node_modules/@ethersproject/web/lib.esm/index.js +0 -404
  138. package/bundle/node_modules/bech32/index.js +0 -187
  139. package/bundle/node_modules/bn.js/lib/bn.js +0 -3361
  140. package/bundle/node_modules/hash.js/lib/hash/common.js +0 -97
  141. package/bundle/node_modules/hash.js/lib/hash/hmac.js +0 -51
  142. package/bundle/node_modules/hash.js/lib/hash/ripemd.js +0 -152
  143. package/bundle/node_modules/hash.js/lib/hash/sha/1.js +0 -81
  144. package/bundle/node_modules/hash.js/lib/hash/sha/224.js +0 -33
  145. package/bundle/node_modules/hash.js/lib/hash/sha/256.js +0 -113
  146. package/bundle/node_modules/hash.js/lib/hash/sha/384.js +0 -39
  147. package/bundle/node_modules/hash.js/lib/hash/sha/512.js +0 -336
  148. package/bundle/node_modules/hash.js/lib/hash/sha/common.js +0 -53
  149. package/bundle/node_modules/hash.js/lib/hash/sha.js +0 -14
  150. package/bundle/node_modules/hash.js/lib/hash/utils.js +0 -282
  151. package/bundle/node_modules/hash.js/lib/hash.js +0 -33
  152. package/bundle/node_modules/inherits/inherits_browser.js +0 -33
  153. package/bundle/node_modules/minimalistic-assert/index.js +0 -13
  154. package/bundle/packages/rln/dist/contract/errors.js +0 -62
  155. package/dist/contract/errors.d.ts +0 -30
  156. package/dist/contract/errors.js +0 -61
  157. package/dist/contract/errors.js.map +0 -1
  158. package/src/contract/errors.ts +0 -75
@@ -1,11 +1,11 @@
1
1
  import { Logger } from "@waku/utils";
2
2
  import { hexToBytes } from "@waku/utils/bytes";
3
+ import { ethers } from "ethers";
3
4
 
4
5
  import type { RLNInstance } from "../rln.js";
5
6
  import { MerkleRootTracker } from "../root_tracker.js";
6
7
  import { zeroPadLE } from "../utils/bytes.js";
7
8
 
8
- import { ContractStateError } from "./errors.js";
9
9
  import { RLNBaseContract } from "./rln_base_contract.js";
10
10
  import { RLNContractInitOptions } from "./types.js";
11
11
 
@@ -14,7 +14,6 @@ const log = new Logger("waku:rln:contract");
14
14
  export class RLNContract extends RLNBaseContract {
15
15
  private instance: RLNInstance;
16
16
  private merkleRootTracker: MerkleRootTracker;
17
- private lastSyncedBlock: number = 0;
18
17
 
19
18
  /**
20
19
  * Asynchronous initializer for RLNContract.
@@ -25,42 +24,8 @@ export class RLNContract extends RLNBaseContract {
25
24
  options: RLNContractInitOptions
26
25
  ): Promise<RLNContract> {
27
26
  const rlnContract = new RLNContract(rlnInstance, options);
28
- await rlnContract.syncState();
29
- return rlnContract;
30
- }
31
-
32
- /**
33
- * Override base contract method to keep Merkle tree in sync
34
- * Registers a new membership with the given commitment and rate limit
35
- */
36
- public override async registerMembership(
37
- idCommitment: string,
38
- rateLimit: number = this.getRateLimit()
39
- ): Promise<void> {
40
- await super.registerMembership(idCommitment, rateLimit);
41
- await this.syncState();
42
- }
43
27
 
44
- /**
45
- * Override base contract method to keep Merkle tree in sync
46
- * Erases an existing membership from the contract
47
- */
48
- public override async eraseMembership(
49
- idCommitment: string,
50
- eraseFromMembershipSet: boolean = true
51
- ): Promise<void> {
52
- await super.eraseMembership(idCommitment, eraseFromMembershipSet);
53
- await this.syncState();
54
- }
55
-
56
- /**
57
- * Gets the current Merkle root
58
- * Returns the latest valid root or empty array if no roots exist
59
- */
60
- public async getMerkleRoot(): Promise<Uint8Array> {
61
- await this.syncState();
62
- const roots = this.merkleRootTracker.roots();
63
- return roots.length > 0 ? roots[0] : new Uint8Array();
28
+ return rlnContract;
64
29
  }
65
30
 
66
31
  private constructor(
@@ -68,102 +33,112 @@ export class RLNContract extends RLNBaseContract {
68
33
  options: RLNContractInitOptions
69
34
  ) {
70
35
  super(options);
36
+
71
37
  this.instance = rlnInstance;
38
+
72
39
  const initialRoot = rlnInstance.zerokit.getMerkleRoot();
73
40
  this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
74
41
  }
75
42
 
76
- /**
77
- * Syncs the local Merkle tree with the current contract state
78
- */
79
- private async syncState(): Promise<void> {
80
- try {
81
- const currentBlock = await this.provider.getBlockNumber();
82
-
83
- // If we're already synced, just get new members
84
- if (this.lastSyncedBlock > 0) {
85
- await this.syncNewMembers(this.lastSyncedBlock, currentBlock);
86
- this.lastSyncedBlock = currentBlock;
43
+ public override processEvents(events: ethers.Event[]): void {
44
+ const toRemoveTable = new Map<number, number[]>();
45
+ const toInsertTable = new Map<number, ethers.Event[]>();
46
+
47
+ events.forEach((evt) => {
48
+ if (!evt.args) {
87
49
  return;
88
50
  }
89
51
 
90
- // First time sync - get all members
91
- const nextIndex = await this.contract.nextFreeIndex();
92
- const members = await this.getMembersInRange(0, nextIndex.toNumber());
93
-
94
- // Clear existing members by deleting them one by one
95
- // This effectively resets the tree without needing resetTree()
96
- for (let i = 0; i < nextIndex.toNumber(); i++) {
97
- try {
98
- this.instance.zerokit.deleteMember(i);
99
- } catch (error) {
100
- // Ignore errors for non-existent members
101
- continue;
52
+ if (
53
+ evt.event === "MembershipErased" ||
54
+ evt.event === "MembershipExpired"
55
+ ) {
56
+ let index = evt.args.index;
57
+
58
+ if (!index) {
59
+ return;
102
60
  }
103
- }
104
61
 
105
- // Insert all members
106
- for (const member of members) {
107
- const idCommitment = zeroPadLE(hexToBytes(member.idCommitment), 32);
108
- this.instance.zerokit.insertMember(idCommitment);
62
+ if (typeof index === "number" || typeof index === "string") {
63
+ index = ethers.BigNumber.from(index);
64
+ } else {
65
+ log.error("Index is not a number or string", {
66
+ index,
67
+ event: evt
68
+ });
69
+ return;
70
+ }
71
+
72
+ const toRemoveVal = toRemoveTable.get(evt.blockNumber);
73
+ if (toRemoveVal != undefined) {
74
+ toRemoveVal.push(index.toNumber());
75
+ toRemoveTable.set(evt.blockNumber, toRemoveVal);
76
+ } else {
77
+ toRemoveTable.set(evt.blockNumber, [index.toNumber()]);
78
+ }
79
+ } else if (evt.event === "MembershipRegistered") {
80
+ let eventsPerBlock = toInsertTable.get(evt.blockNumber);
81
+ if (eventsPerBlock == undefined) {
82
+ eventsPerBlock = [];
83
+ }
84
+
85
+ eventsPerBlock.push(evt);
86
+ toInsertTable.set(evt.blockNumber, eventsPerBlock);
109
87
  }
88
+ });
110
89
 
111
- // Update root tracker
112
- const currentRoot = this.instance.zerokit.getMerkleRoot();
113
- this.merkleRootTracker.pushRoot(currentBlock, currentRoot);
114
- this.lastSyncedBlock = currentBlock;
115
-
116
- log.info(
117
- `Synced ${members.length} members to current block ${currentBlock}`
118
- );
119
- } catch (error) {
120
- log.error("Failed to sync state", error);
121
- throw new ContractStateError("Failed to sync contract state");
122
- }
90
+ this.removeMembers(this.instance, toRemoveTable);
91
+ this.insertMembers(this.instance, toInsertTable);
123
92
  }
124
93
 
125
- /**
126
- * Syncs new members added between fromBlock and toBlock
127
- */
128
- private async syncNewMembers(
129
- fromBlock: number,
130
- toBlock: number
131
- ): Promise<void> {
132
- // Get members that were added
133
- const filter = this.contract.filters.MembershipRegistered();
134
- const addEvents = await this.contract.queryFilter(
135
- filter,
136
- fromBlock,
137
- toBlock
138
- );
139
-
140
- // Get members that were removed
141
- const removeFilter = this.contract.filters.MembershipErased();
142
- const removeEvents = await this.contract.queryFilter(
143
- removeFilter,
144
- fromBlock,
145
- toBlock
146
- );
147
-
148
- // Process removals first (in reverse block order)
149
- for (const evt of removeEvents.sort(
150
- (a, b) => b.blockNumber - a.blockNumber
151
- )) {
152
- if (!evt.args) continue;
153
- const index = evt.args.index.toNumber();
154
- this.instance.zerokit.deleteMember(index);
155
- this.merkleRootTracker.backFill(evt.blockNumber);
156
- }
157
-
158
- // Then process additions
159
- for (const evt of addEvents) {
160
- if (!evt.args) continue;
161
- const idCommitment = zeroPadLE(hexToBytes(evt.args.idCommitment), 32);
162
- this.instance.zerokit.insertMember(idCommitment);
163
- this.merkleRootTracker.pushRoot(
164
- evt.blockNumber,
165
- this.instance.zerokit.getMerkleRoot()
166
- );
167
- }
94
+ private insertMembers(
95
+ rlnInstance: RLNInstance,
96
+ toInsert: Map<number, ethers.Event[]>
97
+ ): void {
98
+ toInsert.forEach((events: ethers.Event[], blockNumber: number) => {
99
+ events.forEach((evt) => {
100
+ if (!evt.args) return;
101
+
102
+ const _idCommitment = evt.args.idCommitment as string;
103
+ let index = evt.args.index;
104
+
105
+ if (!_idCommitment || !index) {
106
+ return;
107
+ }
108
+
109
+ if (typeof index === "number" || typeof index === "string") {
110
+ index = ethers.BigNumber.from(index);
111
+ }
112
+
113
+ const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
114
+ rlnInstance.zerokit.insertMember(idCommitment);
115
+
116
+ const numericIndex = index.toNumber();
117
+ this._members.set(numericIndex, {
118
+ index,
119
+ idCommitment: _idCommitment
120
+ });
121
+ });
122
+
123
+ const currentRoot = rlnInstance.zerokit.getMerkleRoot();
124
+ this.merkleRootTracker.pushRoot(blockNumber, currentRoot);
125
+ });
126
+ }
127
+
128
+ private removeMembers(
129
+ rlnInstance: RLNInstance,
130
+ toRemove: Map<number, number[]>
131
+ ): void {
132
+ const removeDescending = new Map([...toRemove].reverse());
133
+ removeDescending.forEach((indexes: number[], blockNumber: number) => {
134
+ indexes.forEach((index) => {
135
+ if (this._members.has(index)) {
136
+ this._members.delete(index);
137
+ rlnInstance.zerokit.deleteMember(index);
138
+ }
139
+ });
140
+
141
+ this.merkleRootTracker.backFill(blockNumber);
142
+ });
168
143
  }
169
144
  }
@@ -38,6 +38,11 @@ export interface MembershipInfo {
38
38
  startBlock: number;
39
39
  endBlock: number;
40
40
  state: MembershipState;
41
+ depositAmount: ethers.BigNumber;
42
+ activeDuration: number;
43
+ gracePeriodDuration: number;
44
+ holder: string;
45
+ token: string;
41
46
  }
42
47
 
43
48
  export enum MembershipState {
@@ -155,7 +155,7 @@ export class RLNCredentialsManager {
155
155
  LINEA_CONTRACT.address;
156
156
 
157
157
  if (address === LINEA_CONTRACT.address) {
158
- chainId = LINEA_CONTRACT.chainId;
158
+ chainId = LINEA_CONTRACT.chainId.toString();
159
159
  log.info(`Using Linea contract with chainId: ${chainId}`);
160
160
  }
161
161
 
package/src/identity.ts CHANGED
@@ -28,13 +28,4 @@ export class IdentityCredential {
28
28
  idCommitmentBigInt
29
29
  );
30
30
  }
31
-
32
- public toJSON(): Record<string, number[]> {
33
- return {
34
- idTrapdoor: Array.from(this.IDTrapdoor),
35
- idNullifier: Array.from(this.IDNullifier),
36
- idSecretHash: Array.from(this.IDSecretHash),
37
- idCommitment: Array.from(this.IDCommitment)
38
- };
39
- }
40
31
  }
package/src/index.ts CHANGED
@@ -34,7 +34,9 @@ export type {
34
34
  Keccak256Hash,
35
35
  KeystoreEntity,
36
36
  MembershipHash,
37
- MembershipInfo,
37
+ KeystoreMembershipInfo,
38
38
  Password,
39
39
  Sha256Hash
40
40
  } from "./keystore/types.js";
41
+
42
+ export * from "./contract/index.js";
@@ -14,7 +14,6 @@ import {
14
14
  import _ from "lodash";
15
15
  import { v4 as uuidV4 } from "uuid";
16
16
 
17
- import { IdentityCredential } from "../identity.js";
18
17
  import { buildBigIntFromUint8Array } from "../utils/bytes.js";
19
18
 
20
19
  import { decryptEipKeystore, keccak256Checksum } from "./cipher.js";
@@ -22,8 +21,8 @@ import { isCredentialValid, isKeystoreValid } from "./schema_validator.js";
22
21
  import type {
23
22
  Keccak256Hash,
24
23
  KeystoreEntity,
24
+ KeystoreMembershipInfo,
25
25
  MembershipHash,
26
- MembershipInfo,
27
26
  Password,
28
27
  Sha256Hash
29
28
  } from "./types.js";
@@ -251,27 +250,27 @@ export class Keystore {
251
250
  const str = bytesToUtf8(bytes);
252
251
  const obj = JSON.parse(str);
253
252
 
254
- // Get identity fields from named object
255
- const { idTrapdoor, idNullifier, idSecretHash, idCommitment } = _.get(
256
- obj,
257
- "identityCredential",
258
- {}
259
- );
260
-
261
- const idTrapdoorArray = new Uint8Array(idTrapdoor || []);
262
- const idNullifierArray = new Uint8Array(idNullifier || []);
263
- const idSecretHashArray = new Uint8Array(idSecretHash || []);
264
- const idCommitmentArray = new Uint8Array(idCommitment || []);
265
- const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitmentArray);
266
-
253
+ // TODO: add runtime validation of nwaku credentials
267
254
  return {
268
- identity: new IdentityCredential(
269
- idTrapdoorArray,
270
- idNullifierArray,
271
- idSecretHashArray,
272
- idCommitmentArray,
273
- idCommitmentBigInt
274
- ),
255
+ identity: {
256
+ IDCommitment: Keystore.fromArraylikeToBytes(
257
+ _.get(obj, "identityCredential.idCommitment", [])
258
+ ),
259
+ IDTrapdoor: Keystore.fromArraylikeToBytes(
260
+ _.get(obj, "identityCredential.idTrapdoor", [])
261
+ ),
262
+ IDNullifier: Keystore.fromArraylikeToBytes(
263
+ _.get(obj, "identityCredential.idNullifier", [])
264
+ ),
265
+ IDCommitmentBigInt: buildBigIntFromUint8Array(
266
+ Keystore.fromArraylikeToBytes(
267
+ _.get(obj, "identityCredential.idCommitment", [])
268
+ )
269
+ ),
270
+ IDSecretHash: Keystore.fromArraylikeToBytes(
271
+ _.get(obj, "identityCredential.idSecretHash", [])
272
+ )
273
+ },
275
274
  membership: {
276
275
  treeIndex: _.get(obj, "treeIndex"),
277
276
  chainId: _.get(obj, "membershipContract.chainId"),
@@ -285,9 +284,35 @@ export class Keystore {
285
284
  }
286
285
  }
287
286
 
287
+ private static fromArraylikeToBytes(
288
+ obj:
289
+ | number[]
290
+ | {
291
+ [key: number]: number;
292
+ }
293
+ ): Uint8Array {
294
+ if (Array.isArray(obj)) {
295
+ return new Uint8Array(obj);
296
+ }
297
+
298
+ const bytes = [];
299
+ let index = 0;
300
+ let lastElement = obj[index];
301
+
302
+ while (lastElement !== undefined) {
303
+ bytes.push(lastElement);
304
+ index += 1;
305
+ lastElement = obj[index];
306
+ }
307
+
308
+ return new Uint8Array(bytes);
309
+ }
310
+
288
311
  // follows nwaku implementation
289
312
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
290
- private static computeMembershipHash(info: MembershipInfo): MembershipHash {
313
+ private static computeMembershipHash(
314
+ info: KeystoreMembershipInfo
315
+ ): MembershipHash {
291
316
  return bytesToHex(
292
317
  sha256(utf8ToBytes(`${info.chainId}${info.address}${info.treeIndex}`))
293
318
  ).toUpperCase();
@@ -298,16 +323,16 @@ export class Keystore {
298
323
  private static fromIdentityToBytes(options: KeystoreEntity): Uint8Array {
299
324
  return utf8ToBytes(
300
325
  JSON.stringify({
301
- membershipContract: {
302
- chainId: options.membership.chainId,
303
- address: options.membership.address
304
- },
305
326
  treeIndex: options.membership.treeIndex,
306
327
  identityCredential: {
307
- idTrapdoor: Array.from(options.identity.IDTrapdoor),
328
+ idCommitment: Array.from(options.identity.IDCommitment),
308
329
  idNullifier: Array.from(options.identity.IDNullifier),
309
330
  idSecretHash: Array.from(options.identity.IDSecretHash),
310
- idCommitment: Array.from(options.identity.IDCommitment)
331
+ idTrapdoor: Array.from(options.identity.IDTrapdoor)
332
+ },
333
+ membershipContract: {
334
+ chainId: options.membership.chainId,
335
+ address: options.membership.address
311
336
  },
312
337
  userMessageLimit: options.membership.rateLimit
313
338
  })
@@ -7,7 +7,7 @@ export type Password = string | Uint8Array;
7
7
 
8
8
  // see reference
9
9
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
10
- export type MembershipInfo = {
10
+ export type KeystoreMembershipInfo = {
11
11
  chainId: string;
12
12
  address: string;
13
13
  treeIndex: number;
@@ -16,7 +16,7 @@ export type MembershipInfo = {
16
16
 
17
17
  export type KeystoreEntity = {
18
18
  identity: IdentityCredential;
19
- membership: MembershipInfo;
19
+ membership: KeystoreMembershipInfo;
20
20
  };
21
21
 
22
22
  export type DecryptedCredentials = KeystoreEntity;
@@ -65,8 +65,16 @@ export function buildBigIntFromUint8Array(
65
65
  array: Uint8Array,
66
66
  byteOffset: number = 0
67
67
  ): bigint {
68
- const dataView = new DataView(array.buffer);
69
- return dataView.getBigUint64(byteOffset, true);
68
+ // Convert byte array to BigInt in big-endian format (to match nwaku)
69
+ let result = 0n;
70
+ // Process all 32 bytes (or the available bytes if less)
71
+ const length = Math.min(array.length - byteOffset, 32);
72
+
73
+ for (let i = 0; i < length; i++) {
74
+ result = (result << 8n) | BigInt(array[byteOffset + i]);
75
+ }
76
+
77
+ return result;
70
78
  }
71
79
 
72
80
  /**
@@ -1,6 +0,0 @@
1
- import * as _nodeResolve_empty from './_node-resolve_empty.js';
2
- import { getAugmentedNamespace } from './_commonjsHelpers.js';
3
-
4
- var require$$0 = /*@__PURE__*/getAugmentedNamespace(_nodeResolve_empty);
5
-
6
- export { require$$0 as default };
@@ -1,3 +0,0 @@
1
- var _nodeResolve_empty = {};
2
-
3
- export { _nodeResolve_empty as default };
@@ -1,3 +0,0 @@
1
- var bn = {exports: {}};
2
-
3
- export { bn as __module };
@@ -1,3 +0,0 @@
1
- var common = {};
2
-
3
- export { common as __exports };
@@ -1,3 +0,0 @@
1
- var common = {};
2
-
3
- export { common as __exports };
@@ -1,3 +0,0 @@
1
- var hash = {};
2
-
3
- export { hash as __exports };
@@ -1,3 +0,0 @@
1
- var inherits_browser = {exports: {}};
2
-
3
- export { inherits_browser as __module };
@@ -1,3 +0,0 @@
1
- var ripemd = {};
2
-
3
- export { ripemd as __exports };
@@ -1,3 +0,0 @@
1
- var sha = {};
2
-
3
- export { sha as __exports };
@@ -1,3 +0,0 @@
1
- var sha3 = {exports: {}};
2
-
3
- export { sha3 as __module };
@@ -1,3 +0,0 @@
1
- var utils = {};
2
-
3
- export { utils as __exports };
@@ -1,3 +0,0 @@
1
- const version = "abi/5.7.0";
2
-
3
- export { version };
@@ -1,96 +0,0 @@
1
- import { arrayify } from '../../bytes/lib.esm/index.js';
2
- import { defineReadOnly } from '../../properties/lib.esm/index.js';
3
- import { Logger } from '../../logger/lib.esm/index.js';
4
- import { version } from './_version.js';
5
- import { Reader, Writer } from './coders/abstract-coder.js';
6
- import { AddressCoder } from './coders/address.js';
7
- import { ArrayCoder } from './coders/array.js';
8
- import { BooleanCoder } from './coders/boolean.js';
9
- import { BytesCoder } from './coders/bytes.js';
10
- import { FixedBytesCoder } from './coders/fixed-bytes.js';
11
- import { NullCoder } from './coders/null.js';
12
- import { NumberCoder } from './coders/number.js';
13
- import { StringCoder } from './coders/string.js';
14
- import { TupleCoder } from './coders/tuple.js';
15
- import { ParamType } from './fragments.js';
16
-
17
- const logger = new Logger(version);
18
- const paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);
19
- const paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);
20
- class AbiCoder {
21
- constructor(coerceFunc) {
22
- defineReadOnly(this, "coerceFunc", coerceFunc || null);
23
- }
24
- _getCoder(param) {
25
- switch (param.baseType) {
26
- case "address":
27
- return new AddressCoder(param.name);
28
- case "bool":
29
- return new BooleanCoder(param.name);
30
- case "string":
31
- return new StringCoder(param.name);
32
- case "bytes":
33
- return new BytesCoder(param.name);
34
- case "array":
35
- return new ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name);
36
- case "tuple":
37
- return new TupleCoder((param.components || []).map((component) => {
38
- return this._getCoder(component);
39
- }), param.name);
40
- case "":
41
- return new NullCoder(param.name);
42
- }
43
- // u?int[0-9]*
44
- let match = param.type.match(paramTypeNumber);
45
- if (match) {
46
- let size = parseInt(match[2] || "256");
47
- if (size === 0 || size > 256 || (size % 8) !== 0) {
48
- logger.throwArgumentError("invalid " + match[1] + " bit length", "param", param);
49
- }
50
- return new NumberCoder(size / 8, (match[1] === "int"), param.name);
51
- }
52
- // bytes[0-9]+
53
- match = param.type.match(paramTypeBytes);
54
- if (match) {
55
- let size = parseInt(match[1]);
56
- if (size === 0 || size > 32) {
57
- logger.throwArgumentError("invalid bytes length", "param", param);
58
- }
59
- return new FixedBytesCoder(size, param.name);
60
- }
61
- return logger.throwArgumentError("invalid type", "type", param.type);
62
- }
63
- _getWordSize() { return 32; }
64
- _getReader(data, allowLoose) {
65
- return new Reader(data, this._getWordSize(), this.coerceFunc, allowLoose);
66
- }
67
- _getWriter() {
68
- return new Writer(this._getWordSize());
69
- }
70
- getDefaultValue(types) {
71
- const coders = types.map((type) => this._getCoder(ParamType.from(type)));
72
- const coder = new TupleCoder(coders, "_");
73
- return coder.defaultValue();
74
- }
75
- encode(types, values) {
76
- if (types.length !== values.length) {
77
- logger.throwError("types/values length mismatch", Logger.errors.INVALID_ARGUMENT, {
78
- count: { types: types.length, values: values.length },
79
- value: { types: types, values: values }
80
- });
81
- }
82
- const coders = types.map((type) => this._getCoder(ParamType.from(type)));
83
- const coder = (new TupleCoder(coders, "_"));
84
- const writer = this._getWriter();
85
- coder.encode(writer, values);
86
- return writer.data;
87
- }
88
- decode(types, data, loose) {
89
- const coders = types.map((type) => this._getCoder(ParamType.from(type)));
90
- const coder = new TupleCoder(coders, "_");
91
- return coder.decode(this._getReader(arrayify(data), loose));
92
- }
93
- }
94
- const defaultAbiCoder = new AbiCoder();
95
-
96
- export { AbiCoder, defaultAbiCoder };