Skip to content

Commit

Permalink
Merge df4040e into 07dc072
Browse files Browse the repository at this point in the history
  • Loading branch information
sirasistant authored May 20, 2024
2 parents 07dc072 + df4040e commit f1b3cf5
Show file tree
Hide file tree
Showing 50 changed files with 918 additions and 271 deletions.
3 changes: 2 additions & 1 deletion noir-projects/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ FROM aztecprotocol/noir as noir
FROM aztecprotocol/avm-transpiler as transpiler

FROM ubuntu:lunar AS builder
RUN apt-get update && apt-get install -y parallel
RUN apt-get update && apt-get install -y parallel nodejs npm
RUN npm install --global yarn
# Copy in nargo
COPY --from=noir /usr/src/noir/noir-repo/target/release/nargo /usr/src/noir/noir-repo/target/release/nargo
ENV PATH="/usr/src/noir/noir-repo/target/release:${PATH}"
Expand Down
2 changes: 2 additions & 0 deletions noir-projects/noir-protocol-circuits/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Prover.toml
Verifier.toml
target
crates/autogenerated
Nargo.toml
3 changes: 3 additions & 0 deletions noir-projects/noir-protocol-circuits/bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ if [ -n "$CMD" ]; then
fi
fi

yarn
node ./index.js

