Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: aztec nr lib constraining nullifier key is fresh #5939

Merged
merged 38 commits into from
May 1, 2024
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
3acc686
Initial
sklppy88 Apr 22, 2024
1f53bd5
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 22, 2024
177445f
fix
sklppy88 Apr 22, 2024
fdbb60a
good
sklppy88 Apr 22, 2024
2d3a95f
asdf
sklppy88 Apr 22, 2024
58f9650
working tests
sklppy88 Apr 23, 2024
42a9c35
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 23, 2024
f82d1c8
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 23, 2024
ea93350
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 24, 2024
781bbe3
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 25, 2024
3201fd4
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 26, 2024
1b13804
cleanup
sklppy88 Apr 26, 2024
211a060
yarn format
sklppy88 Apr 26, 2024
29bfb80
fix
sklppy88 Apr 26, 2024
7d1620d
change some stuff
sklppy88 Apr 26, 2024
f0ece69
fix
sklppy88 Apr 26, 2024
0461006
fix
sklppy88 Apr 26, 2024
e4f6d15
asdf
sklppy88 Apr 26, 2024
f9a844b
fix
sklppy88 Apr 26, 2024
0e0b63e
fix
sklppy88 Apr 26, 2024
7572be2
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 26, 2024
9051c8e
format
sklppy88 Apr 26, 2024
6e3509a
test
sklppy88 Apr 26, 2024
6fbd1d9
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 26, 2024
711afac
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 29, 2024
7f5dbfc
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 Apr 29, 2024
0ca8578
Addressing comments
sklppy88 May 1, 2024
c852740
Apply suggestions from code review
sklppy88 May 1, 2024
3b9e7ba
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 May 1, 2024
b76ab1a
fix
sklppy88 May 1, 2024
7eb2366
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 May 1, 2024
e2a479a
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 May 1, 2024
59a4c18
format
sklppy88 May 1, 2024
194df19
Address comments
sklppy88 May 1, 2024
938761a
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 May 1, 2024
0baf281
Merge branch 'master' into ek/feat/constrain-keys-are-fresh-lib
sklppy88 May 1, 2024
a85f513
fix
sklppy88 May 1, 2024
94db9f5
Okay
sklppy88 May 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions noir-projects/aztec-nr/aztec/src/keys.nr
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
mod assert_public_key_freshness;

use crate::keys::assert_public_key_freshness::assert_nullifier_public_key_is_fresh;
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
use dep::protocol_types::{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there different number of spaces per tab between users?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I will stick to four from now on 🙃

address::{
AztecAddress,
PartialAddress
},
constants::{
GENERATOR_INDEX__PUBLIC_KEYS_HASH,
GENERATOR_INDEX__CONTRACT_ADDRESS_V1,
CANONICAL_KEY_REGISTRY_ADDRESS
},
grumpkin_point::GrumpkinPoint,
};

use crate::context::PrivateContext;
use crate::hash::{
pedersen_hash,
poseidon2_hash,
};
use crate::oracle;
use crate::state_vars::shared_mutable::shared_mutable_private_getter::SharedMutablePrivateGetter;

struct PublicKeyTypeEnum {
NULLIFIER: u8,
}

global PublicKeyType = PublicKeyTypeEnum {
NULLIFIER: 0,
};

