@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.
- package/bundle/_virtual/utils.js +2 -2
- package/bundle/_virtual/utils2.js +2 -2
- package/bundle/index.js +2 -1
- package/bundle/packages/rln/dist/contract/constants.js +6 -2
- package/bundle/packages/rln/dist/contract/rln_base_contract.js +282 -146
- package/bundle/packages/rln/dist/contract/rln_contract.js +74 -89
- package/bundle/packages/rln/dist/credentials_manager.js +1 -1
- package/bundle/packages/rln/dist/identity.js +0 -8
- package/bundle/packages/rln/dist/keystore/keystore.js +28 -15
- package/bundle/packages/rln/dist/utils/bytes.js +8 -2
- package/bundle/packages/rln/dist/utils/metamask.js +2 -2
- package/bundle/packages/rln/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +1 -1
- package/bundle/packages/rln/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +2 -2
- package/bundle/packages/rln/node_modules/@noble/hashes/_sha2.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/hmac.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/pbkdf2.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/scrypt.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/sha256.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/sha512.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/utils.js +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/contract/constants.d.ts +1 -1
- package/dist/contract/constants.js +1 -1
- package/dist/contract/constants.js.map +1 -1
- package/dist/contract/index.d.ts +1 -0
- package/dist/contract/index.js +1 -0
- package/dist/contract/index.js.map +1 -1
- package/dist/contract/rln_base_contract.d.ts +27 -25
- package/dist/contract/rln_base_contract.js +280 -144
- package/dist/contract/rln_base_contract.js.map +1 -1
- package/dist/contract/rln_contract.d.ts +4 -24
- package/dist/contract/rln_contract.js +74 -89
- package/dist/contract/rln_contract.js.map +1 -1
- package/dist/contract/types.d.ts +5 -0
- package/dist/contract/types.js.map +1 -1
- package/dist/credentials_manager.js +1 -1
- package/dist/credentials_manager.js.map +1 -1
- package/dist/identity.d.ts +0 -1
- package/dist/identity.js +0 -8
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/keystore/keystore.d.ts +1 -0
- package/dist/keystore/keystore.js +28 -15
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/keystore/types.d.ts +2 -2
- package/dist/utils/bytes.js +8 -2
- package/dist/utils/bytes.js.map +1 -1
- package/package.json +1 -1
- package/src/contract/constants.ts +1 -1
- package/src/contract/index.ts +1 -0
- package/src/contract/rln_base_contract.ts +428 -216
- package/src/contract/rln_contract.ts +95 -120
- package/src/contract/types.ts +5 -0
- package/src/credentials_manager.ts +1 -1
- package/src/identity.ts +0 -9
- package/src/index.ts +3 -1
- package/src/keystore/keystore.ts +54 -29
- package/src/keystore/types.ts +2 -2
- package/src/utils/bytes.ts +10 -2
- package/bundle/_virtual/__node-resolve_empty.js +0 -6
- package/bundle/_virtual/_node-resolve_empty.js +0 -3
- package/bundle/_virtual/bn.js +0 -3
- package/bundle/_virtual/common.js +0 -3
- package/bundle/_virtual/common2.js +0 -3
- package/bundle/_virtual/hash.js +0 -3
- package/bundle/_virtual/inherits_browser.js +0 -3
- package/bundle/_virtual/ripemd.js +0 -3
- package/bundle/_virtual/sha.js +0 -3
- package/bundle/_virtual/sha3.js +0 -3
- package/bundle/_virtual/utils3.js +0 -3
- package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abi/lib.esm/abi-coder.js +0 -96
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js +0 -148
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/address.js +0 -26
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js +0 -20
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/array.js +0 -210
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/boolean.js +0 -18
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/bytes.js +0 -30
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js +0 -26
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/null.js +0 -22
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/number.js +0 -43
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/string.js +0 -19
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/tuple.js +0 -58
- package/bundle/node_modules/@ethersproject/abi/lib.esm/fragments.js +0 -854
- package/bundle/node_modules/@ethersproject/abi/lib.esm/interface.js +0 -609
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/index.js +0 -66
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/index.js +0 -302
- package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/address/lib.esm/index.js +0 -110
- package/bundle/node_modules/@ethersproject/base64/lib.esm/base64.js +0 -20
- package/bundle/node_modules/@ethersproject/basex/lib.esm/index.js +0 -120
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/bignumber.js +0 -287
- package/bundle/node_modules/@ethersproject/bytes/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/bytes/lib.esm/index.js +0 -402
- package/bundle/node_modules/@ethersproject/constants/lib.esm/addresses.js +0 -3
- package/bundle/node_modules/@ethersproject/constants/lib.esm/bignumbers.js +0 -8
- package/bundle/node_modules/@ethersproject/constants/lib.esm/hashes.js +0 -3
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +0 -893
- package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/decoder.js +0 -256
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/include.js +0 -36
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/lib.js +0 -135
- package/bundle/node_modules/@ethersproject/hash/lib.esm/id.js +0 -8
- package/bundle/node_modules/@ethersproject/hash/lib.esm/namehash.js +0 -64
- package/bundle/node_modules/@ethersproject/hash/lib.esm/typed-data.js +0 -443
- package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +0 -8
- package/bundle/node_modules/@ethersproject/keccak256/node_modules/js-sha3/src/sha3.js +0 -660
- package/bundle/node_modules/@ethersproject/logger/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/logger/lib.esm/index.js +0 -352
- package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +0 -248
- package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/properties/lib.esm/index.js +0 -127
- package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/providers/lib.esm/base-provider.js +0 -2007
- package/bundle/node_modules/@ethersproject/providers/lib.esm/formatter.js +0 -422
- package/bundle/node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js +0 -674
- package/bundle/node_modules/@ethersproject/providers/lib.esm/web3-provider.js +0 -132
- package/bundle/node_modules/@ethersproject/rlp/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/rlp/lib.esm/index.js +0 -120
- package/bundle/node_modules/@ethersproject/sha2/lib.esm/sha2.js +0 -8
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +0 -2430
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/index.js +0 -76
- package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/strings/lib.esm/utf8.js +0 -219
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/index.js +0 -279
- package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/web/lib.esm/geturl.js +0 -69
- package/bundle/node_modules/@ethersproject/web/lib.esm/index.js +0 -404
- package/bundle/node_modules/bech32/index.js +0 -187
- package/bundle/node_modules/bn.js/lib/bn.js +0 -3361
- package/bundle/node_modules/hash.js/lib/hash/common.js +0 -97
- package/bundle/node_modules/hash.js/lib/hash/hmac.js +0 -51
- package/bundle/node_modules/hash.js/lib/hash/ripemd.js +0 -152
- package/bundle/node_modules/hash.js/lib/hash/sha/1.js +0 -81
- package/bundle/node_modules/hash.js/lib/hash/sha/224.js +0 -33
- package/bundle/node_modules/hash.js/lib/hash/sha/256.js +0 -113
- package/bundle/node_modules/hash.js/lib/hash/sha/384.js +0 -39
- package/bundle/node_modules/hash.js/lib/hash/sha/512.js +0 -336
- package/bundle/node_modules/hash.js/lib/hash/sha/common.js +0 -53
- package/bundle/node_modules/hash.js/lib/hash/sha.js +0 -14
- package/bundle/node_modules/hash.js/lib/hash/utils.js +0 -282
- package/bundle/node_modules/hash.js/lib/hash.js +0 -33
- package/bundle/node_modules/inherits/inherits_browser.js +0 -33
- package/bundle/node_modules/minimalistic-assert/index.js +0 -13
- package/bundle/packages/rln/dist/contract/errors.js +0 -62
- package/dist/contract/errors.d.ts +0 -30
- package/dist/contract/errors.js +0 -61
- package/dist/contract/errors.js.map +0 -1
- 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
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
112
|
-
|
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
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
this.merkleRootTracker.
|
156
|
-
}
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
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
|
}
|
package/src/contract/types.ts
CHANGED
@@ -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
package/src/keystore/keystore.ts
CHANGED
@@ -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
|
-
//
|
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:
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
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(
|
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
|
-
|
328
|
+
idCommitment: Array.from(options.identity.IDCommitment),
|
308
329
|
idNullifier: Array.from(options.identity.IDNullifier),
|
309
330
|
idSecretHash: Array.from(options.identity.IDSecretHash),
|
310
|
-
|
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
|
})
|
package/src/keystore/types.ts
CHANGED
@@ -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
|
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:
|
19
|
+
membership: KeystoreMembershipInfo;
|
20
20
|
};
|
21
21
|
|
22
22
|
export type DecryptedCredentials = KeystoreEntity;
|
package/src/utils/bytes.ts
CHANGED
@@ -65,8 +65,16 @@ export function buildBigIntFromUint8Array(
|
|
65
65
|
array: Uint8Array,
|
66
66
|
byteOffset: number = 0
|
67
67
|
): bigint {
|
68
|
-
|
69
|
-
|
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
|
/**
|
package/bundle/_virtual/bn.js
DELETED
package/bundle/_virtual/hash.js
DELETED
package/bundle/_virtual/sha.js
DELETED
package/bundle/_virtual/sha3.js
DELETED
@@ -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 };
|