echo "Compiling protocol circuits..."
NARGO=${NARGO:-../../noir/noir-repo/target/release/nargo}
$NARGO compile --silence-warnings
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::private_kernel_circuit_public_inputs_composer::PrivateKernelCircuitPublicInputsComposer;
use dep::reset_kernel_lib::{
NoteHashReadRequestHints, NullifierReadRequestHints, PrivateValidationRequestProcessor,
verify_squashed_transient_note_hashes_and_nullifiers
verify_squashed_transient_note_hashes_and_nullifiers, reset::nullifier_key::NullifierKeyHint
};
use dep::types::{
abis::{
Expand All @@ -25,22 +25,22 @@ struct PrivateKernelResetOutputs {
note_encrypted_log_hashes: [NoteLogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_TX],
}

struct PrivateKernelResetHints {
struct PrivateKernelResetHints<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS> {
transient_nullifier_indexes_for_note_hashes: [u64; MAX_NEW_NOTE_HASHES_PER_TX],
transient_note_hash_indexes_for_nullifiers: [u64; MAX_NEW_NULLIFIERS_PER_TX],
transient_note_hash_indexes_for_logs: [u64; MAX_NOTE_ENCRYPTED_LOGS_PER_TX],
note_hash_read_request_hints: NoteHashReadRequestHints,
nullifier_read_request_hints: NullifierReadRequestHints,
master_nullifier_secret_keys: [GrumpkinPrivateKey; MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX],
note_hash_read_request_hints: NoteHashReadRequestHints<NH_RR_PENDING, NH_RR_SETTLED>,
nullifier_read_request_hints: NullifierReadRequestHints<NLL_RR_PENDING, NLL_RR_SETTLED>,
master_nullifier_secret_keys: [NullifierKeyHint; NLL_KEYS],
}

struct PrivateKernelResetCircuitPrivateInputs {
struct PrivateKernelResetCircuitPrivateInputs<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS> {
previous_kernel: PrivateKernelData,
outputs: PrivateKernelResetOutputs,
hints: PrivateKernelResetHints,
hints: PrivateKernelResetHints<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS>,
}

impl PrivateKernelResetCircuitPrivateInputs {
impl<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS> PrivateKernelResetCircuitPrivateInputs<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS> {
pub fn execute(self) -> PrivateKernelCircuitPublicInputs {
let mut previous_public_inputs = self.previous_kernel.public_inputs;

Expand Down Expand Up @@ -86,7 +86,8 @@ mod tests {
nullifier_read_request_hints_builder::NullifierReadRequestHintsBuilder,
squash_transient_data::{squash_transient_note_hashes, squash_transient_nullifiers, squash_transient_logs}
},
reset::read_request::{PendingReadHint, ReadRequestState, ReadRequestStatus}
reset::read_request::{PendingReadHint, ReadRequestState, ReadRequestStatus},
reset::nullifier_key::NullifierKeyHint
};
use dep::types::constants::{
MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX,
Expand Down Expand Up @@ -178,7 +179,7 @@ mod tests {
transient_note_hash_indexes_for_logs: self.transient_note_hash_indexes_for_logs,
note_hash_read_request_hints: self.note_hash_read_request_hints_builder.to_hints(),
nullifier_read_request_hints: self.nullifier_read_request_hints_builder.to_hints(),
master_nullifier_secret_keys: [GrumpkinPrivateKey::empty(); MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX]
master_nullifier_secret_keys: [NullifierKeyHint::empty(); MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX]
};

let kernel = PrivateKernelResetCircuitPrivateInputs { previous_kernel: self.previous_kernel.to_private_kernel_data(), outputs, hints };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,6 @@ mod tests {
// TODO: Reduce the duplicated code/tests for PrivateKernelTailInputs and PrivateKernelTailToPublicInputs.
struct PrivateKernelTailInputsBuilder {
previous_kernel: FixtureBuilder,
transient_nullifier_indexes_for_note_hashes: [u64; MAX_NEW_NOTE_HASHES_PER_TX],
transient_note_hash_indexes_for_nullifiers: [u64; MAX_NEW_NULLIFIERS_PER_TX],
transient_note_hash_indexes_for_logs: [u64; MAX_NOTE_ENCRYPTED_LOGS_PER_TX],
note_hash_read_request_hints_builder: NoteHashReadRequestHintsBuilder,
nullifier_read_request_hints_builder: NullifierReadRequestHintsBuilder,
}

impl PrivateKernelTailInputsBuilder {
Expand All @@ -106,14 +101,7 @@ mod tests {

previous_kernel.append_new_nullifiers(1);

PrivateKernelTailInputsBuilder {
previous_kernel,
transient_nullifier_indexes_for_note_hashes: [MAX_NEW_NULLIFIERS_PER_TX; MAX_NEW_NOTE_HASHES_PER_TX],
transient_note_hash_indexes_for_nullifiers: [MAX_NEW_NOTE_HASHES_PER_TX; MAX_NEW_NULLIFIERS_PER_TX],
transient_note_hash_indexes_for_logs: [MAX_NEW_NOTE_HASHES_PER_TX; MAX_NOTE_ENCRYPTED_LOGS_PER_TX],
note_hash_read_request_hints_builder: NoteHashReadRequestHintsBuilder::new(MAX_NOTE_HASH_READ_REQUESTS_PER_TX),
nullifier_read_request_hints_builder: NullifierReadRequestHintsBuilder::new(MAX_NULLIFIER_READ_REQUESTS_PER_TX)
}
PrivateKernelTailInputsBuilder { previous_kernel }
}

// A helper function that uses the first nullifer in the previous kernel to compute the unique siloed
Expand Down Expand Up @@ -177,24 +165,6 @@ mod tests {
let sorted_unencrypted_log_hashes = sorted.sorted_array;
let sorted_unencrypted_log_hashes_indexes = sorted.sorted_index_hints;

let mut sorted_transient_nullifier_indexes_for_note_hashes = [MAX_NEW_NULLIFIERS_PER_TX; MAX_NEW_NOTE_HASHES_PER_TX];
for i in 0..self.transient_nullifier_indexes_for_note_hashes.len() {
let old_index = self.transient_nullifier_indexes_for_note_hashes[i];
if old_index != MAX_NEW_NULLIFIERS_PER_TX {
let new_note_hash_index = sorted_new_note_hashes_indexes[i];
sorted_transient_nullifier_indexes_for_note_hashes[new_note_hash_index] = sorted_new_nullifiers_indexes[old_index];
}
}

let mut sorted_transient_note_hash_indexes_for_nullifiers = [MAX_NEW_NOTE_HASHES_PER_TX; MAX_NEW_NULLIFIERS_PER_TX];
for i in 0..self.transient_note_hash_indexes_for_nullifiers.len() {
let old_index = self.transient_note_hash_indexes_for_nullifiers[i];
if old_index != MAX_NEW_NOTE_HASHES_PER_TX {
let new_nullifier_index = sorted_new_nullifiers_indexes[i];
sorted_transient_note_hash_indexes_for_nullifiers[new_nullifier_index] = sorted_new_note_hashes_indexes[old_index];
}
}

let hints = PrivateKernelTailHints {
sorted_new_note_hashes,
sorted_new_note_hashes_indexes,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,6 @@ mod tests {
// TODO: Reduce the duplicated code/tests for PrivateKernelTailToPublicInputs and PrivateKernelTailInputs.
struct PrivateKernelTailToPublicInputsBuilder {
previous_kernel: FixtureBuilder,
transient_nullifier_indexes_for_note_hashes: [u64; MAX_NEW_NOTE_HASHES_PER_TX],
transient_note_hash_indexes_for_nullifiers: [u64; MAX_NEW_NULLIFIERS_PER_TX],
transient_note_hash_indexes_for_logs: [u64; MAX_NOTE_ENCRYPTED_LOGS_PER_TX],
note_hash_read_request_hints_builder: NoteHashReadRequestHintsBuilder,
nullifier_read_request_hints_builder: NullifierReadRequestHintsBuilder,
}

impl PrivateKernelTailToPublicInputsBuilder {
Expand All @@ -103,14 +98,7 @@ mod tests {
previous_kernel.append_new_nullifiers(1);
previous_kernel.push_public_call_request(1, false);

PrivateKernelTailToPublicInputsBuilder {
previous_kernel,
transient_nullifier_indexes_for_note_hashes: [MAX_NEW_NULLIFIERS_PER_TX; MAX_NEW_NOTE_HASHES_PER_TX],
transient_note_hash_indexes_for_nullifiers: [MAX_NEW_NOTE_HASHES_PER_TX; MAX_NEW_NULLIFIERS_PER_TX],
transient_note_hash_indexes_for_logs: [MAX_NEW_NOTE_HASHES_PER_TX; MAX_NOTE_ENCRYPTED_LOGS_PER_TX],
note_hash_read_request_hints_builder: NoteHashReadRequestHintsBuilder::new(MAX_NOTE_HASH_READ_REQUESTS_PER_TX),
nullifier_read_request_hints_builder: NullifierReadRequestHintsBuilder::new(MAX_NULLIFIER_READ_REQUESTS_PER_TX)
}
PrivateKernelTailToPublicInputsBuilder { previous_kernel }
}

// A helper function that uses the first nullifer in the previous kernel to compute the unique siloed
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
use dep::private_kernel_lib::PrivateKernelResetCircuitPrivateInputs;
use dep::types::PrivateKernelCircuitPublicInputs;
use dep::types::{
PrivateKernelCircuitPublicInputs,
constants::{
MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX,
MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX
}
};

global NOTE_HASH_PENDING_AMOUNT = MAX_NOTE_HASH_READ_REQUESTS_PER_TX; // 128
global NOTE_HASH_SETTLED_AMOUNT = MAX_NOTE_HASH_READ_REQUESTS_PER_TX;
global NULLIFIER_PENDING_AMOUNT = MAX_NULLIFIER_READ_REQUESTS_PER_TX; // 8
global NULLIFIER_SETTLED_AMOUNT = MAX_NULLIFIER_READ_REQUESTS_PER_TX;
global NULLIFIER_KEYS = MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX; // 4

unconstrained fn main(input: PrivateKernelResetCircuitPrivateInputs) -> pub PrivateKernelCircuitPublicInputs {
unconstrained fn main(input: PrivateKernelResetCircuitPrivateInputs<NOTE_HASH_PENDING_AMOUNT, NOTE_HASH_SETTLED_AMOUNT, NULLIFIER_PENDING_AMOUNT, NULLIFIER_SETTLED_AMOUNT, NULLIFIER_KEYS>) -> pub PrivateKernelCircuitPublicInputs {
input.execute()
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
use dep::private_kernel_lib::PrivateKernelResetCircuitPrivateInputs;
use dep::types::PrivateKernelCircuitPublicInputs;
use dep::types::{
PrivateKernelCircuitPublicInputs,
constants::{
MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX,
MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX
}
};

global NOTE_HASH_PENDING_AMOUNT = MAX_NOTE_HASH_READ_REQUESTS_PER_TX; // 128
global NOTE_HASH_SETTLED_AMOUNT = MAX_NOTE_HASH_READ_REQUESTS_PER_TX;
global NULLIFIER_PENDING_AMOUNT = MAX_NULLIFIER_READ_REQUESTS_PER_TX; // 8
global NULLIFIER_SETTLED_AMOUNT = MAX_NULLIFIER_READ_REQUESTS_PER_TX;
global NULLIFIER_KEYS = MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX; // 4

#[recursive]
fn main(input: PrivateKernelResetCircuitPrivateInputs) -> pub PrivateKernelCircuitPublicInputs {
fn main(input: PrivateKernelResetCircuitPrivateInputs<NOTE_HASH_PENDING_AMOUNT, NOTE_HASH_SETTLED_AMOUNT, NULLIFIER_PENDING_AMOUNT, NULLIFIER_SETTLED_AMOUNT, NULLIFIER_KEYS>) -> pub PrivateKernelCircuitPublicInputs {
input.execute()
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ use dep::types::{
accumulated_data::CombinedAccumulatedData, kernel_circuit_public_inputs::KernelCircuitPublicInputs,
public_kernel_data::PublicKernelData
},
constants::MAX_PUBLIC_DATA_HINTS,
constants::{MAX_PUBLIC_DATA_HINTS, MAX_NULLIFIER_READ_REQUESTS_PER_TX},
merkle_tree::{conditionally_assert_check_membership, MembershipWitness},
partial_state_reference::PartialStateReference, utils::{arrays::array_length}
};

struct PublicKernelTailCircuitPrivateInputs {
previous_kernel: PublicKernelData,
nullifier_read_request_hints: NullifierReadRequestHints,
nullifier_read_request_hints: NullifierReadRequestHints<MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX>,
nullifier_non_existent_read_request_hints: NullifierNonExistentReadRequestHints,
public_data_hints: [PublicDataHint; MAX_PUBLIC_DATA_HINTS],
public_data_read_request_hints: PublicDataReadRequestHints,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ impl SettledReadHint<NOTE_HASH_TREE_HEIGHT, NoteHashLeafPreimage> for NoteHashSe
}
}

struct NoteHashReadRequestHints {
struct NoteHashReadRequestHints<PENDING, SETTLED> {
read_request_statuses: [ReadRequestStatus; MAX_NOTE_HASH_READ_REQUESTS_PER_TX],
pending_read_hints: [PendingReadHint; MAX_NOTE_HASH_READ_REQUESTS_PER_TX],
settled_read_hints: [NoteHashSettledReadHint; MAX_NOTE_HASH_READ_REQUESTS_PER_TX],
pending_read_hints: [PendingReadHint; PENDING],
settled_read_hints: [NoteHashSettledReadHint; SETTLED],
}

mod tests {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ impl SettledReadHint<NULLIFIER_TREE_HEIGHT, NullifierLeafPreimage> for Nullifier
}
}

struct NullifierReadRequestHints {
struct NullifierReadRequestHints<PENDING, SETTLED> {
read_request_statuses: [ReadRequestStatus; MAX_NULLIFIER_READ_REQUESTS_PER_TX],
pending_read_hints: [PendingReadHint; MAX_NULLIFIER_READ_REQUESTS_PER_TX],
settled_read_hints: [NullifierSettledReadHint; MAX_NULLIFIER_READ_REQUESTS_PER_TX],
pending_read_hints: [PendingReadHint; PENDING],
settled_read_hints: [NullifierSettledReadHint; SETTLED],
}

mod tests {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::{
note_hash_read_request_reset::NoteHashReadRequestHints,
nullifier_read_request_reset::NullifierReadRequestHints, reset::read_request::reset_read_requests
nullifier_read_request_reset::NullifierReadRequestHints, reset::read_request::reset_read_requests,
reset::nullifier_key::{NullifierKeyHint, reset_nullifier_keys}
};
use dep::types::{
abis::{
Expand All @@ -16,18 +17,18 @@ use dep::types::{
utils::arrays::filter_array_to_bounded_vec
};

struct PrivateValidationRequestProcessor {
struct PrivateValidationRequestProcessor<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS> {
validation_requests: ValidationRequests,
note_hash_read_request_hints: NoteHashReadRequestHints,
note_hash_read_request_hints: NoteHashReadRequestHints<NH_RR_PENDING, NH_RR_SETTLED>,
pending_note_hashes: [ScopedNoteHash; MAX_NEW_NOTE_HASHES_PER_TX],
note_hash_tree_root: Field,
nullifier_read_request_hints: NullifierReadRequestHints,
nullifier_read_request_hints: NullifierReadRequestHints<NLL_RR_PENDING, NLL_RR_SETTLED>,
pending_nullifiers: [ScopedNullifier; MAX_NEW_NULLIFIERS_PER_TX],
nullifier_tree_root: Field,
master_nullifier_secret_keys: [GrumpkinPrivateKey; MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX],
master_nullifier_secret_keys: [NullifierKeyHint; NLL_KEYS],
}

impl PrivateValidationRequestProcessor {
impl<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS> PrivateValidationRequestProcessor<NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, NLL_KEYS> {
pub fn validate(self) -> ValidationRequests {
let remaining_note_hash_read_requests = self.validate_note_hash_read_requests();
let remaining_nullifier_read_requests = self.validate_nullifier_read_requests();
Expand Down Expand Up @@ -66,36 +67,9 @@ impl PrivateValidationRequestProcessor {
}

fn validate_nullifier_keys(self) -> BoundedVec<ScopedNullifierKeyValidationRequest, MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX> {
let mut should_propagate = [false; MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX];
let requests = self.validation_requests.nullifier_key_validation_requests;
for i in 0..MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX {
let request = requests[i].request;
if !is_empty(request) {
let contract_address = requests[i].contract_address;
let master_nullifier_secret_key = self.master_nullifier_secret_keys[i];
if !is_empty(master_nullifier_secret_key) {
// First we check that derived public key matches master nullifier public key from request
let master_nullifier_public_key = master_nullifier_secret_key.derive_public_key();
assert(
master_nullifier_public_key.eq(request.master_nullifier_public_key), "Failed to derive matching master nullifier public key from the secret key."
);

// Then we check that siloing the master secret key with the contract address gives the app nullifier secret key

let app_nullifier_secret_key = poseidon2_hash(
[
master_nullifier_secret_key.high, master_nullifier_secret_key.low, contract_address.to_field(), GENERATOR_INDEX__NSK_M
]
);
assert(
app_nullifier_secret_key.eq(request.app_nullifier_secret_key), "Failed to derive matching app nullifier secret key from the secret key."
);
} else {
should_propagate[i] = true;
}
}
}

filter_array_to_bounded_vec(requests, should_propagate)
reset_nullifier_keys(
self.validation_requests.nullifier_key_validation_requests,
self.master_nullifier_secret_keys
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use dep::types::{
kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs, nullifier::Nullifier,
public_data_update_request::PublicDataUpdateRequest, validation_requests::ValidationRequests
},
constants::{MAX_NEW_NULLIFIERS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX},
constants::{MAX_NEW_NULLIFIERS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX},
hash::silo_nullifier, traits::is_empty,
utils::arrays::{array_merge, array_to_bounded_vec, assert_sorted_array}
};
Expand All @@ -21,7 +21,7 @@ struct PublicValidationRequestProcessor<N> {
validation_requests: ValidationRequests,
pending_nullifiers: [Nullifier; MAX_NEW_NULLIFIERS_PER_TX],
pending_public_data_writes: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],
nullifier_read_request_hints: NullifierReadRequestHints,
nullifier_read_request_hints: NullifierReadRequestHints<MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX>,
nullifier_non_existent_read_request_hints: NullifierNonExistentReadRequestHints,
nullifier_tree_root: Field,
public_data_read_request_hints: PublicDataReadRequestHints,
Expand All @@ -31,7 +31,7 @@ struct PublicValidationRequestProcessor<N> {
impl<N> PublicValidationRequestProcessor<N> {
pub fn new(
public_inputs: PublicKernelCircuitPublicInputs,
nullifier_read_request_hints: NullifierReadRequestHints,
nullifier_read_request_hints: NullifierReadRequestHints<MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX>,
nullifier_non_existent_read_request_hints: NullifierNonExistentReadRequestHints,
nullifier_tree_root: Field,
public_data_read_request_hints: PublicDataReadRequestHints,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ mod mutable_data_read_request;
mod non_existent_read_request;
mod read_request;
mod transient_data;
mod nullifier_key;
Loading

0 comments on commit f1b3cf5

Please sign in to comment.