pub fn assert_nullifier_public_key_is_fresh(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed yesterday, think it would be better if we just have the getter here that is doing the assertions. In my mental model, you want to retrieve it for a user when you are populating the note, so having just one function do it instead of doing a retrieval and then a check that is doing the same internally seems nicer in my mind.

A similar change was made with the public storage some time back as an application can then easily add an explicit check if it want to see if it is a specific value etc.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, addressed as part of a stack, but popped into this pr for ease of review.

Addressed in 0ca8578

context: &mut PrivateContext,
address: AztecAddress,
nullifier_public_key_to_test: GrumpkinPoint,
) {
// This is the storage slot of the nullifier_public_key inside the key registry contract
let storage_slot_of_nullifier_public_key = 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment to canonical registry that we have the slot hardcoded here?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On this, could we not expose "global" values on the struct directly? Seems like it could be super sleek it we could do something like

registry::SOME_STORAGE_SLOT_CONSTANT

@Thunkar do you have any thoughts here? I have actually not checked if this is already possible with the code you made 👀

Copy link
Contributor Author

@sklppy88 sklppy88 May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed the original comment in 0ca8578

// We have to derive this slot to get the location of the shared mutable inside the Map
// This should mimic how maps derive their slots
let derived_slot = pedersen_hash(
[storage_slot_of_nullifier_public_key, address.to_field()],
0
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having hardcoded the inner logic of a Map here would result in hard to debug bug if something got changed there. I would introduce a derive_map_storage_slot function and use it from both Map and here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍. Addressed in 0ca8578


// It's a bit wonky because we need to know the delay for get_current_value_in_private to work correctly
// We read from the canonical Key Registry
let registry_private_getter: SharedMutablePrivateGetter<Field, 5> = SharedMutablePrivateGetter::new(*context, AztecAddress::from_field(CANONICAL_KEY_REGISTRY_ADDRESS), derived_slot);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would also add comment to registry that we use the value here as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 0ca8578

let hashed_nullifier_public_key_in_registry = registry_private_getter.get_current_value_in_private();

// In the case that the value is not found in the registry we need to manually pass in the address preimage
if (hashed_nullifier_public_key_in_registry == 0) {
check_public_key_validity(address, PublicKeyType.NULLIFIER, nullifier_public_key_to_test);
} else {
assert(hashed_nullifier_public_key_in_registry == poseidon2_hash(nullifier_public_key_to_test.serialize()));
}
}

fn check_public_key_validity(address: AztecAddress, key_type: u8, key: GrumpkinPoint) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As the comment below, think this could be done inline, seems a bit unnecessary to have these two separate functions when it is as small as they are. Seems like it would just be two lines instead of two functions.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 0ca8578

let keys = get_public_keys_internal(address);

assert(keys[key_type].eq(key));
}

fn get_public_keys_internal(address: AztecAddress) -> [GrumpkinPoint; 4] {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like having this function just makes it harder to read then if you just had line 64 on line 58 but maybe it's just a matter of taste

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Think it is mostly taste, but I agree, if not using more than once would just insert it directly in there

Copy link
Contributor Author

@sklppy88 sklppy88 May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also gree with your matter of taste, I thought it was convention to do it this way but I guess I was wrong. Addressed in 0ca8578

let (_, public_keys) = oracle::keys::get_public_keys_and_partial_address(address);

public_keys
}
1 change: 1 addition & 0 deletions noir-projects/aztec-nr/aztec/src/lib.nr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ mod deploy;
mod hash;
mod history;
mod initializer;
mod keys;
mod log;
mod messaging;
mod note;
Expand Down
1 change: 1 addition & 0 deletions noir-projects/aztec-nr/aztec/src/oracle.nr
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ mod get_nullifier_membership_witness;
mod get_public_data_witness;
mod get_membership_witness;
mod get_public_key;
mod keys;
mod nullifier_key;
mod get_sibling_path;
mod unsafe_rand;
Expand Down
76 changes: 76 additions & 0 deletions noir-projects/aztec-nr/aztec/src/oracle/keys.nr
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
use dep::protocol_types::{
address::{
AztecAddress,
PartialAddress,
PublicKeysHash,
},
constants::{
GENERATOR_INDEX__PUBLIC_KEYS_HASH,
GENERATOR_INDEX__CONTRACT_ADDRESS_V1,
},
grumpkin_point::GrumpkinPoint,
};

use crate::hash::poseidon2_hash;

#[oracle(getPublicKeysAndPartialAddress)]
fn get_public_keys_and_partial_address_oracle(_address: AztecAddress) -> [Field; 9] {}

unconstrained fn get_public_keys_and_partial_address_oracle_wrapper(address: AztecAddress) -> [Field; 9] {
get_public_keys_and_partial_address_oracle(address)
}

pub fn get_public_keys_and_partial_address(address: AztecAddress) -> (PartialAddress, [GrumpkinPoint; 4]) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you aware of us needing the partial address somewhere?

As far as I know the whole purpose of it is to be able to check the preimage of aztec address which we only do internally in the function so I don't think it makes sense to return here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 0ca8578

