Skip to content

Commit 9344f42

Browse files
KyrylRArvolear
andauthored
SDK (#34)
* Updated utils. Started working on the SDK * Added SDK related contracts * Added NatSpec documentation to the RegistrationSMTReplicator contract. Added test * Completed testing of the SDK * Updated versions and CHANGELOG.md * Update contracts/sdk/AQueryProofVerifierBuilder.sol Co-authored-by: Artem Chystiakov <47551140+Arvolear@users.noreply.github.com> * Pass registrationRoot and currentDate to hooks * Renamed votingVerifier to verifier * Added an ability to read and set verifier address * Renamed _PROOF_SIGNALS_COUNT * Made PROOF_SIGNALS_COUNT and ZERO_DATE public * Update contracts/sdk/PublicSignalsBuilder.sol Co-authored-by: Artem Chystiakov <47551140+Arvolear@users.noreply.github.com> * Update contracts/sdk/PublicSignalsBuilder.sol Co-authored-by: Artem Chystiakov <47551140+Arvolear@users.noreply.github.com> * Restructured project * Renamed AQueryProofVerifierBuilder to AQueryProofExecutor * Fixed issues with renaming * Made getABuilderStorage private * Added timeBound_ * Added an ability to configure root validity * Reverted to ROOT_VALIDITY * Update CHANGELOG.md Co-authored-by: Artem Chystiakov <47551140+Arvolear@users.noreply.github.com> * Renamings --------- Co-authored-by: Artem Chystiakov <47551140+Arvolear@users.noreply.github.com>
1 parent a411309 commit 9344f42

File tree

11 files changed

+1245
-3
lines changed

11 files changed

+1245
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [0.3.0]
4+
5+
* Added `RegistrationSMTReplicator` contract and `AQueryProofExecutor` abstract contract to accommodate integration with Rarime.
6+
37
## [0.2.1]
48

59
* Added `L1RegistrationState` and `RegistrationSMT` contracts for automatic root transition from L2 Rarimo to L1.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
interface IPoseidonSMT {
5+
function ROOT_VALIDITY() external view returns (uint256);
6+
7+
function isRootValid(bytes32 root_) external view returns (bool);
8+
}
Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.22;
3+
4+
import {PublicSignalsBuilder} from "../../sdk/lib/PublicSignalsBuilder.sol";
5+
import {AQueryProofExecutor} from "../../sdk/AQueryProofExecutor.sol";
6+
7+
contract ProofBuilderTest is AQueryProofExecutor {
8+
uint256 private constant PROOF_SIGNALS_COUNT = PublicSignalsBuilder.PROOF_SIGNALS_COUNT;
9+
uint256 private constant ZERO_DATE = PublicSignalsBuilder.ZERO_DATE;
10+
11+
AQueryProofExecutor.AExecutorStorage internal mockBuilderStorage;
12+
13+
error Mismatch(uint256 iteration, uint256 original, uint256 lib);
14+
15+
function init(address registrationSMT_) external initializer {
16+
__AQueryProofExecutor_init(registrationSMT_, address(0));
17+
}
18+
19+
function _buildPublicSignals(
20+
bytes32 registrationRoot_,
21+
uint256 currentDate_,
22+
bytes memory userPayload_
23+
) public override returns (uint256) {
24+
return 0;
25+
}
26+
27+
function _initializeArrays(
28+
uint256 selector,
29+
uint256 nullifier
30+
) internal pure returns (uint256[] memory original, uint256 builder) {
31+
original = new uint256[](PROOF_SIGNALS_COUNT);
32+
original[0] = nullifier;
33+
original[12] = selector;
34+
original[13] = ZERO_DATE;
35+
original[18] = ZERO_DATE;
36+
original[19] = ZERO_DATE;
37+
original[20] = ZERO_DATE;
38+
original[21] = ZERO_DATE;
39+
40+
builder = PublicSignalsBuilder.newPublicSignalsBuilder(selector, nullifier);
41+
}
42+
43+
function _compareArrays(uint256[] memory original, uint256[] memory lib) internal pure {
44+
for (uint256 i = 0; i < PROOF_SIGNALS_COUNT; i++) {
45+
if (original[i] != lib[i]) {
46+
revert Mismatch(i, original[i], lib[i]);
47+
}
48+
}
49+
}
50+
51+
function testEquivalencePart1_NewBuilder() external view {
52+
uint256 nullifier = 1;
53+
uint256 selector = 2;
54+
55+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
56+
selector,
57+
nullifier
58+
);
59+
60+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
61+
_compareArrays(originalPubSignals, libPubSignals);
62+
}
63+
64+
function testEquivalencePart2_Name() external view {
65+
uint256 nullifier = 1;
66+
uint256 selector = 2;
67+
uint256 name_ = 3;
68+
uint256 nameResidual_ = 4;
69+
70+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
71+
selector,
72+
nullifier
73+
);
74+
75+
originalPubSignals[3] = name_;
76+
originalPubSignals[4] = nameResidual_;
77+
78+
PublicSignalsBuilder.withName(builder, name_);
79+
PublicSignalsBuilder.withNameResidual(builder, nameResidual_);
80+
81+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
82+
_compareArrays(originalPubSignals, libPubSignals);
83+
}
84+
85+
function testEquivalencePart3_NationalityCitizenshipSex() external view {
86+
uint256 nullifier = 1;
87+
uint256 selector = 2;
88+
uint256 nationality_ = 5;
89+
uint256 citizenship_ = 6;
90+
uint256 sex_ = 7;
91+
92+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
93+
selector,
94+
nullifier
95+
);
96+
97+
originalPubSignals[5] = nationality_;
98+
originalPubSignals[6] = citizenship_;
99+
originalPubSignals[7] = sex_;
100+
101+
PublicSignalsBuilder.withNationality(builder, nationality_);
102+
PublicSignalsBuilder.withCitizenship(builder, citizenship_);
103+
PublicSignalsBuilder.withSex(builder, sex_);
104+
105+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
106+
_compareArrays(originalPubSignals, libPubSignals);
107+
}
108+
109+
function testEquivalencePart4_Event() external view {
110+
uint256 nullifier = 1;
111+
uint256 selector = 2;
112+
uint256 eventId_ = 9;
113+
uint256 eventData_ = 10;
114+
115+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
116+
selector,
117+
nullifier
118+
);
119+
120+
originalPubSignals[9] = eventId_;
121+
originalPubSignals[10] = eventData_;
122+
123+
PublicSignalsBuilder.withEventIdAndData(builder, eventId_, eventData_);
124+
125+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
126+
_compareArrays(originalPubSignals, libPubSignals);
127+
}
128+
129+
function testEquivalencePart5_IdStateRoot(bytes32 idStateRoot_) external view {
130+
uint256 nullifier = 1;
131+
uint256 selector = 2;
132+
133+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
134+
selector,
135+
nullifier
136+
);
137+
138+
originalPubSignals[11] = uint256(idStateRoot_);
139+
140+
PublicSignalsBuilder.withIdStateRoot(builder, idStateRoot_);
141+
142+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
143+
_compareArrays(originalPubSignals, libPubSignals);
144+
}
145+
146+
function testEquivalencePart6_CurrentDate(uint256 currentDate_) external view {
147+
uint256 nullifier = 1;
148+
uint256 selector = 2;
149+
150+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
151+
selector,
152+
nullifier
153+
);
154+
155+
originalPubSignals[13] = currentDate_;
156+
157+
PublicSignalsBuilder.withCurrentDate(builder, currentDate_, 1 days);
158+
159+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
160+
_compareArrays(originalPubSignals, libPubSignals);
161+
}
162+
163+
function testEquivalencePart7_TimestampBounds() external view {
164+
uint256 nullifier = 1;
165+
uint256 selector = 2;
166+
uint256 timestampLowerbound_ = 14;
167+
uint256 timestampUpperbound_ = 15;
168+
169+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
170+
selector,
171+
nullifier
172+
);
173+
174+
originalPubSignals[14] = timestampLowerbound_;
175+
originalPubSignals[15] = timestampUpperbound_;
176+
177+
PublicSignalsBuilder.withTimestampLowerboundAndUpperbound(
178+
builder,
179+
timestampLowerbound_,
180+
timestampUpperbound_
181+
);
182+
183+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
184+
_compareArrays(originalPubSignals, libPubSignals);
185+
}
186+
187+
function testEquivalencePart8_IdentityCounterBounds() external view {
188+
uint256 nullifier = 1;
189+
uint256 selector = 2;
190+
uint256 identityCounterLowerbound_ = 16;
191+
uint256 identityCounterUpperbound_ = 17;
192+
193+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
194+
selector,
195+
nullifier
196+
);
197+
198+
originalPubSignals[16] = identityCounterLowerbound_;
199+
originalPubSignals[17] = identityCounterUpperbound_;
200+
201+
PublicSignalsBuilder.withIdentityCounterLowerbound(
202+
builder,
203+
identityCounterLowerbound_,
204+
identityCounterUpperbound_
205+
);
206+
207+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
208+
_compareArrays(originalPubSignals, libPubSignals);
209+
}
210+
211+
function testEquivalencePart9_BirthDateBounds() external view {
212+
uint256 nullifier = 1;
213+
uint256 selector = 2;
214+
uint256 birthDateLowerbound_ = 18;
215+
uint256 birthDateUpperbound_ = 19;
216+
217+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
218+
selector,
219+
nullifier
220+
);
221+
222+
originalPubSignals[18] = birthDateLowerbound_; // Overwrite ZERO_DATE
223+
originalPubSignals[19] = birthDateUpperbound_; // Overwrite ZERO_DATE
224+
225+
PublicSignalsBuilder.withBirthDateLowerboundAndUpperbound(
226+
builder,
227+
birthDateLowerbound_,
228+
birthDateUpperbound_
229+
);
230+
231+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
232+
_compareArrays(originalPubSignals, libPubSignals);
233+
}
234+
235+
function testEquivalencePart10_ExpirationDateBounds() external view {
236+
uint256 nullifier = 1;
237+
uint256 selector = 2;
238+
uint256 expirationDateLowerbound_ = 20;
239+
uint256 expirationDateUpperbound_ = 21; // Test with a non-ZERO_DATE value
240+
241+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
242+
selector,
243+
nullifier
244+
);
245+
246+
originalPubSignals[20] = expirationDateLowerbound_; // Overwrite ZERO_DATE
247+
originalPubSignals[21] = expirationDateUpperbound_; // Overwrite ZERO_DATE
248+
249+
PublicSignalsBuilder.withExpirationDateLowerboundAndUpperbound(
250+
builder,
251+
expirationDateLowerbound_,
252+
expirationDateUpperbound_
253+
);
254+
255+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
256+
_compareArrays(originalPubSignals, libPubSignals);
257+
}
258+
259+
function testEquivalencePart11_CitizenshipMask() external view {
260+
uint256 nullifier = 1;
261+
uint256 selector = 2;
262+
uint256 citizenshipMask_ = 22;
263+
264+
(uint256[] memory originalPubSignals, uint256 builder) = _initializeArrays(
265+
selector,
266+
nullifier
267+
);
268+
269+
originalPubSignals[22] = citizenshipMask_;
270+
271+
PublicSignalsBuilder.withCitizenshipMask(builder, citizenshipMask_);
272+
273+
uint256[] memory libPubSignals = PublicSignalsBuilder.buildAsUintArray(builder);
274+
_compareArrays(originalPubSignals, libPubSignals);
275+
}
276+
}

0 commit comments

Comments
 (0)