let result = get_public_keys_and_partial_address_oracle_wrapper(address);

let partial_address = PartialAddress::from_field(result[0]);
let nullifier_pub_key = GrumpkinPoint::new(result[1], result[2]);
let incoming_pub_key = GrumpkinPoint::new(result[3], result[4]);
let outgoing_pub_key = GrumpkinPoint::new(result[5], result[6]);
let tagging_pub_key = GrumpkinPoint::new(result[7], result[8]);

_check_public_key_validity_constrain_oracle(
address,
partial_address,
nullifier_pub_key,
incoming_pub_key,
outgoing_pub_key,
tagging_pub_key,
);

(partial_address, [nullifier_pub_key, incoming_pub_key, outgoing_pub_key, tagging_pub_key])
}

fn _check_public_key_validity_constrain_oracle(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would likely be easier to follow, if you have that the function is returning the address instead, and then constrain it in the caller. Would then have function that is essentially take the preimage and compue, which should be similar to what we have other places (as jan mentioned)

Copy link
Contributor Author

@sklppy88 sklppy88 May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair, addresssed in 0ca8578

address: AztecAddress,
partial_address: PartialAddress,
nullifier_public_key: GrumpkinPoint,
incoming_public_key: GrumpkinPoint,
outgoing_public_key: GrumpkinPoint,
tagging_public_key: GrumpkinPoint
) {
let public_keys_hash = poseidon2_hash([
nullifier_public_key.serialize()[0],
nullifier_public_key.serialize()[1],
incoming_public_key.serialize()[0],
incoming_public_key.serialize()[1],
outgoing_public_key.serialize()[0],
outgoing_public_key.serialize()[1],
tagging_public_key.serialize()[0],
tagging_public_key.serialize()[1],
GENERATOR_INDEX__PUBLIC_KEYS_HASH,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would just introduce a compute_public_keys_hash function and use it in both the registry and here to avoid pain during changes.

I would also expect that calling serialize() twice on each key would result in a lot of unnecessary gates and I think it would be better to just directly create the array of preimage as [nullifier_public_key.x, nullifier_public_key.y, ...].

@vezenovm can you confirm that I am not proposing non-sense?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed both points in 0ca8578

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I imagine serialize is just flattening (x, y) into an array? Even if this doesn't add many gates it does not look needed here and using x and y themselves is more clear.

]);

// TODO: #5830: we can compute this like below once refactored
// let calculated_address = AztecAddress::compute(PublicKeysHash::compute(pub_key), partial_address);

let computed_address = AztecAddress::from_field(
poseidon2_hash([
partial_address.to_field(),
public_keys_hash.to_field(),
GENERATOR_INDEX__CONTRACT_ADDRESS_V1,
])
);

assert(computed_address.eq(address));
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ contract KeyRegistry {
Map
},
protocol_types::{
grumpkin_point::GrumpkinPoint,
address::{
AztecAddress,
PublicKeysHash,
Expand All @@ -26,7 +27,7 @@ contract KeyRegistry {
struct Storage {
// We are not supporting rotating / changing keys other than the nullifier public in the registry at the moment, but will in the future.
// Uncomment lines below to enable that functionality
nullifier_public_key_registry: Map<AztecAddress, SharedMutable<Field, KEY_ROTATION_DELAY>>,
nullifier_public_key_hash_registry: Map<AztecAddress, SharedMutable<Field, KEY_ROTATION_DELAY>>,
// incoming_public_key_registry: Map<AztecAddress, SharedMutable<Field, KEY_ROTATION_DELAY>>,
// outgoing_public_key_registry: Map<AztecAddress, SharedMutable<Field, KEY_ROTATION_DELAY>>,
// tagging_public_key_registry: Map<AztecAddress, SharedMutable<Field, KEY_ROTATION_DELAY>>,
Expand All @@ -35,36 +36,37 @@ contract KeyRegistry {
#[aztec(public)]
fn rotate_nullifier_public_key(
address: AztecAddress,
new_nullifier_public_key: Field,
new_nullifier_public_key: GrumpkinPoint,
) {
assert(
new_nullifier_public_key != 0,
!new_nullifier_public_key.is_zero(),
"New nullifier public key must be non-zero"
);

if (!address.eq(context.msg_sender())) {
assert_current_call_valid_authwit_public(&mut context, address);
LHerskind marked this conversation as resolved.
Show resolved Hide resolved
}

let nullifier_key_registry = storage.nullifier_public_key_registry.at(address);
let nullifier_key_registry = storage.nullifier_public_key_hash_registry.at(address);

nullifier_key_registry.schedule_value_change(new_nullifier_public_key);
nullifier_key_registry.schedule_value_change(poseidon2_hash(new_nullifier_public_key.serialize()));
}

#[aztec(public)]
fn register(
address: AztecAddress,
partial_address: PartialAddress,
nullifier_public_key: Field,
incoming_public_key: Field,
outgoing_public_key: Field,
tagging_public_key: Field,
nullifier_public_key: GrumpkinPoint,
incoming_public_key: GrumpkinPoint,
outgoing_public_key: GrumpkinPoint,
tagging_public_key: GrumpkinPoint,
) {
assert(
(nullifier_public_key != 0) &
(incoming_public_key != 0) &
(outgoing_public_key != 0) &
(tagging_public_key != 0),
!partial_address.is_zero() &
!nullifier_public_key.is_zero() &
!incoming_public_key.is_zero() &
!outgoing_public_key.is_zero() &
!tagging_public_key.is_zero(),
"All public keys must be non-zero"
);

Expand All @@ -73,10 +75,14 @@ contract KeyRegistry {
// let address = AztecAddress::compute(public_keys_hash, partial_address);
// We could also pass in original_public_keys_hash instead of computing it here, if all we need the original one is for being able to prove ownership of address
let public_keys_hash = poseidon2_hash([
nullifier_public_key,
incoming_public_key,
outgoing_public_key,
tagging_public_key,
nullifier_public_key.serialize()[0],
nullifier_public_key.serialize()[1],
incoming_public_key.serialize()[0],
incoming_public_key.serialize()[1],
outgoing_public_key.serialize()[0],
outgoing_public_key.serialize()[1],
tagging_public_key.serialize()[0],
tagging_public_key.serialize()[1],
GENERATOR_INDEX__PUBLIC_KEYS_HASH,
]
);
Expand All @@ -92,14 +98,14 @@ contract KeyRegistry {

assert(computed_address.eq(address), "Computed address does not match supplied address");

let nullifier_key_registry = storage.nullifier_public_key_registry.at(address);
let nullifier_key_hash_registry = storage.nullifier_public_key_hash_registry.at(address);
// We are not supporting rotating / changing keys other than the nullifier public in the registry at the moment, but will in the future.
// Uncomment lines below to enable that functionality
// let incoming_key_registry = storage.incoming_public_key_registry.at(address);
// let outgoing_key_registry = storage.outgoing_public_key_registry.at(address);
// let tagging_key_registry = storage.taggin_public_key_registry.at(address);

nullifier_key_registry.schedule_value_change(nullifier_public_key);
nullifier_key_hash_registry.schedule_value_change(poseidon2_hash(nullifier_public_key.serialize()));
// We are not supporting rotating / changing keys other than the nullifier public in the registry at the moment, but will in the future.
// Uncomment lines below to enable that functionality // incoming_key_registry.schedule_value_change(new_incoming_public_key);
// outgoing_key_registry.schedule_value_change(new_outgoing_public_key);
Expand Down
14 changes: 12 additions & 2 deletions noir-projects/noir-contracts/contracts/test_contract/src/main.nr
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,16 @@ contract Test {

use dep::aztec::protocol_types::{
abis::private_circuit_public_inputs::PrivateCircuitPublicInputs,
constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, traits::Serialize
constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, traits::Serialize,
grumpkin_point::GrumpkinPoint
};

use dep::aztec::note::constants::MAX_NOTES_PER_PAGE;

use dep::aztec::state_vars::shared_mutable::SharedMutablePrivateGetter;

use dep::aztec::{
keys::assert_public_key_freshness::assert_nullifier_public_key_is_fresh,
context::{Context, inputs::private_context_inputs::PrivateContextInputs},
hash::{pedersen_hash, compute_secret_hash, ArgsHasher},
note::{
Expand Down Expand Up @@ -387,7 +389,7 @@ contract Test {
0
);
// It's a bit wonky because we need to know the delay for get_current_value_in_private to work correctly
let registry_private_getter: SharedMutablePrivateGetter<AztecAddress, 5> = SharedMutablePrivateGetter::new(context, contract_address_to_read, derived_slot);
let registry_private_getter: SharedMutablePrivateGetter<Field, 5> = SharedMutablePrivateGetter::new(context, contract_address_to_read, derived_slot);
let nullifier_public_key = registry_private_getter.get_current_value_in_private();

context.emit_unencrypted_log(nullifier_public_key);
LHerskind marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -409,6 +411,14 @@ contract Test {
context.emit_unencrypted_log(authorized);
}

#[aztec(private)]
fn test_nullifier_key_freshness(
address: AztecAddress,
public_nullifying_key: GrumpkinPoint,
) {
assert_nullifier_public_key_is_fresh(&mut context, address, public_nullifying_key);
}

#[aztec(public)]
fn delay() {
// We use this as a util function to "mine a block"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ impl PartialAddress {
self.inner
}

pub fn is_zero(self) -> bool {
self.to_field() == 0
}

pub fn assert_is_zero(self) {
assert(self.to_field() == 0);
}
Expand Down
5 changes: 3 additions & 2 deletions yarn-project/circuit-types/src/interfaces/pxe.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type AztecAddress, type CompleteAddress, type Fr, type PartialAddress } from '@aztec/circuits.js';
import { type AztecAddress, type CompleteAddress, type Fr, type PartialAddress, type Point } from '@aztec/circuits.js';
import { type ContractArtifact } from '@aztec/foundation/abi';
import { type ContractClassWithId, type ContractInstanceWithAddress } from '@aztec/types/contracts';
import { type NodeInfo } from '@aztec/types/interfaces';
Expand Down Expand Up @@ -73,7 +73,8 @@ export interface PXE {
* the recipient's notes. We can send notes to this account because we can encrypt them with the recipient's
* public key.
*/
registerRecipient(recipient: CompleteAddress): Promise<void>;
// TODO: #5834: FIX THIS AFTER THE COMPLETE ADDRESS REFACTOR
registerRecipient(recipient: CompleteAddress, publicKeys?: Point[]): Promise<void>;
sklppy88 marked this conversation as resolved.
Show resolved Hide resolved

/**
* Retrieves the user accounts registered on this PXE Service.
Expand Down
17 changes: 17 additions & 0 deletions yarn-project/circuit-types/src/keys/key_store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
type Fr,
type GrumpkinPrivateKey,
type PartialAddress,
type Point,
type PublicKey,
} from '@aztec/circuits.js';

Expand Down Expand Up @@ -116,4 +117,20 @@ export interface KeyStore {
* @returns A Promise that resolves to the public keys hash.
*/
getPublicKeysHash(account: AztecAddress): Promise<Fr>;

/**
* This is used to register a recipient / for storing public keys of an address
* @param accountAddress - The account address to store keys for.
* @param masterNullifierPublicKey - The stored master nullifier public key
* @param masterIncomingViewingPublicKey - The stored incoming viewing public key
* @param masterOutgoingViewingPublicKey - The stored outgoing viewing public key
* @param masterTaggingPublicKey - The stored master tagging public key
*/
addPublicKeysForAccount(
accountAddress: AztecAddress,
masterNullifierPublicKey: Point,
masterIncomingViewingPublicKey: Point,
masterOutgoingViewingPublicKey: Point,
masterTaggingPublicKey: Point,
): Promise<void>;
}
2 changes: 1 addition & 1 deletion yarn-project/end-to-end/jest.integration.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"moduleNameMapper": {
"^(\\.{1,2}/.*)\\.js$": "$1"
},
"reporters": [["default", {"summaryThreshold": 9999}]],
"reporters": [["default", { "summaryThreshold": 9999 }]],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this change?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like just a good ol formatting

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lasse was right, via yarn format. Not sure why though its a diff though. Reverted it in 0ca8578

"testRegex": "./src/.*\\.test\\.ts$",
"rootDir": "./src"
}
Loading
Loading