From 1a586c4197f2e093521e921e7ef21599be71e5b5 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 13 Sep 2023 11:07:41 -0400 Subject: [PATCH 01/11] chore: consolidate mirror repos on a nightly schedule (#1994) Co-authored-by: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> --- .../workflows/mirror_barretenberg_repo.yml | 35 -------- .../workflows/mirror_build_system_repo.yml | 35 -------- .github/workflows/mirror_docs_repo.yml | 35 -------- .github/workflows/mirror_repos.yml | 79 +++++++++++++++++++ 4 files changed, 79 insertions(+), 105 deletions(-) delete mode 100644 .github/workflows/mirror_barretenberg_repo.yml delete mode 100644 .github/workflows/mirror_build_system_repo.yml delete mode 100644 .github/workflows/mirror_docs_repo.yml create mode 100644 .github/workflows/mirror_repos.yml diff --git a/.github/workflows/mirror_barretenberg_repo.yml b/.github/workflows/mirror_barretenberg_repo.yml deleted file mode 100644 index d4ab13d76e1..00000000000 --- a/.github/workflows/mirror_barretenberg_repo.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Mirror to barretenberg repo - -on: - push: - branches: - - master - paths: - - "barretenberg/**" - - "!barretenberg/.gitrepo" - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - - - name: Push to branch - run: | - # we push using git subrepo (https://github.com/ingydotnet/git-subrepo) - # with some logic to recover from squashed parent commits - SUBREPO_PATH=barretenberg - # identify ourselves, needed to commit - git config --global user.name AztecBot - git config --global user.email tech@aztecprotocol.com - # push to subrepo, commit to master. The commit is needed - # to continue to replay. If we still hit issues such as this - # action failing due to upstream changes, a manual resolution - # PR with ./scripts/git_subrepo.sh pull will be needed. - ./scripts/git_subrepo.sh push $SUBREPO_PATH --branch=master - git push # update .gitrepo on master diff --git a/.github/workflows/mirror_build_system_repo.yml b/.github/workflows/mirror_build_system_repo.yml deleted file mode 100644 index 9e85d3600f0..00000000000 --- a/.github/workflows/mirror_build_system_repo.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Mirror to build-system repo - -on: - push: - branches: - - master - paths: - - "build-system/**" - - "!build-system/.gitrepo" - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - - - name: Push to branch - run: | - # we push using git subrepo (https://github.com/ingydotnet/git-subrepo) - # with some logic to recover from squashed parent commits - SUBREPO_PATH=build-system - # identify ourselves, needed to commit - git config --global user.name AztecBot - git config --global user.email tech@aztecprotocol.com - # push to subrepo, commit to master. The commit is needed - # to continue to replay. If we still hit issues such as this - # action failing due to upstream changes, a manual resolution - # PR with ./scripts/git_subrepo.sh pull will be needed. - ./scripts/git_subrepo.sh push $SUBREPO_PATH --branch=master - git push # update .gitrepo on master diff --git a/.github/workflows/mirror_docs_repo.yml b/.github/workflows/mirror_docs_repo.yml deleted file mode 100644 index 7965b5c867d..00000000000 --- a/.github/workflows/mirror_docs_repo.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Mirror to docs repo - -on: - push: - branches: - - master - paths: - - 'docs/**' - - '!docs/.gitrepo' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - - - name: Push to branch - run: | - # we push using git subrepo (https://github.com/ingydotnet/git-subrepo) - # with some logic to recover from squashed parent commits - SUBREPO_PATH=docs - # identify ourselves, needed to commit - git config --global user.name AztecBot - git config --global user.email tech@aztecprotocol.com - # push to subrepo, commit to master. The commit is needed - # to continue to replay. If we still hit issues such as this - # action failing due to upstream changes, a manual resolution - # PR with ./scripts/git_subrepo.sh pull will be needed. - ./scripts/git_subrepo.sh push $SUBREPO_PATH --branch=main - git push # update .gitrepo on master diff --git a/.github/workflows/mirror_repos.yml b/.github/workflows/mirror_repos.yml new file mode 100644 index 00000000000..c3cec86a551 --- /dev/null +++ b/.github/workflows/mirror_repos.yml @@ -0,0 +1,79 @@ +# We push using git subrepo (https://github.com/ingydotnet/git-subrepo) +# with some logic to recover from squashed parent commits +# We first identify ourselves, needed to commit. +# Then push to subrepo, commit to master. The commit is needed +# to continue to replay. If we still hit issues such as this +# action failing due to upstream changes, a manual resolution +# PR with ./scripts/git_subrepo.sh pull will be needed. +name: Mirror Repositories + +concurrency: + group: mirror-repositories +on: + schedule: + # Run the workflow every night at 2:00 AM UTC. + cron: '0 2 * * *' + +jobs: + mirror-to-docs-repo: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + - name: Push to docs repo + run: | + SUBREPO_PATH=docs + git config --global user.name AztecBot + git config --global user.email tech@aztecprotocol.com + + if ./scripts/git_subrepo.sh push $SUBREPO_PATH --branch=main; then + git fetch # in case a commit came after this + git rebase origin/master + git commit --amend -m "$(git log -1 --pretty=%B) [skip ci]" + git push + fi + + mirror-to-build-system-repo: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + - name: Push to build-system repo + run: | + SUBREPO_PATH=build-system + git config --global user.name AztecBot + git config --global user.email tech@aztecprotocol.com + + if ./scripts/git_subrepo.sh push $SUBREPO_PATH --branch=main; then + git fetch # in case a commit came after this + git rebase origin/master + git commit --amend -m "$(git log -1 --pretty=%B) [skip ci]" + git push + fi + + mirror-to-barretenberg-repo: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + - name: Push to barretenberg repo + run: | + SUBREPO_PATH=barretenberg + git config --global user.name AztecBot + git config --global user.email tech@aztecprotocol.com + + if ./scripts/git_subrepo.sh push $SUBREPO_PATH --branch=main; then + git fetch # in case a commit came after this + git rebase origin/master + git commit --amend -m "$(git log -1 --pretty=%B) [skip ci]" + git push + fi From f85db4972411c863585e968fe2535e68c467b028 Mon Sep 17 00:00:00 2001 From: Maddiaa <47148561+Maddiaa0@users.noreply.github.com> Date: Wed, 13 Sep 2023 17:11:37 +0200 Subject: [PATCH 02/11] fix: noir bootstrap (#2274) goofed --- yarn-project/noir-contracts/bootstrap.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/yarn-project/noir-contracts/bootstrap.sh b/yarn-project/noir-contracts/bootstrap.sh index 85414de80c6..1077490d138 100755 --- a/yarn-project/noir-contracts/bootstrap.sh +++ b/yarn-project/noir-contracts/bootstrap.sh @@ -9,7 +9,6 @@ fi # Update noir ./scripts/install_noir.sh -./scripts/install_noir_backend.sh # Use yarn script to compile and create types yarn From 3927c1a09933e46b2447a99641cc2c423f58f664 Mon Sep 17 00:00:00 2001 From: Charlie Lye Date: Wed, 13 Sep 2023 15:37:08 +0000 Subject: [PATCH 03/11] Bootstrap tweaks. --- bootstrap.sh | 54 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 88bca947176..12da08e2b23 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,29 +1,19 @@ #!/bin/bash +# Usage: +# Bootstraps the repo. End to end tests should be runnable after a bootstrap: +# ./bootstrap.sh +# Run a second time to perform a "light bootstrap", rebuilds code that's changed: +# ./bootstrap.sh +# Force a clean of the repo before performing a full bootstrap, erases untracked files, be careful! +# ./bootstrap.sh clean set -eu export CMD=${1:-} cd "$(dirname "$0")" -# Lightweight bootstrap. Run `./bootstrap.sh clean` to bypass. -if [ -f .bootstrapped ]; then - echo -e '\033[1mRebuild L1 contracts...\033[0m' - (cd l1-contracts && forge build) - - echo -e '\n\033[1mUpdate npm deps...\033[0m' - (cd yarn-project && yarn install) - - echo -e '\n\033[1mRebuild Noir contracts...\033[0m' - (cd yarn-project/noir-contracts && yarn noir:build:all 2> /dev/null) - - echo -e '\n\033[1mRebuild barretenberg wasm...\033[0m' - (cd barretenberg/cpp && cmake --build --preset wasm && cmake --build --preset wasm-threads) - - echo -e '\n\033[1mRebuild circuits wasm...\033[0m' - (cd circuits/cpp && cmake --build --preset wasm -j --target aztec3-circuits.wasm) - - exit 0 -fi +# Bump this number to force a full bootstrap. +VERSION=1 # Remove all untracked files and directories. if [ -n "$CMD" ]; then @@ -34,21 +24,39 @@ if [ -n "$CMD" ]; then if [ "$user_input" != "y" ] && [ "$user_input" != "Y" ]; then exit 1 fi - rm .bootstrapped + rm -f .bootstrapped rm -rf .git/hooks/* rm -rf .git/modules/* git clean -fd for SUBMODULE in $(git config --file .gitmodules --get-regexp path | awk '{print $2}'); do rm -rf $SUBMODULE done - git submodule update --init --recursive - exit 0 else echo "Unknown command: $CLEAN" exit 1 fi fi +# Lightweight bootstrap. Run `./bootstrap.sh clean` to bypass. +if [[ -f .bootstrapped && $(cat .bootstrapped) -eq "$VERSION" ]]; then + echo -e '\033[1mRebuild L1 contracts...\033[0m' + (cd l1-contracts && .foundry/bin/forge build) + + echo -e '\n\033[1mUpdate npm deps...\033[0m' + (cd yarn-project && yarn install) + + echo -e '\n\033[1mRebuild Noir contracts...\033[0m' + (cd yarn-project/noir-contracts && yarn noir:build:all 2> /dev/null) + + echo -e '\n\033[1mRebuild barretenberg wasm...\033[0m' + (cd barretenberg/cpp && cmake --build --preset default && cmake --build --preset wasm && cmake --build --preset wasm-threads) + + echo -e '\n\033[1mRebuild circuits wasm...\033[0m' + (cd circuits/cpp && cmake --build --preset wasm -j --target aztec3-circuits.wasm) + + exit 0 +fi + git submodule update --init --recursive if [ ! -f ~/.nvm/nvm.sh ]; then @@ -66,4 +74,4 @@ barretenberg/cpp/bootstrap.sh circuits/cpp/bootstrap.sh yarn-project/bootstrap.sh -touch .bootstrapped \ No newline at end of file +echo $VERSION > .bootstrapped \ No newline at end of file From 271b060f2642570f58e38881cbb3477745b84ddf Mon Sep 17 00:00:00 2001 From: Leila Wang Date: Wed, 13 Sep 2023 18:26:44 +0200 Subject: [PATCH 04/11] fix: ensure_note_hash_exists (#2256) Closes #1142 #1029 - Rename `oracle.getCommitment` to `oracle.checkNoteHashExists`. - Change `Set.assert_contains_and_remove(note, nonce)` to take a nonce in addition to a note. We calculate the inner note hash from the provided note. And although the nonce can be set to the header of the note, by making it a required parameter of this method makes it clearer that nonce is needed to check the existence of a note hash. (An example will be created in a later PR to show how a recipient can learn about the nonce if they don't have the encrypted data.) - Change the api on CommitmentDb to only return an index of a note hash: the index is all we need to know if a note hash exists, and to use it to get `readRequestMembershipWitnesses` later in the kernel prover. - (A tiny change that is not really related to this PR): We don't have to emit storage slot when notifying the simulator about a new nullifier. # Checklist: Remove the checklist to signal you've completed it. Enable auto-merge if the PR is ready to merge. - [ ] If the pull request requires a cryptography review (e.g. cryptographic algorithm implementations) I have added the 'crypto' tag. - [ ] I have reviewed my diff in github, line by line and removed unexpected formatting changes, testing logs, or commented-out code. - [ ] Every change is related to the PR description. - [ ] I have [linked](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) this pull request to relevant issues (if any exist). --------- Co-authored-by: David Banks <47112877+dbanks12@users.noreply.github.com> --- yarn-project/acir-simulator/src/acvm/acvm.ts | 2 +- .../acir-simulator/src/acvm/serialize.ts | 19 +---- .../src/client/client_execution_context.ts | 65 ++++++++------- .../acir-simulator/src/client/db_oracle.ts | 16 ---- .../src/client/execution_note_cache.ts | 68 +++++++--------- .../src/client/private_execution.test.ts | 32 +------- .../src/client/private_execution.ts | 7 +- .../src/client/unconstrained_execution.ts | 3 +- yarn-project/acir-simulator/src/public/db.ts | 11 ++- .../acir-simulator/src/public/executor.ts | 18 +++-- .../aztec-rpc/src/simulator_oracle/index.ts | 30 ++----- .../docs_example_contract/src/actions.nr | 5 +- .../native_token_contract/src/main.nr | 4 +- .../non_native_token_contract/src/main.nr | 4 +- .../src/interface.nr | 8 +- .../src/main.nr | 7 +- .../src/contracts/token_contract/src/main.nr | 4 +- .../noir-libs/aztec-noir/src/messaging.nr | 1 - .../messaging/get_commitment_getter_data.nr | 15 ---- .../aztec-noir/src/note/lifecycle.nr | 3 +- .../aztec-noir/src/note/note_getter.nr | 74 ++++------------- .../noir-libs/aztec-noir/src/oracle.nr | 1 - .../aztec-noir/src/oracle/get_commitment.nr | 11 --- .../noir-libs/aztec-noir/src/oracle/notes.nr | 17 +++- .../aztec-noir/src/state_vars/set.nr | 80 +++++++++++-------- .../aztec-noir/src/state_vars/singleton.nr | 4 +- .../src/simulator/public_executor.ts | 18 +---- 27 files changed, 201 insertions(+), 326 deletions(-) delete mode 100644 yarn-project/noir-libs/aztec-noir/src/messaging/get_commitment_getter_data.nr delete mode 100644 yarn-project/noir-libs/aztec-noir/src/oracle/get_commitment.nr diff --git a/yarn-project/acir-simulator/src/acvm/acvm.ts b/yarn-project/acir-simulator/src/acvm/acvm.ts index e806f22618c..2a9db8fb761 100644 --- a/yarn-project/acir-simulator/src/acvm/acvm.ts +++ b/yarn-project/acir-simulator/src/acvm/acvm.ts @@ -38,6 +38,7 @@ type ORACLE_NAMES = | 'getSecretKey' | 'getNote' | 'getNotes' + | 'checkNoteHashExists' | 'getRandomField' | 'notifyCreatedNote' | 'notifyNullifiedNote' @@ -46,7 +47,6 @@ type ORACLE_NAMES = | 'enqueuePublicFunctionCall' | 'storageRead' | 'storageWrite' - | 'getCommitment' | 'getL1ToL2Message' | 'getPortalContractAddress' | 'emitEncryptedLog' diff --git a/yarn-project/acir-simulator/src/acvm/serialize.ts b/yarn-project/acir-simulator/src/acvm/serialize.ts index 9b8e2640315..8784774486c 100644 --- a/yarn-project/acir-simulator/src/acvm/serialize.ts +++ b/yarn-project/acir-simulator/src/acvm/serialize.ts @@ -9,7 +9,7 @@ import { } from '@aztec/circuits.js'; import { Fr } from '@aztec/foundation/fields'; -import { CommitmentDataOracleInputs, MessageLoadOracleInputs } from '../client/db_oracle.js'; +import { MessageLoadOracleInputs } from '../client/db_oracle.js'; import { ACVMField, toACVMField } from './acvm.js'; // Utilities to write TS classes to ACVM Field arrays @@ -160,23 +160,6 @@ export function toAcvmL1ToL2MessageLoadOracleInputs( ]; } -/** - * Converts the result of loading commitments to ACVM fields. - * @param commitmentLoadOracleInputs - The result of loading messages to convert. - * @param l1ToL2MessagesTreeRoot - The L1 to L2 messages tree root - * @returns The Message Oracle Fields. - */ -export function toAcvmCommitmentLoadOracleInputs( - messageLoadOracleInputs: CommitmentDataOracleInputs, - l1ToL2MessagesTreeRoot: Fr, -): ACVMField[] { - return [ - toACVMField(messageLoadOracleInputs.commitment), - toACVMField(messageLoadOracleInputs.index), - toACVMField(l1ToL2MessagesTreeRoot), - ]; -} - /** * Inserts a list of ACVM fields to a witness. * @param witnessStartIndex - The index where to start inserting the fields. diff --git a/yarn-project/acir-simulator/src/client/client_execution_context.ts b/yarn-project/acir-simulator/src/client/client_execution_context.ts index 61d1d09c779..550490b48be 100644 --- a/yarn-project/acir-simulator/src/client/client_execution_context.ts +++ b/yarn-project/acir-simulator/src/client/client_execution_context.ts @@ -6,9 +6,10 @@ import { createDebugLogger } from '@aztec/foundation/log'; import { ACVMField, + ONE_ACVM_FIELD, + ZERO_ACVM_FIELD, fromACVMField, toACVMField, - toAcvmCommitmentLoadOracleInputs, toAcvmL1ToL2MessageLoadOracleInputs, } from '../acvm/index.js'; import { PackedArgsCache } from '../common/packed_args_cache.js'; @@ -156,7 +157,7 @@ export class ClientTxExecutionContext { // Nullified pending notes are already removed from the list. const pendingNotes = this.noteCache.getNotes(contractAddress, storageSlotField); - const pendingNullifiers = this.noteCache.getNullifiers(contractAddress, storageSlotField); + const pendingNullifiers = this.noteCache.getNullifiers(contractAddress); const dbNotes = await this.db.getNotes(contractAddress, storageSlotField); const dbNotesFiltered = dbNotes.filter(n => !pendingNullifiers.has((n.siloedNullifier as Fr).value)); @@ -253,23 +254,12 @@ export class ClientTxExecutionContext { * Adding a siloed nullifier into the current set of all pending nullifiers created * within the current transaction/execution. * @param contractAddress - The contract address. - * @param storageSlot - The storage slot. * @param innerNullifier - The pending nullifier to add in the list (not yet siloed by contract address). * @param innerNoteHash - The inner note hash of the new note. * @param contractAddress - The contract address */ - public async handleNullifiedNote( - contractAddress: AztecAddress, - storageSlot: ACVMField, - innerNullifier: ACVMField, - innerNoteHash: ACVMField, - ) { - await this.noteCache.nullifyNote( - contractAddress, - fromACVMField(storageSlot), - fromACVMField(innerNullifier), - fromACVMField(innerNoteHash), - ); + public async handleNullifiedNote(contractAddress: AztecAddress, innerNullifier: ACVMField, innerNoteHash: ACVMField) { + await this.noteCache.nullifyNote(contractAddress, fromACVMField(innerNullifier), fromACVMField(innerNoteHash)); } /** @@ -285,20 +275,39 @@ export class ClientTxExecutionContext { /** * Fetches a path to prove existence of a commitment in the db, given its contract side commitment (before silo). * @param contractAddress - The contract address. - * @param commitment - The commitment. - * @returns The commitment data. + * @param nonce - The nonce of the note. + * @param innerNoteHash - The inner note hash of the note. + * @returns 1 if (persistent or transient) note hash exists, 0 otherwise. Value is in ACVMField form. */ - public async getCommitment(contractAddress: AztecAddress, commitment: ACVMField) { - const innerNoteHash = fromACVMField(commitment); - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): only works - // for noteHashes/commitments created by public functions! Once public kernel or - // base rollup circuit injects nonces, this can be used with commitments created by - // private functions as well. - const commitmentInputs = await this.db.getCommitmentOracle(contractAddress, innerNoteHash); - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1029): support pending commitments here + public async checkNoteHashExists( + contractAddress: AztecAddress, + nonce: ACVMField, + innerNoteHash: ACVMField, + ): Promise { + const nonceField = fromACVMField(nonce); + const innerNoteHashField = fromACVMField(innerNoteHash); + if (nonceField.isZero()) { + // If nonce is 0, we are looking for a new note created in this transaction. + const exists = this.noteCache.checkNoteExists(contractAddress, innerNoteHashField); + if (exists) { + return ONE_ACVM_FIELD; + } + // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386) + // Currently it can also be a note created from public if nonce is 0. + // If we can't find a matching new note, keep looking for the match from the notes created in previous transactions. + } + + // If nonce is zero, SHOULD only be able to reach this point if note was publicly created const wasm = await CircuitsWasm.get(); - const siloedNoteHash = siloCommitment(wasm, contractAddress, innerNoteHash); - this.gotNotes.set(siloedNoteHash.value, commitmentInputs.index); - return toAcvmCommitmentLoadOracleInputs(commitmentInputs, this.historicBlockData.privateDataTreeRoot); + let noteHashToLookUp = siloCommitment(wasm, contractAddress, innerNoteHashField); + if (!nonceField.isZero()) { + noteHashToLookUp = computeUniqueCommitment(wasm, nonceField, noteHashToLookUp); + } + + const index = await this.db.getCommitmentIndex(noteHashToLookUp); + if (index !== undefined) { + this.gotNotes.set(noteHashToLookUp.value, index); + } + return index !== undefined ? ONE_ACVM_FIELD : ZERO_ACVM_FIELD; } } diff --git a/yarn-project/acir-simulator/src/client/db_oracle.ts b/yarn-project/acir-simulator/src/client/db_oracle.ts index df56338f9fa..2392e382495 100644 --- a/yarn-project/acir-simulator/src/client/db_oracle.ts +++ b/yarn-project/acir-simulator/src/client/db_oracle.ts @@ -45,22 +45,6 @@ export interface MessageLoadOracleInputs { index: bigint; } -/** - * The format noir uses to get commitments. - */ -export interface CommitmentDataOracleInputs { - /** The siloed commitment. */ - commitment: Fr; - /** - * The path in the merkle tree to the commitment. - */ - siblingPath: Fr[]; - /** - * The index of the message commitment in the merkle tree. - */ - index: bigint; -} - /** * A function ABI with optional debug metadata */ diff --git a/yarn-project/acir-simulator/src/client/execution_note_cache.ts b/yarn-project/acir-simulator/src/client/execution_note_cache.ts index 18de0658095..45e883dda6f 100644 --- a/yarn-project/acir-simulator/src/client/execution_note_cache.ts +++ b/yarn-project/acir-simulator/src/client/execution_note_cache.ts @@ -5,41 +5,32 @@ import { Fr } from '@aztec/foundation/fields'; import { NoteData } from './db_oracle.js'; -/** - * Generate a key with the given contract address and storage slot. - * @param contractAddress - Contract address. - * @param storageSlot - Storage slot. - */ -const generateKeyForContractStorageSlot = (contractAddress: AztecAddress, storageSlot: Fr) => - `${contractAddress.toShortString}${storageSlot}`; - /** * Data that's accessible by all the function calls in an execution. */ export class ExecutionNoteCache { /** - * Notes created during execution. - * The key of the mapping is a value representing a contract address and storage slot combination. + * New notes created in this transaction. + * This mapping maps from a contract address to the notes in the contract. */ - private newNotes: Map = new Map(); + private newNotes: Map = new Map(); /** * The list of nullifiers created in this transaction. - * The key of the mapping is a value representing a contract address and storage slot combination. + * This mapping maps from a contract address to the nullifiers emitted from the contract. * The note which is nullified might be new or not (i.e., was generated in a previous transaction). * Note that their value (bigint representation) is used because Frs cannot be looked up in Sets. */ - private nullifiers: Map> = new Map(); + private nullifiers: Map> = new Map(); /** * Add a new note to cache. * @param note - New note created during execution. */ public addNewNote(note: NoteData) { - const key = generateKeyForContractStorageSlot(note.contractAddress, note.storageSlot); - const notes = this.newNotes.get(key) ?? []; + const notes = this.newNotes.get(note.contractAddress.toBigInt()) ?? []; notes.push(note); - this.newNotes.set(key, notes); + this.newNotes.set(note.contractAddress.toBigInt(), notes); } /** @@ -50,32 +41,22 @@ export class ExecutionNoteCache { * @param innerNoteHash - Inner note hash of the note. If this value equals EMPTY_NULLIFIED_COMMITMENT, it means the * note being nullified is from a previous transaction (and thus not a new note). */ - public async nullifyNote(contractAddress: AztecAddress, storageSlot: Fr, innerNullifier: Fr, innerNoteHash: Fr) { + public async nullifyNote(contractAddress: AztecAddress, innerNullifier: Fr, innerNoteHash: Fr) { const wasm = await CircuitsWasm.get(); const siloedNullifier = siloNullifier(wasm, contractAddress, innerNullifier); - const nullifiers = this.getNullifiers(contractAddress, storageSlot); - if (nullifiers.has(siloedNullifier.value)) { - throw new Error('Attemp to nullify the same note twice.'); - } - + const nullifiers = this.getNullifiers(contractAddress); nullifiers.add(siloedNullifier.value); - const key = generateKeyForContractStorageSlot(contractAddress, storageSlot); - this.nullifiers.set(key, nullifiers); + this.nullifiers.set(contractAddress.toBigInt(), nullifiers); // Find and remove the matching new note if the emitted innerNoteHash is not empty. if (!innerNoteHash.equals(new Fr(EMPTY_NULLIFIED_COMMITMENT))) { - const notes = this.newNotes.get(key) ?? []; - /** - * The identifier used to determine matching is the inner note hash value. - * However, we adopt a defensive approach and ensure that the contract address - * and storage slot do match. - */ + const notes = this.newNotes.get(contractAddress.toBigInt()) ?? []; const noteIndexToRemove = notes.findIndex(n => n.innerNoteHash.equals(innerNoteHash)); if (noteIndexToRemove === -1) { throw new Error('Attemp to remove a pending note that does not exist.'); } notes.splice(noteIndexToRemove, 1); - this.newNotes.set(key, notes); + this.newNotes.set(contractAddress.toBigInt(), notes); } } @@ -86,17 +67,26 @@ export class ExecutionNoteCache { * @param storageSlot - Storage slot of the notes. **/ public getNotes(contractAddress: AztecAddress, storageSlot: Fr) { - const key = generateKeyForContractStorageSlot(contractAddress, storageSlot); - return this.newNotes.get(key) ?? []; + const notes = this.newNotes.get(contractAddress.toBigInt()) ?? []; + return notes.filter(n => n.storageSlot.equals(storageSlot)); } /** - * Return all nullifiers of a storage slot. - * @param contractAddress - Contract address of the notes. - * @param storageSlot - Storage slot of the notes. + * Check if a note exists in the newNotes array. + * @param contractAddress - Contract address of the note. + * @param storageSlot - Storage slot of the note. + * @param innerNoteHash - Inner note hash of the note. + **/ + public checkNoteExists(contractAddress: AztecAddress, innerNoteHash: Fr) { + const notes = this.newNotes.get(contractAddress.toBigInt()) ?? []; + return notes.some(n => n.innerNoteHash.equals(innerNoteHash)); + } + + /** + * Return all nullifiers emitted from a contract. + * @param contractAddress - Address of the contract. */ - public getNullifiers(contractAddress: AztecAddress, storageSlot: Fr): Set { - const key = generateKeyForContractStorageSlot(contractAddress, storageSlot); - return this.nullifiers.get(key) || new Set(); + public getNullifiers(contractAddress: AztecAddress): Set { + return this.nullifiers.get(contractAddress.toBigInt()) ?? new Set(); } } diff --git a/yarn-project/acir-simulator/src/client/private_execution.test.ts b/yarn-project/acir-simulator/src/client/private_execution.test.ts index e7d769cd235..d45cbddf93b 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.test.ts @@ -365,7 +365,7 @@ describe('Private Execution test suite', () => { expect(changeNote.preimage[0]).toEqual(new Fr(balance - amountToTransfer)); }); - it('Should be able to claim a note by providing the correct secret', async () => { + it('Should be able to claim a note by providing the correct secret and nonce', async () => { const amount = 100n; const secret = Fr.random(); const abi = getFunctionAbi(PrivateTokenAirdropContractAbi, 'claim'); @@ -374,22 +374,11 @@ describe('Private Execution test suite', () => { const nonce = new Fr(1n); const customNoteHash = hash([toBufferBE(amount, 32), secret.toBuffer()]); const innerNoteHash = Fr.fromBuffer(hash([storageSlot.toBuffer(), customNoteHash])); - - oracle.getNotes.mockResolvedValue([ - { - contractAddress, - storageSlot, - nonce, - preimage: [new Fr(amount), secret], - innerNoteHash, - siloedNullifier: new Fr(0), - index: 1n, - }, - ]); + oracle.getCommitmentIndex.mockResolvedValue(2n); const result = await runSimulator({ abi, - args: [amount, secret, recipient], + args: [amount, secret, recipient, nonce], }); // Check a nullifier has been inserted. @@ -751,20 +740,7 @@ describe('Private Execution test suite', () => { const storageSlot = new Fr(2); const innerNoteHash = hash([storageSlot.toBuffer(), noteHash.toBuffer()]); const siloedNoteHash = siloCommitment(wasm, contractAddress, Fr.fromBuffer(innerNoteHash)); - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should insert - // uniqueSiloedNoteHash in tree and that should be what is expected in Noir - //const uniqueSiloedNoteHash = computeUniqueCommitment(wasm, nonce, Fr.fromBuffer(innerNoteHash)); - - const tree = await insertLeaves([siloedNoteHash]); - - oracle.getCommitmentOracle.mockImplementation(async () => { - // Check the calculated commitment is correct - return Promise.resolve({ - commitment: siloedNoteHash, - siblingPath: (await tree.getSiblingPath(0n, false)).toFieldArray(), - index: 0n, - }); - }); + oracle.getCommitmentIndex.mockResolvedValue(0n); const result = await runSimulator({ abi, diff --git a/yarn-project/acir-simulator/src/client/private_execution.ts b/yarn-project/acir-simulator/src/client/private_execution.ts index 2e058c86852..1ee35591083 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.ts @@ -99,10 +99,12 @@ export class PrivateFunctionExecution { this.context.handleNewNote(this.contractAddress, storageSlot, preimage, innerNoteHash); return Promise.resolve(ZERO_ACVM_FIELD); }, - notifyNullifiedNote: async ([slot], [innerNullifier], [innerNoteHash]) => { - await this.context.handleNullifiedNote(this.contractAddress, slot, innerNullifier, innerNoteHash); + notifyNullifiedNote: async ([innerNullifier], [innerNoteHash]) => { + await this.context.handleNullifiedNote(this.contractAddress, innerNullifier, innerNoteHash); return Promise.resolve(ZERO_ACVM_FIELD); }, + checkNoteHashExists: ([nonce], [innerNoteHash]) => + this.context.checkNoteHashExists(this.contractAddress, nonce, innerNoteHash), callPrivateFunction: async ([acvmContractAddress], [acvmFunctionSelector], [acvmArgsHash]) => { const contractAddress = fromACVMField(acvmContractAddress); const functionSelector = fromACVMField(acvmFunctionSelector); @@ -125,7 +127,6 @@ export class PrivateFunctionExecution { getL1ToL2Message: ([msgKey]) => { return this.context.getL1ToL2Message(fromACVMField(msgKey)); }, - getCommitment: ([commitment]) => this.context.getCommitment(this.contractAddress, commitment), debugLog: (...args) => { this.log(oracleDebugCallToFormattedStr(args)); return Promise.resolve(ZERO_ACVM_FIELD); diff --git a/yarn-project/acir-simulator/src/client/unconstrained_execution.ts b/yarn-project/acir-simulator/src/client/unconstrained_execution.ts index f11c95d4c70..4a1d8fc89c3 100644 --- a/yarn-project/acir-simulator/src/client/unconstrained_execution.ts +++ b/yarn-project/acir-simulator/src/client/unconstrained_execution.ts @@ -72,13 +72,14 @@ export class UnconstrainedFunctionExecution { +offset, +returnSize, ), + checkNoteHashExists: ([nonce], [innerNoteHash]) => + this.context.checkNoteHashExists(this.contractAddress, nonce, innerNoteHash), getRandomField: () => Promise.resolve(toACVMField(Fr.random())), debugLog: (...params) => { this.log(oracleDebugCallToFormattedStr(params)); return Promise.resolve(ZERO_ACVM_FIELD); }, getL1ToL2Message: ([msgKey]) => this.context.getL1ToL2Message(fromACVMField(msgKey)), - getCommitment: ([commitment]) => this.context.getCommitment(this.contractAddress, commitment), storageRead: async ([slot], [numberOfElements]) => { if (!aztecNode) { const errMsg = `Aztec node is undefined, cannot read storage`; diff --git a/yarn-project/acir-simulator/src/public/db.ts b/yarn-project/acir-simulator/src/public/db.ts index bc79cb17b76..245c3f103c7 100644 --- a/yarn-project/acir-simulator/src/public/db.ts +++ b/yarn-project/acir-simulator/src/public/db.ts @@ -2,7 +2,7 @@ import { EthAddress, FunctionSelector } from '@aztec/circuits.js'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr } from '@aztec/foundation/fields'; -import { CommitmentDataOracleInputs, MessageLoadOracleInputs } from '../index.js'; +import { MessageLoadOracleInputs } from '../index.js'; /** * Database interface for providing access to public state. @@ -65,10 +65,9 @@ export interface CommitmentsDB { getL1ToL2Message(msgKey: Fr): Promise; /** - * Gets a message index and sibling path to some commitment in the private data tree. - * @param address - The contract address owning storage. - * @param commitment - The preimage of the siloed data. - * @returns - The Commitment data oracle object + * Gets the index of a commitment in the private data tree. + * @param commitment - The commitment. + * @returns - The index of the commitment. Undefined if it does not exist in the tree. */ - getCommitmentOracle(address: AztecAddress, commitment: Fr): Promise; + getCommitmentIndex(commitment: Fr): Promise; } diff --git a/yarn-project/acir-simulator/src/public/executor.ts b/yarn-project/acir-simulator/src/public/executor.ts index 4d8fe6da158..ca1451771dd 100644 --- a/yarn-project/acir-simulator/src/public/executor.ts +++ b/yarn-project/acir-simulator/src/public/executor.ts @@ -1,6 +1,7 @@ import { AztecAddress, CallContext, + CircuitsWasm, EthAddress, Fr, FunctionData, @@ -9,11 +10,13 @@ import { HistoricBlockData, RETURN_VALUES_LENGTH, } from '@aztec/circuits.js'; +import { siloCommitment } from '@aztec/circuits.js/abis'; import { padArrayEnd } from '@aztec/foundation/collection'; import { createDebugLogger } from '@aztec/foundation/log'; import { FunctionL2Logs } from '@aztec/types'; import { + ONE_ACVM_FIELD, ZERO_ACVM_FIELD, acvm, convertACVMFieldToBuffer, @@ -23,7 +26,6 @@ import { fromACVMField, toACVMField, toACVMWitness, - toAcvmCommitmentLoadOracleInputs, toAcvmL1ToL2MessageLoadOracleInputs, } from '../acvm/index.js'; import { oracleDebugCallToFormattedStr } from '../client/debug.js'; @@ -91,12 +93,14 @@ export class PublicExecutor { const messageInputs = await this.commitmentsDb.getL1ToL2Message(fromACVMField(msgKey)); return toAcvmL1ToL2MessageLoadOracleInputs(messageInputs, this.blockData.l1ToL2MessagesTreeRoot); }, // l1 to l2 messages in public contexts TODO: https://github.com/AztecProtocol/aztec-packages/issues/616 - getCommitment: async ([commitment]) => { - const commitmentInputs = await this.commitmentsDb.getCommitmentOracle( - execution.contractAddress, - fromACVMField(commitment), - ); - return toAcvmCommitmentLoadOracleInputs(commitmentInputs, this.blockData.privateDataTreeRoot); + checkNoteHashExists: async ([_nonce], [innerNoteHash]) => { + // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386) + // Once public kernel or base rollup circuit injects nonces, this can be updated to use uniqueSiloedCommitment. + const wasm = await CircuitsWasm.get(); + const siloedNoteHash = siloCommitment(wasm, execution.contractAddress, fromACVMField(innerNoteHash)); + const index = await this.commitmentsDb.getCommitmentIndex(siloedNoteHash); + // return 0 or 1 for whether note hash exists + return index === undefined ? ZERO_ACVM_FIELD : ONE_ACVM_FIELD; }, storageRead: async ([slot], [numberOfElements]) => { const startStorageSlot = fromACVMField(slot); diff --git a/yarn-project/aztec-rpc/src/simulator_oracle/index.ts b/yarn-project/aztec-rpc/src/simulator_oracle/index.ts index 52737d91a42..68309243747 100644 --- a/yarn-project/aztec-rpc/src/simulator_oracle/index.ts +++ b/yarn-project/aztec-rpc/src/simulator_oracle/index.ts @@ -1,12 +1,6 @@ -import { - CommitmentDataOracleInputs, - DBOracle, - FunctionAbiWithDebugMetadata, - MessageLoadOracleInputs, -} from '@aztec/acir-simulator'; +import { DBOracle, FunctionAbiWithDebugMetadata, MessageLoadOracleInputs } from '@aztec/acir-simulator'; import { AztecAddress, - CircuitsWasm, CompleteAddress, EthAddress, Fr, @@ -15,7 +9,6 @@ import { HistoricBlockData, PublicKey, } from '@aztec/circuits.js'; -import { siloCommitment } from '@aztec/circuits.js/abis'; import { DataCommitmentProvider, KeyStore, L1ToL2MessageProvider } from '@aztec/types'; import { ContractDataOracle } from '../contract_data_oracle/index.js'; @@ -105,23 +98,12 @@ export class SimulatorOracle implements DBOracle { } /** - * Retrieves the noir oracle data required to prove existence of a given commitment. - * @param contractAddress - The contract Address. - * @param innerCommitment - The key of the message being fetched. - * @returns - A promise that resolves to the commitment data, a sibling path and the - * index of the message in the private data tree. + * Gets the index of a commitment in the private data tree. + * @param commitment - The commitment. + * @returns - The index of the commitment. Undefined if it does not exist in the tree. */ - async getCommitmentOracle(contractAddress: AztecAddress, innerCommitment: Fr): Promise { - const siloedCommitment = siloCommitment(await CircuitsWasm.get(), contractAddress, innerCommitment); - const index = await this.dataTreeProvider.findCommitmentIndex(siloedCommitment.toBuffer()); - if (!index) throw new Error(`Commitment not found ${siloedCommitment.toString()}`); - - const siblingPath = await this.dataTreeProvider.getDataTreePath(index); - return await Promise.resolve({ - commitment: siloedCommitment, - siblingPath: siblingPath.toFieldArray(), - index, - }); + async getCommitmentIndex(commitment: Fr) { + return await this.dataTreeProvider.findCommitmentIndex(commitment.toBuffer()); } /** diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr index ff8e77a10b6..94b5981e1f3 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr @@ -148,9 +148,10 @@ unconstrained fn get_total_points( // docs:start:state_vars-SetContains fn assert_contains_card( state_var: Set, - card: CardNote, + card: &mut CardNote, + nonce: Field, ) { - state_var.assert_contains_and_remove(card); + state_var.assert_contains_and_remove(card, nonce); } // docs:end:state_vars-SetContains diff --git a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr index ba2bc64737a..31dc5e610e5 100644 --- a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr @@ -348,10 +348,10 @@ contract NativeToken { let storage = Storage::init(Context::private(&mut context)); let pending_shields = storage.pending_shields; - let public_note = TransparentNote::new_from_secret(amount, secret); + let mut public_note = TransparentNote::new_from_secret(amount, secret); // Ensure that the note exists in the tree and remove it. - pending_shields.assert_contains_and_remove_publicly_created(public_note); + pending_shields.assert_contains_and_remove_publicly_created(&mut public_note); // Mint the tokens let balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr index a9fb5b021ba..719f262b505 100644 --- a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr @@ -248,10 +248,10 @@ contract NonNativeToken { let storage = Storage::init(Context::private(&mut context)); let pending_shields = storage.pending_shields; - let public_note = TransparentNote::new_from_secret(amount, secret); + let mut public_note = TransparentNote::new_from_secret(amount, secret); // Ensure that the note exists in the tree and remove it. - pending_shields.assert_contains_and_remove_publicly_created(public_note); + pending_shields.assert_contains_and_remove_publicly_created(&mut public_note); // Mint the tokens let balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/interface.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/interface.nr index 6c8a95fb33a..ff54645fa31 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/interface.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/interface.nr @@ -59,14 +59,16 @@ impl PrivateTokenAirdropPrivateContextInterface { context: &mut PrivateContext, amount: Field, secret: Field, - owner: Field + owner: Field, + nonce: Field ) -> [Field; RETURN_VALUES_LENGTH] { - let mut serialised_args = [0; 3]; + let mut serialised_args = [0; 4]; serialised_args[0] = amount; serialised_args[1] = secret; serialised_args[2] = owner; + serialised_args[3] = nonce; - context.call_private_function(self.address, 0xd68b55c1, serialised_args) + context.call_private_function(self.address, 0xa9220f0f, serialised_args) } diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr index 2216e36ecba..c7eac5d9d4b 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr @@ -160,13 +160,14 @@ contract PrivateTokenAirdrop { fn claim( amount: Field, secret: Field, - owner: Field + owner: Field, + nonce: Field, ) { let storage = Storage::init(Context::private(&mut context)); // Remove the claim note if it exists in the set. - let note = ClaimNote::new(amount, secret); - storage.claims.assert_contains_and_remove(note); + let mut note = ClaimNote::new(amount, secret); + storage.claims.assert_contains_and_remove(&mut note, nonce); // Send the value note. let balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/token_contract/src/main.nr index 677998e7d1e..b676bea7962 100644 --- a/yarn-project/noir-contracts/src/contracts/token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/token_contract/src/main.nr @@ -244,9 +244,9 @@ contract Token { let storage = Storage::init(Context::private(&mut context)); let pending_shields = storage.pending_shields; let balance = storage.balances.at(to.address); - let public_note = TransparentNote::new_from_secret(amount, secret); + let mut public_note = TransparentNote::new_from_secret(amount, secret); - pending_shields.assert_contains_and_remove_publicly_created(public_note); + pending_shields.assert_contains_and_remove_publicly_created(&mut public_note); increment(balance, amount, to.address); 1 diff --git a/yarn-project/noir-libs/aztec-noir/src/messaging.nr b/yarn-project/noir-libs/aztec-noir/src/messaging.nr index c9ee3be0a3e..8f41c29c943 100644 --- a/yarn-project/noir-libs/aztec-noir/src/messaging.nr +++ b/yarn-project/noir-libs/aztec-noir/src/messaging.nr @@ -1,4 +1,3 @@ -mod get_commitment_getter_data; mod l1_to_l2_message; mod l1_to_l2_message_getter_data; diff --git a/yarn-project/noir-libs/aztec-noir/src/messaging/get_commitment_getter_data.nr b/yarn-project/noir-libs/aztec-noir/src/messaging/get_commitment_getter_data.nr deleted file mode 100644 index 07d826d41d7..00000000000 --- a/yarn-project/noir-libs/aztec-noir/src/messaging/get_commitment_getter_data.nr +++ /dev/null @@ -1,15 +0,0 @@ -use crate::oracle::get_commitment::COMMITMENT_GETTER_LENGTH; - -struct CommitmentGetterData { - message: Field, - leaf_index: Field, - root: Field, -} - -fn make_commitment_getter_data(fields: [Field; COMMITMENT_GETTER_LENGTH], start: Field) -> CommitmentGetterData { - CommitmentGetterData { - message: fields[start], - leaf_index: fields[start + 1], - root: fields[start + 2], - } -} \ No newline at end of file diff --git a/yarn-project/noir-libs/aztec-noir/src/note/lifecycle.nr b/yarn-project/noir-libs/aztec-noir/src/note/lifecycle.nr index b6e530ed94f..43ccdfad556 100644 --- a/yarn-project/noir-libs/aztec-noir/src/note/lifecycle.nr +++ b/yarn-project/noir-libs/aztec-noir/src/note/lifecycle.nr @@ -50,7 +50,6 @@ fn create_note_hash_from_public( fn destroy_note( context: &mut PrivateContext, - storage_slot: Field, note: Note, note_interface: NoteInterface, ) { @@ -72,7 +71,7 @@ fn destroy_note( // TODO(1718): Can we reuse the note commitment computed in `compute_nullifier`? nullified_commitment = compute_inner_note_hash(note_interface, note); } - assert(notify_nullified_note(storage_slot, nullifier, nullified_commitment) == 0); + assert(notify_nullified_note(nullifier, nullified_commitment) == 0); context.push_new_nullifier(nullifier, nullified_commitment) } \ No newline at end of file diff --git a/yarn-project/noir-libs/aztec-noir/src/note/note_getter.nr b/yarn-project/noir-libs/aztec-noir/src/note/note_getter.nr index ee407657547..808f9389b3a 100644 --- a/yarn-project/noir-libs/aztec-noir/src/note/note_getter.nr +++ b/yarn-project/noir-libs/aztec-noir/src/note/note_getter.nr @@ -13,11 +13,9 @@ use crate::note::{ note_header::NoteHeader, note_viewer_options::NoteViewerOptions, utils::compute_note_hash_for_read_or_nullify, - utils::compute_unique_siloed_note_hash, utils::compute_inner_note_hash, utils::compute_siloed_note_hash, }; -use crate::messaging::get_commitment_getter_data::make_commitment_getter_data; use crate::oracle; use crate::types::vec::BoundedVec; @@ -34,69 +32,29 @@ fn check_note_header( assert(header.storage_slot == storage_slot); } -fn ensure_note_exists( - context: &mut PrivateContext, - storage_slot: Field, - note_interface: NoteInterface, - note: &mut Note, -) { - let saved_note = get_note_internal(storage_slot, note_interface); - - // Only copy over the header to the original note to make sure the preimage is the same. - let get_header = note_interface.get_header; - let set_header = note_interface.set_header; - let note_header = get_header(saved_note); - set_header(note, note_header); - - check_note_header(*context, storage_slot, note_interface, *note); - - let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, *note); - context.push_read_request(note_hash_for_read_request); -} - // Ensure a note's hash exists in the tree without retrieving the entire // notes via the oracle. -// Modifies the note by populating it with header info. fn ensure_note_hash_exists( context: &mut PrivateContext, - storage_slot: Field, note_interface: NoteInterface, - note: &mut Note, + note: Note, + from_public: bool, ) { - // Initialize header of note. Must be done before computing note hashes as it initializes the: - // - storage slot (used in inner note hash) - // - the contract address (used in siloed note hash) - // - and the nonce (used in the unique siloed note hash) - let set_header = note_interface.set_header; - let note_header = NoteHeader { - contract_address: (*context).this_address(), - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be - // real nonce (once public kernel applies nonces). - nonce: 0, - storage_slot - }; - set_header(note, note_header); - - // Get a note from oracle and early out if it doesn't exist. - let inner_note_hash = compute_inner_note_hash(note_interface, *note); - - let raw_oracle_ret = oracle::get_commitment::get_commitment(inner_note_hash); - let deserialized_oracle_ret = make_commitment_getter_data(raw_oracle_ret, 0); - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be - // unique_siloed_note_hash once public kernel applies nonces - let saved_siloed_note_hash = deserialized_oracle_ret.message; - - assert(saved_siloed_note_hash != 0); // TODO(dbanks12): necessary? - - check_note_header(*context, storage_slot, note_interface, *note); - - // Ensure that the note hash retrieved from oracle matches the one computed from note. - let computed_siloed_note_hash = compute_siloed_note_hash(note_interface, *note); - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be - // compute_note_hash_for_read_or_nullify once public kernel applies nonces - assert(computed_siloed_note_hash == saved_siloed_note_hash); + let get_header = note_interface.get_header; + let header = get_header(note); - context.push_read_request(computed_siloed_note_hash); + // Check the note hash via oracle and early out if it doesn't exist. + let inner_note_hash = compute_inner_note_hash(note_interface, note); + let exists = oracle::notes::check_note_hash_exists(header.nonce, inner_note_hash); + assert(exists, "Note hash does not exist."); + + let mut note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note); + if from_public { + // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386) + // Should remove this once public kernel applies nonces. + note_hash_for_read_request = compute_siloed_note_hash(note_interface, note); + } + context.push_read_request(note_hash_for_read_request); } fn get_note( diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle.nr b/yarn-project/noir-libs/aztec-noir/src/oracle.nr index 056617ed42f..da760abf487 100644 --- a/yarn-project/noir-libs/aztec-noir/src/oracle.nr +++ b/yarn-project/noir-libs/aztec-noir/src/oracle.nr @@ -6,7 +6,6 @@ mod arguments; mod call_private_function; mod context; mod debug_log; -mod get_commitment; mod get_l1_to_l2_message; mod get_public_key; mod get_secret_key; diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/get_commitment.nr b/yarn-project/noir-libs/aztec-noir/src/oracle/get_commitment.nr deleted file mode 100644 index 2793c003bf6..00000000000 --- a/yarn-project/noir-libs/aztec-noir/src/oracle/get_commitment.nr +++ /dev/null @@ -1,11 +0,0 @@ -// Oracle function to get a commitment, its sibling path and index, without getting its preimage. - -// commitment + index + root; -global COMMITMENT_GETTER_LENGTH = 3; - -#[oracle(getCommitment)] -fn get_commitment_oracle(_commitment: Field) -> [Field; COMMITMENT_GETTER_LENGTH] {} - -unconstrained fn get_commitment(commitment: Field) -> [Field; COMMITMENT_GETTER_LENGTH] { - get_commitment_oracle(commitment) -} diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/notes.nr b/yarn-project/noir-libs/aztec-noir/src/oracle/notes.nr index 52d4a445389..356cf5de4aa 100644 --- a/yarn-project/noir-libs/aztec-noir/src/oracle/notes.nr +++ b/yarn-project/noir-libs/aztec-noir/src/oracle/notes.nr @@ -22,17 +22,28 @@ unconstrained fn notify_created_note( #[oracle(notifyNullifiedNote)] fn notify_nullified_note_oracle( - _storage_slot: Field, _nullifier: Field, _inner_note_hash: Field, ) -> Field {} unconstrained fn notify_nullified_note( - storage_slot: Field, nullifier: Field, inner_note_hash: Field, ) -> Field { - notify_nullified_note_oracle(storage_slot, nullifier, inner_note_hash) + notify_nullified_note_oracle(nullifier, inner_note_hash) +} + +#[oracle(checkNoteHashExists)] +fn check_note_hash_exists_oracle( + _nonce: Field, + _inner_note_hash: Field, +) -> Field {} + +unconstrained fn check_note_hash_exists( + nonce: Field, + inner_note_hash: Field, +) -> bool { + check_note_hash_exists_oracle(nonce, inner_note_hash) == 1 } #[oracle(getNotes)] diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars/set.nr b/yarn-project/noir-libs/aztec-noir/src/state_vars/set.nr index c14eebb770d..698af2ef11c 100644 --- a/yarn-project/noir-libs/aztec-noir/src/state_vars/set.nr +++ b/yarn-project/noir-libs/aztec-noir/src/state_vars/set.nr @@ -4,8 +4,9 @@ use crate::constants_gen::{MAX_NOTES_PER_PAGE, MAX_READ_REQUESTS_PER_CALL}; use crate::context::{PrivateContext, PublicContext, Context}; use crate::note::{ lifecycle::{create_note, create_note_hash_from_public, destroy_note}, - note_getter::{ensure_note_exists, ensure_note_hash_exists, get_notes, view_notes}, + note_getter::{ensure_note_hash_exists, get_notes, view_notes}, note_getter_options::NoteGetterOptions, + note_header::NoteHeader, note_interface::NoteInterface, note_viewer_options::NoteViewerOptions, utils::compute_note_hash_for_read_or_nullify, @@ -49,64 +50,79 @@ impl Set { ); } - fn assert_contains_and_remove(self, note: Note) { - let mut note_with_header = note; - // TODO(1386): replace with `ensure_note_hash_exists` - // once `get_commitment` works for privately created note hashes - ensure_note_exists( - self.context.private.unwrap(), - self.storage_slot, + fn assert_contains_and_remove(self, note: &mut Note, nonce: Field) { + // Initialize header of note. Must be done before computing note hashes as it initializes the: + // - storage slot (used in inner note hash) + // - the contract address (used in siloed note hash) + // - and the nonce (used in the unique siloed note hash) + let context = self.context.private.unwrap(); + let set_header = self.note_interface.set_header; + let note_header = NoteHeader{ + contract_address: context.this_address(), + storage_slot: self.storage_slot, + nonce + }; + set_header(note, note_header); + + ensure_note_hash_exists( + context, self.note_interface, - &mut note_with_header, + *note, + false, ); + destroy_note( - self.context.private.unwrap(), - self.storage_slot, - note_with_header, + context, + *note, self.note_interface, ); } // NOTE: this function should ONLY be used for PUBLICLY-CREATED note hashes! - // WARNING: function will be deprecated/removed eventually once `assert_contains_and_remove` - // works for publicly-created note hashes as well. - fn assert_contains_and_remove_publicly_created(self, note: Note) { - let mut note_with_header = note; - // Modifies note with the header which is necessary for the next step (remove). + // WARNING: function will be deprecated/removed eventually once public kernel applies nonces. + fn assert_contains_and_remove_publicly_created(self, note: &mut Note) { + // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386) + // Should be real nonce (once public kernel applies nonces). + let nonce = 0; + let context = self.context.private.unwrap(); + let set_header = self.note_interface.set_header; + let mut note_header = NoteHeader{ + contract_address: context.this_address(), + storage_slot: self.storage_slot, + nonce + }; + set_header(note, note_header); + ensure_note_hash_exists( - self.context.private.unwrap(), - self.storage_slot, + context, self.note_interface, - &mut note_with_header, + *note, + true, ); - let get_header = self.note_interface.get_header; - let set_header = self.note_interface.set_header; - let mut header = get_header(note); // Set the nonce to nonzero so that the nullifier is treated as persistable // (non-transient) and so the private kernel does not attempt to match it to // a pending noteHash/commitment and squash them. // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): remove // this hack once public kernel injects nonces. - header.nonce = 1; - set_header(&mut note_with_header, header); + note_header.nonce = 1; + set_header(note, note_header); + destroy_note( - self.context.private.unwrap(), - self.storage_slot, - note_with_header, + context, + *note, self.note_interface, ); } fn remove(self, note: Note) { + let context = self.context.private.unwrap(); let note_hash = compute_note_hash_for_read_or_nullify(self.note_interface, note); - let read_requests = self.context.private.unwrap_unchecked().read_requests; - let has_been_read = read_requests.any(|r| r == note_hash); + let has_been_read = context.read_requests.any(|r| r == note_hash); assert(has_been_read, "Can only remove a note that has been read from the set."); destroy_note( - self.context.private.unwrap(), - self.storage_slot, + context, note, self.note_interface, ); diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars/singleton.nr b/yarn-project/noir-libs/aztec-noir/src/state_vars/singleton.nr index e1033604995..6b7afcba2ce 100644 --- a/yarn-project/noir-libs/aztec-noir/src/state_vars/singleton.nr +++ b/yarn-project/noir-libs/aztec-noir/src/state_vars/singleton.nr @@ -56,7 +56,7 @@ impl Singleton { let prev_note = get_note(context, self.storage_slot, self.note_interface); // Nullify previous note. - destroy_note(context, self.storage_slot, prev_note, self.note_interface); + destroy_note(context, prev_note, self.note_interface); // Add replacement note. create_note(context, self.storage_slot, new_note, self.note_interface); @@ -67,7 +67,7 @@ impl Singleton { let mut note = get_note(context, self.storage_slot, self.note_interface); // Nullify current note to make sure it's reading the latest note. - destroy_note(context, self.storage_slot, note, self.note_interface); + destroy_note(context, note, self.note_interface); // Add the same note again. // Because a nonce is added to every note in the kernel, its nullifier will be different. diff --git a/yarn-project/sequencer-client/src/simulator/public_executor.ts b/yarn-project/sequencer-client/src/simulator/public_executor.ts index bef534b6228..1296dcae50a 100644 --- a/yarn-project/sequencer-client/src/simulator/public_executor.ts +++ b/yarn-project/sequencer-client/src/simulator/public_executor.ts @@ -1,5 +1,4 @@ import { - CommitmentDataOracleInputs, CommitmentsDB, MessageLoadOracleInputs, PublicContractsDB, @@ -7,7 +6,6 @@ import { PublicStateDB, } from '@aztec/acir-simulator'; import { AztecAddress, CircuitsWasm, EthAddress, Fr, FunctionSelector, HistoricBlockData } from '@aztec/circuits.js'; -import { siloCommitment } from '@aztec/circuits.js/abis'; import { ContractDataSource, L1ToL2MessageSource, MerkleTreeId } from '@aztec/types'; import { MerkleTreeOperations, computePublicDataTreeLeafIndex } from '@aztec/world-state'; @@ -100,19 +98,7 @@ export class WorldStateDB implements CommitmentsDB { }; } - public async getCommitmentOracle(address: AztecAddress, innerCommitment: Fr): Promise { - const siloedCommitment = siloCommitment(await CircuitsWasm.get(), address, innerCommitment); - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): shoild be - // unique commitment that exists in tree (should be siloed and then made unique via - // nonce). Once public kernel or base rollup circuit injects nonces, this can be updated - // to use uniqueSiloedCommitment. - const index = (await this.db.findLeafIndex(MerkleTreeId.PRIVATE_DATA_TREE, siloedCommitment.toBuffer()))!; - const siblingPath = await this.db.getSiblingPath(MerkleTreeId.PRIVATE_DATA_TREE, index); - - return { - commitment: siloedCommitment, - siblingPath: siblingPath.toFieldArray(), - index, - }; + public async getCommitmentIndex(commitment: Fr): Promise { + return await this.db.findLeafIndex(MerkleTreeId.PRIVATE_DATA_TREE, commitment.toBuffer()); } } From f66077a6f7bfd446eec81dd4f09723322fc0c980 Mon Sep 17 00:00:00 2001 From: Charlie Lye Date: Wed, 13 Sep 2023 20:27:02 +0100 Subject: [PATCH 05/11] feat: Build system handles dynamic deps first class. (#2283) If no deps provided, query-manifest exectutes script in project, uses 1 line of jq to get deps for ts. --- build-system/scripts/query_manifest | 55 +++++-- build_manifest.json | 184 +++-------------------- yarn-project/scripts/get_dependencies.sh | 7 + 3 files changed, 72 insertions(+), 174 deletions(-) create mode 100755 yarn-project/scripts/get_dependencies.sh diff --git a/build-system/scripts/query_manifest b/build-system/scripts/query_manifest index e64086badc0..51eac1df79d 100755 --- a/build-system/scripts/query_manifest +++ b/build-system/scripts/query_manifest @@ -11,18 +11,46 @@ if [ $(jq "has(\"$REPO\")" $MANIFEST) == "false" ]; then exit 1 fi -function addRebuildPatterns { - local TYPE=$(jq -r ".\"$1\".rebuildPatterns | type" $MANIFEST) - if [ "$TYPE" == "string" ]; then - local FILE=$(jq -r ".\"$1\".rebuildPatterns" $MANIFEST) - local BUILD_DIR=$($0 buildDir $1) - PATTERNS=(${PATTERNS[@]} $(cat $BUILD_DIR/$FILE)) - elif [ "$TYPE" == "array" ]; then - PATTERNS=(${PATTERNS[@]} $(jq -r ".\"$1\".rebuildPatterns | .[]" $MANIFEST)) - else - >&2 echo "Missing rebuildPatterns property. Either filename as string, or patterns as array." +function get_deps { + local TYPE=$(jq -r ".\"$1\".dependencies | type" $MANIFEST) + if [ "$TYPE" == "string" ]; then + # Execute string as command relative to buildDir to retrieve dependencies. + local CMD=$BUILD_DIR/$(jq -r ".\"$1\".dependencies") + if [ ! -f "$CMD" ]; then + >&2 echo "Dependency script not found: $CMD" exit 1 fi + local PROJECT_DIR=$($0 projectDir $1) + DEPS=($($CMD $PROJECT_DIR)) + elif [ "$TYPE" == "null" ]; then + # Execute default script relative to buildDir to retrieve dependencies. + local CMD=$BUILD_DIR/scripts/get_dependencies.sh + if [ ! -f "$CMD" ]; then + >&2 echo "Dependency script not found: $CMD" + exit 1 + fi + local PROJECT_DIR=$($0 projectDir $1) + DEPS=($($CMD $PROJECT_DIR)) + elif [ "$TYPE" == "array" ]; then + DEPS=($(jq -r ".\"$1\".dependencies // [] | .[]" $MANIFEST)) + else + >&2 echo "dependencies must be a array, string or null." + exit 1 + fi +} + +function add_rebuild_patterns { + local TYPE=$(jq -r ".\"$1\".rebuildPatterns | type" $MANIFEST) + if [ "$TYPE" == "string" ]; then + local FILE=$(jq -r ".\"$1\".rebuildPatterns" $MANIFEST) + local BUILD_DIR=$($0 buildDir $1) + PATTERNS=(${PATTERNS[@]} $(cat $BUILD_DIR/$FILE)) + elif [ "$TYPE" == "array" ]; then + PATTERNS=(${PATTERNS[@]} $(jq -r ".\"$1\".rebuildPatterns | .[]" $MANIFEST)) + else + >&2 echo "Missing rebuildPatterns property. Either filename as string, or patterns as array." + exit 1 + fi } case "$CMD" in @@ -46,13 +74,14 @@ case "$CMD" in jq -r ".\"$REPO\".projectDir // .\"$REPO\".buildDir" $MANIFEST ;; dependencies) + BUILD_DIR=$($0 buildDir $REPO) declare -A ALL_DEPS add_deps() { if [[ -v ALL_DEPS[$1] ]]; then return fi ALL_DEPS["$1"]=1 - DEPS=($(jq -r ".\"$1\".dependencies // [] | .[]" $MANIFEST)) + get_deps $1 for DEP in "${DEPS[@]}"; do add_deps $DEP done @@ -65,9 +94,9 @@ case "$CMD" in rebuildPatterns) DEPS=($($0 dependencies $REPO)) PATTERNS=() - addRebuildPatterns $REPO + add_rebuild_patterns $REPO for DEP in "${DEPS[@]}"; do - addRebuildPatterns $DEP + add_rebuild_patterns $DEP done printf "%s\n" "${PATTERNS[@]}" | sort | uniq ;; diff --git a/build_manifest.json b/build_manifest.json index c00f0764513..db71326fe07 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -113,168 +113,85 @@ "buildDir": "yarn-project", "projectDir": "yarn-project/acir-simulator", "dockerfile": "acir-simulator/Dockerfile", - "rebuildPatterns": ["^yarn-project/acir-simulator/"], - "dependencies": [ - "yarn-project-base", - "circuits.js", - "foundation", - "types", - "merkle-tree", - "noir-contracts" - ] + "rebuildPatterns": ["^yarn-project/acir-simulator/"] }, "archiver": { "buildDir": "yarn-project", "projectDir": "yarn-project/archiver", "dockerfile": "archiver/Dockerfile", - "rebuildPatterns": ["^yarn-project/archiver/"], - "dependencies": [ - "yarn-project-base", - "circuits.js", - "ethereum", - "foundation", - "l1-artifacts", - "types" - ] + "rebuildPatterns": ["^yarn-project/archiver/"] }, "cli": { "buildDir": "yarn-project", "projectDir": "yarn-project/cli", "dockerfile": "cli/Dockerfile", - "rebuildPatterns": ["^yarn-project/cli/"], - "dependencies": [ - "yarn-project-base", - "aztec.js", - "ethereum", - "foundation", - "noir-compiler", - "noir-contracts", - "types" - ] + "rebuildPatterns": ["^yarn-project/cli/"] }, "aztec-rpc": { "buildDir": "yarn-project", "projectDir": "yarn-project/aztec-rpc", "dockerfile": "aztec-rpc/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec-rpc/"], - "dependencies": [ - "yarn-project-base", - "acir-simulator", - "circuits.js", - "foundation", - "key-store", - "types" - ] + "rebuildPatterns": ["^yarn-project/aztec-rpc/"] }, "aztec-sandbox": { "buildDir": "yarn-project", "projectDir": "yarn-project/aztec-sandbox", "dockerfile": "aztec-sandbox/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec-sandbox/"], - "dependencies": [ - "yarn-project-base", - "aztec-node", - "aztec-rpc", - "aztec.js", - "circuits.js", - "ethereum", - "foundation", - "l1-artifacts", - "noir-contracts", - "types" - ] + "rebuildPatterns": ["^yarn-project/aztec-sandbox/"] }, "aztec.js": { "buildDir": "yarn-project", "projectDir": "yarn-project/aztec.js", "dockerfile": "aztec.js/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec.js/"], - "dependencies": ["yarn-project-base", "circuits.js", "foundation", "types"] + "rebuildPatterns": ["^yarn-project/aztec.js/"] }, "canary-build": { "buildDir": "yarn-project", "projectDir": "yarn-project/canary", "dockerfile": "canary/Dockerfile.build", - "rebuildPatterns": ["^yarn-project/canary/"], - "dependencies": [ - "yarn-project-base", - "aztec.js", - "l1-artifacts", - "noir-contracts", - "aztec-sandbox" - ] + "rebuildPatterns": ["^yarn-project/canary/"] }, "canary": { "buildDir": "yarn-project", "projectDir": "yarn-project/canary", "dockerfile": "canary/Dockerfile", - "rebuildPatterns": ["^yarn-project/canary/"], - "dependencies": [ - "yarn-project-base", - "aztec.js", - "foundation", - "l1-artifacts", - "noir-contracts" - ] + "rebuildPatterns": ["^yarn-project/canary/"] }, "circuits.js": { "buildDir": "yarn-project", "projectDir": "yarn-project/circuits.js", "dockerfile": "circuits.js/Dockerfile", - "rebuildPatterns": ["^yarn-project/circuits.js/"], - "dependencies": ["yarn-project-base", "foundation"] + "rebuildPatterns": ["^yarn-project/circuits.js/"] }, "end-to-end": { "buildDir": "yarn-project", "projectDir": "yarn-project/end-to-end", "dockerfile": "end-to-end/Dockerfile", - "rebuildPatterns": ["^yarn-project/end-to-end/"], - "dependencies": [ - "yarn-project-base", - "archiver", - "aztec-node", - "aztec-rpc", - "aztec-sandbox", - "aztec.js", - "circuits.js", - "cli", - "ethereum", - "foundation", - "l1-artifacts", - "noir-contracts", - "p2p", - "sequencer-client", - "types", - "world-state" - ] + "rebuildPatterns": ["^yarn-project/end-to-end/"] }, "ethereum": { "buildDir": "yarn-project", "projectDir": "yarn-project/ethereum", "dockerfile": "ethereum/Dockerfile", - "rebuildPatterns": ["^yarn-project/ethereum/"], - "dependencies": ["yarn-project-base", "foundation", "l1-artifacts"] + "rebuildPatterns": ["^yarn-project/ethereum/"] }, "foundation": { "buildDir": "yarn-project", "projectDir": "yarn-project/foundation", "dockerfile": "foundation/Dockerfile", - "rebuildPatterns": ["^yarn-project/foundation/"], - "dependencies": ["yarn-project-base"] + "rebuildPatterns": ["^yarn-project/foundation/"] }, "key-store": { "buildDir": "yarn-project", "projectDir": "yarn-project/key-store", "dockerfile": "key-store/Dockerfile", - "rebuildPatterns": ["^yarn-project/key-store/"], - "dependencies": ["yarn-project-base", "circuits.js", "foundation", "types"] + "rebuildPatterns": ["^yarn-project/key-store/"] }, "merkle-tree": { "buildDir": "yarn-project", "projectDir": "yarn-project/merkle-tree", "dockerfile": "merkle-tree/Dockerfile", - "rebuildPatterns": ["^yarn-project/merkle-tree/"], - "dependencies": ["yarn-project-base", "circuits.js", "foundation", "types"] + "rebuildPatterns": ["^yarn-project/merkle-tree/"] }, "noir-contracts-build": { "buildDir": "yarn-project", @@ -283,12 +200,6 @@ "rebuildPatterns": [ "^yarn-project/noir-contracts/", "^yarn-project/noir-libs/" - ], - "dependencies": [ - "yarn-project-base", - "aztec.js", - "foundation", - "noir-compiler" ] }, "noir-contracts": { @@ -298,109 +209,60 @@ "rebuildPatterns": [ "^yarn-project/noir-contracts/", "^yarn-project/noir-libs/" - ], - "dependencies": [ - "yarn-project-base", - "aztec.js", - "foundation", - "noir-compiler" ] }, "noir-compiler": { "buildDir": "yarn-project", "projectDir": "yarn-project/noir-compiler", "dockerfile": "noir-compiler/Dockerfile", - "rebuildPatterns": ["^yarn-project/noir-compiler/"], - "dependencies": ["yarn-project-base", "foundation"] + "rebuildPatterns": ["^yarn-project/noir-compiler/"] }, "p2p": { "buildDir": "yarn-project", "projectDir": "yarn-project/p2p", "dockerfile": "p2p/Dockerfile", - "rebuildPatterns": ["^yarn-project/p2p/"], - "dependencies": ["yarn-project-base", "circuits.js", "foundation", "types"] + "rebuildPatterns": ["^yarn-project/p2p/"] }, "p2p-bootstrap": { "buildDir": "yarn-project", "projectDir": "yarn-project/p2p-bootstrap", "dockerfile": "p2p/Dockerfile", - "rebuildPatterns": ["^yarn-project/p2p-bootstrap/"], - "dependencies": ["yarn-project-base", "foundation", "p2p"] + "rebuildPatterns": ["^yarn-project/p2p-bootstrap/"] }, "prover-client": { "buildDir": "yarn-project", "projectDir": "yarn-project/prover-client", "dockerfile": "prover-client/Dockerfile", - "rebuildPatterns": ["^yarn-project/prover-client/"], - "dependencies": ["yarn-project-base", "foundation"] + "rebuildPatterns": ["^yarn-project/prover-client/"] }, "rollup-provider": { "buildDir": "yarn-project", "projectDir": "yarn-project/rollup-provider", "dockerfile": "rollup-provider/Dockerfile", - "rebuildPatterns": ["^yarn-project/rollup-provider/"], - "dependencies": [ - "yarn-project-base", - "aztec-node", - "circuits.js", - "foundation", - "types" - ] + "rebuildPatterns": ["^yarn-project/rollup-provider/"] }, "aztec-node": { "buildDir": "yarn-project", "projectDir": "yarn-project/aztec-node", "dockerfile": "aztec-node/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec-node/"], - "dependencies": [ - "yarn-project-base", - "archiver", - "circuits.js", - "foundation", - "l1-artifacts", - "merkle-tree", - "p2p", - "sequencer-client", - "types", - "world-state" - ] + "rebuildPatterns": ["^yarn-project/aztec-node/"] }, "sequencer-client": { "buildDir": "yarn-project", "projectDir": "yarn-project/sequencer-client", "dockerfile": "sequencer-client/Dockerfile", - "rebuildPatterns": ["^yarn-project/sequencer-client/"], - "dependencies": [ - "yarn-project-base", - "acir-simulator", - "circuits.js", - "ethereum", - "foundation", - "l1-artifacts", - "merkle-tree", - "p2p", - "types", - "world-state" - ] + "rebuildPatterns": ["^yarn-project/sequencer-client/"] }, "types": { "buildDir": "yarn-project", "projectDir": "yarn-project/types", "dockerfile": "types/Dockerfile", - "rebuildPatterns": ["^yarn-project/types/"], - "dependencies": ["yarn-project-base", "circuits.js", "foundation"] + "rebuildPatterns": ["^yarn-project/types/"] }, "world-state": { "buildDir": "yarn-project", "projectDir": "yarn-project/world-state", "dockerfile": "world-state/Dockerfile", - "rebuildPatterns": ["^yarn-project/world-state/"], - "dependencies": [ - "yarn-project-base", - "circuits.js", - "foundation", - "merkle-tree", - "types" - ] + "rebuildPatterns": ["^yarn-project/world-state/"] } } diff --git a/yarn-project/scripts/get_dependencies.sh b/yarn-project/scripts/get_dependencies.sh new file mode 100755 index 00000000000..60b61bbc985 --- /dev/null +++ b/yarn-project/scripts/get_dependencies.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -eu + +PROJECT_DIR=$1 + +echo yarn-project-base +jq -r ".dependencies + .devDependencies | keys | .[] | select(startswith(\"@aztec/\")) | ltrimstr(\"@aztec/\")" $PROJECT_DIR/package.json \ No newline at end of file From a91db48d1943fdc2e39535a153216b7aaca40de4 Mon Sep 17 00:00:00 2001 From: Michael Connor Date: Wed, 13 Sep 2023 20:53:26 +0100 Subject: [PATCH 06/11] chore(docs): rename to aztec.nr (#1943) Find + replace --------- Co-authored-by: kevaundray Co-authored-by: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> --- .../roadmap/features_initial_ldt.md | 14 +- .../circuits/kernels/private_kernel.md | 4 +- docs/docs/concepts/advanced/circuits/main.md | 2 +- .../advanced/data_structures/trees.md | 6 +- .../docs/concepts/foundation/accounts/keys.md | 4 +- docs/docs/concepts/foundation/state_model.md | 6 +- docs/docs/dev_docs/contracts/common_errors.md | 2 +- docs/docs/dev_docs/contracts/compiling.md | 16 +- docs/docs/dev_docs/contracts/contract.md | 2 +- docs/docs/dev_docs/contracts/layout.md | 2 +- docs/docs/dev_docs/contracts/main.md | 11 +- docs/docs/dev_docs/contracts/types.md | 2 +- docs/docs/dev_docs/contracts/workflow.md | 2 +- docs/docs/dev_docs/dapps/main.md | 2 +- docs/docs/dev_docs/getting_started/sandbox.md | 2 +- docs/docs/dev_docs/sandbox/common_errors.md | 14 +- docs/docs/dev_docs/sandbox/components.md | 14 +- docs/docs/dev_docs/sandbox/main.md | 2 +- docs/docs/dev_docs/testing/cheat_codes.md | 4 +- docs/docs/dev_docs/testing/main.md | 4 +- docs/docs/dev_docs/wallets/architecture.md | 2 +- .../wallets/writing_an_account_contract.md | 4 +- l1-contracts/GUIDE_LINES.md | 2 +- l1-contracts/src/core/libraries/Decoder.sol | 2 +- .../acir-simulator/src/acvm/serialize.ts | 4 +- .../src/client/client_execution_context.ts | 2 +- .../acir-simulator/src/client/db_oracle.ts | 2 +- .../acir-simulator/src/client/debug.ts | 2 +- .../src/client/private_execution.test.ts | 6 +- yarn-project/acir-simulator/src/utils.ts | 2 +- .../src/contract_data_oracle/index.ts | 2 +- .../examples/uniswap_trade_on_l1_from_l2.ts | 4 +- .../contract_deployer/contract_deployer.ts | 2 +- .../aztec.js/src/utils/cheat_codes.ts | 4 +- yarn-project/bootstrap.sh | 4 +- .../src/uniswap_trade_on_l1_from_l2.test.ts | 4 +- .../src/structs/verification_key.test.ts | 2 +- yarn-project/cli/README.md | 6 +- yarn-project/cli/src/index.ts | 10 +- .../e2e_pending_commitments_contract.test.ts | 10 +- .../src/fixtures/cross_chain_test_harness.ts | 4 +- yarn-project/foundation/src/abi/abi.ts | 2 +- yarn-project/foundation/src/abi/decoder.ts | 2 +- yarn-project/noir-compiler/README.md | 4 +- yarn-project/noir-compiler/package.json | 2 +- .../src/__snapshots__/index.test.ts.snap | 214 ++++++++++++++++-- .../noir-compiler/src/cli/contract.ts | 10 +- .../noir-compiler/src/compile/nargo.ts | 6 +- .../src/contract-interface-gen/abi.ts | 2 +- .../src/contract-interface-gen/noir.ts | 6 +- yarn-project/noir-compiler/src/index.test.ts | 2 +- yarn-project/noir-compiler/src/index.ts | 2 +- .../noir-compiler/src/noir_artifact.ts | 10 +- yarn-project/noir-contracts/README.md | 2 +- .../noir-contracts/scripts/compile.sh | 2 +- .../src/contracts/test_contract/src/main.nr | 2 +- .../noir-contracts/src/scripts/copy_output.ts | 4 +- .../noir-libs/safe-math/src/safe_u120.nr | 3 +- yarn-project/types/src/contract_database.ts | 2 +- yarn-project/yarn-project-base/Dockerfile | 4 +- 60 files changed, 335 insertions(+), 141 deletions(-) diff --git a/docs/docs/about_aztec/roadmap/features_initial_ldt.md b/docs/docs/about_aztec/roadmap/features_initial_ldt.md index f85c0bc28bf..50cf79233f1 100644 --- a/docs/docs/about_aztec/roadmap/features_initial_ldt.md +++ b/docs/docs/about_aztec/roadmap/features_initial_ldt.md @@ -8,7 +8,7 @@ Devs should be able to quickly spin up local, emulated instances of an Ethereum Here's a summary of the features we intend to support with the first release of the Aztec Sandbox. -## Noir Contracts +## Aztec.nr Contracts - Noir `contract` scopes. - Declare a `contract`, containing a collection of state variables and functions. @@ -21,7 +21,7 @@ Here's a summary of the features we intend to support with the first release of - public functions - May read and modify public state. - `constructor` functions, for initialising contract state. -- `import` other Noir contracts, so their functions may be called. +- `import` other Aztec.nr contracts, so their functions may be called. - Nested function calls, for contract composability - private functions can call private functions of other contracts, and receive return values. - private functions can call public functions any contract. @@ -29,14 +29,14 @@ Here's a summary of the features we intend to support with the first release of - public functions can call public functions of other contracts, and receive return values. - private functions can be called recursively. - public functions can be called recursively. -- Send messages from Noir contracts to Ethereum L1, for consumption by L1 smart contracts. +- Send messages from Aztec.nr contracts to Ethereum L1, for consumption by L1 smart contracts. - Useful, for example, if writing an app to withdraw funds from L2 to L1. - Consume messages which have been sent by: - L1 functions. - Useful, for example, if writing an app to deposit funds from L1 to L2. - public L2 functions. -- Emit `event` data from a Noir Contract. - - Allows applications to subscribe to events which have been emitted by a Noir contract's functions, for example. +- Emit `event` data from a Aztec.nr Contract. + - Allows applications to subscribe to events which have been emitted by a Aztec.nr contract's functions, for example. - Write `unconstrained` functions. - These allow developers to write `pure` and `view` functions, which can perform calculations and retrieve state. E.g. for fetching contract-specific information, which may then be consumed by a dapp, without having to generate a zero-knowledge proof or interact with the 'network'. @@ -46,13 +46,13 @@ A typescript wrapper for making RPC calls to an Aztec LDT node. - Similar in purpose to `web3.js`/`ethers.js`/`viem`, but for interacting with Aztec Network nodes. The RPC interface for an Aztec node is necessarily different from that of an Ethereum node, because it deals with encrypted transactions and state variables. - A library for public/private key management. -- Construct `Contract` instances from a Noir contract's JSON ABI. +- Construct `Contract` instances from a Aztec.nr contract's JSON ABI. - Deploy new contracts to the Aztec LDT. - Construct tx requests, passing arguments to a function of a contract. - Sign tx requests. - Send txs to the LDT node, for simulating. - Send txs to the LDT node, to be sent to the LDT network. -- Call `unconstrained` functions of a Noir contract, to perform `pure` calculations or retrieve state. +- Call `unconstrained` functions of a Aztec.nr contract, to perform `pure` calculations or retrieve state. ## Aztec Local Developer Testnet Node diff --git a/docs/docs/concepts/advanced/circuits/kernels/private_kernel.md b/docs/docs/concepts/advanced/circuits/kernels/private_kernel.md index d079a3deaa8..405a6163061 100644 --- a/docs/docs/concepts/advanced/circuits/kernels/private_kernel.md +++ b/docs/docs/concepts/advanced/circuits/kernels/private_kernel.md @@ -6,7 +6,7 @@ This circuit is executed by the user, on their own device. This is to ensure pri - Verifies a user's signature. - Hides the user's address. -- Verifies an app's proof - i.e. a proof which has been output after the execution of some function in a Noir Contract. +- Verifies an app's proof - i.e. a proof which has been output after the execution of some function in an Aztec.nr Contract. - Performs private state reads and writes. - Exposes (forwards) the following data to the next recursive circuit: - new note hashes; @@ -21,5 +21,5 @@ This circuit is executed by the user, on their own device. This is to ensure pri - Verifies a previous 'Private Kernel Proof', recursively, when verifying transactions which are composed of many private function calls. - Optionally can [deploy](../../contract_creation) a new private contract. -> Note: **This is the only core protocol circuit which actually needs to be "zk" (zero knowledge)!!!** That's because this is the only core protocol circuit which handles private data, and hence the only circuit for which proofs must not leak any information about witnesses! (The private data being handled includes: details of the Noir Contract function which has been executed; the address of the user who executed the function; the intelligible inputs and outputs of that function). +> Note: **This is the only core protocol circuit which actually needs to be "zk" (zero knowledge)!!!** That's because this is the only core protocol circuit which handles private data, and hence the only circuit for which proofs must not leak any information about witnesses! (The private data being handled includes: details of the Aztec.nr Contract function which has been executed; the address of the user who executed the function; the intelligible inputs and outputs of that function). > This is a really interesting point. Most so-called "zk-Rollups" do not make use of this "zero knowledge" property. Their snarks are "snarks"; with no need for zero-knowledge, because they don't seek privacy; they only seek the 'succinct' computation-compression properties of snarks. Aztec's "zk-Rollup" actually makes use of "zero knowledge" snarks. That's why we sometimes call it a "zk-zk-Rollup", or "_actual_ zk-Rollup". diff --git a/docs/docs/concepts/advanced/circuits/main.md b/docs/docs/concepts/advanced/circuits/main.md index b959287941a..3f21cb79053 100644 --- a/docs/docs/concepts/advanced/circuits/main.md +++ b/docs/docs/concepts/advanced/circuits/main.md @@ -7,7 +7,7 @@ title: Circuits In Aztec, circuits come from two sources: 1. Core protocol circuits -2. User-written circuits (written as Noir Contracts and deployed to the network) +2. User-written circuits (written as Aztec.nr Contracts and deployed to the network) This page focusses on the core protocol circuits. These circuits check that the rules of the protocol are being adhered to. diff --git a/docs/docs/concepts/advanced/data_structures/trees.md b/docs/docs/concepts/advanced/data_structures/trees.md index 75cbcdddf45..903b80a3de1 100644 --- a/docs/docs/concepts/advanced/data_structures/trees.md +++ b/docs/docs/concepts/advanced/data_structures/trees.md @@ -25,11 +25,11 @@ So, if an app needs to edit a private state variable (which will be represented ### Example Note -An example blob of data might be defined in a Noir Contract as: +An example blob of data might be defined in an Aztec.nr Contract as: ```rust struct MyNote { - storage_slot: Field, // determined by the Noir Contract + storage_slot: Field, // determined by the Aztec.nr Contract value: Field, owner_public_key: Point, // The owner of this private state // (and the person who may edit it). @@ -37,7 +37,7 @@ struct MyNote { } ``` -The note might be committed-to, within a function of the Noir Contract as: +The note might be committed-to, within a function of the Aztec.nr Contract as: ```rust note_hash: Field = pedersen::compress( diff --git a/docs/docs/concepts/foundation/accounts/keys.md b/docs/docs/concepts/foundation/accounts/keys.md index 0e4755c3798..9f7ca23f581 100644 --- a/docs/docs/concepts/foundation/accounts/keys.md +++ b/docs/docs/concepts/foundation/accounts/keys.md @@ -69,7 +69,7 @@ The privacy master key is used to derive encryption keys. Encryption keys, as th In a future version, encryption keys will be differentiated between incoming and outgoing. When sending a note to another user, the sender will use the recipient's incoming encryption key for encrypting the data for them, and will optionally use their own outgoing encryption key for encrypting any data about the destination of that note. This is useful for reconstructing transaction history from on-chain data. For example, during a token transfer, the token contract may dictate that the sender encrypts the note with value with the recipient's incoming key, but also records the transfer with its own outgoing key for bookkeeping purposes. -An application in Noir can access the encryption public key for a given address using the oracle call `get_public_key`, which you can then use for calls such as `emit_encrypted_log`: +An application in Aztec.nr can access the encryption public key for a given address using the oracle call `get_public_key`, which you can then use for calls such as `emit_encrypted_log`: #include_code encrypted /yarn-project/noir-libs/value-note/src/utils.nr rust @@ -81,7 +81,7 @@ In order to be able to provide the public encryption key for a given address, th In addition to deriving encryption keys, the privacy master key is used for deriving nullifier secrets. Whenever a private note is consumed, a nullifier deterministically derived from it is emitted. This mechanisms prevents double-spends, since nullifiers are checked by the protocol to be unique. Now, in order to preserve privacy, a third party should not be able to link a note commitment to its nullifier - this link is enforced by the note implementation. Therefore, calculating the nullifier for a note requires a secret from its owner. -An application in Noir can request a nullifier from the current user for computing the nullifier of a note via the `get_secret_key` oracle call: +An application in Aztec.nr can request a nullifier from the current user for computing the nullifier of a note via the `get_secret_key` oracle call: #include_code nullifier /yarn-project/noir-libs/value-note/src/value_note.nr rust diff --git a/docs/docs/concepts/foundation/state_model.md b/docs/docs/concepts/foundation/state_model.md index e29d1350849..87db190203c 100644 --- a/docs/docs/concepts/foundation/state_model.md +++ b/docs/docs/concepts/foundation/state_model.md @@ -10,7 +10,7 @@ import Disclaimer from '../../misc/common/\_disclaimer.mdx'; ## Private State -Private state must be treated differently from public state and this must be expressed in the semantics of the Noir language. +Private state must be treated differently from public state and this must be expressed in the semantics of Aztec.nr. Private state is encrypted and therefore is "owned" by a user or a set of users (via shared secrets) that are able to decrypt the state. @@ -22,12 +22,12 @@ Modification of state variables can be emulated by nullifying the a state record ### Abstracting UTXO's from App's / Users -The goal of Noir's contract syntax is abstract the UTXO model away from an app user / developer, contract developers are the only actor who should have to think about UTXO's. +The goal of the Aztec.nr smart contract library is to abstract the UTXO model away from an app user / developer, contract developers are the only actor who should have to think about UTXO's. This is achieved with two main features: 1. Users sign over transactions, not over specific UTXO's -2. Noir contracts support developer defined `unconstrained` getter functions to help dApp's make sense of UTXO's. e.g `getBalance()`. These functions can be called outside of a transaction context to read private state. +2. Aztec.nr contracts support developer defined `unconstrained` getter functions to help dApp's make sense of UTXO's. e.g `getBalance()`. These functions can be called outside of a transaction context to read private state. ### The lifecycle of a note diff --git a/docs/docs/dev_docs/contracts/common_errors.md b/docs/docs/dev_docs/contracts/common_errors.md index 75762ef9cd6..ce96e27ed09 100644 --- a/docs/docs/dev_docs/contracts/common_errors.md +++ b/docs/docs/dev_docs/contracts/common_errors.md @@ -2,7 +2,7 @@ List common errors. -There are two kinds of errors: errors in a noir contract, and errors spat out by an Aztec Sandbox node! +There are two kinds of errors: errors in an Aztec.nr contract, and errors spat out by an Aztec Sandbox node! Maybe even auto-generate error docs, based on error codes in our codebase. diff --git a/docs/docs/dev_docs/contracts/compiling.md b/docs/docs/dev_docs/contracts/compiling.md index 109aa96732b..845ffdf645e 100644 --- a/docs/docs/dev_docs/contracts/compiling.md +++ b/docs/docs/dev_docs/contracts/compiling.md @@ -1,10 +1,10 @@ # Compiling contracts -Once you have written a [contract](../contracts/main.md) in Noir, you will need to compile it into an [artifact](./abi.md) in order to use it. +Once you have written a [contract](../contracts/main.md) in Aztec.nr, you will need to compile it into an [artifact](./abi.md) in order to use it. In this guide we will cover how to do so, both using the CLI and programmatically. -We'll also cover how to generate a helper [TypeScript interface](#typescript-interfaces) and a [Noir interface](#noir-interfaces) for easily interacting with your contract from your typescript app and from other noir contracts, respectively. +We'll also cover how to generate a helper [TypeScript interface](#typescript-interfaces) and an [Aztec.nr interface](#noir-interfaces) for easily interacting with your contract from your typescript app and from other Aztec.nr contracts, respectively. ## Prerequisites @@ -76,13 +76,13 @@ export class PrivateTokenContract extends ContractBase { Read more about interacting with contracts using `aztec.js` [here](../dapps/main.md). -### Noir interfaces +### Aztec.nr interfaces -A Noir contract can [call a function](./functions.md) in another contract via `context.call_private_function` or `context.call_public_function`. However, this requires manually assembling the function selector and manually serialising the arguments, which is not type-safe. +An Aztec.nr contract can [call a function](./functions.md) in another contract via `context.call_private_function` or `context.call_public_function`. However, this requires manually assembling the function selector and manually serialising the arguments, which is not type-safe. To make this easier, the compiler can generate contract interface structs that expose a convenience method for each function listed in a given contract ABI. These structs are intended to be used from another contract project that calls into the current one. For each contract, two interface structs are generated: one to be used from private functions with a `PrivateContext`, and one to be used from open functions with a `PublicContext`. -To generate them, include a `--interface` option in the compile command with a path to the target folder for the generated Noir interface files: +To generate them, include a `--interface` option in the compile command with a path to the target folder for the generated Aztec.nr interface files: ``` aztec-cli compile --interface ./path/to/another_aztec_contract_project/src ./path/to/my_aztec_contract_project @@ -128,7 +128,7 @@ impl PrivateTokenPrivateContextInterface { } ``` -Read more about how to use the Noir interfaces [here](./functions.md#contract-interface). +Read more about how to use the Aztec.nr interfaces [here](./functions.md#contract-interface). :::info At the moment, the compiler generates these interfaces from already compiled ABIs, and not from source code. This means that you should not import a generated interface from within the same project as its source contract, or you risk circular references. @@ -143,9 +143,9 @@ npm install @aztec/noir-compiler ` The compiler exposes the following functions: -- `compileUsingNargo`: Compiles a Noir project in the target folder using the `nargo` binary available on the shell `PATH` and returns the generated ABIs. +- `compileUsingNargo`: Compiles an Aztec.nr project in the target folder using the `nargo` binary available on the shell `PATH` and returns the generated ABIs. - `generateTypescriptContractInterface`: Generates a typescript class for the given contract ABI. -- `generateNoirContractInterface`: Generates a Noir interface struct for the given contract ABI. +- `generateNoirContractInterface`: Generates a Aztec.nr interface struct for the given contract ABI. ## Next steps diff --git a/docs/docs/dev_docs/contracts/contract.md b/docs/docs/dev_docs/contracts/contract.md index 9e94abb09ff..211491237ee 100644 --- a/docs/docs/dev_docs/contracts/contract.md +++ b/docs/docs/dev_docs/contracts/contract.md @@ -18,7 +18,7 @@ contract MyContract { ``` -> A note for vanilla Noir devs: There is no [`main()`](https://noir-lang.org/getting_started/breakdown/#mainnr) function within a Noir Contract scope. This is because more than one function of a contract may be called and proven as external (as opposed to inlined by the compiler). +> A note for vanilla Noir devs: There is no [`main()`](https://noir-lang.org/getting_started/breakdown/#mainnr) function within a Noir `contract` scope. This is because more than one function of a contract may be called and proven as external (as opposed to inlined by the compiler). ## Structure of a contract diff --git a/docs/docs/dev_docs/contracts/layout.md b/docs/docs/dev_docs/contracts/layout.md index 2c657d37fc7..a6db7b63a6d 100644 --- a/docs/docs/dev_docs/contracts/layout.md +++ b/docs/docs/dev_docs/contracts/layout.md @@ -2,7 +2,7 @@ ## Directory structure -Here's a common layout for a basic Noir Contract project: +Here's a common layout for a basic Aztec.nr Contract project: ```title="layout of an aztec contract project" ─── my_aztec_contract_project diff --git a/docs/docs/dev_docs/contracts/main.md b/docs/docs/dev_docs/contracts/main.md index 571a4fe3156..b5e5ecc1787 100644 --- a/docs/docs/dev_docs/contracts/main.md +++ b/docs/docs/dev_docs/contracts/main.md @@ -2,7 +2,7 @@ ## What is Aztec.nr? -**Aztec.nr** is a library for writing Aztec smart contracts. +**Aztec.nr** is a framework for writing Aztec smart contracts. ## Nomenclature @@ -12,17 +12,17 @@ A **smart contract** is just a collection of persistent state variables, and a c An **Aztec smart contract** is a smart contract with **private** state variables and **private** functions. -**Aztec.nr** is a library for writing Aztec smart contracts, written in Noir. +**Aztec.nr** is a framework for writing Aztec smart contracts, written in Noir. # Getting started ## Install Noir -To write a Noir Contract, you need to write Noir, and to write Noir, you need to [install Nargo](https://noir-lang.org/getting_started/nargo_installation). +To write an Aztec.nr contract, you need to write Noir, and to write Noir, you need to [install Nargo](https://noir-lang.org/getting_started/nargo_installation). ## Install Noir tooling -There are a number of tools to make writing Noir Contracts more pleasant. See [here](https://github.com/noir-lang/awesome-noir#get-coding). +There are a number of tools to make writing Aztec.nr contracts more pleasant. See [here](https://github.com/noir-lang/awesome-noir#get-coding). ## Quick start @@ -30,7 +30,8 @@ There are a number of tools to make writing Noir Contracts more pleasant. See [h Starter kit ::: -## Example Noir Contract + +## Example Aztec.nr Contract In keeping with the origins of blockchain, here's an example of a simple private token contract. Everyone's balances are private. diff --git a/docs/docs/dev_docs/contracts/types.md b/docs/docs/dev_docs/contracts/types.md index de66faed98b..a7e81ff0027 100644 --- a/docs/docs/dev_docs/contracts/types.md +++ b/docs/docs/dev_docs/contracts/types.md @@ -1,2 +1,2 @@ See Noir docs for Noir types. -See [state_variables](./state_variables.md) for Noir Contract state variable types. \ No newline at end of file +See [state_variables](./state_variables.md) for Aztec.nr state variable types. \ No newline at end of file diff --git a/docs/docs/dev_docs/contracts/workflow.md b/docs/docs/dev_docs/contracts/workflow.md index f208a34e33b..9ebe0ac2431 100644 --- a/docs/docs/dev_docs/contracts/workflow.md +++ b/docs/docs/dev_docs/contracts/workflow.md @@ -1,4 +1,4 @@ -# Noir contract workflow +# Aztec.nr smart contract workflow ## Write diff --git a/docs/docs/dev_docs/dapps/main.md b/docs/docs/dev_docs/dapps/main.md index cf4484cd4eb..d267ad9a162 100644 --- a/docs/docs/dev_docs/dapps/main.md +++ b/docs/docs/dev_docs/dapps/main.md @@ -21,7 +21,7 @@ Explain how to write a dapp using [`aztec.js`](https://github.com/AztecProtocol/ - Use the e2e tests as inspiration. - Instantiate a contract - Deploy a contract - - How to generate a nice typescript interface for a Noir Contract's functions (we have a little `.ts` program in `noir-contracts` to generate a types file at the moment... how would a user do this?) + - How to generate a nice typescript interface for an Aztec.nr contract's functions (we have a little `.ts` program in `noir-contracts` to generate a types file at the moment... how would a user do this?) - Call 'view' functions - Simulate functions (simulate the result, without sending to the 'network') - Execute functions (send them to the 'network') diff --git a/docs/docs/dev_docs/getting_started/sandbox.md b/docs/docs/dev_docs/getting_started/sandbox.md index 8f2dc173a20..fc31b6708da 100644 --- a/docs/docs/dev_docs/getting_started/sandbox.md +++ b/docs/docs/dev_docs/getting_started/sandbox.md @@ -6,7 +6,7 @@ import Image from "@theme/IdealImage"; ## Introduction -The Aztec Sandbox aims to provide a local development system against which you can build and test Noir contracts in a fast, safe, and free environment. +The Aztec Sandbox aims to provide a local development system against which you can build and test Aztec.nr contracts in a fast, safe, and free environment. Here we will walkthrough the process of retrieving the Sandbox, installing the client libraries and using it to deploy and use a fully private token contract on the Aztec network. diff --git a/docs/docs/dev_docs/sandbox/common_errors.md b/docs/docs/dev_docs/sandbox/common_errors.md index 5552601ff65..c13345e00dd 100644 --- a/docs/docs/dev_docs/sandbox/common_errors.md +++ b/docs/docs/dev_docs/sandbox/common_errors.md @@ -26,7 +26,7 @@ For static calls, new commitments aren't allowed For static calls, new nullifiers aren't allowed #### 2009 - PRIVATE_KERNEL__NON_PRIVATE_FUNCTION_EXECUTED_WITH_PRIVATE_KERNEL -You cannot execute a public noir function in the private kernel +You cannot execute a public Aztec.nr function in the private kernel #### 2011 - PRIVATE_KERNEL__UNSUPPORTED_OP You are trying to do something that is currently unsupported in the private kernel. If this is a blocker feel free to open up an issue on our monorepo [aztec3-packages](https://github.com/AztecProtocol/aztec3-packages/tree/master) or reach out to us on discord @@ -34,7 +34,7 @@ You are trying to do something that is currently unsupported in the private kern Note that certain operations are unsupported on certain versions of the private kernel. Eg static calls are allowed for all but the initial iteration of the private kernel (which initialises the kernel for subsequent function calls). #### 2012 - PRIVATE_KERNEL__CONTRACT_ADDRESS_MISMATCH -For the initial iteration of the private kernel, only the expected noir contract should be the entrypoint. Static and delegate calls are not allowed in the initial iteration. +For the initial iteration of the private kernel, only the expected Aztec.nr contract should be the entrypoint. Static and delegate calls are not allowed in the initial iteration. #### 2013 - PRIVATE_KERNEL__NON_PRIVATE_KERNEL_VERIFIED_WITH_PRIVATE_KERNEL The previous kernel iteration within the private kernel must also be private @@ -46,7 +46,7 @@ A constructor must be executed as the first tx in the recursion i.e. a construct Confirms that the TxRequest (user's intent) matches the private call being executed. This error may happen when: * origin address of tx_request doesn't match call_stack_item's contract_address * tx_request.function_data doesn't match call_stack_item.function_data -* noir function args passed to tx_request doesn't match args in the call_stack_item +* Aztec.nr function args passed to tx_request doesn't match args in the call_stack_item #### 2018 - PRIVATE_KERNEL__READ_REQUEST_PRIVATE_DATA_ROOT_MISMATCH Given a read request and provided witness, we check that the merkle root obtained from the witness' sibling path and it's leaf is similar to the historic state root we want to read against. This is a sanity check to ensure we are reading from the right state. @@ -65,7 +65,7 @@ But for non transient reads, we do a merkle membership check. Redas are done at You are trying to do something that is currently unsupported in the public kernel. If this is a blocker feel free to open up an issue on our monorepo [aztec3-packages](https://github.com/AztecProtocol/aztec3-packages/tree/master) or reach out to us on discord #### 3002 - PUBLIC_KERNEL__PRIVATE_FUNCTION_NOT_ALLOWED -Calling a private noir function in a public kernel is not allowed. +Calling a private Aztec.nr function in a public kernel is not allowed. #### 3005 - PUBLIC_KERNEL__NON_EMPTY_PRIVATE_CALL_STACK Public functions are executed after all the private functions are (see [private-public execution](../../concepts/foundation/communication/public_private_calls.md)). As such, private call stack must be empty when executing in the public kernel. @@ -109,7 +109,7 @@ The L1 chain ID you used in your proof generation (for your private transaction) #### 4008 - BASE__INVALID_VERSION Same as [section 4007](#4007---base__invalid_chain_id) except the `version` refers to the version of the Aztec L2 instance. -Some scary bugs like `4003 - BASE__INVALID_NULLIFIER_SUBTREE` and `4004 - BASE__INVALID_NULLIFIER_RANGE` which are to do malformed nullifier trees (see [Indexed Merkle Trees](../../concepts/advanced/data_structures/indexed_merkle_tree.md)) etc may seem unrelated at a glance, but at a closer look may be because of some bug in an application's Noir code. Same is true for certain instances of `7008 - MEMBERSHIP_CHECK_FAILED`. +Some scary bugs like `4003 - BASE__INVALID_NULLIFIER_SUBTREE` and `4004 - BASE__INVALID_NULLIFIER_RANGE` which are to do malformed nullifier trees (see [Indexed Merkle Trees](../../concepts/advanced/data_structures/indexed_merkle_tree.md)) etc may seem unrelated at a glance, but at a closer look may be because of some bug in an application's Aztec.nr code. Same is true for certain instances of `7008 - MEMBERSHIP_CHECK_FAILED`. ### Generic circuit errors @@ -119,7 +119,7 @@ Circuits work by having a fixed size array. As such, we have limits on how many * too many new commitments in one tx * too many new nullifiers in one tx - - Note: Nullifiers may be created even outside the context of your noir code. Eg, when creating a contract, we add a nullifier for its address to prevent same address from ever occurring. Similarly, we add a nullifier for your transaction hash too. + - Note: Nullifiers may be created even outside the context of your Aztec.nr code. Eg, when creating a contract, we add a nullifier for its address to prevent same address from ever occurring. Similarly, we add a nullifier for your transaction hash too. * too many private function calls in one tx (i.e. call stack size exceeded) * too many public function calls in one tx (i.e. call stack size exceeded) * too many new L2 to L1 messages in one tx @@ -159,7 +159,7 @@ Users may create a proof against a historic state in Aztec. The rollup circuits * "Public call stack size exceeded" - In Aztec, the sequencer executes all enqueued public functions in a transaction (to prevent race conditions - see [private-public execution](../../concepts/foundation/communication/public_private_calls.md)). This error says there are too many public functions requested. -* "Array size exceeds target length" - happens if you add more items than allowed by the constants set due to our circuit limitations (eg sending too many L2 to L1 messages or creating a function that exceeds the call stack length or return more values than what Noir functions allows) +* "Array size exceeds target length" - happens if you add more items than allowed by the constants set due to our circuit limitations (eg sending too many L2 to L1 messages or creating a function that exceeds the call stack length or returns more values than what Aztec.nr functions allow) * "Failed to publish block" - Happens when sequencer tries to submit its L2 block + proof to the rollup contract. Use the CLI to find any solidity error and then refer the [Contract errors section](#l1-aztec-contract-errors). diff --git a/docs/docs/dev_docs/sandbox/components.md b/docs/docs/dev_docs/sandbox/components.md index 588aeaa016f..cb07a4b6139 100644 --- a/docs/docs/dev_docs/sandbox/components.md +++ b/docs/docs/dev_docs/sandbox/components.md @@ -2,7 +2,11 @@ title: Components --- - + + +:::TODO Outdated +This page needs to be updated. +::: import Disclaimer from '../../misc/common/\_disclaimer.mdx'; @@ -84,10 +88,10 @@ Responsibilities: These tasks are lower priority than providing a handcrafted ABI. -- The ability for a dev to enclose a collection of Noir functions in a 'contract scope'. -- The ability to create a Noir contract abi from the above. +- The ability for a dev to enclose a collection of Aztec.nr functions in a 'contract scope'. +- The ability to create an Aztec.nr contract abi from the above. -Design a Noir Contract ABI, similar to a Solidity ABI which is output by Solc (see [here](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html#json)). It might include for each function: +Design an Aztec.nr Contract ABI, similar to a Solidity ABI which is output by Solc (see [here](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html#json)). It might include for each function: - ACIR opcodes (akin to Solidity bytecode). - Function name and parameter names & types. @@ -109,7 +113,7 @@ aztec.js should always be stateless. It offers the ability to interact with stat The analogous AC component would be the AztecSdk (wraps the CoreSdk which is more analogous to the private client). - Allows a user to create an Aztec keypair. Call `create_account` on Wallet. -- Create a `Contract` instance (similar to web3.js), given a path to a Noir Contract ABI. +- Create a `Contract` instance (similar to web3.js), given a path to an Aztec.nr Contract ABI. - Construct `tx_request` by calling e.g. `contract.get_deployment_request(constructor_args)`. - Call wallet `sign_tx_request(tx_request)` to get signature. - Call `simulate_tx(signed_tx_request)` on the Private Client. In future this would help compute gas, for now we won't actually return gas (it's hard). Returns success or failure, so client knows if it should proceed, and computed kernel circuit public outputs. diff --git a/docs/docs/dev_docs/sandbox/main.md b/docs/docs/dev_docs/sandbox/main.md index 9ddf0ce78ac..2f33ffa684a 100644 --- a/docs/docs/dev_docs/sandbox/main.md +++ b/docs/docs/dev_docs/sandbox/main.md @@ -2,7 +2,7 @@ ## What is the Aztec Sandbox? -The Aztec Sandbox is local development system against which you can build and test Noir contracts in a fast, safe, and free environment. +The Aztec Sandbox is local development system against which you can build and test Aztec.nr contracts in a fast, safe, and free environment. To learn more and to download to for yourself you can visit the [website](https://sandbox.aztec.network). diff --git a/docs/docs/dev_docs/testing/cheat_codes.md b/docs/docs/dev_docs/testing/cheat_codes.md index 4a09ac7f811..458b5f406db 100644 --- a/docs/docs/dev_docs/testing/cheat_codes.md +++ b/docs/docs/dev_docs/testing/cheat_codes.md @@ -382,7 +382,7 @@ Otherwise, it will throw an error. const timestamp = await cc.eth.timestamp(); const newTimestamp = timestamp + 100_000_000; await cc.aztec.warp(newTimestamp); -// any noir contract calls that make use of current timestamp +// any Aztec.nr contract calls that make use of current timestamp // and is executed in the next rollup block will now read `newTimestamp` ``` @@ -395,7 +395,7 @@ public computeSlotInMap(baseSlot: Fr | bigint, key: Fr | bigint): Fr #### Description Compute storage slot for a map key. -The baseSlot is specified in the noir contract. +The baseSlot is specified in the Aztec.nr contract. #### Example ```rust diff --git a/docs/docs/dev_docs/testing/main.md b/docs/docs/dev_docs/testing/main.md index ca7cd33a835..a6adae5114b 100644 --- a/docs/docs/dev_docs/testing/main.md +++ b/docs/docs/dev_docs/testing/main.md @@ -2,8 +2,8 @@ Please use the [TUTORIAL-TEMPLATE](../../TUTORIAL_TEMPLATE.md) for standalone guides / tutorials. -## Testing in Noir +## Testing in Aztec.nr Individual functions can be tested much like [how 'regular Noir' functions can be tested](https://noir-lang.org/nargo/testing). -But a Noir Contract typically tracks state variables, so you'll likely need to write more complex tests in TypeScript, using Aztec.js \ No newline at end of file +But an Aztec.nr contract typically tracks state variables, so you'll likely need to write more complex tests in TypeScript, using Aztec.js \ No newline at end of file diff --git a/docs/docs/dev_docs/wallets/architecture.md b/docs/docs/dev_docs/wallets/architecture.md index 27818b48b9f..2d81c594655 100644 --- a/docs/docs/dev_docs/wallets/architecture.md +++ b/docs/docs/dev_docs/wallets/architecture.md @@ -8,7 +8,7 @@ Architecture-wise, a wallet is an instance of an **Aztec RPC Server** which mana Additionally, a wallet must be able to handle one or more [account contract implementations](../../concepts/foundation/accounts/main.md#account-contracts-and-wallets). When a user creates a new account, the account is represented on-chain by an account contract. The wallet is responsible for deploying and interacting with this contract. A wallet may support multiple flavours of accounts, such as an account that uses ECDSA signatures, or one that relies on WebAuthn, or one that requires multi-factor authentication. For a user, the choice of what account implementation to use is then determined by the wallet they interact with. -In code, this translates to a wallet implementing an **Entrypoint** interface that defines [how to create an _execution request_ out of an array of _function calls_](./main.md#transaction-lifecycle) for the specific implementation of an account contract. Think of the entrypoint interface as the Javascript counterpart of an account contract, or the piece of code that knows how to format and authenticate a transaction based on the rules defined in Noir by the user's account. +In code, this translates to a wallet implementing an **Entrypoint** interface that defines [how to create an _execution request_ out of an array of _function calls_](./main.md#transaction-lifecycle) for the specific implementation of an account contract. Think of the entrypoint interface as the Javascript counterpart of an account contract, or the piece of code that knows how to format and authenticate a transaction based on the rules defined in Aztec.nr by the user's account. ## Entrypoint interface diff --git a/docs/docs/dev_docs/wallets/writing_an_account_contract.md b/docs/docs/dev_docs/wallets/writing_an_account_contract.md index b6ddc219c5d..b1f02e156f7 100644 --- a/docs/docs/dev_docs/wallets/writing_an_account_contract.md +++ b/docs/docs/dev_docs/wallets/writing_an_account_contract.md @@ -14,7 +14,7 @@ For the sake of simplicity, we will hardcode the signing public key into the con ## The account contract -Let's start with the account contract itself in Noir. Create [a new Noir contract project](../contracts/main.md) that will contain a file with the code for the account contract, with a hardcoded public key: +Let's start with the account contract itself in Aztec.nr. Create [a new Aztec.nr contract project](../contracts/main.md) that will contain a file with the code for the account contract, with a hardcoded public key: #include_code contract yarn-project/noir-contracts/src/contracts/schnorr_hardcoded_account_contract/src/main.nr rust @@ -54,7 +54,7 @@ Note the usage of the `_with_packed_args` variant of [`call_public_function` and ## The typescript side of things -Now that we have a valid Noir account contract, we need to write the typescript glue code that will take care of formatting and authenticating transactions so they can be processed by our contract, as well as deploying the contract during account setup. This takes the form of implementing the `AccountContract` interface: +Now that we have a valid Aztec.nr account contract, we need to write the typescript glue code that will take care of formatting and authenticating transactions so they can be processed by our contract, as well as deploying the contract during account setup. This takes the form of implementing the `AccountContract` interface: #include_code account-contract-interface yarn-project/aztec.js/src/account/contract/index.ts typescript diff --git a/l1-contracts/GUIDE_LINES.md b/l1-contracts/GUIDE_LINES.md index 255f85c52a5..650c09befbf 100644 --- a/l1-contracts/GUIDE_LINES.md +++ b/l1-contracts/GUIDE_LINES.md @@ -5,7 +5,7 @@ In the following, there will be guidelines for the process of writing readable, - when optimizing - when reviewing. -In general the language of choice will be Solidity for our L1 contracts, so most of the specific style rules will be having that in mind, but the process for writing it can be adapted slightly for vyper, and will have an extension when Noir contracts are more mature. +In general the language of choice will be Solidity for our L1 contracts, so most of the specific style rules will be having that in mind, but the process for writing it can be adapted slightly for vyper, and will have an extension when Aztec.nr contracts are more mature. ![](https://media.tenor.com/ry_sCXk6wH0AAAAC/pirates-caribbean-code.gif) diff --git a/l1-contracts/src/core/libraries/Decoder.sol b/l1-contracts/src/core/libraries/Decoder.sol index 2de68f9d980..b5f604437fc 100644 --- a/l1-contracts/src/core/libraries/Decoder.sol +++ b/l1-contracts/src/core/libraries/Decoder.sol @@ -401,7 +401,7 @@ library Decoder { // Iterate until all the logs were processed while (remainingLogsLength > 0) { - // The length of the logs emitted by Noir from the function call corresponding to this kernel iteration + // The length of the logs emitted by Aztec.nr from the function call corresponding to this kernel iteration uint256 privateCircuitPublicInputLogsLength = read4(_l2Block, offset); offset += 0x4; diff --git a/yarn-project/acir-simulator/src/acvm/serialize.ts b/yarn-project/acir-simulator/src/acvm/serialize.ts index 8784774486c..00ca0d9de48 100644 --- a/yarn-project/acir-simulator/src/acvm/serialize.ts +++ b/yarn-project/acir-simulator/src/acvm/serialize.ts @@ -127,11 +127,11 @@ export function toAcvmCallPrivateStackItem(item: PrivateCallStackItem): ACVMFiel /** * Converts a public call stack item with the request for executing a public function to - * a set of ACVM fields accepted by the enqueue_public_function_call_oracle Noir function. + * a set of ACVM fields accepted by the enqueue_public_function_call_oracle Aztec.nr function. * Note that only the fields related to the request are serialized: those related to the result * are empty since this is just an execution request, so we don't send them to the circuit. * @param item - The public call stack item to serialize to be passed onto Noir. - * @returns The fields expected by the enqueue_public_function_call_oracle Noir function. + * @returns The fields expected by the enqueue_public_function_call_oracle Aztec.nr function. */ export async function toAcvmEnqueuePublicFunctionResult(item: PublicCallRequest): Promise { return [ diff --git a/yarn-project/acir-simulator/src/client/client_execution_context.ts b/yarn-project/acir-simulator/src/client/client_execution_context.ts index 550490b48be..5dc9ff7d549 100644 --- a/yarn-project/acir-simulator/src/client/client_execution_context.ts +++ b/yarn-project/acir-simulator/src/client/client_execution_context.ts @@ -186,7 +186,7 @@ export class ClientTxExecutionContext { }); // TODO: notice, that if we don't have a note in our DB, we don't know how big the preimage needs to be, and so we don't actually know how many dummy notes to return, or big to make those dummy notes, or where to position `is_some` booleans to inform the noir program that _all_ the notes should be dummies. - // By a happy coincidence, a `0` field is interpreted as `is_none`, and since in this case (of an empty db) we'll return all zeros (paddedZeros), the noir program will treat the returned data as all dummies, but this is luck. Perhaps a preimage size should be conveyed by the get_notes noir oracle? + // By a happy coincidence, a `0` field is interpreted as `is_none`, and since in this case (of an empty db) we'll return all zeros (paddedZeros), the noir program will treat the returned data as all dummies, but this is luck. Perhaps a preimage size should be conveyed by the get_notes Aztec.nr oracle? const preimageLength = notes?.[0]?.preimage.length ?? 0; if ( !notes.every(({ preimage }) => { diff --git a/yarn-project/acir-simulator/src/client/db_oracle.ts b/yarn-project/acir-simulator/src/client/db_oracle.ts index 2392e382495..cb3c77b113c 100644 --- a/yarn-project/acir-simulator/src/client/db_oracle.ts +++ b/yarn-project/acir-simulator/src/client/db_oracle.ts @@ -27,7 +27,7 @@ export interface NoteData { } /** - * The format that noir uses to get L1 to L2 Messages. + * The format that Aztec.nr uses to get L1 to L2 Messages. */ export interface MessageLoadOracleInputs { /** diff --git a/yarn-project/acir-simulator/src/client/debug.ts b/yarn-project/acir-simulator/src/client/debug.ts index 21efa0e576c..a6e7d97d075 100644 --- a/yarn-project/acir-simulator/src/client/debug.ts +++ b/yarn-project/acir-simulator/src/client/debug.ts @@ -24,7 +24,7 @@ export function acvmFieldMessageToString(msg: ACVMField[]): string { } /** - * Format a debug string for Noir filling in `'{0}'` entries with their + * Format a debug string for Aztec.nr filling in `'{0}'` entries with their * corresponding values from the args array. * * @param formatStr - str of form `'this is a string with some entries like {0} and {1}'` diff --git a/yarn-project/acir-simulator/src/client/private_execution.test.ts b/yarn-project/acir-simulator/src/client/private_execution.test.ts index d45cbddf93b..3ba37e9f200 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.test.ts @@ -223,7 +223,7 @@ describe('Private Execution test suite', () => { const storageSlot = Fr.random(); const note = buildNote(60n, owner, storageSlot); - // Should be the same as how we compute the values for the ValueNote in the noir library. + // Should be the same as how we compute the values for the ValueNote in the Aztec.nr library. const valueNoteHash = pedersenPlookupCommitInputs( circuitsWasm, note.preimage.map(f => f.toBuffer()), @@ -451,7 +451,7 @@ describe('Private Execution test suite', () => { const storageSlot = Fr.random(); const note = buildNote(60n, owner, storageSlot); - // Should be the same as how we compute the values for the ValueNote in the noir library. + // Should be the same as how we compute the values for the ValueNote in the Aztec.nr library. const valueNoteHash = pedersenPlookupCommitInputs( circuitsWasm, note.preimage.map(f => f.toBuffer()), @@ -627,7 +627,7 @@ describe('Private Execution test suite', () => { expect(result.nestedExecutions).toHaveLength(1); expect(result.nestedExecutions[0].callStackItem.publicInputs.returnValues[0]).toEqual(new Fr(privateIncrement)); - // check that Noir calculated the call stack item hash like cpp does + // check that Aztec.nr calculated the call stack item hash like cpp does const wasm = await CircuitsWasm.get(); const expectedCallStackItemHash = computeCallStackItemHash(wasm, result.nestedExecutions[0].callStackItem); expect(result.callStackItem.publicInputs.privateCallStack[0]).toEqual(expectedCallStackItemHash); diff --git a/yarn-project/acir-simulator/src/utils.ts b/yarn-project/acir-simulator/src/utils.ts index fa30e578657..a15b8f74b0f 100644 --- a/yarn-project/acir-simulator/src/utils.ts +++ b/yarn-project/acir-simulator/src/utils.ts @@ -3,7 +3,7 @@ import { Grumpkin, pedersenPlookupCommitInputs } from '@aztec/circuits.js/barret import { Fr } from '@aztec/foundation/fields'; /** - * A point in the format that noir uses. + * A point in the format that Aztec.nr uses. */ export type NoirPoint = { /** The x coordinate. */ diff --git a/yarn-project/aztec-rpc/src/contract_data_oracle/index.ts b/yarn-project/aztec-rpc/src/contract_data_oracle/index.ts index f398edfe86b..0984e3dcc70 100644 --- a/yarn-project/aztec-rpc/src/contract_data_oracle/index.ts +++ b/yarn-project/aztec-rpc/src/contract_data_oracle/index.ts @@ -5,7 +5,7 @@ import { ContractCommitmentProvider, ContractDatabase } from '@aztec/types'; import { ContractTree } from '../contract_tree/index.js'; /** - * ContractDataOracle serves as a data manager and retriever for noir contracts. + * ContractDataOracle serves as a data manager and retriever for Aztec.nr contracts. * It provides methods to obtain contract addresses, function ABI, bytecode, and membership witnesses * from a given contract address and function selector. The class maintains a cache of ContractTree instances * to efficiently serve the requested data. It interacts with the ContractDatabase and AztecNode to fetch diff --git a/yarn-project/aztec-sandbox/src/examples/uniswap_trade_on_l1_from_l2.ts b/yarn-project/aztec-sandbox/src/examples/uniswap_trade_on_l1_from_l2.ts index 72fd032da4a..9feaa2d9b89 100644 --- a/yarn-project/aztec-sandbox/src/examples/uniswap_trade_on_l1_from_l2.ts +++ b/yarn-project/aztec-sandbox/src/examples/uniswap_trade_on_l1_from_l2.ts @@ -217,7 +217,7 @@ async function main() { // 3. Claim WETH on L2 logger('Minting weth on L2'); - // Call the mint tokens function on the noir contract + // Call the mint tokens function on the Aztec.nr contract const consumptionTx = wethL2Contract.methods .mint(wethAmountToBridge, owner.address, messageKey, secret, ethAccount.toField()) .send(); @@ -298,7 +298,7 @@ async function main() { // 6. claim dai on L2 logger('Consuming messages to mint dai on L2'); - // Call the mint tokens function on the noir contract + // Call the mint tokens function on the Aztec.nr contract const daiMintTx = daiL2Contract.methods .mint(daiAmountToBridge, owner.address, depositDaiMessageKey, secret, ethAccount.toField()) .send(); diff --git a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts index fb9a9b14ea7..c01f4490025 100644 --- a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts +++ b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts @@ -6,7 +6,7 @@ import { DeployMethod } from './deploy_method.js'; /** * A class for deploying contract. - * @remarks Keeping this around even though we have noir contract types because it can be useful for non-TS users. + * @remarks Keeping this around even though we have Aztec.nr contract types because it can be useful for non-TS users. */ export class ContractDeployer { constructor(private abi: ContractAbi, private arc: AztecRPC, private publicKey?: PublicKey) {} diff --git a/yarn-project/aztec.js/src/utils/cheat_codes.ts b/yarn-project/aztec.js/src/utils/cheat_codes.ts index 1dc12106108..d5e644e6ff4 100644 --- a/yarn-project/aztec.js/src/utils/cheat_codes.ts +++ b/yarn-project/aztec.js/src/utils/cheat_codes.ts @@ -151,7 +151,7 @@ export class EthCheatCodes { /** * Computes the slot value for a given map and key. - * @param baseSlot - The base slot of the map (specified in noir contract) + * @param baseSlot - The base slot of the map (specified in Aztec.nr contract) * @param key - The key to lookup in the map * @returns The storage slot of the value in the map */ @@ -228,7 +228,7 @@ export class AztecCheatCodes { /** * Computes the slot value for a given map and key. - * @param baseSlot - The base slot of the map (specified in noir contract) + * @param baseSlot - The base slot of the map (specified in Aztec.nr contract) * @param key - The key to lookup in the map * @returns The storage slot of the value in the map */ diff --git a/yarn-project/bootstrap.sh b/yarn-project/bootstrap.sh index f3ad539416e..78be8c3e692 100755 --- a/yarn-project/bootstrap.sh +++ b/yarn-project/bootstrap.sh @@ -16,7 +16,7 @@ set -eu yarn install --immutable -# Build the necessary dependencies for noir contracts typegen. +# Build the necessary dependencies for Aztec.nr contracts typegen. for DIR in foundation noir-compiler circuits.js; do echo "Building $DIR..." cd $DIR @@ -24,7 +24,7 @@ for DIR in foundation noir-compiler circuits.js; do cd .. done -# Run remake bindings before building noir contracts or l1 contracts as they depend on files created by it. +# Run remake bindings before building Aztec.nr contracts or l1 contracts as they depend on files created by it. yarn --cwd circuits.js remake-bindings yarn --cwd circuits.js remake-constants diff --git a/yarn-project/canary/src/uniswap_trade_on_l1_from_l2.test.ts b/yarn-project/canary/src/uniswap_trade_on_l1_from_l2.test.ts index f79632c5f83..7a142332a03 100644 --- a/yarn-project/canary/src/uniswap_trade_on_l1_from_l2.test.ts +++ b/yarn-project/canary/src/uniswap_trade_on_l1_from_l2.test.ts @@ -243,7 +243,7 @@ describe('uniswap_trade_on_l1_from_l2', () => { // 3. Claim WETH on L2 logger('Minting weth on L2'); - // Call the mint tokens function on the noir contract + // Call the mint tokens function on the Aztec.nr contract const consumptionTx = wethL2Contract.methods .mint(wethAmountToBridge, owner, messageKey, secret, ethAccount.toField()) .send(); @@ -324,7 +324,7 @@ describe('uniswap_trade_on_l1_from_l2', () => { // 6. claim dai on L2 logger('Consuming messages to mint dai on L2'); - // Call the mint tokens function on the noir contract + // Call the mint tokens function on the Aztec.nr contract const daiMintTx = daiL2Contract.methods .mint(daiAmountToBridge, owner, depositDaiMessageKey, secret, ethAccount.toField()) .send(); diff --git a/yarn-project/circuits.js/src/structs/verification_key.test.ts b/yarn-project/circuits.js/src/structs/verification_key.test.ts index 40256ed8613..7dd17b375dc 100644 --- a/yarn-project/circuits.js/src/structs/verification_key.test.ts +++ b/yarn-project/circuits.js/src/structs/verification_key.test.ts @@ -1,7 +1,7 @@ import { VerificationKey } from './verification_key.js'; describe('structs/verification_key', () => { - // The VK below was grabbed from the noir contract artifact child_contract.json + // The VK below was grabbed from the Aztec.nr contract artifact child_contract.json it(`can deserialize vk built by noir`, () => { const serialized = `0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f`; const vk = VerificationKey.fromBuffer(Buffer.from(serialized, 'hex')); diff --git a/yarn-project/cli/README.md b/yarn-project/cli/README.md index e2ec0163948..87f643a669f 100644 --- a/yarn-project/cli/README.md +++ b/yarn-project/cli/README.md @@ -135,7 +135,7 @@ aztec-cli create-account ### deploy -Deploys a compiled Noir contract to Aztec. +Deploys a compiled Aztec.nr contract to Aztec. Syntax: @@ -145,12 +145,12 @@ aztec-cli deploy [options] Options: -- `-c, --contract-abi `: Path to the compiled Noir contract's ABI file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractAbi. You can get a full ist of the available contracts with `aztec-cli example-contracts` +- `-c, --contract-abi `: Path to the compiled Aztec.nr contract's ABI file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractAbi. You can get a full ist of the available contracts with `aztec-cli example-contracts` - `-a, --args ` (optional): Contract constructor arguments Default: []. - `-u, --rpc-url `: URL of the Aztec RPC. Default: `http://localhost:8080`. - `-k, --public-key `: Public key of the deployer. If not provided, it will check the RPC for existing ones. -This command deploys a compiled Noir contract to Aztec. It requires the path to the contract's ABI file in JSON format. Optionally, you can specify the public key of the deployer and provide constructor arguments for the contract. The command displays the address of the deployed contract. +This command deploys a compiled Aztec.nr contract to Aztec. It requires the path to the contract's ABI file in JSON format. Optionally, you can specify the public key of the deployer and provide constructor arguments for the contract. The command displays the address of the deployed contract. Example usage: diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index b1ac8bb4c7c..a597a07e21f 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -148,10 +148,10 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { program .command('deploy') - .description('Deploys a compiled Noir contract to Aztec.') + .description('Deploys a compiled Aztec.nr contract to Aztec.') .argument( '', - "A compiled Noir contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", + "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", ) .option('-a, --args ', 'Contract constructor arguments', []) .option('-u, --rpc-url ', 'URL of the Aztec RPC', AZTEC_RPC_HOST || 'http://localhost:8080') @@ -360,7 +360,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .option('-a, --args [functionArgs...]', 'Function arguments', []) .requiredOption( '-c, --contract-abi ', - "A compiled Noir contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", + "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", ) .requiredOption('-ca, --contract-address
', 'Aztec address of the contract.') .option('-k, --private-key ', "The sender's private key.", PRIVATE_KEY) @@ -406,7 +406,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .option('-a, --args [functionArgs...]', 'Function arguments', []) .requiredOption( '-c, --contract-abi ', - "A compiled Noir contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", + "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", ) .requiredOption('-ca, --contract-address
', 'Aztec address of the contract.') .option('-f, --from ', 'Public key of the TX viewer. If empty, will try to find account in RPC.') @@ -438,7 +438,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .argument('', 'The encoded hex string') .requiredOption( '-c, --contract-abi ', - "A compiled Noir contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", + "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", ) .requiredOption('-p, --parameter ', 'The name of the struct parameter to decode into') .action(async (encodedString, options) => { diff --git a/yarn-project/end-to-end/src/e2e_pending_commitments_contract.test.ts b/yarn-project/end-to-end/src/e2e_pending_commitments_contract.test.ts index 24edd48610b..2c8d21403ee 100644 --- a/yarn-project/end-to-end/src/e2e_pending_commitments_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_pending_commitments_contract.test.ts @@ -64,7 +64,7 @@ describe('e2e_pending_commitments_contract', () => { return contract; }; - it('Noir function can "get" notes it just "inserted"', async () => { + it('Aztec.nr function can "get" notes it just "inserted"', async () => { const mintAmount = 65n; const deployedContract = await deployContract(); @@ -76,7 +76,7 @@ describe('e2e_pending_commitments_contract', () => { expect(receipt.status).toBe(TxStatus.MINED); }, 60_000); - it('Squash! Noir function can "create" and "nullify" note in the same TX', async () => { + it('Squash! Aztec.nr function can "create" and "nullify" note in the same TX', async () => { // Kernel will squash the noteHash and its nullifier. // Realistic way to describe this test is "Mint note A, then burn note A in the same transaction" const mintAmount = 65n; @@ -101,7 +101,7 @@ describe('e2e_pending_commitments_contract', () => { await expectNullifiersSquashedExcept(0); }, 60_000); - it('Squash! Noir function can "create" 2 notes and "nullify" both in the same TX', async () => { + it('Squash! Aztec.nr function can "create" 2 notes and "nullify" both in the same TX', async () => { // Kernel will squash both noteHashes and their nullifier. // Realistic way to describe this test is "Mint notes A and B, then burn both in the same transaction" const mintAmount = 65n; @@ -125,7 +125,7 @@ describe('e2e_pending_commitments_contract', () => { await expectNullifiersSquashedExcept(0); }, 60_000); - it('Squash! Noir function can "create" 2 notes and "nullify" 1 in the same TX (kernel will squash one note + nullifier)', async () => { + it('Squash! Aztec.nr function can "create" 2 notes and "nullify" 1 in the same TX (kernel will squash one note + nullifier)', async () => { // Kernel will squash one noteHash and its nullifier. // The other note will become persistent! // Realistic way to describe this test is "Mint notes A and B, then burn note A in the same transaction" @@ -150,7 +150,7 @@ describe('e2e_pending_commitments_contract', () => { await expectNullifiersSquashedExcept(0); }, 60_000); - it('Squash! Noir function can nullify a pending note and a persistent in the same TX', async () => { + it('Squash! Aztec.nr function can nullify a pending note and a persistent in the same TX', async () => { // Create 1 note in isolated TX. // Then, in a separate TX, create 1 new note and nullify BOTH notes. // In this second TX, the kernel will squash one note + nullifier, diff --git a/yarn-project/end-to-end/src/fixtures/cross_chain_test_harness.ts b/yarn-project/end-to-end/src/fixtures/cross_chain_test_harness.ts index ad71a3f1733..9084a112687 100644 --- a/yarn-project/end-to-end/src/fixtures/cross_chain_test_harness.ts +++ b/yarn-project/end-to-end/src/fixtures/cross_chain_test_harness.ts @@ -166,7 +166,7 @@ export class CrossChainTestHarness { async consumeMessageOnAztecAndMintSecretly(bridgeAmount: bigint, messageKey: Fr, secret: Fr) { this.logger('Consuming messages on L2 secretively'); - // Call the mint tokens function on the noir contract + // Call the mint tokens function on the Aztec.nr contract const consumptionTx = this.l2Contract.methods .mint(bridgeAmount, this.ownerAddress, messageKey, secret, this.ethAccount.toField()) .send(); @@ -178,7 +178,7 @@ export class CrossChainTestHarness { async consumeMessageOnAztecAndMintPublicly(bridgeAmount: bigint, messageKey: Fr, secret: Fr) { this.logger('Consuming messages on L2 Publicly'); - // Call the mint tokens function on the noir contract + // Call the mint tokens function on the Aztec.nr contract const consumptionTx = this.l2Contract.methods .mintPublic(bridgeAmount, this.ownerAddress, messageKey, secret, this.ethAccount.toField()) .send(); diff --git a/yarn-project/foundation/src/abi/abi.ts b/yarn-project/foundation/src/abi/abi.ts index 0fecd88c5cd..18dd0dd2793 100644 --- a/yarn-project/foundation/src/abi/abi.ts +++ b/yarn-project/foundation/src/abi/abi.ts @@ -96,7 +96,7 @@ export interface StructType extends BasicType<'struct'> { } /** - * Noir function types. + * Aztec.nr function types. */ export enum FunctionType { SECRET = 'secret', diff --git a/yarn-project/foundation/src/abi/decoder.ts b/yarn-project/foundation/src/abi/decoder.ts index 0dfbe09708c..cece6e9d949 100644 --- a/yarn-project/foundation/src/abi/decoder.ts +++ b/yarn-project/foundation/src/abi/decoder.ts @@ -62,7 +62,7 @@ class ReturnValuesDecoder { /** * Decodes all the return values for the given function ABI. - * Noir support only single return value + * Aztec.nr support only single return value * The return value can however be simple types, structs or arrays * @returns The decoded return values. */ diff --git a/yarn-project/noir-compiler/README.md b/yarn-project/noir-compiler/README.md index 92558025bbb..ade6f9bfa0c 100644 --- a/yarn-project/noir-compiler/README.md +++ b/yarn-project/noir-compiler/README.md @@ -1,6 +1,6 @@ -# Aztec Noir compiler +# Aztec.nr compiler -The Aztec noir compiler compiles noir contracts using nargo and outputs Aztec formatted contract ABIs. The compiler can also generate typescript classes for each contract, as well as Noir interfaces for calling external functions. +The Aztec.nr compiler compiles Aztec.nr contracts using nargo and outputs Aztec formatted contract ABIs. The compiler can also generate typescript classes for each contract, as well as Aztec.nr interfaces for calling external functions. ## Installation diff --git a/yarn-project/noir-compiler/package.json b/yarn-project/noir-compiler/package.json index 067b9a5c6d9..7ef409d0bb4 100644 --- a/yarn-project/noir-compiler/package.json +++ b/yarn-project/noir-compiler/package.json @@ -10,7 +10,7 @@ "entryPoints": [ "./src/index.ts" ], - "name": "Aztec noir compiler", + "name": "Aztec.nr compiler", "tsconfig": "./tsconfig.json" }, "bin": { diff --git a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap index 4a4607ed288..5defbe9affe 100644 --- a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap +++ b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap @@ -3,9 +3,167 @@ exports[`noir-compiler using nargo binary compiles the test contract 1`] = ` [ { + "debug": { + "debugSymbols": [ + "eJyrVsrJT04syczPK1ayqlYyULKKrlYqLkjMA/GKSxKLSpSsDE0MdZRS81KALFOzWh2ltMycVCC7VgdDpbEJVKGZOVydsQkWhUYGMJVGxkhKa2N1lAwH2gm1tQDKLFO0", + "eJyrVsrJT04syczPK1ayqq6tBQAz9wY7", + ], + "fileMap": { + "3": { + "path": "std/hash", + "source": "mod poseidon; + +#[foreign(sha256)] +fn sha256(_input : [u8; N]) -> [u8; 32] {} + +#[foreign(blake2s)] +fn blake2s(_input : [u8; N]) -> [u8; 32] {} + +fn pedersen(input : [Field; N]) -> [Field; 2] { + pedersen_with_separator(input, 0) +} + +#[foreign(pedersen)] +fn pedersen_with_separator(_input : [Field; N], _separator : u32) -> [Field; 2] {} + +#[foreign(hash_to_field_128_security)] +fn hash_to_field(_input : [Field; N]) -> Field {} + +#[foreign(keccak256)] +fn keccak256(_input : [u8; N], _message_size: u32) -> [u8; 32] {} + +// mimc-p/p implementation +// constants are (publicly generated) random numbers, for instance using keccak as a ROM. +// You must use constants generated for the native field +// Rounds number should be ~ log(p)/log(exp) +// For 254 bit primes, exponent 7 and 91 rounds seems to be recommended +fn mimc(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field { + //round 0 + let mut t = x + k; + let mut h = t.pow_32(exp); + //next rounds + for i in 1 .. constants.len() { + t = h + k + constants[i]; + h = t.pow_32(exp); + }; + h + k +} + +global MIMC_BN254_ROUNDS = 91; + +//mimc implementation with hardcoded parameters for BN254 curve. +fn mimc_bn254(array: [Field; N]) -> Field { + //mimc parameters + let exponent = 7; + //generated from seed "mimc" using keccak256 + let constants: [Field; MIMC_BN254_ROUNDS] = [ + 0, + 20888961410941983456478427210666206549300505294776164667214940546594746570981, + 15265126113435022738560151911929040668591755459209400716467504685752745317193, + 8334177627492981984476504167502758309043212251641796197711684499645635709656, + 1374324219480165500871639364801692115397519265181803854177629327624133579404, + 11442588683664344394633565859260176446561886575962616332903193988751292992472, + 2558901189096558760448896669327086721003508630712968559048179091037845349145, + 11189978595292752354820141775598510151189959177917284797737745690127318076389, + 3262966573163560839685415914157855077211340576201936620532175028036746741754, + 17029914891543225301403832095880481731551830725367286980611178737703889171730, + 4614037031668406927330683909387957156531244689520944789503628527855167665518, + 19647356996769918391113967168615123299113119185942498194367262335168397100658, + 5040699236106090655289931820723926657076483236860546282406111821875672148900, + 2632385916954580941368956176626336146806721642583847728103570779270161510514, + 17691411851977575435597871505860208507285462834710151833948561098560743654671, + 11482807709115676646560379017491661435505951727793345550942389701970904563183, + 8360838254132998143349158726141014535383109403565779450210746881879715734773, + 12663821244032248511491386323242575231591777785787269938928497649288048289525, + 3067001377342968891237590775929219083706800062321980129409398033259904188058, + 8536471869378957766675292398190944925664113548202769136103887479787957959589, + 19825444354178182240559170937204690272111734703605805530888940813160705385792, + 16703465144013840124940690347975638755097486902749048533167980887413919317592, + 13061236261277650370863439564453267964462486225679643020432589226741411380501, + 10864774797625152707517901967943775867717907803542223029967000416969007792571, + 10035653564014594269791753415727486340557376923045841607746250017541686319774, + 3446968588058668564420958894889124905706353937375068998436129414772610003289, + 4653317306466493184743870159523234588955994456998076243468148492375236846006, + 8486711143589723036499933521576871883500223198263343024003617825616410932026, + 250710584458582618659378487568129931785810765264752039738223488321597070280, + 2104159799604932521291371026105311735948154964200596636974609406977292675173, + 16313562605837709339799839901240652934758303521543693857533755376563489378839, + 6032365105133504724925793806318578936233045029919447519826248813478479197288, + 14025118133847866722315446277964222215118620050302054655768867040006542798474, + 7400123822125662712777833064081316757896757785777291653271747396958201309118, + 1744432620323851751204287974553233986555641872755053103823939564833813704825, + 8316378125659383262515151597439205374263247719876250938893842106722210729522, + 6739722627047123650704294650168547689199576889424317598327664349670094847386, + 21211457866117465531949733809706514799713333930924902519246949506964470524162, + 13718112532745211817410303291774369209520657938741992779396229864894885156527, + 5264534817993325015357427094323255342713527811596856940387954546330728068658, + 18884137497114307927425084003812022333609937761793387700010402412840002189451, + 5148596049900083984813839872929010525572543381981952060869301611018636120248, + 19799686398774806587970184652860783461860993790013219899147141137827718662674, + 19240878651604412704364448729659032944342952609050243268894572835672205984837, + 10546185249390392695582524554167530669949955276893453512788278945742408153192, + 5507959600969845538113649209272736011390582494851145043668969080335346810411, + 18177751737739153338153217698774510185696788019377850245260475034576050820091, + 19603444733183990109492724100282114612026332366576932662794133334264283907557, + 10548274686824425401349248282213580046351514091431715597441736281987273193140, + 1823201861560942974198127384034483127920205835821334101215923769688644479957, + 11867589662193422187545516240823411225342068709600734253659804646934346124945, + 18718569356736340558616379408444812528964066420519677106145092918482774343613, + 10530777752259630125564678480897857853807637120039176813174150229243735996839, + 20486583726592018813337145844457018474256372770211860618687961310422228379031, + 12690713110714036569415168795200156516217175005650145422920562694422306200486, + 17386427286863519095301372413760745749282643730629659997153085139065756667205, + 2216432659854733047132347621569505613620980842043977268828076165669557467682, + 6309765381643925252238633914530877025934201680691496500372265330505506717193, + 20806323192073945401862788605803131761175139076694468214027227878952047793390, + 4037040458505567977365391535756875199663510397600316887746139396052445718861, + 19948974083684238245321361840704327952464170097132407924861169241740046562673, + 845322671528508199439318170916419179535949348988022948153107378280175750024, + 16222384601744433420585982239113457177459602187868460608565289920306145389382, + 10232118865851112229330353999139005145127746617219324244541194256766741433339, + 6699067738555349409504843460654299019000594109597429103342076743347235369120, + 6220784880752427143725783746407285094967584864656399181815603544365010379208, + 6129250029437675212264306655559561251995722990149771051304736001195288083309, + 10773245783118750721454994239248013870822765715268323522295722350908043393604, + 4490242021765793917495398271905043433053432245571325177153467194570741607167, + 19596995117319480189066041930051006586888908165330319666010398892494684778526, + 837850695495734270707668553360118467905109360511302468085569220634750561083, + 11803922811376367215191737026157445294481406304781326649717082177394185903907, + 10201298324909697255105265958780781450978049256931478989759448189112393506592, + 13564695482314888817576351063608519127702411536552857463682060761575100923924, + 9262808208636973454201420823766139682381973240743541030659775288508921362724, + 173271062536305557219323722062711383294158572562695717740068656098441040230, + 18120430890549410286417591505529104700901943324772175772035648111937818237369, + 20484495168135072493552514219686101965206843697794133766912991150184337935627, + 19155651295705203459475805213866664350848604323501251939850063308319753686505, + 11971299749478202793661982361798418342615500543489781306376058267926437157297, + 18285310723116790056148596536349375622245669010373674803854111592441823052978, + 7069216248902547653615508023941692395371990416048967468982099270925308100727, + 6465151453746412132599596984628739550147379072443683076388208843341824127379, + 16143532858389170960690347742477978826830511669766530042104134302796355145785, + 19362583304414853660976404410208489566967618125972377176980367224623492419647, + 1702213613534733786921602839210290505213503664731919006932367875629005980493, + 10781825404476535814285389902565833897646945212027592373510689209734812292327, + 4212716923652881254737947578600828255798948993302968210248673545442808456151, + 7594017890037021425366623750593200398174488805473151513558919864633711506220, + 18979889247746272055963929241596362599320706910852082477600815822482192194401, + 13602139229813231349386885113156901793661719180900395818909719758150455500533, + ]; + + let mut r = 0; + for elem in array { + let h = mimc(elem, r, constants, exponent); + r = r + elem + h; + } + r +} +", + }, + }, + }, "functions": [ { - "bytecode": "H4sIAAAAAAAA/61RQQ6DQAjEtfU9sIALt36lm67/f0GjRkzWs04ymeEykGECgAQHho1T6Dn/w48bX3DFGPoJxXug4cGs1GUxziKt5EZMX8xeTVG0zkZGavrLxtxMrHj1gk7CjRZ1XiLs/dxd2Hd7+tT9YO9037cCCmnZhZgBAAA=", + "bytecode": "H4sIAAAAAAAA/61Q0QrDMAhMuqXfo1EbfduvLCz9/y8Y66gF6Wt7cJwncsjNKaVH2pE3zq6H//r8v3luLO6n0z7iyHu5wjVgvjFrClkEC/NodSDhG6p1FWDpi6KiqHyqEg1lbdatgSHTwFWMVg8r9/0FsfMcOo49l9DxD+/NSgK4AQAA", "functionType": "secret", "isInternal": false, "name": "constructor", @@ -22,7 +180,7 @@ exports[`noir-compiler using nargo binary compiles the test contract 1`] = ` "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f", }, { - "bytecode": "H4sIAAAAAAAA/6WOSwqAMAwFU0+Ub5vsvEqL6f2PIKKCIK6czcBbPGYBgAJv7m29LFhVs3GSUEeO4YZqozo5mdvGLpKu3mJEwyCVpGkhE0/K4wt/wf2r9fAOFP9TANAAAAA=", + "bytecode": "H4sIAAAAAAAA/6WPuw2AMAxEHSbyN7E7VkmEs/8IFIAUCVHxmpOuON3bAKDAm6fb7xSsqtk4Sagjx3BDtVGdnMztYBdJV28xomGQStK0kIkXZdnCX3D/+rp6nNHQ/4XYAAAA", "functionType": "open", "isInternal": false, "name": "openFunction", @@ -40,19 +198,21 @@ exports[`noir-compiler using nargo binary compiles the test contract 1`] = ` ] `; -exports[`noir-compiler using nargo binary generates noir external interface 1`] = ` +exports[`noir-compiler using nargo binary generates Aztec.nr external interface 1`] = ` "/* Autogenerated file, do not edit! */ use dep::std; -use dep::aztec::context::PrivateContext; +use dep::aztec::context::{ PrivateContext, PublicContext }; use dep::aztec::constants_gen::RETURN_VALUES_LENGTH; -struct TestContractContractInterface { + +// Interface for calling TestContract functions from a private context +struct TestContractPrivateContextInterface { address: Field, } -impl TestContractContractInterface { +impl TestContractPrivateContextInterface { fn at(address: Field) -> Self { Self { address, @@ -69,7 +229,34 @@ impl TestContractContractInterface { } } + + + + +// Interface for calling TestContract functions from a public context +struct TestContractPublicContextInterface { + address: Field, +} + +impl TestContractPublicContextInterface { + fn at(address: Field) -> Self { + Self { + address, + } + } + + fn openFunction( + self, + context: PublicContext + ) -> [Field; RETURN_VALUES_LENGTH] { + let mut serialised_args = [0; 0]; + context.call_public_function(self.address, 0x46be982e, serialised_args) + } + +} + + " `; @@ -78,12 +265,12 @@ exports[`noir-compiler using nargo binary generates typescript interface 1`] = ` /* Autogenerated file, do not edit! */ /* eslint-disable */ -import { AztecAddress, ContractBase, ContractFunctionInteraction, ContractMethod, DeployMethod, FieldLike, Wallet } from '@aztec/aztec.js'; +import { AztecAddress, CompleteAddress, ContractBase, ContractFunctionInteraction, ContractMethod, DeployMethod, FieldLike, Wallet } from '@aztec/aztec.js'; import { Fr, Point } from '@aztec/foundation/fields'; import { AztecRPC, PublicKey } from '@aztec/types'; import { ContractAbi } from '@aztec/foundation/abi'; import TestContractContractAbiJson from '../target/test.json' assert { type: 'json' }; -export const TestContractContractAbi = TestContractContractAbiJson as ContractAbi; +export const TestContractContractAbi = TestContractContractAbiJson as unknown as ContractAbi; /** * Type-safe interface for contract TestContract; @@ -91,12 +278,12 @@ export const TestContractContractAbi = TestContractContractAbiJson as ContractAb export class TestContractContract extends ContractBase { private constructor( - /** The deployed contract's address. */ - address: AztecAddress, + /** The deployed contract's complete address. */ + completeAddress: CompleteAddress, /** The wallet. */ wallet: Wallet, ) { - super(address, TestContractContractAbi, wallet); + super(completeAddress, TestContractContractAbi, wallet); } @@ -113,10 +300,11 @@ export class TestContractContract extends ContractBase { /** The wallet. */ wallet: Wallet, ) { - if ((await wallet.getContractData(address)) === undefined) { + const extendedContractData = await wallet.getExtendedContractData(address); + if (extendedContractData === undefined) { throw new Error('Contract ' + address.toString() + ' is not deployed'); } - return new TestContractContract(address, wallet); + return new TestContractContract(extendedContractData.getCompleteAddress(), wallet); } diff --git a/yarn-project/noir-compiler/src/cli/contract.ts b/yarn-project/noir-compiler/src/cli/contract.ts index 020908f0ab0..92243a5a368 100644 --- a/yarn-project/noir-compiler/src/cli/contract.ts +++ b/yarn-project/noir-compiler/src/cli/contract.ts @@ -8,7 +8,7 @@ import path, { resolve } from 'path'; import { compileUsingNargo, generateNoirContractInterface, generateTypescriptContractInterface } from '../index.js'; /** - * Registers a 'contract' command on the given commander program that compiles a Noir contract project. + * Registers a 'contract' command on the given commander program that compiles an Aztec.nr contract project. * @param program - Commander program. * @param log - Optional logging function. * @returns The program with the command registered. @@ -16,10 +16,10 @@ import { compileUsingNargo, generateNoirContractInterface, generateTypescriptCon export function compileContract(program: Command, name = 'contract', log: LogFn = () => {}): Command { return program .command(name) - .argument('', 'Path to the noir project to compile') + .argument('', 'Path to the Aztec.nr project to compile') .option('-o, --outdir ', 'Output folder for the binary artifacts, relative to the project path', 'target') .option('-ts, --typescript ', 'Optional output folder for generating typescript wrappers', undefined) - .option('-i, --interface ', 'Optional output folder for generating noir contract interface', undefined) + .option('-i, --interface ', 'Optional output folder for generating an Aztec.nr contract interface', undefined) .description('Compiles the contracts in the target project') .action( @@ -48,7 +48,9 @@ export function compileContract(program: Command, name = 'contract', log: LogFn if (noirInterface) { const noirInterfacePath = resolve(projectPath, noirInterface, `${contract.name}_interface.nr`); - log(`Writing ${contract.name} Noir external interface to ${path.relative(currentDir, noirInterfacePath)}`); + log( + `Writing ${contract.name} Aztec.nr external interface to ${path.relative(currentDir, noirInterfacePath)}`, + ); const noirWrapper = generateNoirContractInterface(contract); mkdirpSync(path.dirname(noirInterfacePath)); writeFileSync(noirInterfacePath, noirWrapper); diff --git a/yarn-project/noir-compiler/src/compile/nargo.ts b/yarn-project/noir-compiler/src/compile/nargo.ts index 790f4462b84..bba92a98617 100644 --- a/yarn-project/noir-compiler/src/compile/nargo.ts +++ b/yarn-project/noir-compiler/src/compile/nargo.ts @@ -19,7 +19,7 @@ export type CompileOpts = { }; /** - * A class that compiles noir contracts using nargo via the shell. + * A class that compiles Aztec.nr contracts using nargo via the shell. */ export class NargoContractCompiler { private log: LogFn; @@ -28,8 +28,8 @@ export class NargoContractCompiler { } /** - * Compiles the contracts in projectPath and returns the Noir artifact. - * @returns Noir artifact of the compiled contracts. + * Compiles the contracts in projectPath and returns the Aztec.nr artifact. + * @returns Aztec.nr artifact of the compiled contracts. */ public compile(): Promise { const stdio = this.opts.quiet ? 'ignore' : 'inherit'; diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts index a6d32037717..ba3f02d48d3 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts @@ -6,7 +6,7 @@ import { mockVerificationKey } from '../mocked_keys.js'; import { NoirCompilationArtifacts, NoirFunctionEntry } from '../noir_artifact.js'; /** - * Generates an Aztec ABI for a Noir function build artifact. Replaces verification key with a mock value. + * Generates an Aztec ABI for a Aztec.nr function build artifact. Replaces verification key with a mock value. * @param fn - Noir function entry. * @returns Aztec ABI function entry. */ diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts index cbd9cea1532..8f81f7697ba 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts @@ -134,8 +134,8 @@ function generateSerialisation(parameters: ABIParameter[]) { } /** - * Generate a function interface for a particular function of the Noir Contract being processed. This function will be a method of the ContractInterface struct being created here. - * @param functionData - Data relating to the function, which can be used to generate a callable Noir Function. + * Generate a function interface for a particular function of the Aztec.nr Contract being processed. This function will be a method of the ContractInterface struct being created here. + * @param functionData - Data relating to the function, which can be used to generate a callable Aztec.nr Function. * @param kind - Whether this interface will be used from private or public functions. * @returns A code string. */ @@ -272,7 +272,7 @@ ${contractImpl} /** * Generates the Noir code to represent an interface for calling a contract. - * @param abi - The compiled Noir artifact. + * @param abi - The compiled Aztec.nr artifact. * @returns The corresponding ts code. */ export function generateNoirContractInterface(abi: ContractAbi) { diff --git a/yarn-project/noir-compiler/src/index.test.ts b/yarn-project/noir-compiler/src/index.test.ts index 9a09d1fe8f8..804dc88da31 100644 --- a/yarn-project/noir-compiler/src/index.test.ts +++ b/yarn-project/noir-compiler/src/index.test.ts @@ -39,7 +39,7 @@ describe('noir-compiler', () => { expect(result).toMatchSnapshot(); }); - it('generates noir external interface', () => { + it('generates Aztec.nr external interface', () => { const result = generateNoirContractInterface(compiled[0]); expect(result).toMatchSnapshot(); }); diff --git a/yarn-project/noir-compiler/src/index.ts b/yarn-project/noir-compiler/src/index.ts index b7054d89577..85b52ffe7bd 100644 --- a/yarn-project/noir-compiler/src/index.ts +++ b/yarn-project/noir-compiler/src/index.ts @@ -12,7 +12,7 @@ export { generateTypescriptContractInterface } from './contract-interface-gen/ty export { generateAztecAbi }; /** - * Compile Noir contracts in project path using a nargo binary available in the shell. + * Compile Aztec.nr contracts in project path using a nargo binary available in the shell. * @param projectPath - Path to project. * @param opts - Compiler options. * @returns Compiled artifacts. diff --git a/yarn-project/noir-compiler/src/noir_artifact.ts b/yarn-project/noir-compiler/src/noir_artifact.ts index 40eed69101f..f1fab9562a7 100644 --- a/yarn-project/noir-compiler/src/noir_artifact.ts +++ b/yarn-project/noir-compiler/src/noir_artifact.ts @@ -1,9 +1,9 @@ import { ABIParameter, ABIType, DebugFileMap, DebugInfo } from '@aztec/foundation/abi'; -/** The noir function types. */ +/** The Aztec.nr function types. */ type NoirFunctionType = 'Open' | 'Secret' | 'Unconstrained'; -/** The ABI of a noir function. */ +/** The ABI of an Aztec.nr function. */ interface NoirFunctionAbi { /** The parameters of the function. */ parameters: ABIParameter[]; @@ -16,7 +16,7 @@ interface NoirFunctionAbi { } /** - * The compilation result of a noir function. + * The compilation result of an Aztec.nr function. */ export interface NoirFunctionEntry { /** The name of the function. */ @@ -36,7 +36,7 @@ export interface NoirFunctionEntry { } /** - * The compilation result of a noir contract. + * The compilation result of an Aztec.nr contract. */ export interface NoirCompiledContract { /** The name of the contract. */ @@ -48,7 +48,7 @@ export interface NoirCompiledContract { } /** - * The debug metadata of a noir contract. + * The debug metadata of an Aztec.nr contract. */ export interface NoirDebugMetadata { /** diff --git a/yarn-project/noir-contracts/README.md b/yarn-project/noir-contracts/README.md index b4631099f63..33d3ea1518b 100644 --- a/yarn-project/noir-contracts/README.md +++ b/yarn-project/noir-contracts/README.md @@ -1,4 +1,4 @@ -# Noir contracts +# Aztec.nr contracts This package contains the source code and the Aztec ABIs for the example contracts used in tests. diff --git a/yarn-project/noir-contracts/scripts/compile.sh b/yarn-project/noir-contracts/scripts/compile.sh index 972e9652730..09c1d896f6c 100755 --- a/yarn-project/noir-contracts/scripts/compile.sh +++ b/yarn-project/noir-contracts/scripts/compile.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Compiles noir contracts in parallel, bubbling any compilation errors +# Compiles Aztec.nr contracts in parallel, bubbling any compilation errors source ./scripts/catch.sh source ./scripts/nargo_check.sh diff --git a/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr index fe9fa044e5e..d2c29d6c6e8 100644 --- a/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr @@ -44,7 +44,7 @@ contract Test { context.this_address() } - // Test codegen for noir interfaces + // Test codegen for Aztec.nr interfaces // See yarn-project/acir-simulator/src/client/private_execution.test.ts 'nested calls through autogenerated interface' // Note; this function is deliberately NOT annotated with #[aztec(private)] due to its use in tests fn testCodeGen( diff --git a/yarn-project/noir-contracts/src/scripts/copy_output.ts b/yarn-project/noir-contracts/src/scripts/copy_output.ts index 05da55f50be..68ec5ca5204 100644 --- a/yarn-project/noir-contracts/src/scripts/copy_output.ts +++ b/yarn-project/noir-contracts/src/scripts/copy_output.ts @@ -88,7 +88,7 @@ const main = () => { writeFileSync(tsInterfaceDestFilePath, generateTypescriptContractInterface(artifactJson, tsAbiImportPath)); log(`Written ${tsInterfaceDestFilePath}`); - // Write a .nr contract interface, for consumption by other Noir Contracts + // Write a .nr contract interface, for consumption by other Aztec.nr contracts if (INTERFACE_CONTRACTS.includes(name)) { const projectDirPath = `src/contracts/${projectName}`; const noirInterfaceDestFilePath = `${projectDirPath}/src/interface.nr`; @@ -96,7 +96,7 @@ const main = () => { writeFileSync(noirInterfaceDestFilePath, generateNoirContractInterface(artifactJson)); log(`Written ${noirInterfaceDestFilePath}`); } catch (err) { - log(`Error generating noir interface for ${name}: ${err}`); + log(`Error generating Aztec.nr interface for ${name}: ${err}`); } } }; diff --git a/yarn-project/noir-libs/safe-math/src/safe_u120.nr b/yarn-project/noir-libs/safe-math/src/safe_u120.nr index ccb6ab906a8..5feeb3cca23 100644 --- a/yarn-project/noir-libs/safe-math/src/safe_u120.nr +++ b/yarn-project/noir-libs/safe-math/src/safe_u120.nr @@ -259,11 +259,10 @@ fn test_mul_div_up_ghost_overflow() { // It should not be possible for us to overflow `mul_div_up` through the adder, since that require the divisor to be 1 // since we otherwise would not be at the max value. If divisor is 1, adder is 0. - #[test(should_fail)] fn test_mul_div_up_zero_divisor() { let a = SafeU120::new(6); let b = SafeU120::new(3); let c = SafeU120::new(0); let _d = SafeU120::mul_div_up(a, b, c); -} \ No newline at end of file +} diff --git a/yarn-project/types/src/contract_database.ts b/yarn-project/types/src/contract_database.ts index 7eb2333ed88..f9b8581febb 100644 --- a/yarn-project/types/src/contract_database.ts +++ b/yarn-project/types/src/contract_database.ts @@ -3,7 +3,7 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { ContractDao } from './contract_dao.js'; /** - * Represents a ContractDatabase interface for managing noir contracts. + * Represents a ContractDatabase interface for managing Aztec.nr contracts. * Provides methods for adding and retrieving ContractDao objects by their associated addresses. */ export interface ContractDatabase { diff --git a/yarn-project/yarn-project-base/Dockerfile b/yarn-project/yarn-project-base/Dockerfile index ffcf3abb8c2..dca9635efdc 100644 --- a/yarn-project/yarn-project-base/Dockerfile +++ b/yarn-project/yarn-project-base/Dockerfile @@ -108,7 +108,7 @@ RUN ./scripts/generate-artifacts.sh WORKDIR /usr/src/yarn-project -# Generate noir contract artifacts +# Generate Aztec.nr contract artifacts FROM builder_ as noir_types COPY . . COPY --from=noir /usr/src/yarn-project/noir-contracts/src/contracts /usr/src/yarn-project/noir-contracts/src/contracts @@ -121,7 +121,7 @@ RUN ./scripts/types_all.sh # Run yarn build again to build the types RUN yarn build -# Take noir contract artifacts into the final build image +# Take Aztec.nr contract artifacts into the final build image FROM builder_ as final COPY . . COPY --from=noir_types /usr/src/yarn-project/noir-contracts/src/artifacts /usr/src/yarn-project/noir-contracts/src/artifacts From c57f027af9a9796ddef970db24e56be954215760 Mon Sep 17 00:00:00 2001 From: Maddiaa <47148561+Maddiaa0@users.noreply.github.com> Date: Wed, 13 Sep 2023 23:00:35 +0200 Subject: [PATCH 07/11] chore(ci): Mirror Aztec-nr (#2270) solution for: - https://github.com/AztecProtocol/aztec-packages/issues/2265 - handles renaming noir-libs -> aztec-nr - renames what was aztec-nr to just aztec aztec-nr lives here (with full history): - https://github.com/AztecProtocol/aztec-nr - once this is merged it can be made public and a nice readme put on it --- .github/workflows/mirror_repos.yml | 23 +- build_manifest.json | 6 +- .../docs/concepts/foundation/accounts/keys.md | 4 +- docs/docs/dev_docs/contracts/events.md | 4 +- docs/docs/dev_docs/contracts/portals/main.md | 4 +- .../dev_docs/contracts/state_variables.md | 8 +- docs/docs/dev_docs/contracts/syntax.md | 2 +- docs/docs/dev_docs/dapps/testing.md | 2 +- .../dapps/tutorials/contract_deployment.md | 4 +- .../getting_started/noir_contracts.md | 2 +- .../wallets/writing_an_account_contract.md | 4 +- yarn-project/aztec-nr/.gitrepo | 12 ++ yarn-project/aztec-nr/LICENCE | 202 ++++++++++++++++++ yarn-project/aztec-nr/README.md | 66 ++++++ yarn-project/aztec-nr/assets/Aztec_banner.png | Bin 0 -> 605722 bytes .../aztec-noir => aztec-nr/aztec}/Nargo.toml | 0 .../aztec-noir => aztec-nr/aztec}/src/abi.nr | 0 .../aztec-noir => aztec-nr/aztec}/src/auth.nr | 0 .../aztec}/src/constants_gen.nr | 0 .../aztec}/src/context.nr | 0 .../aztec}/src/entrypoint.nr | 0 .../aztec-noir => aztec-nr/aztec}/src/lib.nr | 0 .../aztec-noir => aztec-nr/aztec}/src/log.nr | 0 .../aztec}/src/messaging.nr | 0 .../aztec}/src/messaging/l1_to_l2_message.nr | 0 .../messaging/l1_to_l2_message_getter_data.nr | 0 .../aztec-noir => aztec-nr/aztec}/src/note.nr | 0 .../aztec}/src/note/lifecycle.nr | 0 .../aztec}/src/note/note_getter.nr | 0 .../aztec}/src/note/note_getter_options.nr | 0 .../aztec}/src/note/note_hash.nr | 0 .../aztec}/src/note/note_header.nr | 0 .../aztec}/src/note/note_interface.nr | 0 .../aztec}/src/note/note_viewer_options.nr | 0 .../aztec}/src/note/utils.nr | 0 .../aztec}/src/oracle.nr | 0 .../aztec}/src/oracle/arguments.nr | 0 .../src/oracle/call_private_function.nr | 0 .../aztec}/src/oracle/compute_selector.nr | 0 .../aztec}/src/oracle/context.nr | 0 .../aztec}/src/oracle/create_commitment.nr | 0 .../aztec}/src/oracle/debug_log.nr | 0 .../oracle/enqueue_public_function_call.nr | 0 .../aztec}/src/oracle/get_l1_to_l2_message.nr | 0 .../aztec}/src/oracle/get_public_key.nr | 0 .../aztec}/src/oracle/get_secret_key.nr | 0 .../aztec}/src/oracle/logs.nr | 0 .../aztec}/src/oracle/notes.nr | 0 .../aztec}/src/oracle/public_call.nr | 0 .../aztec}/src/oracle/rand.nr | 0 .../aztec}/src/oracle/storage.nr | 0 .../aztec}/src/private_call_stack_item.nr | 0 .../aztec}/src/public_call_stack_item.nr | 0 .../aztec}/src/state_vars.nr | 0 .../src/state_vars/immutable_singleton.nr | 0 .../aztec}/src/state_vars/map.nr | 0 .../aztec}/src/state_vars/public_state.nr | 0 .../aztec}/src/state_vars/set.nr | 0 .../aztec}/src/state_vars/singleton.nr | 0 .../aztec}/src/types.nr | 0 .../aztec}/src/types/grumpkin_scalar.nr | 0 .../aztec}/src/types/point.nr | 0 .../aztec}/src/types/type_serialisation.nr | 0 .../type_serialisation/bool_serialisation.nr | 0 .../type_serialisation/field_serialisation.nr | 0 .../type_serialisation/u32_serialisation.nr | 0 .../aztec}/src/types/vec.nr | 0 .../aztec}/src/utils.nr | 0 .../easy-private-state/Nargo.toml | 2 +- .../src/easy_private_state.nr | 0 .../easy-private-state/src/lib.nr | 0 .../safe-math/Nargo.toml | 0 .../safe-math/src/lib.nr | 0 .../safe-math/src/safe_u120.nr | 0 .../value-note/Nargo.toml | 2 +- .../value-note/src/balance_utils.nr | 0 .../value-note/src/filter.nr | 0 .../value-note/src/lib.nr | 0 .../value-note/src/utils.nr | 0 .../value-note/src/value_note.nr | 0 .../account/entrypoint/entrypoint_payload.ts | 2 +- .../aztec.js/src/utils/cheat_codes.ts | 2 +- .../circuits.js/src/cbind/constants.in.ts | 2 +- yarn-project/noir-contracts/README.md | 2 +- .../scripts/get_all_libraries.sh | 4 +- .../noir-contracts/scripts/nargo_test.sh | 2 +- .../contracts/card_game_contract/Nargo.toml | 4 +- .../src/contracts/child_contract/Nargo.toml | 2 +- .../docs_example_contract/Nargo.toml | 2 +- .../easy_private_token_contract/Nargo.toml | 6 +- .../ecdsa_account_contract/Nargo.toml | 2 +- .../src/contracts/escrow_contract/Nargo.toml | 2 +- .../contracts/import_test_contract/Nargo.toml | 2 +- .../src/contracts/lending_contract/Nargo.toml | 4 +- .../multi_transfer_contract/Nargo.toml | 2 +- .../native_token_contract/Nargo.toml | 4 +- .../non_native_token_contract/Nargo.toml | 4 +- .../src/contracts/parent_contract/Nargo.toml | 2 +- .../pending_commitments_contract/Nargo.toml | 4 +- .../pokeable_token_contract/Nargo.toml | 4 +- .../contracts/price_feed_contract/Nargo.toml | 2 +- .../private_token_airdrop_contract/Nargo.toml | 4 +- .../private_token_contract/Nargo.toml | 4 +- .../public_token_contract/Nargo.toml | 2 +- .../schnorr_account_contract/Nargo.toml | 2 +- .../Nargo.toml | 2 +- .../Nargo.toml | 2 +- .../Nargo.toml | 2 +- .../src/contracts/test_contract/Nargo.toml | 2 +- .../src/contracts/token_contract/Nargo.toml | 6 +- .../src/contracts/uniswap_contract/Nargo.toml | 2 +- 111 files changed, 368 insertions(+), 67 deletions(-) create mode 100644 yarn-project/aztec-nr/.gitrepo create mode 100644 yarn-project/aztec-nr/LICENCE create mode 100644 yarn-project/aztec-nr/README.md create mode 100644 yarn-project/aztec-nr/assets/Aztec_banner.png rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/Nargo.toml (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/abi.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/auth.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/constants_gen.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/context.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/entrypoint.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/lib.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/log.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/messaging.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/messaging/l1_to_l2_message.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/messaging/l1_to_l2_message_getter_data.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/lifecycle.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/note_getter.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/note_getter_options.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/note_hash.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/note_header.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/note_interface.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/note_viewer_options.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/note/utils.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/arguments.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/call_private_function.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/compute_selector.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/context.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/create_commitment.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/debug_log.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/enqueue_public_function_call.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/get_l1_to_l2_message.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/get_public_key.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/get_secret_key.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/logs.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/notes.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/public_call.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/rand.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/oracle/storage.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/private_call_stack_item.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/public_call_stack_item.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/state_vars.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/state_vars/immutable_singleton.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/state_vars/map.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/state_vars/public_state.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/state_vars/set.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/state_vars/singleton.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types/grumpkin_scalar.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types/point.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types/type_serialisation.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types/type_serialisation/bool_serialisation.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types/type_serialisation/field_serialisation.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types/type_serialisation/u32_serialisation.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/types/vec.nr (100%) rename yarn-project/{noir-libs/aztec-noir => aztec-nr/aztec}/src/utils.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/easy-private-state/Nargo.toml (81%) rename yarn-project/{noir-libs => aztec-nr}/easy-private-state/src/easy_private_state.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/easy-private-state/src/lib.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/safe-math/Nargo.toml (100%) rename yarn-project/{noir-libs => aztec-nr}/safe-math/src/lib.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/safe-math/src/safe_u120.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/value-note/Nargo.toml (76%) rename yarn-project/{noir-libs => aztec-nr}/value-note/src/balance_utils.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/value-note/src/filter.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/value-note/src/lib.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/value-note/src/utils.nr (100%) rename yarn-project/{noir-libs => aztec-nr}/value-note/src/value_note.nr (100%) diff --git a/.github/workflows/mirror_repos.yml b/.github/workflows/mirror_repos.yml index c3cec86a551..f93244bbce2 100644 --- a/.github/workflows/mirror_repos.yml +++ b/.github/workflows/mirror_repos.yml @@ -12,7 +12,7 @@ concurrency: on: schedule: # Run the workflow every night at 2:00 AM UTC. - cron: '0 2 * * *' + - cron: '0 2 * * *' jobs: mirror-to-docs-repo: @@ -77,3 +77,24 @@ jobs: git commit --amend -m "$(git log -1 --pretty=%B) [skip ci]" git push fi + + mirror-to-aztec-nr-repo: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + - name: Push to aztec-nr repo + run: | + SUBREPO_PATH=yarn-project/aztec-nr + git config --global user.name AztecBot + git config --global user.email tech@aztecprotocol.com + + if ./scripts/git_subrepo.sh push $SUBREPO_PATH --branch=main; then + git fetch # in case a commit came after this + git rebase origin/master + git commit --amend -m "$(git log -1 --pretty=%B) [skip ci]" + git push + fi \ No newline at end of file diff --git a/build_manifest.json b/build_manifest.json index db71326fe07..0f7316595d7 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -102,7 +102,7 @@ "^l1-contracts/", "^yarn-project/l1-artifacts/", "^yarn-project/noir-contracts/", - "^yarn-project/noir-libs/", + "^yarn-project/aztec-nr/", "^yarn-project/noir-compiler/", "^yarn-project/yarn-project-base/", "^yarn-project/yarn.lock" @@ -199,7 +199,7 @@ "dockerfile": "noir-contracts/Dockerfile.build", "rebuildPatterns": [ "^yarn-project/noir-contracts/", - "^yarn-project/noir-libs/" + "^yarn-project/aztec-nr/" ] }, "noir-contracts": { @@ -208,7 +208,7 @@ "dockerfile": "noir-contracts/Dockerfile", "rebuildPatterns": [ "^yarn-project/noir-contracts/", - "^yarn-project/noir-libs/" + "^yarn-project/aztec-nr/" ] }, "noir-compiler": { diff --git a/docs/docs/concepts/foundation/accounts/keys.md b/docs/docs/concepts/foundation/accounts/keys.md index 9f7ca23f581..2fb19d87860 100644 --- a/docs/docs/concepts/foundation/accounts/keys.md +++ b/docs/docs/concepts/foundation/accounts/keys.md @@ -71,7 +71,7 @@ In a future version, encryption keys will be differentiated between incoming and An application in Aztec.nr can access the encryption public key for a given address using the oracle call `get_public_key`, which you can then use for calls such as `emit_encrypted_log`: -#include_code encrypted /yarn-project/noir-libs/value-note/src/utils.nr rust +#include_code encrypted /yarn-project/aztec-nr/value-note/src/utils.nr rust :::info In order to be able to provide the public encryption key for a given address, that public key needs to have been registered in advance. At the moment, there is no broadcasting mechanism for public keys, which means that you will need to manually register all addresses you intend to send encrypted notes to. You can do this via the `registerRecipient` method of the Aztec RPC server, callable either via aztec.js or the CLI. Note that any accounts you own that have been added to the RPC server are automatically registered. @@ -83,7 +83,7 @@ In addition to deriving encryption keys, the privacy master key is used for deri An application in Aztec.nr can request a nullifier from the current user for computing the nullifier of a note via the `get_secret_key` oracle call: -#include_code nullifier /yarn-project/noir-libs/value-note/src/value_note.nr rust +#include_code nullifier /yarn-project/aztec-nr/value-note/src/value_note.nr rust ### Scoped keys diff --git a/docs/docs/dev_docs/contracts/events.md b/docs/docs/dev_docs/contracts/events.md index 1f12b91c8e5..88eaf3b2396 100644 --- a/docs/docs/dev_docs/contracts/events.md +++ b/docs/docs/dev_docs/contracts/events.md @@ -44,11 +44,11 @@ await aztecRpc.registerRecipient(completeAddress); To emit encrypted logs first import the `emit_encrypted_log` utility function inside your contract: -#include_code encrypted_import /yarn-project/noir-libs/value-note/src/utils.nr rust +#include_code encrypted_import /yarn-project/aztec-nr/value-note/src/utils.nr rust Then you can call the function: -#include_code encrypted /yarn-project/noir-libs/value-note/src/utils.nr rust +#include_code encrypted /yarn-project/aztec-nr/value-note/src/utils.nr rust ### Unencrypted Events diff --git a/docs/docs/dev_docs/contracts/portals/main.md b/docs/docs/dev_docs/contracts/portals/main.md index b1ead86a80e..67074e53aab 100644 --- a/docs/docs/dev_docs/contracts/portals/main.md +++ b/docs/docs/dev_docs/contracts/portals/main.md @@ -37,7 +37,7 @@ As time passes, a sequencer will see your tx, the juicy fee provided and include To consume the message, we can use the `consume_l1_to_l2_message` function within the `context` struct. The `msg_key` is the hash of the message produced from the `sendL2Message` call, the `content` is the content of the message, and the `secret` is the pre-image hashed to compute the `secretHash`. -#include_code context_consume_l1_to_l2_message /yarn-project/noir-libs/aztec-noir/src/context.nr rust +#include_code context_consume_l1_to_l2_message /yarn-project/aztec-nr/aztec/src/context.nr rust Computing the `content` might be a little clunky in its current form, as we are still adding a number of bytes utilities. A good example exists within the [Non-native token example](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/hash.nr). @@ -63,7 +63,7 @@ The portal must ensure that the sender is as expected. One way to do this, is to To send a message to L1 from your Aztec contract, you must use the `message_portal` function on the `context`. When messaging to L1, only the `content` is required (as field). -#include_code context_message_portal /yarn-project/noir-libs/aztec-noir/src/context.nr rust +#include_code context_message_portal /yarn-project/aztec-nr/aztec/src/context.nr rust When sending a message from L2 to L1 we don't need to pass recipient, deadline, secret nor fees. Recipient is populated with the attached portal and the remaining values are not needed as the message is inserted into the outbox at the same time as it was included in a block (for the inbox it could be inserted and then only included in rollup block later). diff --git a/docs/docs/dev_docs/contracts/state_variables.md b/docs/docs/dev_docs/contracts/state_variables.md index d11e7fb8b2d..db6ac3f6289 100644 --- a/docs/docs/dev_docs/contracts/state_variables.md +++ b/docs/docs/dev_docs/contracts/state_variables.md @@ -28,7 +28,7 @@ The BoolSerialisationMethods is part of the Aztec stdlib: It contains methods that instruct its PublicState wrapper how to serialise and deserialise a boolean to and from a Field, which is the data type being saved in the public state tree. -The Aztec stdlib provides serialization methods for various common types. Check [here](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-libs/aztec-noir/src/types/type_serialisation) for the complete list. +The Aztec stdlib provides serialization methods for various common types. Check [here](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/types/type_serialisation) for the complete list. ### Custom types @@ -36,7 +36,7 @@ It's possible to create a public state for any types. Simply define methods that The methods should be implemented in a struct that conforms to the following interface: -#include_code TypeSerialisationInterface /yarn-project/noir-libs/aztec-noir/src/types/type_serialisation.nr rust +#include_code TypeSerialisationInterface /yarn-project/aztec-nr/aztec/src/types/type_serialisation.nr rust For example, to create a public state for the following type: @@ -118,7 +118,7 @@ Notes are the fundamental elements in the private world. A note should conform to the following interface: -#include_code NoteInterface /yarn-project/noir-libs/aztec-noir/src/note/note_interface.nr rust +#include_code NoteInterface /yarn-project/aztec-nr/aztec/src/note/note_interface.nr rust The interplay between a private state variable and its notes can be confusing. Here's a summary to aid intuition: @@ -243,7 +243,7 @@ Because of this limit, we should always consider using the second argument `Note `NoteGetterOptions` encapsulates a set of configurable options for filtering and retrieving a selection of notes from a database: -#include_code NoteGetterOptions /yarn-project/noir-libs/aztec-noir/src/note/note_getter_options.nr rust +#include_code NoteGetterOptions /yarn-project/aztec-nr/aztec/src/note/note_getter_options.nr rust Developers can design instances of `NoteGetterOptions`, to determine how notes should be filtered and returned to the functions of their smart contracts. diff --git a/docs/docs/dev_docs/contracts/syntax.md b/docs/docs/dev_docs/contracts/syntax.md index a5d5008e78d..584bdeab7ae 100644 --- a/docs/docs/dev_docs/contracts/syntax.md +++ b/docs/docs/dev_docs/contracts/syntax.md @@ -2,7 +2,7 @@ [Noir](https://noir-lang.org/) is a language which is agnostic to proof systems and use cases. Rather than baking Aztec-specific keywords and smart contract types directly into Noir (which would break this agnosticism), we have developed a library -- written in Noir -- whose types and methods provide rich smart contract semantics. -On top of [Noir's stdlib](https://noir-lang.org/standard_library/array_methods), we provide [Aztec.nr](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-libs) for writing contracts on Aztec. +On top of [Noir's stdlib](https://noir-lang.org/standard_library/array_methods), we provide [Aztec.nr](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/aztec-nr) for writing contracts on Aztec. Aztec.nr contains abstractions which remove the need to understand the low-level Aztec protocol. Notably, it provides: diff --git a/docs/docs/dev_docs/dapps/testing.md b/docs/docs/dev_docs/dapps/testing.md index c8395ae51a6..ec59f1d7516 100644 --- a/docs/docs/dev_docs/dapps/testing.md +++ b/docs/docs/dev_docs/dapps/testing.md @@ -133,7 +133,7 @@ To query storage directly, you'll need to know the slot you want to access. This Private state in the Aztec Network is represented via sets of [private notes](../../concepts/foundation/state_model.md#private-state). In our token contract example, the balance of a user is represented as a set of unspent value notes, each with their own corresponding numeric value. -#include_code value-note-def yarn-project/noir-libs/value-note/src/value_note.nr rust +#include_code value-note-def yarn-project/aztec-nr/value-note/src/value_note.nr rust We can query the RPC server for all notes encrypted for a given user in a contract slot. For this example, we'll get all notes encrypted for the `owner` user that are stored on the token contract address and on the slot we calculated earlier. To calculate the actual balance, we extract the `value` of each note, which is the first element, and sum them up. diff --git a/docs/docs/dev_docs/dapps/tutorials/contract_deployment.md b/docs/docs/dev_docs/dapps/tutorials/contract_deployment.md index 9bbbbdc3669..d78a68969fd 100644 --- a/docs/docs/dev_docs/dapps/tutorials/contract_deployment.md +++ b/docs/docs/dev_docs/dapps/tutorials/contract_deployment.md @@ -19,8 +19,8 @@ Then, open the `contracts/private_token/Nargo.toml` configuration file, and add ```toml [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="master", directory="yarn-project/noir-libs/noir-aztec" } -value_note = { git="https://github.com/AztecProtocol/aztec-packages", tag="master", directory="yarn-project/noir-libs/value-note" } +aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="master", directory="yarn-project/aztec-nr/noir-aztec" } +value_note = { git="https://github.com/AztecProtocol/aztec-packages", tag="master", directory="yarn-project/aztec-nr/value-note" } ``` Last, copy-paste the code from the `PrivateToken` contract into `contracts/private_token/main.nr`: diff --git a/docs/docs/dev_docs/getting_started/noir_contracts.md b/docs/docs/dev_docs/getting_started/noir_contracts.md index e6b9e3a96f8..65e27c14643 100644 --- a/docs/docs/dev_docs/getting_started/noir_contracts.md +++ b/docs/docs/dev_docs/getting_started/noir_contracts.md @@ -61,7 +61,7 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="master", directory="yarn-project/noir-libs/aztec-noir" } +aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="master", directory="yarn-project/aztec-nr/aztec" } ``` You are now ready to write your own contracts! diff --git a/docs/docs/dev_docs/wallets/writing_an_account_contract.md b/docs/docs/dev_docs/wallets/writing_an_account_contract.md index b1f02e156f7..4e42ae43efa 100644 --- a/docs/docs/dev_docs/wallets/writing_an_account_contract.md +++ b/docs/docs/dev_docs/wallets/writing_an_account_contract.md @@ -32,7 +32,7 @@ Public Key: 0x0ede151adaef1cfcc1b3e152ea39f00c5cda3f3857cef00decb049d283672dc71 The important part of this contract is the `entrypoint` function, which will be the first function executed in any transaction originated from this account. This function has two main responsibilities: 1) authenticating the transaction and 2) executing calls. It receives a `payload` with the list of function calls to execute, as well as a signature over that payload. -#include_code entrypoint-struct yarn-project/noir-libs/aztec-noir/src/entrypoint.nr rust +#include_code entrypoint-struct yarn-project/aztec-nr/aztec/src/entrypoint.nr rust :::info Using the `EntrypointPayload` struct is not mandatory. You can package the instructions to be carried out by your account contract however you want. However, the entrypoint payload already provides a set of helper functions, both in Noir and Typescript, that can save you a lot of time when writing a new account contract. @@ -48,7 +48,7 @@ We authenticate the transaction. To do this, we serialise and Pedersen-hash the Last, we execute the calls in the payload struct. The `execute_calls` helper function runs through the private and public calls included in the entrypoint payload and executes them: -#include_code entrypoint-execute-calls yarn-project/noir-libs/aztec-noir/src/entrypoint.nr rust +#include_code entrypoint-execute-calls yarn-project/aztec-nr/aztec/src/entrypoint.nr rust Note the usage of the `_with_packed_args` variant of [`call_public_function` and `call_private_function`](../contracts/functions.md#calling-functions). Due to Noir limitations, we cannot include more than a small number of arguments in a function call. However, we can bypass this restriction by using a hash of the arguments in a function call, which gets automatically expanded to the full set of arguments when the nested call is executed. We call this _argument packing_. diff --git a/yarn-project/aztec-nr/.gitrepo b/yarn-project/aztec-nr/.gitrepo new file mode 100644 index 00000000000..9b54eedeb04 --- /dev/null +++ b/yarn-project/aztec-nr/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme +; +[subrepo] + remote = git@github.com:AztecProtocol/aztec-nr.git + branch = master + commit = f662901567fa19e205062d84180763f06cddd641 + method = merge + cmdver = 0.4.6 + parent = 8df8fa7351ca79c022e2eb7dddfd7cf0145876df diff --git a/yarn-project/aztec-nr/LICENCE b/yarn-project/aztec-nr/LICENCE new file mode 100644 index 00000000000..7a4a3ea2424 --- /dev/null +++ b/yarn-project/aztec-nr/LICENCE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/yarn-project/aztec-nr/README.md b/yarn-project/aztec-nr/README.md new file mode 100644 index 00000000000..c137de45e0c --- /dev/null +++ b/yarn-project/aztec-nr/README.md @@ -0,0 +1,66 @@ +
+ + +

Aztec.nr

+ +

+ Aztec Smart Contract Development Framework +

+ +

+ Build Status + Aztec Website + Discord Chat + License +

+
+ + +# Aztec.nr + +`Aztec-nr` is a [Noir](https://noir-lang.org) framework for contract development on [Aztec](aztec.network). + +### Directory Structure +``` +. +├── aztec // The core of the aztec framework +├── easy-private-state // A library for easily creating private state +├── safe-math // A library for safe arithmetic +└── value-note // A library for storing arbitrary values +``` + +## Installing Aztec-nr libraries + +```toml +[package] +name = "your_contract" +authors = ["you! ;) "] +compiler_version = "" +type = "contract" + +[dependencies] +# To install the aztec framework (required to create aztec contracts). +aztec = { git = "https://github.com/AztecProtocol/aztec-nr", tag = "master" , directory = "aztec" } + +# Optional libraries +easy_private_state = { git = "https://github.com/AztecProtocol/aztec-nr", tag = "master" , directory = "easy-private-state" } +safe_math = { git = "https://github.com/AztecProtocol/aztec-nr", tag = "master" , directory = "safe-math" } +value_note = { git = "https://github.com/AztecProtocol/aztec-nr", tag = "master" , directory = "value-note" } +``` + + +## Prerequisites +To use `Aztec.nr` you must have [Noir](https://noir-lang.org/) installed. Noir is a general purpose programming language for creating zero-knowledge-proofs. `Aztec.nr` supercharges the Noir language with Aztec Smart Contract capabilities. + +### Quick Installation +The fastest way to install is with [noirup](https://noir-lang.org/getting_started/nargo_installation#option-1-noirup). + +To use `Aztec-nr` the `aztec` version of `Noir` is required (Note; this version is temporarily required if you would like to use `#[aztec()]` macros). + +Once noirup is installed, you can run the following: +```bash +noirup -v aztec +``` + +For more installation options, please view [Noir's getting started.](https://noir-lang.org/getting_started/nargo_installation) + diff --git a/yarn-project/aztec-nr/assets/Aztec_banner.png b/yarn-project/aztec-nr/assets/Aztec_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..503202966b9ab4495cdc680eab3ed94b641b2dc5 GIT binary patch literal 605722 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 z zFZeoK8JcnZNU|rem)m5Nm8*4y^}|Tf+%jebj%sfQ;L`M21tB$iKm|(XCJdZi;r02z>gepYJYaT<{agSK5R>j`PFOA3% zKKzA3nC`D9`MQe^k2nQfyvIa}teyj%Di_O=pT}ws^U%&0!&}r%Iqqsi8;$;I{gAj_ z6nc9~CO(+^3R7$z=Kf~Zv;|u$25XHbF9e^+)P2!Lu%DBO`Muj2FGdmTbKRcH)(}?P zCA3}0R2Z~)Ru|HykCuGb_?^AG+;`0>A&voRex-Np~HGh28l;DoXzjbEFU(>#DaRtljuD_-N zAxI3K4jkFE+G+3MbiDx-eAO%;5X!{=0lwFss@T4`|0CrCT6?IZvj05N%1P}WogZ

8s2N5ap?1vR`?uSBQKCG6q?8%a`yr%AfA2sJ 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 z z19Ho1;KnI-`B73nog17lE{B}8k=raUg@qIb?sEO4?kIqB^1~Osvukpg{dyo5e~9)c zlPkZJd@dKk0)xMEuEW_u={x3;%e7I4K+XGxvXdVp<;JeA!yDl&KtJRwa-RX8N)-nV zu@{7Ygbr8#aLcx~V6&+)C~r))>7B2A;*F^D?kA);_a1{*82Y5i@Jo+Etfh@J``*{L z7xoxkuukBqN{%8_Q?)Q+uj=u*UuC}CHW^Wq8(H}J={LG>0-q|!C+za~Kt-<5LKyGz zf(uJwthrBYkdoS`e_)vQ+n{cXK;?6B9>P7tsVZrKr2mwO_`L{QWNo!)L)~NmH z3Tpj2AU~%%QA1!x-rQZh2y&(9E<}?VfFU*OLJw~n&Ovl_obO%jCGwE)F|rV?qavA= z05S5P4ok!ha|i4&6E2n3M*8m`31D1Xzq&&C_1s)4+jX<^pHmj0t5%>MuKMmpYTEoi zMb@nVSG21yZk8d0GGAhx1T&#?-&KYDjjYj8Rg9ThM`5K%0>%9xcpl$x4dYzL&$tNp zB@>pR_j3RgnRbIZa&;UDm>m8cFu@rpX6PGm8P5A z&L~6NHYfBz8cyr0#8+=<6317Wo!s`wTy!q8?6ZKKtQ*YmC@3>rSSR|X0{DN1k4>S$ zBch9j$uJ0g&VKYJppMWeo(j!aVMP;^FKn$?2lOUNj~&CZPpFfMp%EyxS=?nF5BcE3Wx)V1R1OERnF=egEz1{u}v6n7oQ@pCl8 zFqQ9vu+E*X~?UDF)53n7RvV5Cf@HQ_w^nV`c06GV>Nd3+C7ugn(OL-%9<+Q zz|ZUzO@U5PURjLOZ38%cqKz-Mh*^O*K~wW3trW=i>_YoZr%CE;jD@O3IqeUvfBrhf z7LJKe$EtRMRD*ECg*|DUU!OkyslnGUAKMS2jO|&TiJ!ZFLt4Ms>9ghOexDlgGi1|h z!4LQiWl6qH?qLibiMSS<+d@$i1L%gGmyRaGt9KZSH<4exKN!s7%vJV+Xc>TbjK~Ga zjxc>50oQuF|9~;1kkwxd-BQ_ky837|)8McKJmjW!-@F98DEkK9;q{OPKGn->oI941 z={6ltOtXYOuO!QfUiM3pIcVN}_wtN968_-yntNmM0E$ZS7mW7n=t{G`r@rrJ%La-b z zeod63v?7WzX!pPXXCOu{q8Dlab|92@HkO((G}ler{XmQerPQ04A_2)4JQ zH&hQRzw?M$+m2TKJJ*BT;nTPN(OiZyOwVLiiEj=dt?f7Q%M@{j4r+^TfBVN`#Ydd` zImiV-#~Z$Vib4n?G&Hj{jv?^R%Z5Ev$I<#=G91{OD)Z3uFa2gNi)ab!yYY{Rc6J}Z zBCDKwc-61a$eL9a9Fx|*Ty_o@0? z;0yBmAem5cRK(wCT}kHG1885Q{D#X;o}DDIyD!_xB0n1XaI}PPL>s3*PXY5rUg!2V zk9r&7Np7PmR$_f+0{5q;FPfK0Q1$i^-5h_c3jbgNhw~_J_vfsLEG-|Zik^t{&%jD7 zt7{p_;Y}*->1r@Y@&r;$K~5f^a9c8Bms#zEyyovn8Y=0-RRIE!bw8EP(XFRE z1bouW6hhe{fIdLsWKdQc3e!pHOIuI(t+I2hdEdg~5$tY_dMGA*xBfmRaFEo6Djm=R zEr8PT=;GeN-#6ROzGF^4JO^}_aG4&99DZTzy!Q)+LjACaK(19%WY(?=G zi*xq_6}r<;B>Q5y$y6So^R#HJ(64I|Q*ygtpDJvqFXtctwq{~LiOgXoq=2tf)ksj> zlB1_Wa`uj6^;Ia9Z8#@uMpi`|(9qEa`|LSq{wyN$J&SScy2bs4#A0{6?CXujO(~p! zjhkZ8--!9eul*?q1A6EUvJLn{YWVgk`VT+%v3j`*}_(* z-%xN$;QOMN?1@?jR#W(6$heHxAfZ2wLrIGj7nUF~c-R|R*?aFeRC9KGpPq;ro0Z7A zsO+%u>;(R0ZI$J-H)X>+4p@(`#owTCoqoai)4(hJhYK^xOxl;UkdYTpBIi3g6-(J* z(eH_mqSqU!jI0yVk_Fy6Qmx|a&uDr_i|dG)3US7(UkGlFE=QKuo^RwAT2FPlcMBiW zl=Po_A|{``_+xCs-oniuQuMKq<>f#mP5TFa64U#jr{eEI__VG}+@;J?Q|qA3;51xv zwN_o4*mZK}+uf0=>Azs>idW({U=b%Sp@A2Bi=OYri1SOLuCb|V-ci;pW2JCf|* zk=IqYRdXxaDOOikkyG5>W60atsqzH@!27!M=XnO1)E>BoejdD z&wb$#?+fqmCCUK)xBCyLJa2u70xn(1mjSMlc=4|gWMC>)T6BdFKtFpuaasr3h+Ck5 z+@V5b=JB=~zi~)@@}ec&BoQrRe(?+&dVez_gG3dECH0>^zGIPTOx<8h(JK{bbei$y zb*SigPg#29`nwW;QT$?Z-jKhoK?qrs=w5aAxV?mbX4xMPHL5fXC50FP)ZbTH7*U0W zP@afw_5BjsJ3&jF8`7R;NjL0-6L7J^;M+LCzm{7UIbpZT^fo+g^MBVJD!a>=o|Ne# zR<0H6qe&;&)S*0i=IJvv^>=9E_OAwVOy@WAJ;0--P_f8D*z0&m@Amo001HP)MDw*m zm5VFgk6{}h&gdjIJirB_{D4j`;YzH@+j3+NX~ok@3zJ}$%0Db~PcWu%MqSC5egg$A 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�)WTYVy| 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 literal 0 HcmV?d00001 diff --git a/yarn-project/noir-libs/aztec-noir/Nargo.toml b/yarn-project/aztec-nr/aztec/Nargo.toml similarity index 100% rename from yarn-project/noir-libs/aztec-noir/Nargo.toml rename to yarn-project/aztec-nr/aztec/Nargo.toml diff --git a/yarn-project/noir-libs/aztec-noir/src/abi.nr b/yarn-project/aztec-nr/aztec/src/abi.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/abi.nr rename to yarn-project/aztec-nr/aztec/src/abi.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/auth.nr b/yarn-project/aztec-nr/aztec/src/auth.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/auth.nr rename to yarn-project/aztec-nr/aztec/src/auth.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/constants_gen.nr b/yarn-project/aztec-nr/aztec/src/constants_gen.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/constants_gen.nr rename to yarn-project/aztec-nr/aztec/src/constants_gen.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/context.nr b/yarn-project/aztec-nr/aztec/src/context.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/context.nr rename to yarn-project/aztec-nr/aztec/src/context.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/entrypoint.nr b/yarn-project/aztec-nr/aztec/src/entrypoint.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/entrypoint.nr rename to yarn-project/aztec-nr/aztec/src/entrypoint.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/lib.nr b/yarn-project/aztec-nr/aztec/src/lib.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/lib.nr rename to yarn-project/aztec-nr/aztec/src/lib.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/log.nr b/yarn-project/aztec-nr/aztec/src/log.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/log.nr rename to yarn-project/aztec-nr/aztec/src/log.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/messaging.nr b/yarn-project/aztec-nr/aztec/src/messaging.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/messaging.nr rename to yarn-project/aztec-nr/aztec/src/messaging.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/messaging/l1_to_l2_message.nr b/yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/messaging/l1_to_l2_message.nr rename to yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/messaging/l1_to_l2_message_getter_data.nr b/yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message_getter_data.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/messaging/l1_to_l2_message_getter_data.nr rename to yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message_getter_data.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note.nr b/yarn-project/aztec-nr/aztec/src/note.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note.nr rename to yarn-project/aztec-nr/aztec/src/note.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/lifecycle.nr b/yarn-project/aztec-nr/aztec/src/note/lifecycle.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/lifecycle.nr rename to yarn-project/aztec-nr/aztec/src/note/lifecycle.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/note_getter.nr b/yarn-project/aztec-nr/aztec/src/note/note_getter.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/note_getter.nr rename to yarn-project/aztec-nr/aztec/src/note/note_getter.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/note_getter_options.nr b/yarn-project/aztec-nr/aztec/src/note/note_getter_options.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/note_getter_options.nr rename to yarn-project/aztec-nr/aztec/src/note/note_getter_options.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/note_hash.nr b/yarn-project/aztec-nr/aztec/src/note/note_hash.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/note_hash.nr rename to yarn-project/aztec-nr/aztec/src/note/note_hash.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/note_header.nr b/yarn-project/aztec-nr/aztec/src/note/note_header.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/note_header.nr rename to yarn-project/aztec-nr/aztec/src/note/note_header.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/note_interface.nr b/yarn-project/aztec-nr/aztec/src/note/note_interface.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/note_interface.nr rename to yarn-project/aztec-nr/aztec/src/note/note_interface.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/note_viewer_options.nr b/yarn-project/aztec-nr/aztec/src/note/note_viewer_options.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/note_viewer_options.nr rename to yarn-project/aztec-nr/aztec/src/note/note_viewer_options.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/note/utils.nr b/yarn-project/aztec-nr/aztec/src/note/utils.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/note/utils.nr rename to yarn-project/aztec-nr/aztec/src/note/utils.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle.nr b/yarn-project/aztec-nr/aztec/src/oracle.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle.nr rename to yarn-project/aztec-nr/aztec/src/oracle.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/arguments.nr b/yarn-project/aztec-nr/aztec/src/oracle/arguments.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/arguments.nr rename to yarn-project/aztec-nr/aztec/src/oracle/arguments.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/call_private_function.nr b/yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/call_private_function.nr rename to yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/compute_selector.nr b/yarn-project/aztec-nr/aztec/src/oracle/compute_selector.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/compute_selector.nr rename to yarn-project/aztec-nr/aztec/src/oracle/compute_selector.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/context.nr b/yarn-project/aztec-nr/aztec/src/oracle/context.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/context.nr rename to yarn-project/aztec-nr/aztec/src/oracle/context.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/create_commitment.nr b/yarn-project/aztec-nr/aztec/src/oracle/create_commitment.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/create_commitment.nr rename to yarn-project/aztec-nr/aztec/src/oracle/create_commitment.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/debug_log.nr b/yarn-project/aztec-nr/aztec/src/oracle/debug_log.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/debug_log.nr rename to yarn-project/aztec-nr/aztec/src/oracle/debug_log.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/enqueue_public_function_call.nr b/yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/enqueue_public_function_call.nr rename to yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/get_l1_to_l2_message.nr b/yarn-project/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/get_l1_to_l2_message.nr rename to yarn-project/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/get_public_key.nr b/yarn-project/aztec-nr/aztec/src/oracle/get_public_key.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/get_public_key.nr rename to yarn-project/aztec-nr/aztec/src/oracle/get_public_key.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/get_secret_key.nr b/yarn-project/aztec-nr/aztec/src/oracle/get_secret_key.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/get_secret_key.nr rename to yarn-project/aztec-nr/aztec/src/oracle/get_secret_key.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/logs.nr b/yarn-project/aztec-nr/aztec/src/oracle/logs.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/logs.nr rename to yarn-project/aztec-nr/aztec/src/oracle/logs.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/notes.nr b/yarn-project/aztec-nr/aztec/src/oracle/notes.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/notes.nr rename to yarn-project/aztec-nr/aztec/src/oracle/notes.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/public_call.nr b/yarn-project/aztec-nr/aztec/src/oracle/public_call.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/public_call.nr rename to yarn-project/aztec-nr/aztec/src/oracle/public_call.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/rand.nr b/yarn-project/aztec-nr/aztec/src/oracle/rand.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/rand.nr rename to yarn-project/aztec-nr/aztec/src/oracle/rand.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/oracle/storage.nr b/yarn-project/aztec-nr/aztec/src/oracle/storage.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/oracle/storage.nr rename to yarn-project/aztec-nr/aztec/src/oracle/storage.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/private_call_stack_item.nr b/yarn-project/aztec-nr/aztec/src/private_call_stack_item.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/private_call_stack_item.nr rename to yarn-project/aztec-nr/aztec/src/private_call_stack_item.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/public_call_stack_item.nr b/yarn-project/aztec-nr/aztec/src/public_call_stack_item.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/public_call_stack_item.nr rename to yarn-project/aztec-nr/aztec/src/public_call_stack_item.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars.nr b/yarn-project/aztec-nr/aztec/src/state_vars.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/state_vars.nr rename to yarn-project/aztec-nr/aztec/src/state_vars.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars/immutable_singleton.nr b/yarn-project/aztec-nr/aztec/src/state_vars/immutable_singleton.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/state_vars/immutable_singleton.nr rename to yarn-project/aztec-nr/aztec/src/state_vars/immutable_singleton.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars/map.nr b/yarn-project/aztec-nr/aztec/src/state_vars/map.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/state_vars/map.nr rename to yarn-project/aztec-nr/aztec/src/state_vars/map.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars/public_state.nr b/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/state_vars/public_state.nr rename to yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars/set.nr b/yarn-project/aztec-nr/aztec/src/state_vars/set.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/state_vars/set.nr rename to yarn-project/aztec-nr/aztec/src/state_vars/set.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/state_vars/singleton.nr b/yarn-project/aztec-nr/aztec/src/state_vars/singleton.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/state_vars/singleton.nr rename to yarn-project/aztec-nr/aztec/src/state_vars/singleton.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types.nr b/yarn-project/aztec-nr/aztec/src/types.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types.nr rename to yarn-project/aztec-nr/aztec/src/types.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types/grumpkin_scalar.nr b/yarn-project/aztec-nr/aztec/src/types/grumpkin_scalar.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types/grumpkin_scalar.nr rename to yarn-project/aztec-nr/aztec/src/types/grumpkin_scalar.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types/point.nr b/yarn-project/aztec-nr/aztec/src/types/point.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types/point.nr rename to yarn-project/aztec-nr/aztec/src/types/point.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types/type_serialisation.nr b/yarn-project/aztec-nr/aztec/src/types/type_serialisation.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types/type_serialisation.nr rename to yarn-project/aztec-nr/aztec/src/types/type_serialisation.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types/type_serialisation/bool_serialisation.nr b/yarn-project/aztec-nr/aztec/src/types/type_serialisation/bool_serialisation.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types/type_serialisation/bool_serialisation.nr rename to yarn-project/aztec-nr/aztec/src/types/type_serialisation/bool_serialisation.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types/type_serialisation/field_serialisation.nr b/yarn-project/aztec-nr/aztec/src/types/type_serialisation/field_serialisation.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types/type_serialisation/field_serialisation.nr rename to yarn-project/aztec-nr/aztec/src/types/type_serialisation/field_serialisation.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types/type_serialisation/u32_serialisation.nr b/yarn-project/aztec-nr/aztec/src/types/type_serialisation/u32_serialisation.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types/type_serialisation/u32_serialisation.nr rename to yarn-project/aztec-nr/aztec/src/types/type_serialisation/u32_serialisation.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/types/vec.nr b/yarn-project/aztec-nr/aztec/src/types/vec.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/types/vec.nr rename to yarn-project/aztec-nr/aztec/src/types/vec.nr diff --git a/yarn-project/noir-libs/aztec-noir/src/utils.nr b/yarn-project/aztec-nr/aztec/src/utils.nr similarity index 100% rename from yarn-project/noir-libs/aztec-noir/src/utils.nr rename to yarn-project/aztec-nr/aztec/src/utils.nr diff --git a/yarn-project/noir-libs/easy-private-state/Nargo.toml b/yarn-project/aztec-nr/easy-private-state/Nargo.toml similarity index 81% rename from yarn-project/noir-libs/easy-private-state/Nargo.toml rename to yarn-project/aztec-nr/easy-private-state/Nargo.toml index eef8798d8c8..c6364218f27 100644 --- a/yarn-project/noir-libs/easy-private-state/Nargo.toml +++ b/yarn-project/aztec-nr/easy-private-state/Nargo.toml @@ -5,5 +5,5 @@ compiler_version = "0.7.1" type = "lib" [dependencies] -aztec = { path = "../aztec-noir" } +aztec = { path = "../aztec" } value_note = { path = "../value-note" } \ No newline at end of file diff --git a/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr b/yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr similarity index 100% rename from yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr rename to yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr diff --git a/yarn-project/noir-libs/easy-private-state/src/lib.nr b/yarn-project/aztec-nr/easy-private-state/src/lib.nr similarity index 100% rename from yarn-project/noir-libs/easy-private-state/src/lib.nr rename to yarn-project/aztec-nr/easy-private-state/src/lib.nr diff --git a/yarn-project/noir-libs/safe-math/Nargo.toml b/yarn-project/aztec-nr/safe-math/Nargo.toml similarity index 100% rename from yarn-project/noir-libs/safe-math/Nargo.toml rename to yarn-project/aztec-nr/safe-math/Nargo.toml diff --git a/yarn-project/noir-libs/safe-math/src/lib.nr b/yarn-project/aztec-nr/safe-math/src/lib.nr similarity index 100% rename from yarn-project/noir-libs/safe-math/src/lib.nr rename to yarn-project/aztec-nr/safe-math/src/lib.nr diff --git a/yarn-project/noir-libs/safe-math/src/safe_u120.nr b/yarn-project/aztec-nr/safe-math/src/safe_u120.nr similarity index 100% rename from yarn-project/noir-libs/safe-math/src/safe_u120.nr rename to yarn-project/aztec-nr/safe-math/src/safe_u120.nr diff --git a/yarn-project/noir-libs/value-note/Nargo.toml b/yarn-project/aztec-nr/value-note/Nargo.toml similarity index 76% rename from yarn-project/noir-libs/value-note/Nargo.toml rename to yarn-project/aztec-nr/value-note/Nargo.toml index 7f527d67f21..d0e7bb52461 100644 --- a/yarn-project/noir-libs/value-note/Nargo.toml +++ b/yarn-project/aztec-nr/value-note/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.7.1" type = "lib" [dependencies] -aztec = { path = "../aztec-noir" } \ No newline at end of file +aztec = { path = "../aztec" } \ No newline at end of file diff --git a/yarn-project/noir-libs/value-note/src/balance_utils.nr b/yarn-project/aztec-nr/value-note/src/balance_utils.nr similarity index 100% rename from yarn-project/noir-libs/value-note/src/balance_utils.nr rename to yarn-project/aztec-nr/value-note/src/balance_utils.nr diff --git a/yarn-project/noir-libs/value-note/src/filter.nr b/yarn-project/aztec-nr/value-note/src/filter.nr similarity index 100% rename from yarn-project/noir-libs/value-note/src/filter.nr rename to yarn-project/aztec-nr/value-note/src/filter.nr diff --git a/yarn-project/noir-libs/value-note/src/lib.nr b/yarn-project/aztec-nr/value-note/src/lib.nr similarity index 100% rename from yarn-project/noir-libs/value-note/src/lib.nr rename to yarn-project/aztec-nr/value-note/src/lib.nr diff --git a/yarn-project/noir-libs/value-note/src/utils.nr b/yarn-project/aztec-nr/value-note/src/utils.nr similarity index 100% rename from yarn-project/noir-libs/value-note/src/utils.nr rename to yarn-project/aztec-nr/value-note/src/utils.nr diff --git a/yarn-project/noir-libs/value-note/src/value_note.nr b/yarn-project/aztec-nr/value-note/src/value_note.nr similarity index 100% rename from yarn-project/noir-libs/value-note/src/value_note.nr rename to yarn-project/aztec-nr/value-note/src/value_note.nr diff --git a/yarn-project/aztec.js/src/account/entrypoint/entrypoint_payload.ts b/yarn-project/aztec.js/src/account/entrypoint/entrypoint_payload.ts index 56bc26c9207..6d41291437b 100644 --- a/yarn-project/aztec.js/src/account/entrypoint/entrypoint_payload.ts +++ b/yarn-project/aztec.js/src/account/entrypoint/entrypoint_payload.ts @@ -5,7 +5,7 @@ import { FunctionCall, PackedArguments, emptyFunctionCall } from '@aztec/types'; import partition from 'lodash.partition'; -// These must match the values defined in yarn-project/noir-libs/aztec-noir/src/entrypoint.nr +// These must match the values defined in yarn-project/aztec-nr/aztec/src/entrypoint.nr export const ACCOUNT_MAX_PRIVATE_CALLS = 2; export const ACCOUNT_MAX_PUBLIC_CALLS = 2; diff --git a/yarn-project/aztec.js/src/utils/cheat_codes.ts b/yarn-project/aztec.js/src/utils/cheat_codes.ts index d5e644e6ff4..fc3fe96c080 100644 --- a/yarn-project/aztec.js/src/utils/cheat_codes.ts +++ b/yarn-project/aztec.js/src/utils/cheat_codes.ts @@ -234,7 +234,7 @@ export class AztecCheatCodes { */ public computeSlotInMap(baseSlot: Fr | bigint, key: Fr | bigint | AztecAddress): Fr { // Based on `at` function in - // aztec3-packages/yarn-project/noir-libs/aztec-noir/src/state_vars/map.nr + // aztec3-packages/yarn-project/aztec-nr/aztec/src/state_vars/map.nr return Fr.fromBuffer( pedersenPlookupCommitInputs( this.wasm, diff --git a/yarn-project/circuits.js/src/cbind/constants.in.ts b/yarn-project/circuits.js/src/cbind/constants.in.ts index 68bf902704b..300e676a207 100644 --- a/yarn-project/circuits.js/src/cbind/constants.in.ts +++ b/yarn-project/circuits.js/src/cbind/constants.in.ts @@ -39,7 +39,7 @@ async function main(): Promise { processEnumNoir(privateStateNoteGeneratorIndexEnum, 'PRIVATE_STATE_NOTE_GENERATOR_INDEX__') + processEnumNoir(privateStateTypeEnum, 'PRIVATE_STATE_TYPE__'); - const noirTargetPath = join(__dirname, '../../../noir-libs/aztec-noir/src/constants_gen.nr'); + const noirTargetPath = join(__dirname, '../../../aztec-nr/aztec/src/constants_gen.nr'); fs.writeFileSync(noirTargetPath, resultNoir); // Solidity diff --git a/yarn-project/noir-contracts/README.md b/yarn-project/noir-contracts/README.md index 33d3ea1518b..7a227dddf9b 100644 --- a/yarn-project/noir-contracts/README.md +++ b/yarn-project/noir-contracts/README.md @@ -122,7 +122,7 @@ It has prebuilt binaries and is super easy to install using `noirup` compiler_version = "0.7.1" [dependencies] - aztec = { path = "../../../../noir-libs/aztec-noir" } + aztec = { path = "../../../../aztec-nr/aztec" } ``` 4. Replace the content of the generated `example_contract/src/main.nr` file with your contract code. diff --git a/yarn-project/noir-contracts/scripts/get_all_libraries.sh b/yarn-project/noir-contracts/scripts/get_all_libraries.sh index e1aa684e3fa..3220187ae3c 100755 --- a/yarn-project/noir-contracts/scripts/get_all_libraries.sh +++ b/yarn-project/noir-contracts/scripts/get_all_libraries.sh @@ -1,3 +1,3 @@ #!/bin/bash -# Utility to get the names of all noir libaries located in ../noir-libs -echo $(ls -d ../noir-libs/*/Nargo.toml | sed -r "s/..\\/noir-libs\\/(.+)\\/Nargo.toml/\\1/") \ No newline at end of file +# Utility to get the names of all noir libaries located in ../aztec-nr +echo $(ls -d ../aztec-nr/*/Nargo.toml | sed -r "s/..\\/aztec-nr\\/(.+)\\/Nargo.toml/\\1/") \ No newline at end of file diff --git a/yarn-project/noir-contracts/scripts/nargo_test.sh b/yarn-project/noir-contracts/scripts/nargo_test.sh index 5635759ff73..8468c19f492 100755 --- a/yarn-project/noir-contracts/scripts/nargo_test.sh +++ b/yarn-project/noir-contracts/scripts/nargo_test.sh @@ -38,7 +38,7 @@ test() { nargo test --package ${PROJECT_NAME}_contract else echo "Testing library $PROJECT_NAME..." - cd ../noir-libs/$PROJECT_NAME + cd ../aztec-nr/$PROJECT_NAME nargo test fi } diff --git a/yarn-project/noir-contracts/src/contracts/card_game_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/card_game_contract/Nargo.toml index 58853dc1a57..566a99dc488 100644 --- a/yarn-project/noir-contracts/src/contracts/card_game_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/card_game_contract/Nargo.toml @@ -5,5 +5,5 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} diff --git a/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml index 013af3ce22e..fe50f619436 100644 --- a/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/docs_example_contract/Nargo.toml index 7826fffbf0d..f5870a5a735 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/Nargo.toml index 4b8208cc51b..e8651b9783a 100644 --- a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/Nargo.toml @@ -5,6 +5,6 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} -easy_private_state = { path = "../../../../noir-libs/easy-private-state"} \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} +easy_private_state = { path = "../../../../aztec-nr/easy-private-state"} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml index 999b75a218a..b0e030b7808 100644 --- a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/escrow_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/escrow_contract/Nargo.toml index 4077357a075..6278ae9ddfb 100644 --- a/yarn-project/noir-contracts/src/contracts/escrow_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/escrow_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/import_test_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/import_test_contract/Nargo.toml index 21840bab59b..a00b14498de 100644 --- a/yarn-project/noir-contracts/src/contracts/import_test_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/import_test_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/lending_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/lending_contract/Nargo.toml index 8233a8c530c..dbdd8a1c4b2 100644 --- a/yarn-project/noir-contracts/src/contracts/lending_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/lending_contract/Nargo.toml @@ -5,5 +5,5 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -safe_math = { path = "../../../../noir-libs/safe-math" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } +safe_math = { path = "../../../../aztec-nr/safe-math" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/multi_transfer_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/multi_transfer_contract/Nargo.toml index 86574e53fc1..cccba64b2ea 100644 --- a/yarn-project/noir-contracts/src/contracts/multi_transfer_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/multi_transfer_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/native_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/native_token_contract/Nargo.toml index 42a0a9313a4..05cf9a92810 100644 --- a/yarn-project/noir-contracts/src/contracts/native_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/native_token_contract/Nargo.toml @@ -5,6 +5,6 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} non_native = { path = "../non_native_token_contract"} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml index d6c7fef03e1..5e51ed65b25 100644 --- a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml @@ -5,5 +5,5 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml index 850b3ad14e5..bde7ef065d0 100644 --- a/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/Nargo.toml index 1c0e84969da..c692b32fad3 100644 --- a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/Nargo.toml @@ -5,5 +5,5 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} diff --git a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/Nargo.toml index 4a8af37b776..6b07ad277f4 100644 --- a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/Nargo.toml @@ -5,5 +5,5 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/price_feed_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/price_feed_contract/Nargo.toml index be6246ac397..b414ff04bf7 100644 --- a/yarn-project/noir-contracts/src/contracts/price_feed_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/price_feed_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/Nargo.toml index 9f21c40d77e..c41c12b4351 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/Nargo.toml @@ -5,5 +5,5 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/private_token_contract/Nargo.toml index 0eb35564eec..f3e29ac1bf5 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/Nargo.toml @@ -7,6 +7,6 @@ type = "contract" [dependencies] # highlight-next-line:importing-aztec -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} # docs:end:importing-aztec \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml index 04489c04c7e..c3098dda9ee 100644 --- a/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml index 84c123fadee..4ac82f6b7e6 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_auth_witness_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/schnorr_auth_witness_account_contract/Nargo.toml index 77bd89399b3..9ff8c965953 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_auth_witness_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/schnorr_auth_witness_account_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_hardcoded_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/schnorr_hardcoded_account_contract/Nargo.toml index 218d93ac79d..586e246467d 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_hardcoded_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/schnorr_hardcoded_account_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_single_key_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/schnorr_single_key_account_contract/Nargo.toml index d1eff41f9ae..d02343f7772 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_single_key_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/schnorr_single_key_account_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml index 1d564c16ddd..c4818f6ba32 100644 --- a/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/token_contract/Nargo.toml index cece7de949c..6bc97909172 100644 --- a/yarn-project/noir-contracts/src/contracts/token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/token_contract/Nargo.toml @@ -5,6 +5,6 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } -value_note = { path = "../../../../noir-libs/value-note"} -safe_math = { path = "../../../../noir-libs/safe-math" } \ No newline at end of file +aztec = { path = "../../../../aztec-nr/aztec" } +value_note = { path = "../../../../aztec-nr/value-note"} +safe_math = { path = "../../../../aztec-nr/safe-math" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml index 21daac464fd..110b8eb98fe 100644 --- a/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = "0.1" type = "contract" [dependencies] -aztec = { path = "../../../../noir-libs/aztec-noir" } +aztec = { path = "../../../../aztec-nr/aztec" } From c46b3c8f848e7ff240eb466fa2f3f8aad96dc328 Mon Sep 17 00:00:00 2001 From: Lasse Herskind <16536249+LHerskind@users.noreply.github.com> Date: Wed, 13 Sep 2023 23:25:56 +0100 Subject: [PATCH 08/11] refactor: replace native token in lending contract (#2276) Fixes #2275. - Moves simulators into a separate simulator folder for easier access from other testfiles. - Refactors lending tests to be more similar to the token tests running "invariant" checks on `afterEach` - Burns borrowed asset when repaying --- .../src/e2e_lending_contract.test.ts | 744 +++++++----------- .../end-to-end/src/e2e_token_contract.test.ts | 103 +-- .../end-to-end/src/simulators/index.ts | 2 + .../src/simulators/lending_simulator.ts | 187 +++++ .../src/simulators/token_simulator.ts | 93 +++ .../lending_contract/src/interfaces.nr | 38 +- .../contracts/lending_contract/src/main.nr | 32 +- 7 files changed, 598 insertions(+), 601 deletions(-) create mode 100644 yarn-project/end-to-end/src/simulators/index.ts create mode 100644 yarn-project/end-to-end/src/simulators/lending_simulator.ts create mode 100644 yarn-project/end-to-end/src/simulators/token_simulator.ts diff --git a/yarn-project/end-to-end/src/e2e_lending_contract.test.ts b/yarn-project/end-to-end/src/e2e_lending_contract.test.ts index efc5b8843d4..d9b31c0315e 100644 --- a/yarn-project/end-to-end/src/e2e_lending_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_lending_contract.test.ts @@ -4,21 +4,30 @@ import { Account, AuthWitnessAccountContract, AuthWitnessEntrypointWallet, - AztecAddress, CheatCodes, Fr, IAuthWitnessAccountEntrypoint, + SentTx, computeMessageSecretHash, } from '@aztec/aztec.js'; import { CircuitsWasm, CompleteAddress, FunctionSelector, GeneratorIndex, GrumpkinScalar } from '@aztec/circuits.js'; -import { pedersenPlookupCommitInputs, pedersenPlookupCompressWithHashIndex } from '@aztec/circuits.js/barretenberg'; +import { pedersenPlookupCompressWithHashIndex } from '@aztec/circuits.js/barretenberg'; import { DebugLogger } from '@aztec/foundation/log'; -import { LendingContract, NativeTokenContract, PriceFeedContract } from '@aztec/noir-contracts/types'; +import { + LendingContract, + PriceFeedContract, + SchnorrAuthWitnessAccountContract, + TokenContract, +} from '@aztec/noir-contracts/types'; import { AztecRPC, TxStatus } from '@aztec/types'; +import { jest } from '@jest/globals'; + import { setup } from './fixtures/utils.js'; +import { LendingAccount, LendingSimulator, TokenSimulator } from './simulators/index.js'; describe('e2e_lending_contract', () => { + jest.setTimeout(100_000); let aztecNode: AztecNodeService | undefined; let aztecRpcServer: AztecRPC; let wallet: AuthWitnessEntrypointWallet; @@ -26,83 +35,105 @@ describe('e2e_lending_contract', () => { let logger: DebugLogger; let cc: CheatCodes; + const TIME_JUMP = 100; + + let lendingContract: LendingContract; + let priceFeedContract: PriceFeedContract; + let collateralAsset: TokenContract; + let stableCoin: TokenContract; - const WAD = 10n ** 18n; - const BASE = 10n ** 9n; + let lendingAccount: LendingAccount; + let lendingSim: LendingSimulator; + + const waitForSuccess = async (tx: SentTx) => { + const receipt = await tx.wait(); + expect(receipt.status).toBe(TxStatus.MINED); + return receipt; + }; - const deployContracts = async (owner: AztecAddress) => { + const deployContracts = async () => { let lendingContract: LendingContract; let priceFeedContract: PriceFeedContract; - let collateralAsset: NativeTokenContract; - let stableCoin: NativeTokenContract; + let collateralAsset: TokenContract; + let stableCoin: TokenContract; { logger(`Deploying price feed contract...`); - const tx = PriceFeedContract.deploy(wallet).send(); - logger(`Tx sent with hash ${await tx.getTxHash()}`); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); + const receipt = await waitForSuccess(PriceFeedContract.deploy(wallet).send()); logger(`Price feed deployed to ${receipt.contractAddress}`); priceFeedContract = await PriceFeedContract.at(receipt.contractAddress!, wallet); } { logger(`Deploying collateral asset feed contract...`); - const tx = NativeTokenContract.deploy(wallet, 10000n, owner).send(); - logger(`Tx sent with hash ${await tx.getTxHash()}`); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); + const receipt = await waitForSuccess(TokenContract.deploy(wallet).send()); logger(`Collateral asset deployed to ${receipt.contractAddress}`); - collateralAsset = await NativeTokenContract.at(receipt.contractAddress!, wallet); + collateralAsset = await TokenContract.at(receipt.contractAddress!, wallet); } { logger(`Deploying stable coin contract...`); - const tx = NativeTokenContract.deploy(wallet, 0n, owner).send(); - logger(`Tx sent with hash ${await tx.getTxHash()}`); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); + const receipt = await waitForSuccess(TokenContract.deploy(wallet).send()); logger(`Stable coin asset deployed to ${receipt.contractAddress}`); - stableCoin = await NativeTokenContract.at(receipt.contractAddress!, wallet); + stableCoin = await TokenContract.at(receipt.contractAddress!, wallet); } { logger(`Deploying L2 public contract...`); - const tx = LendingContract.deploy(wallet).send(); - logger(`Tx sent with hash ${await tx.getTxHash()}`); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); + const receipt = await waitForSuccess(LendingContract.deploy(wallet).send()); logger(`CDP deployed at ${receipt.contractAddress}`); lendingContract = await LendingContract.at(receipt.contractAddress!, wallet); } + + await waitForSuccess(collateralAsset.methods._initialize(accounts[0]).send()); + await waitForSuccess(collateralAsset.methods.set_minter({ address: lendingContract.address }, 1).send()); + await waitForSuccess(stableCoin.methods._initialize(accounts[0]).send()); + await waitForSuccess(stableCoin.methods.set_minter({ address: lendingContract.address }, 1).send()); + return { priceFeedContract, lendingContract, collateralAsset, stableCoin }; }; - beforeEach(async () => { + beforeAll(async () => { ({ aztecNode, aztecRpcServer, logger, cheatCodes: cc } = await setup(0)); - { - const privateKey = GrumpkinScalar.random(); - const account = new Account(aztecRpcServer, privateKey, new AuthWitnessAccountContract(privateKey)); - const deployTx = await account.deploy(); - await deployTx.wait({ interval: 0.1 }); - wallet = new AuthWitnessEntrypointWallet( - aztecRpcServer, - (await account.getEntrypoint()) as unknown as IAuthWitnessAccountEntrypoint, - await account.getCompleteAddress(), - ); - accounts = await wallet.getAccounts(); - } - }, 100_000); + const privateKey = GrumpkinScalar.random(); + const account = new Account(aztecRpcServer, privateKey, new AuthWitnessAccountContract(privateKey)); + const deployTx = await account.deploy(); + await deployTx.wait({ interval: 0.1 }); + wallet = new AuthWitnessEntrypointWallet( + aztecRpcServer, + (await account.getEntrypoint()) as unknown as IAuthWitnessAccountEntrypoint, + await account.getCompleteAddress(), + ); + accounts = await wallet.getAccounts(); - afterEach(async () => { + ({ lendingContract, priceFeedContract, collateralAsset, stableCoin } = await deployContracts()); + lendingAccount = new LendingAccount(accounts[0].address, new Fr(42)); + + // Also specified in `noir-contracts/src/contracts/lending_contract/src/main.nr` + const rate = 1268391679n; + lendingSim = new LendingSimulator( + cc, + lendingAccount, + rate, + lendingContract, + new TokenSimulator(collateralAsset, logger, [lendingContract.address, ...accounts.map(a => a.address)]), + new TokenSimulator(stableCoin, logger, [lendingContract.address, ...accounts.map(a => a.address)]), + ); + }, 200_000); + + afterAll(async () => { await aztecNode?.stop(); if (aztecRpcServer instanceof AztecRPCServer) { await aztecRpcServer?.stop(); } }); + afterEach(async () => { + await lendingSim.check(); + }); + const hashPayload = async (payload: Fr[]) => { return pedersenPlookupCompressWithHashIndex( await CircuitsWasm.get(), @@ -111,265 +142,59 @@ describe('e2e_lending_contract', () => { ); }; - // Fetch a storage snapshot from the contract that we can use to compare between transitions. - const getStorageSnapshot = async ( - lendingContract: LendingContract, - collateralAsset: NativeTokenContract, - stableCoin: NativeTokenContract, - account: LendingAccount, - ) => { - logger('Fetching storage snapshot 📸 '); - const accountKey = await account.key(); - - const tot = await lendingContract.methods.get_asset(0).view(); - const privatePos = await lendingContract.methods.get_position(accountKey).view(); - const publicPos = await lendingContract.methods.get_position(account.address.toField()).view(); - const totalCollateral = await collateralAsset.methods.public_balance_of(lendingContract.address).view(); - - return { - interestAccumulator: new Fr(tot['interest_accumulator']), - lastUpdatedTs: new Fr(tot['last_updated_ts']), - privateCollateral: new Fr(privatePos['collateral']), - privateStaticDebt: new Fr(privatePos['static_debt']), - privateDebt: new Fr(privatePos['debt']), - publicCollateral: new Fr(publicPos['collateral']), - publicStaticDebt: new Fr(publicPos['static_debt']), - publicDebt: new Fr(publicPos['debt']), - totalCollateral: new Fr(totalCollateral), - stableCoinLending: new Fr(await stableCoin.methods.public_balance_of(lendingContract.address).view()), - stableCoinPublic: new Fr(await stableCoin.methods.public_balance_of(account.address).view()), - stableCoinPrivate: new Fr(await stableCoin.methods.balance_of(account.address).view()), - stableCoinSupply: new Fr(await stableCoin.methods.total_supply().view()), - }; - }; - - // Convenience struct to hold an account's address and secret that can easily be passed around. - // Contains utilities to compute the "key" for private holdings in the public state. - class LendingAccount { - public readonly address: AztecAddress; - public readonly secret: Fr; - - constructor(address: AztecAddress, secret: Fr) { - this.address = address; - this.secret = secret; - } - - public async key(): Promise { - return Fr.fromBuffer( - pedersenPlookupCommitInputs( - await CircuitsWasm.get(), - [this.address, this.secret].map(f => f.toBuffer()), - ), - ); - } - } - - const muldivDown = (a: bigint, b: bigint, c: bigint) => (a * b) / c; - - const muldivUp = (a: bigint, b: bigint, c: bigint) => { - const adder = (a * b) % c > 0n ? 1n : 0n; - return muldivDown(a, b, c) + adder; - }; - - const computeMultiplier = (rate: bigint, dt: bigint) => { - if (dt == 0n) { - return BASE; - } - - const expMinusOne = dt - 1n; - const expMinusTwo = dt > 2 ? dt - 2n : 0n; - - const basePowerTwo = muldivDown(rate, rate, WAD); - const basePowerThree = muldivDown(basePowerTwo, rate, WAD); - - const temp = dt * expMinusOne; - const secondTerm = muldivDown(temp, basePowerTwo, 2n); - const thirdTerm = muldivDown(temp * expMinusTwo, basePowerThree, 6n); - - const offset = (dt * rate + secondTerm + thirdTerm) / (WAD / BASE); - - return BASE + offset; - }; - - // Helper class that emulates the logic of the lending contract. Used to have a "twin" to check values against. - class LendingSimulator { - public accumulator: bigint = BASE; - public time: number = 0; - - private collateral: { [key: string]: Fr } = {}; - private staticDebt: { [key: string]: Fr } = {}; - private stableBalance: { [key: string]: Fr } = {}; - private repaid: bigint = 0n; - - private key: Fr = Fr.ZERO; - - constructor(private cc: CheatCodes, private account: LendingAccount, private rate: bigint) {} - - async prepare() { - this.key = await this.account.key(); - const ts = await this.cc.eth.timestamp(); - this.time = ts + 10 + (ts % 10); - await this.cc.aztec.warp(this.time); - } - - async progressTime(diff: number) { - this.time = this.time + diff; - await this.cc.aztec.warp(this.time); - this.accumulator = muldivDown(this.accumulator, computeMultiplier(this.rate, BigInt(diff)), BASE); - } - - mintStable(to: Fr, amount: bigint) { - const balance = this.stableBalance[to.toString()] ?? Fr.ZERO; - this.stableBalance[to.toString()] = new Fr(balance.value + amount); - } - - deposit(onBehalfOf: Fr, amount: bigint) { - const coll = this.collateral[onBehalfOf.toString()] ?? Fr.ZERO; - this.collateral[onBehalfOf.toString()] = new Fr(coll.value + amount); - } - - withdraw(owner: Fr, amount: bigint) { - const coll = this.collateral[owner.toString()] ?? Fr.ZERO; - this.collateral[owner.toString()] = new Fr(coll.value - amount); - } - - borrow(owner: Fr, recipient: Fr, amount: bigint) { - const staticDebtBal = this.staticDebt[owner.toString()] ?? Fr.ZERO; - const increase = muldivUp(amount, BASE, this.accumulator); - this.staticDebt[owner.toString()] = new Fr(staticDebtBal.value + increase); - - const balance = this.stableBalance[recipient.toString()] ?? Fr.ZERO; - this.stableBalance[recipient.toString()] = new Fr(balance.value + amount); - } - - repay(owner: Fr, onBehalfOf: Fr, amount: bigint) { - const staticDebtBal = this.staticDebt[onBehalfOf.toString()] ?? Fr.ZERO; - const decrease = muldivDown(amount, BASE, this.accumulator); - this.staticDebt[onBehalfOf.toString()] = new Fr(staticDebtBal.value - decrease); - - const balance = this.stableBalance[owner.toString()] ?? Fr.ZERO; - this.stableBalance[owner.toString()] = new Fr(balance.value - amount); - this.repaid += amount; - } - - check(storage: { [key: string]: Fr }) { - expect(storage['interestAccumulator']).toEqual(new Fr(this.accumulator)); - expect(storage['lastUpdatedTs']).toEqual(new Fr(this.time)); - - // Private values - const keyPriv = this.key.toString(); - expect(storage['privateCollateral']).toEqual(this.collateral[keyPriv] ?? Fr.ZERO); - expect(storage['privateStaticDebt']).toEqual(this.staticDebt[keyPriv] ?? Fr.ZERO); - expect(storage['privateDebt'].value).toEqual( - muldivUp((this.staticDebt[keyPriv] ?? Fr.ZERO).value, this.accumulator, BASE), - ); - - // Public values - const keyPub = this.account.address.toString(); - expect(storage['publicCollateral']).toEqual(this.collateral[keyPub] ?? Fr.ZERO); - expect(storage['publicStaticDebt']).toEqual(this.staticDebt[keyPub] ?? Fr.ZERO); - expect(storage['publicDebt'].value).toEqual( - muldivUp((this.staticDebt[keyPub] ?? Fr.ZERO).value, this.accumulator, BASE), - ); - - const totalCollateral = Object.values(this.collateral).reduce((a, b) => new Fr(a.value + b.value), Fr.ZERO); - expect(storage['totalCollateral']).toEqual(totalCollateral); - - expect(storage['stableCoinLending'].value).toEqual(this.repaid); - expect(storage['stableCoinPublic']).toEqual(this.stableBalance[keyPub] ?? Fr.ZERO); - - // Abusing notation and using the `keyPriv` as if an address for private holdings of stable_coin while it has the same owner in reality. - expect(storage['stableCoinPrivate']).toEqual(this.stableBalance[keyPriv] ?? Fr.ZERO); - - const totalStableSupply = Object.values(this.stableBalance).reduce((a, b) => new Fr(a.value + b.value), Fr.ZERO); - // @todo @lherskind To be updated such that we burn assets on repay instead. - expect(storage['stableCoinSupply'].value).toEqual(totalStableSupply.value + this.repaid); - } - } - - it('Full lending run-through', async () => { - // Gotta use the actual auth witness account here and not the standard wallet. - const recipientFull = accounts[0]; - const recipient = recipientFull.address; - - const { lendingContract, priceFeedContract, collateralAsset, stableCoin } = await deployContracts(recipient); - - const lendingAccount = new LendingAccount(recipient, new Fr(42)); - - const storageSnapshots: { [key: string]: { [key: string]: Fr } } = {}; - - const setPrice = async (newPrice: bigint) => { - const tx = priceFeedContract.methods.set_price(0n, newPrice).send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - }; - - await setPrice(2n * 10n ** 9n); + it('Mint assets for later usage', async () => { + await waitForSuccess(priceFeedContract.methods.set_price(0n, 2n * 10n ** 9n).send()); { - // Minting some collateral in public so we got it at hand. - const tx = collateralAsset.methods.owner_mint_pub(lendingAccount.address, 10000n).send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - - const tx2 = collateralAsset.methods.approve(lendingContract.address, 10000n).send(); - const receipt2 = await tx2.wait(); - expect(receipt2.status).toBe(TxStatus.MINED); - - // Minting some collateral in private so we got it at hand. - const secret = Fr.random(); - const secretHash = await computeMessageSecretHash(secret); - const shieldAmount = 10000n; - const tx3 = stableCoin.methods.owner_mint_priv(shieldAmount, secretHash).send(); - const receipt3 = await tx3.wait(); - expect(receipt3.status).toBe(TxStatus.MINED); - - const tx4 = stableCoin.methods.redeemShield(shieldAmount, secret, recipient).send(); - const receipt4 = await tx4.wait(); - expect(receipt4.status).toBe(TxStatus.MINED); - - const tx5 = stableCoin.methods.approve(lendingContract.address, 10000n).send(); - const receipt5 = await tx5.wait(); - expect(receipt5.status).toBe(TxStatus.MINED); + const assets = [collateralAsset, stableCoin]; + const mintAmount = 10000n; + for (const asset of assets) { + const secret = Fr.random(); + const secretHash = await computeMessageSecretHash(secret); + + const a = asset.methods.mint_public({ address: lendingAccount.address }, mintAmount).send(); + const b = asset.methods.mint_private(mintAmount, secretHash).send(); + + await Promise.all([a, b].map(waitForSuccess)); + await waitForSuccess( + asset.methods.redeem_shield({ address: lendingAccount.address }, mintAmount, secret).send(), + ); + } } - // Also specified in `noir-contracts/src/contracts/lending_contract/src/main.nr` - const rate = 1268391679n; - const lendingSim = new LendingSimulator(cc, lendingAccount, rate); - await lendingSim.prepare(); - // To handle initial mint (we use these funds to refund privately without shielding first). - lendingSim.mintStable(await lendingAccount.key(), 10000n); + lendingSim.mintStableCoinOutsideLoan(lendingAccount.address, 10000n, true); + lendingSim.stableCoin.redeemShield(lendingAccount.address, 10000n); + lendingSim.mintStableCoinOutsideLoan(lendingAccount.address, 10000n, false); - { - // Initialize the contract values, setting the interest accumulator to 1e9 and the last updated timestamp to now. - logger('Initializing contract'); - const tx = lendingContract.methods - .init(priceFeedContract.address, 8000, collateralAsset.address, stableCoin.address) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['initial'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, - ); + lendingSim.collateralAsset.mintPrivate(10000n); + lendingSim.collateralAsset.redeemShield(lendingAccount.address, 10000n); + lendingSim.collateralAsset.mintPublic(lendingAccount.address, 10000n); + }); - lendingSim.check(storageSnapshots['initial']); - } + it('Initialize the contract', async () => { + await lendingSim.prepare(); + logger('Initializing contract'); + await waitForSuccess( + lendingContract.methods.init(priceFeedContract.address, 8000, collateralAsset.address, stableCoin.address).send(), + ); + }); - { + describe('Deposits', () => { + it('Depositing 🥸 : 💰 -> 🏦', async () => { const depositAmount = 420n; - + const nonce = Fr.random(); const messageHash = await hashPayload([ - FunctionSelector.fromSignature('unshieldTokens(Field,Field,Field)').toField(), - recipientFull.address.toField(), + lendingContract.address.toField(), + collateralAsset.address.toField(), + FunctionSelector.fromSignature('unshield((Field),(Field),Field,Field)').toField(), + lendingAccount.address.toField(), lendingContract.address.toField(), new Fr(depositAmount), + nonce, ]); await wallet.signAndAddAuthWitness(messageHash); - await lendingSim.progressTime(10); - lendingSim.deposit(await lendingAccount.key(), depositAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.depositPrivate(lendingAccount.address, await lendingAccount.key(), depositAmount); // Make a private deposit of funds into own account. // This should: @@ -377,58 +202,76 @@ describe('e2e_lending_contract', () => { // - increase last updated timestamp. // - increase the private collateral. logger('Depositing 🥸 : 💰 -> 🏦'); - const tx = lendingContract.methods - .deposit_private(lendingAccount.secret, lendingAccount.address, 0n, depositAmount, collateralAsset.address) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['private_deposit'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods + .deposit_private( + lendingAccount.address, + depositAmount, + nonce, + lendingAccount.secret, + 0n, + collateralAsset.address, + ) + .send(), ); + }); - lendingSim.check(storageSnapshots['private_deposit']); - } - - { + it('Depositing 🥸 on behalf of recipient: 💰 -> 🏦', async () => { const depositAmount = 421n; + const nonce = Fr.random(); const messageHash = await hashPayload([ - FunctionSelector.fromSignature('unshieldTokens(Field,Field,Field)').toField(), - recipientFull.address.toField(), + lendingContract.address.toField(), + collateralAsset.address.toField(), + FunctionSelector.fromSignature('unshield((Field),(Field),Field,Field)').toField(), + lendingAccount.address.toField(), lendingContract.address.toField(), new Fr(depositAmount), + nonce, ]); await wallet.signAndAddAuthWitness(messageHash); - await lendingSim.progressTime(10); - lendingSim.deposit(recipient.toField(), depositAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.depositPrivate(lendingAccount.address, lendingAccount.address.toField(), depositAmount); // Make a private deposit of funds into another account, in this case, a public account. // This should: // - increase the interest accumulator // - increase last updated timestamp. // - increase the public collateral. logger('Depositing 🥸 on behalf of recipient: 💰 -> 🏦'); - const tx = lendingContract.methods - .deposit_private(0n, lendingAccount.address, recipient.toField(), depositAmount, collateralAsset.address) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['private_deposit_on_behalf'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods + .deposit_private( + lendingAccount.address, + depositAmount, + nonce, + 0n, + lendingAccount.address, + collateralAsset.address, + ) + .send(), ); + }); - lendingSim.check(storageSnapshots['private_deposit_on_behalf']); - } - - { + it('Depositing: 💰 -> 🏦', async () => { const depositAmount = 211n; - await lendingSim.progressTime(10); - lendingSim.deposit(recipient.toField(), depositAmount); + + const nonce = Fr.random(); + const messageHash = await hashPayload([ + lendingContract.address.toField(), + collateralAsset.address.toField(), + FunctionSelector.fromSignature('transfer_public((Field),(Field),Field,Field)').toField(), + lendingAccount.address.toField(), + lendingContract.address.toField(), + new Fr(depositAmount), + nonce, + ]); + + // Add it to the wallet as approved + const me = await SchnorrAuthWitnessAccountContract.at(accounts[0].address, wallet); + await waitForSuccess(me.methods.set_is_valid_storage(messageHash, 1).send()); + + await lendingSim.progressTime(TIME_JUMP); + lendingSim.depositPublic(lendingAccount.address, lendingAccount.address.toField(), depositAmount); // Make a public deposit of funds into self. // This should: @@ -437,24 +280,31 @@ describe('e2e_lending_contract', () => { // - increase the public collateral. logger('Depositing: 💰 -> 🏦'); - const tx = lendingContract.methods - .deposit_public(lendingAccount.address, depositAmount, collateralAsset.address) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['public_deposit'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods + .deposit_public(depositAmount, nonce, lendingAccount.address, collateralAsset.address) + .send(), ); - lendingSim.check(storageSnapshots['public_deposit']); - } + }); + describe('failure cases', () => { + it('calling internal _deposit function directly', async () => { + // Try to call the internal `_deposit` function directly + // This should: + // - not change any storage values. + // - fail + + await expect( + lendingContract.methods._deposit(lendingAccount.address.toField(), 42n, collateralAsset.address).simulate(), + ).rejects.toThrow(); + }); + }); + }); - { + describe('Borrow', () => { + it('Borrow 🥸 : 🏦 -> 🍌', async () => { const borrowAmount = 69n; - await lendingSim.progressTime(10); - lendingSim.borrow(await lendingAccount.key(), lendingAccount.address.toField(), borrowAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.borrow(await lendingAccount.key(), lendingAccount.address, borrowAmount); // Make a private borrow using the private account // This should: @@ -463,25 +313,15 @@ describe('e2e_lending_contract', () => { // - increase the private debt. logger('Borrow 🥸 : 🏦 -> 🍌'); - const tx = lendingContract.methods - .borrow_private(lendingAccount.secret, lendingAccount.address, borrowAmount) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['private_borrow'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods.borrow_private(lendingAccount.secret, lendingAccount.address, borrowAmount).send(), ); + }); - lendingSim.check(storageSnapshots['private_borrow']); - } - - { + it('Borrow: 🏦 -> 🍌', async () => { const borrowAmount = 69n; - await lendingSim.progressTime(10); - lendingSim.borrow(recipient.toField(), lendingAccount.address.toField(), borrowAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.borrow(lendingAccount.address.toField(), lendingAccount.address, borrowAmount); // Make a public borrow using the private account // This should: @@ -490,31 +330,26 @@ describe('e2e_lending_contract', () => { // - increase the public debt. logger('Borrow: 🏦 -> 🍌'); - const tx = lendingContract.methods.borrow_public(lendingAccount.address, borrowAmount).send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['public_borrow'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, - ); - - lendingSim.check(storageSnapshots['public_borrow']); - } + await waitForSuccess(lendingContract.methods.borrow_public(lendingAccount.address, borrowAmount).send()); + }); + }); - { + describe('Repay', () => { + it('Repay 🥸 : 🍌 -> 🏦', async () => { const repayAmount = 20n; + const nonce = Fr.random(); const messageHash = await hashPayload([ - FunctionSelector.fromSignature('unshieldTokens(Field,Field,Field)').toField(), - recipientFull.address.toField(), lendingContract.address.toField(), + stableCoin.address.toField(), + FunctionSelector.fromSignature('burn((Field),Field,Field)').toField(), + lendingAccount.address.toField(), new Fr(repayAmount), + nonce, ]); await wallet.signAndAddAuthWitness(messageHash); - await lendingSim.progressTime(10); - lendingSim.repay(await lendingAccount.key(), await lendingAccount.key(), repayAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.repayPrivate(lendingAccount.address, await lendingAccount.key(), repayAmount); // Make a private repay of the debt in the private account // This should: @@ -523,33 +358,28 @@ describe('e2e_lending_contract', () => { // - decrease the private debt. logger('Repay 🥸 : 🍌 -> 🏦'); - const tx = lendingContract.methods - .repay_private(lendingAccount.secret, lendingAccount.address, 0n, repayAmount, stableCoin.address) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['private_repay'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods + .repay_private(lendingAccount.address, repayAmount, nonce, lendingAccount.secret, 0n, stableCoin.address) + .send(), ); + }); - lendingSim.check(storageSnapshots['private_repay']); - } - - { + it('Repay 🥸 on behalf of public: 🍌 -> 🏦', async () => { const repayAmount = 21n; + const nonce = Fr.random(); const messageHash = await hashPayload([ - FunctionSelector.fromSignature('unshieldTokens(Field,Field,Field)').toField(), - recipientFull.address.toField(), lendingContract.address.toField(), + stableCoin.address.toField(), + FunctionSelector.fromSignature('burn((Field),Field,Field)').toField(), + lendingAccount.address.toField(), new Fr(repayAmount), + nonce, ]); await wallet.signAndAddAuthWitness(messageHash); - await lendingSim.progressTime(10); - lendingSim.repay(await lendingAccount.key(), lendingAccount.address.toField(), repayAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.repayPrivate(lendingAccount.address, lendingAccount.address.toField(), repayAmount); // Make a private repay of the debt in the public account // This should: @@ -558,25 +388,32 @@ describe('e2e_lending_contract', () => { // - decrease the public debt. logger('Repay 🥸 on behalf of public: 🍌 -> 🏦'); - const tx = lendingContract.methods - .repay_private(0n, lendingAccount.address, recipient.toField(), repayAmount, stableCoin.address) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['private_repay_on_behalf'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods + .repay_private(lendingAccount.address, repayAmount, nonce, 0n, lendingAccount.address, stableCoin.address) + .send(), ); + }); - lendingSim.check(storageSnapshots['private_repay_on_behalf']); - } - - { + it('Repay: 🍌 -> 🏦', async () => { const repayAmount = 20n; - await lendingSim.progressTime(10); - lendingSim.repay(lendingAccount.address.toField(), lendingAccount.address.toField(), repayAmount); + + const nonce = Fr.random(); + const messageHash = await hashPayload([ + lendingContract.address.toField(), + stableCoin.address.toField(), + FunctionSelector.fromSignature('burn_public((Field),Field,Field)').toField(), + lendingAccount.address.toField(), + new Fr(repayAmount), + nonce, + ]); + + // Add it to the wallet as approved + const me = await SchnorrAuthWitnessAccountContract.at(accounts[0].address, wallet); + await waitForSuccess(me.methods.set_is_valid_storage(messageHash, 1).send()); + + await lendingSim.progressTime(TIME_JUMP); + lendingSim.repayPublic(lendingAccount.address, lendingAccount.address.toField(), repayAmount); // Make a public repay of the debt in the public account // This should: @@ -585,32 +422,17 @@ describe('e2e_lending_contract', () => { // - decrease the public debt. logger('Repay: 🍌 -> 🏦'); - const tx = lendingContract.methods.repay_public(recipient.toField(), 20n, stableCoin.address).send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['public_repay'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods.repay_public(repayAmount, nonce, lendingAccount.address, stableCoin.address).send(), ); + }); + }); - lendingSim.check(storageSnapshots['public_repay']); - } - - { - // Withdraw more than possible to test the revert. - logger('Withdraw: trying to withdraw more than possible'); - const tx = lendingContract.methods.withdraw_public(recipient, 10n ** 9n).send({ skipPublicSimulation: true }); - await tx.isMined({ interval: 0.1 }); - const receipt = await tx.getReceipt(); - expect(receipt.status).toBe(TxStatus.DROPPED); - } - - { + describe('Withdraw', () => { + it('Withdraw: 🏦 -> 💰', async () => { const withdrawAmount = 42n; - await lendingSim.progressTime(10); - lendingSim.withdraw(recipient.toField(), withdrawAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.withdraw(lendingAccount.address.toField(), lendingAccount.address, withdrawAmount); // Withdraw funds from the public account // This should: @@ -619,23 +441,13 @@ describe('e2e_lending_contract', () => { // - decrease the public collateral. logger('Withdraw: 🏦 -> 💰'); - const tx = lendingContract.methods.withdraw_public(recipient, withdrawAmount).send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['public_withdraw'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, - ); - - lendingSim.check(storageSnapshots['public_withdraw']); - } + await waitForSuccess(lendingContract.methods.withdraw_public(lendingAccount.address, withdrawAmount).send()); + }); - { + it('Withdraw 🥸 : 🏦 -> 💰', async () => { const withdrawAmount = 42n; - await lendingSim.progressTime(10); - lendingSim.withdraw(await lendingAccount.key(), withdrawAmount); + await lendingSim.progressTime(TIME_JUMP); + lendingSim.withdraw(await lendingAccount.key(), lendingAccount.address, withdrawAmount); // Withdraw funds from the private account // This should: @@ -644,41 +456,19 @@ describe('e2e_lending_contract', () => { // - decrease the private collateral. logger('Withdraw 🥸 : 🏦 -> 💰'); - const tx = lendingContract.methods - .withdraw_private(lendingAccount.secret, lendingAccount.address, withdrawAmount) - .send(); - const receipt = await tx.wait(); - expect(receipt.status).toBe(TxStatus.MINED); - storageSnapshots['private_withdraw'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, + await waitForSuccess( + lendingContract.methods.withdraw_private(lendingAccount.secret, lendingAccount.address, withdrawAmount).send(), ); - - lendingSim.check(storageSnapshots['private_withdraw']); - } - - { - // Try to call the internal `_deposit` function directly - // This should: - // - not change any storage values. - // - fail - - const tx = lendingContract.methods - ._deposit(recipient.toField(), 42n, collateralAsset.address) - .send({ skipPublicSimulation: true }); - await tx.isMined({ interval: 0.1 }); - const receipt = await tx.getReceipt(); - expect(receipt.status).toBe(TxStatus.DROPPED); - logger('Rejected call directly to internal function 🧚 '); - storageSnapshots['attempted_internal_deposit'] = await getStorageSnapshot( - lendingContract, - collateralAsset, - stableCoin, - lendingAccount, - ); - expect(storageSnapshots['private_withdraw']).toEqual(storageSnapshots['attempted_internal_deposit']); - } - }, 650_000); + }); + + describe('failure cases', () => { + it('withdraw more than possible to revert', async () => { + // Withdraw more than possible to test the revert. + logger('Withdraw: trying to withdraw more than possible'); + await expect( + lendingContract.methods.withdraw_public(lendingAccount.address, 10n ** 9n).simulate(), + ).rejects.toThrow(); + }); + }); + }); }); diff --git a/yarn-project/end-to-end/src/e2e_token_contract.test.ts b/yarn-project/end-to-end/src/e2e_token_contract.test.ts index 649a53cdee6..7e8defafae4 100644 --- a/yarn-project/end-to-end/src/e2e_token_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_token_contract.test.ts @@ -4,7 +4,6 @@ import { Account, AuthWitnessAccountContract, AuthWitnessEntrypointWallet, - AztecAddress, IAuthWitnessAccountEntrypoint, computeMessageSecretHash, } from '@aztec/aztec.js'; @@ -24,6 +23,7 @@ import { AztecRPC, TxStatus } from '@aztec/types'; import { jest } from '@jest/globals'; import { setup } from './fixtures/utils.js'; +import { TokenSimulator } from './simulators/token_simulator.js'; const hashPayload = async (payload: Fr[]) => { return pedersenPlookupCompressWithHashIndex( @@ -35,95 +35,6 @@ const hashPayload = async (payload: Fr[]) => { const TIMEOUT = 60_000; -class TokenSimulator { - private balancesPrivate: Map = new Map(); - private balancePublic: Map = new Map(); - public totalSupply: bigint = 0n; - - constructor(protected token: TokenContract, protected logger: DebugLogger, protected accounts: CompleteAddress[]) {} - - public mintPrivate(to: AztecAddress, amount: bigint) { - this.totalSupply += amount; - } - - public mintPublic(to: AztecAddress, amount: bigint) { - this.totalSupply += amount; - const value = this.balancePublic.get(to) || 0n; - this.balancePublic.set(to, value + amount); - } - - public transferPublic(from: AztecAddress, to: AztecAddress, amount: bigint) { - const fromBalance = this.balancePublic.get(from) || 0n; - this.balancePublic.set(from, fromBalance - amount); - expect(fromBalance).toBeGreaterThanOrEqual(amount); - - const toBalance = this.balancePublic.get(to) || 0n; - this.balancePublic.set(to, toBalance + amount); - } - - public transferPrivate(from: AztecAddress, to: AztecAddress, amount: bigint) { - const fromBalance = this.balancesPrivate.get(from) || 0n; - expect(fromBalance).toBeGreaterThanOrEqual(amount); - this.balancesPrivate.set(from, fromBalance - amount); - - const toBalance = this.balancesPrivate.get(to) || 0n; - this.balancesPrivate.set(to, toBalance + amount); - } - - public shield(from: AztecAddress, amount: bigint) { - const fromBalance = this.balancePublic.get(from) || 0n; - expect(fromBalance).toBeGreaterThanOrEqual(amount); - this.balancePublic.set(from, fromBalance - amount); - } - - public redeemShield(to: AztecAddress, amount: bigint) { - const toBalance = this.balancesPrivate.get(to) || 0n; - this.balancesPrivate.set(to, toBalance + amount); - } - - public unshield(from: AztecAddress, to: AztecAddress, amount: bigint) { - const fromBalance = this.balancesPrivate.get(from) || 0n; - const toBalance = this.balancePublic.get(to) || 0n; - expect(fromBalance).toBeGreaterThanOrEqual(amount); - this.balancesPrivate.set(from, fromBalance - amount); - this.balancePublic.set(to, toBalance + amount); - } - - public burnPrivate(from: AztecAddress, amount: bigint) { - const fromBalance = this.balancesPrivate.get(from) || 0n; - expect(fromBalance).toBeGreaterThanOrEqual(amount); - this.balancesPrivate.set(from, fromBalance - amount); - - this.totalSupply -= amount; - } - - public burnPublic(from: AztecAddress, amount: bigint) { - const fromBalance = this.balancePublic.get(from) || 0n; - expect(fromBalance).toBeGreaterThanOrEqual(amount); - this.balancePublic.set(from, fromBalance - amount); - - this.totalSupply -= amount; - } - - public balanceOfPublic(address: AztecAddress) { - return this.balancePublic.get(address) || 0n; - } - - public balanceOfPrivate(address: AztecAddress) { - return this.balancesPrivate.get(address) || 0n; - } - - public async check() { - expect(await this.token.methods.total_supply().view()).toEqual(this.totalSupply); - - // Check that all our public matches - for (const { address } of this.accounts) { - expect(await this.token.methods.balance_of_public({ address }).view()).toEqual(this.balanceOfPublic(address)); - expect(await this.token.methods.balance_of_private({ address }).view()).toEqual(this.balanceOfPrivate(address)); - } - } -} - describe('e2e_token_contract', () => { jest.setTimeout(TIMEOUT); @@ -173,7 +84,11 @@ describe('e2e_token_contract', () => { asset = await TokenContract.at(receipt.contractAddress!, wallets[0]); } - tokenSim = new TokenSimulator(asset, logger, accounts); + tokenSim = new TokenSimulator( + asset, + logger, + accounts.map(account => account.address), + ); { const initializeTx = asset.methods._initialize({ address: accounts[0].address }).send(); @@ -299,7 +214,7 @@ describe('e2e_token_contract', () => { const tx = asset.methods.mint_private(amount, secretHash).send(); const receipt = await tx.wait(); expect(receipt.status).toBe(TxStatus.MINED); - tokenSim.mintPrivate(accounts[0].address, amount); + tokenSim.mintPrivate(amount); }); it('redeem as recipient', async () => { @@ -976,8 +891,8 @@ describe('e2e_token_contract', () => { caller.address.toField(), asset.address.toField(), FunctionSelector.fromSignature('unshield((Field),(Field),Field,Field)').toField(), - accounts[0].address.toField(), - accounts[1].address.toField(), + from.address.toField(), + to.address.toField(), new Fr(amount), nonce, ]); diff --git a/yarn-project/end-to-end/src/simulators/index.ts b/yarn-project/end-to-end/src/simulators/index.ts new file mode 100644 index 00000000000..bf023483a1b --- /dev/null +++ b/yarn-project/end-to-end/src/simulators/index.ts @@ -0,0 +1,2 @@ +export * from './lending_simulator.js'; +export * from './token_simulator.js'; diff --git a/yarn-project/end-to-end/src/simulators/lending_simulator.ts b/yarn-project/end-to-end/src/simulators/lending_simulator.ts new file mode 100644 index 00000000000..37333ab4572 --- /dev/null +++ b/yarn-project/end-to-end/src/simulators/lending_simulator.ts @@ -0,0 +1,187 @@ +// Convenience struct to hold an account's address and secret that can easily be passed around. +import { CheatCodes } from '@aztec/aztec.js'; +import { AztecAddress, CircuitsWasm, Fr } from '@aztec/circuits.js'; +import { pedersenPlookupCommitInputs } from '@aztec/circuits.js/barretenberg'; +import { LendingContract } from '@aztec/noir-contracts/types'; + +import { TokenSimulator } from './token_simulator.js'; + +/** + * Contains utilities to compute the "key" for private holdings in the public state. + */ +export class LendingAccount { + /** The address that owns this account */ + public readonly address: AztecAddress; + /** The secret used for private deposits */ + public readonly secret: Fr; + + constructor(address: AztecAddress, secret: Fr) { + this.address = address; + this.secret = secret; + } + + /** + * Computes the key for the private holdings of this account. + * @returns Key in public space + */ + public async key(): Promise { + return Fr.fromBuffer( + pedersenPlookupCommitInputs( + await CircuitsWasm.get(), + [this.address, this.secret].map(f => f.toBuffer()), + ), + ); + } +} + +const WAD = 10n ** 18n; +const BASE = 10n ** 9n; + +const muldivDown = (a: bigint, b: bigint, c: bigint) => (a * b) / c; + +const muldivUp = (a: bigint, b: bigint, c: bigint) => { + const adder = (a * b) % c > 0n ? 1n : 0n; + return muldivDown(a, b, c) + adder; +}; + +const computeMultiplier = (rate: bigint, dt: bigint) => { + if (dt == 0n) { + return BASE; + } + + const expMinusOne = dt - 1n; + const expMinusTwo = dt > 2 ? dt - 2n : 0n; + + const basePowerTwo = muldivDown(rate, rate, WAD); + const basePowerThree = muldivDown(basePowerTwo, rate, WAD); + + const temp = dt * expMinusOne; + const secondTerm = muldivDown(temp, basePowerTwo, 2n); + const thirdTerm = muldivDown(temp * expMinusTwo, basePowerThree, 6n); + + const offset = (dt * rate + secondTerm + thirdTerm) / (WAD / BASE); + + return BASE + offset; +}; + +/** + * Helper class that emulates the logic of the lending contract. Used to have a "twin" to check values against. + */ +export class LendingSimulator { + /** interest rate accumulator */ + public accumulator: bigint = 0n; + /** the timestamp of the simulator*/ + public time: number = 0; + + private collateral: { [key: string]: Fr } = {}; + private staticDebt: { [key: string]: Fr } = {}; + private borrowed: bigint = 0n; + private mintedOutside: bigint = 0n; + + constructor( + private cc: CheatCodes, + private account: LendingAccount, + private rate: bigint, + /** the lending contract */ + public lendingContract: LendingContract, + /** the collateral asset used in the lending contract */ + public collateralAsset: TokenSimulator, + /** the stable-coin borrowed in the lending contract */ + public stableCoin: TokenSimulator, + ) {} + + async prepare() { + this.accumulator = BASE; + const ts = await this.cc.eth.timestamp(); + this.time = ts + 10 + (ts % 10); + await this.cc.aztec.warp(this.time); + } + + async progressTime(diff: number) { + this.time = this.time + diff; + await this.cc.aztec.warp(this.time); + this.accumulator = muldivDown(this.accumulator, computeMultiplier(this.rate, BigInt(diff)), BASE); + } + + depositPrivate(from: AztecAddress, onBehalfOf: Fr, amount: bigint) { + this.collateralAsset.unshield(from, this.lendingContract.address, amount); + this.deposit(onBehalfOf, amount); + } + + depositPublic(from: AztecAddress, onBehalfOf: Fr, amount: bigint) { + this.collateralAsset.transferPublic(from, this.lendingContract.address, amount); + this.deposit(onBehalfOf, amount); + } + + private deposit(onBehalfOf: Fr, amount: bigint) { + const coll = this.collateral[onBehalfOf.toString()] ?? Fr.ZERO; + this.collateral[onBehalfOf.toString()] = new Fr(coll.value + amount); + } + + withdraw(owner: Fr, recipient: AztecAddress, amount: bigint) { + const coll = this.collateral[owner.toString()] ?? Fr.ZERO; + this.collateral[owner.toString()] = new Fr(coll.value - amount); + this.collateralAsset.transferPublic(this.lendingContract.address, recipient, amount); + } + + borrow(owner: Fr, recipient: AztecAddress, amount: bigint) { + const staticDebtBal = this.staticDebt[owner.toString()] ?? Fr.ZERO; + const increase = muldivUp(amount, BASE, this.accumulator); + this.staticDebt[owner.toString()] = new Fr(staticDebtBal.value + increase); + + this.stableCoin.mintPublic(recipient, amount); + this.borrowed += amount; + } + + repayPrivate(from: AztecAddress, onBehalfOf: Fr, amount: bigint) { + this.stableCoin.burnPrivate(from, amount); + this.repay(onBehalfOf, onBehalfOf, amount); + } + + repayPublic(from: AztecAddress, onBehalfOf: Fr, amount: bigint) { + this.stableCoin.burnPublic(from, amount); + this.repay(onBehalfOf, onBehalfOf, amount); + } + + private repay(from: Fr, onBehalfOf: Fr, amount: bigint) { + const staticDebtBal = this.staticDebt[onBehalfOf.toString()] ?? Fr.ZERO; + const decrease = muldivDown(amount, BASE, this.accumulator); + this.staticDebt[onBehalfOf.toString()] = new Fr(staticDebtBal.value - decrease); + + this.borrowed -= amount; + } + + mintStableCoinOutsideLoan(recipient: AztecAddress, amount: bigint, priv = false) { + if (priv) { + this.stableCoin.mintPrivate(amount); + } else { + this.stableCoin.mintPublic(recipient, amount); + } + this.mintedOutside += amount; + } + + async check() { + // Run checks on both underlying assets + await this.collateralAsset.check(); + await this.stableCoin.check(); + + // Check that total collateral equals total holdings by contract. + const totalCollateral = Object.values(this.collateral).reduce((a, b) => new Fr(a.value + b.value), Fr.ZERO); + expect(totalCollateral).toEqual(new Fr(this.collateralAsset.balanceOfPublic(this.lendingContract.address))); + + expect(this.borrowed).toEqual(this.stableCoin.totalSupply - this.mintedOutside); + + const asset = await this.lendingContract.methods.get_asset(0).view(); + expect(asset['interest_accumulator']).toEqual(this.accumulator); + expect(asset['last_updated_ts']).toEqual(BigInt(this.time)); + + for (const key of [this.account.address, await this.account.key()]) { + const privatePos = await this.lendingContract.methods.get_position(key).view(); + expect(new Fr(privatePos['collateral'])).toEqual(this.collateral[key.toString()] ?? Fr.ZERO); + expect(new Fr(privatePos['static_debt'])).toEqual(this.staticDebt[key.toString()] ?? Fr.ZERO); + expect(privatePos['debt']).toEqual( + muldivUp((this.staticDebt[key.toString()] ?? Fr.ZERO).value, this.accumulator, BASE), + ); + } + } +} diff --git a/yarn-project/end-to-end/src/simulators/token_simulator.ts b/yarn-project/end-to-end/src/simulators/token_simulator.ts new file mode 100644 index 00000000000..b28c5480d6e --- /dev/null +++ b/yarn-project/end-to-end/src/simulators/token_simulator.ts @@ -0,0 +1,93 @@ +/* eslint-disable jsdoc/require-jsdoc */ +import { DebugLogger } from '@aztec/aztec.js'; +import { AztecAddress } from '@aztec/circuits.js'; +import { TokenContract } from '@aztec/noir-contracts/types'; + +export class TokenSimulator { + private balancesPrivate: Map = new Map(); + private balancePublic: Map = new Map(); + public totalSupply: bigint = 0n; + + constructor(protected token: TokenContract, protected logger: DebugLogger, protected accounts: AztecAddress[]) {} + + public mintPrivate(amount: bigint) { + this.totalSupply += amount; + } + + public mintPublic(to: AztecAddress, amount: bigint) { + this.totalSupply += amount; + const value = this.balancePublic.get(to) || 0n; + this.balancePublic.set(to, value + amount); + } + + public transferPublic(from: AztecAddress, to: AztecAddress, amount: bigint) { + const fromBalance = this.balancePublic.get(from) || 0n; + this.balancePublic.set(from, fromBalance - amount); + expect(fromBalance).toBeGreaterThanOrEqual(amount); + + const toBalance = this.balancePublic.get(to) || 0n; + this.balancePublic.set(to, toBalance + amount); + } + + public transferPrivate(from: AztecAddress, to: AztecAddress, amount: bigint) { + const fromBalance = this.balancesPrivate.get(from) || 0n; + expect(fromBalance).toBeGreaterThanOrEqual(amount); + this.balancesPrivate.set(from, fromBalance - amount); + + const toBalance = this.balancesPrivate.get(to) || 0n; + this.balancesPrivate.set(to, toBalance + amount); + } + + public shield(from: AztecAddress, amount: bigint) { + const fromBalance = this.balancePublic.get(from) || 0n; + expect(fromBalance).toBeGreaterThanOrEqual(amount); + this.balancePublic.set(from, fromBalance - amount); + } + + public redeemShield(to: AztecAddress, amount: bigint) { + const toBalance = this.balancesPrivate.get(to) || 0n; + this.balancesPrivate.set(to, toBalance + amount); + } + + public unshield(from: AztecAddress, to: AztecAddress, amount: bigint) { + const fromBalance = this.balancesPrivate.get(from) || 0n; + const toBalance = this.balancePublic.get(to) || 0n; + expect(fromBalance).toBeGreaterThanOrEqual(amount); + this.balancesPrivate.set(from, fromBalance - amount); + this.balancePublic.set(to, toBalance + amount); + } + + public burnPrivate(from: AztecAddress, amount: bigint) { + const fromBalance = this.balancesPrivate.get(from) || 0n; + expect(fromBalance).toBeGreaterThanOrEqual(amount); + this.balancesPrivate.set(from, fromBalance - amount); + + this.totalSupply -= amount; + } + + public burnPublic(from: AztecAddress, amount: bigint) { + const fromBalance = this.balancePublic.get(from) || 0n; + expect(fromBalance).toBeGreaterThanOrEqual(amount); + this.balancePublic.set(from, fromBalance - amount); + + this.totalSupply -= amount; + } + + public balanceOfPublic(address: AztecAddress) { + return this.balancePublic.get(address) || 0n; + } + + public balanceOfPrivate(address: AztecAddress) { + return this.balancesPrivate.get(address) || 0n; + } + + public async check() { + expect(await this.token.methods.total_supply().view()).toEqual(this.totalSupply); + + // Check that all our public matches + for (const address of this.accounts) { + expect(await this.token.methods.balance_of_public({ address }).view()).toEqual(this.balanceOfPublic(address)); + expect(await this.token.methods.balance_of_private({ address }).view()).toEqual(this.balanceOfPrivate(address)); + } + } +} diff --git a/yarn-project/noir-contracts/src/contracts/lending_contract/src/interfaces.nr b/yarn-project/noir-contracts/src/contracts/lending_contract/src/interfaces.nr index c79378d7ecf..f8b7a9a41b5 100644 --- a/yarn-project/noir-contracts/src/contracts/lending_contract/src/interfaces.nr +++ b/yarn-project/noir-contracts/src/contracts/lending_contract/src/interfaces.nr @@ -36,36 +36,44 @@ impl Token { Self { address } } - fn transfer_pub(self: Self, context: PublicContext, to: Field, amount: Field) { + fn transfer_public(self: Self, context: PublicContext, from: Field, to: Field, amount: Field, nonce: Field) { let _transfer_return_values = context.call_public_function( self.address, - compute_selector("transfer_pub(Field,Field)"), - [to, amount] + compute_selector("transfer_public((Field),(Field),Field,Field)"), + [from, to, amount, nonce] ); } - fn transfer_from_pub(self: Self, context: PublicContext, from: Field, to: Field, amount: Field) { - let _transfer_return_values = context.call_public_function( + fn mint_public(self: Self, context: PublicContext, to: Field, amount: Field) { + let _return_values = context.call_public_function( self.address, - compute_selector("transfer_from_pub(Field,Field,Field)"), - [from, to, amount] + compute_selector("mint_public((Field),Field)"), + [to, amount] ); } - fn owner_mint_pub(self: Self, context: PublicContext, to: Field, amount: Field) { - let _transfer_return_values = context.call_public_function( - self.address, - compute_selector("owner_mint_pub(Field,Field)"), - [to, amount] + fn burn_public(self: Self, context: PublicContext, from: Field, amount: Field, nonce: Field){ + let _return_values = context.call_public_function( + self.address, + compute_selector("burn_public((Field),Field,Field)"), + [from, amount, nonce] ); } // Private - fn unshield(self: Self, context: &mut PrivateContext, from: Field, to: Field, amount: Field) -> [Field; RETURN_VALUES_LENGTH] { + fn unshield(self: Self, context: &mut PrivateContext, from: Field, to: Field, amount: Field, nonce: Field) -> [Field; RETURN_VALUES_LENGTH] { + context.call_private_function( + self.address, + compute_selector("unshield((Field),(Field),Field,Field)"), + [from, to, amount, nonce] + ) + } + + fn burn(self: Self, context: &mut PrivateContext, from: Field, amount: Field, nonce: Field) -> [Field; RETURN_VALUES_LENGTH] { context.call_private_function( self.address, - compute_selector("unshieldTokens(Field,Field,Field)"), - [from, to, amount] + compute_selector("burn((Field),Field,Field)"), + [from, amount, nonce] ) } } diff --git a/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr index 3683aafe96d..c26af11e340 100644 --- a/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr @@ -155,17 +155,17 @@ contract Lending { asset } - // This don't need to be on behalf of self. We should be able to repay on behalf of someone else. #[aztec(private)] fn deposit_private( + from: Field, + amount: Field, + nonce: Field, secret: Field, - asset_owner: Field, on_behalf_of: Field, - amount: Field, collateral_asset: Field, ) { let on_behalf_of = compute_identifier(secret, on_behalf_of, context.msg_sender()); - let _res = Token::at(collateral_asset).unshield(&mut context, asset_owner, context.this_address(), amount); + let _res = Token::at(collateral_asset).unshield(&mut context, from, context.this_address(), amount, nonce); // _deposit(on_behalf_of, amount, collateral_asset) let selector = compute_selector("_deposit(Field,Field,Field)"); let _callStackItem2 = context.call_public_function(context.this_address(), selector, [on_behalf_of, amount, collateral_asset]); @@ -173,13 +173,14 @@ contract Lending { #[aztec(public)] fn deposit_public( - owner: Field, amount: Field, + nonce: Field, + on_behalf_of: Field, collateral_asset: Field, ) -> Field { - Token::at(collateral_asset).transfer_from_pub(context, context.msg_sender(), context.this_address(), amount); + Token::at(collateral_asset).transfer_public(context, context.msg_sender(), context.this_address(), amount, nonce); let selector = compute_selector("_deposit(Field,Field,Field)"); - let return_values = context.call_public_function(context.this_address(), selector, [owner, amount, collateral_asset]); + let return_values = context.call_public_function(context.this_address(), selector, [on_behalf_of, amount, collateral_asset]); return_values[0] } @@ -253,7 +254,7 @@ contract Lending { // @todo @LHerskind Support both shielding and transfers (for now just transfer) let collateral_asset = storage.collateral_asset.read(); - Token::at(collateral_asset).transfer_pub(context, recipient, amount); + Token::at(collateral_asset).transfer_public(context, context.this_address(), recipient, amount, 0); 1 } @@ -304,33 +305,34 @@ contract Lending { // @todo @LHerskind Need to support both private and public minting. let stable_coin = storage.stable_coin.read(); - Token::at(stable_coin).owner_mint_pub(context, to, amount); + Token::at(stable_coin).mint_public(context, to, amount); 1 } #[aztec(private)] fn repay_private( + from: Field, + amount: Field, + nonce: Field, secret: Field, - asset_owner: Field, on_behalf_of: Field, - amount: Field, stable_coin: Field, ) { let on_behalf_of = compute_identifier(secret, on_behalf_of, context.msg_sender()); - let _res = Token::at(stable_coin).unshield(&mut context, asset_owner, context.this_address(), amount); + let _res = Token::at(stable_coin).burn(&mut context, from, amount, nonce); let selector = compute_selector("_repay(Field,Field,Field)"); let _callStackItem = context.call_public_function(context.this_address(), selector, [on_behalf_of, amount, stable_coin]); } #[aztec(public)] fn repay_public( - owner: Field, amount: Field, + nonce: Field, + owner: Field, stable_coin: Field, ) -> Field { - // Should probably just burn the tokens actually :thinking: - Token::at(stable_coin).transfer_from_pub(context, context.msg_sender(), context.this_address(), amount); + Token::at(stable_coin).burn_public(context, context.msg_sender(), amount, nonce); let selector = compute_selector("_repay(Field,Field,Field)"); let return_values = context.call_public_function(context.this_address(), selector, [owner, amount, stable_coin]); From c8a5cfb375b498475503c12cc83fcdba39f2ec5f Mon Sep 17 00:00:00 2001 From: Charlie Lye Date: Thu, 14 Sep 2023 00:31:19 +0100 Subject: [PATCH 09/11] feat: build_manifest default tweaks. (#2287) If rebuildPatterns are not provided in build_manifest.json, default to the project dir. Can also exclude empty dependencies. --- build-system/scripts/query_manifest | 35 +++-- build_manifest.json | 120 +++++------------- yarn-project/acir-simulator/package.json | 2 - yarn-project/archiver/package.json | 2 - yarn-project/aztec-node/package.json | 2 - yarn-project/aztec-rpc/package.json | 2 - yarn-project/aztec-sandbox/package.json | 2 - yarn-project/aztec.js/package.json | 2 - yarn-project/circuits.js/package.json | 2 - yarn-project/cli/package.json | 2 - yarn-project/end-to-end/package.json | 2 - yarn-project/ethereum/package.json | 2 - yarn-project/foundation/package.json | 2 - yarn-project/key-store/package.json | 2 - yarn-project/l1-artifacts/package.json | 2 - yarn-project/merkle-tree/package.json | 2 - yarn-project/noir-compiler/package.json | 2 - yarn-project/noir-contracts/package.json | 2 - yarn-project/p2p-bootstrap/package.json | 2 - yarn-project/p2p/package.json | 2 - yarn-project/package.common.json | 2 - yarn-project/prover-client/package.json | 2 - yarn-project/rollup-provider/package.json | 2 - yarn-project/sequencer-client/package.json | 2 - yarn-project/types/package.json | 2 - yarn-project/world-state/package.json | 2 - .../scripts/update_build_manifest.mjs | 106 ---------------- 27 files changed, 57 insertions(+), 252 deletions(-) delete mode 100644 yarn-project/yarn-project-base/scripts/update_build_manifest.mjs diff --git a/build-system/scripts/query_manifest b/build-system/scripts/query_manifest index 51eac1df79d..85ccbf1e96d 100755 --- a/build-system/scripts/query_manifest +++ b/build-system/scripts/query_manifest @@ -15,6 +15,7 @@ function get_deps { local TYPE=$(jq -r ".\"$1\".dependencies | type" $MANIFEST) if [ "$TYPE" == "string" ]; then # Execute string as command relative to buildDir to retrieve dependencies. + local BUILD_DIR=$($0 buildDir $1) local CMD=$BUILD_DIR/$(jq -r ".\"$1\".dependencies") if [ ! -f "$CMD" ]; then >&2 echo "Dependency script not found: $CMD" @@ -24,10 +25,11 @@ function get_deps { DEPS=($($CMD $PROJECT_DIR)) elif [ "$TYPE" == "null" ]; then # Execute default script relative to buildDir to retrieve dependencies. + local BUILD_DIR=$($0 buildDir $1) local CMD=$BUILD_DIR/scripts/get_dependencies.sh if [ ! -f "$CMD" ]; then - >&2 echo "Dependency script not found: $CMD" - exit 1 + DEPS=() + return fi local PROJECT_DIR=$($0 projectDir $1) DEPS=($($CMD $PROJECT_DIR)) @@ -43,22 +45,25 @@ function add_rebuild_patterns { local TYPE=$(jq -r ".\"$1\".rebuildPatterns | type" $MANIFEST) if [ "$TYPE" == "string" ]; then local FILE=$(jq -r ".\"$1\".rebuildPatterns" $MANIFEST) - local BUILD_DIR=$($0 buildDir $1) - PATTERNS=(${PATTERNS[@]} $(cat $BUILD_DIR/$FILE)) + local PROJECT_DIR=$($0 projectDir $1) + PATTERNS=(${PATTERNS[@]} $(cat $PROJECT_DIR/$FILE)) elif [ "$TYPE" == "array" ]; then PATTERNS=(${PATTERNS[@]} $(jq -r ".\"$1\".rebuildPatterns | .[]" $MANIFEST)) + elif [ "$TYPE" == "null" ]; then + local PROJECT_DIR=$($0 relativeProjectDir $1) + PATTERNS=(${PATTERNS[@]} "^$PROJECT_DIR/") else - >&2 echo "Missing rebuildPatterns property. Either filename as string, or patterns as array." + >&2 echo "rebuildPatterns must be array, string, or null." exit 1 fi } case "$CMD" in dockerfile) - # In the manifest, the path is relative to buildDir. Return absolute path. - BUILD_DIR=$($0 buildDir $REPO) + # In the manifest, the path is relative to projectDir. Return absolute path. + PROJECT_DIR=$($0 projectDir $REPO) DOCKERFILE=$(jq -r ".\"$REPO\".dockerfile // \"Dockerfile\"" $MANIFEST) - echo $BUILD_DIR/$DOCKERFILE + echo $PROJECT_DIR/$DOCKERFILE ;; buildDir) # In the manifest, the path is relative to the repo root. Return absolute path. @@ -71,10 +76,15 @@ case "$CMD" in echo $ROOT_PATH/$PROJECT_DIR ;; relativeProjectDir) + # Return the relative path as it is in the manifest. jq -r ".\"$REPO\".projectDir // .\"$REPO\".buildDir" $MANIFEST ;; dependencies) - BUILD_DIR=$($0 buildDir $REPO) + # Get dependencies for a given repo. + # If no entry in the manifest file, attempt to call /scripts/get_dependencies.sh if exists, else empty. + # If a string, attempt to call / if exists, else error. + # If an array, the array lists the dependencies. + # Recursively descend "unvisited" dependencies to collect all dependencies. declare -A ALL_DEPS add_deps() { if [[ -v ALL_DEPS[$1] ]]; then @@ -87,11 +97,18 @@ case "$CMD" in done } add_deps $REPO + # Remove ourself as a dependency. + unset ALL_DEPS["$REPO"] for KEY in "${!ALL_DEPS[@]}"; do echo $KEY done | sort ;; rebuildPatterns) + # Get rebuild patterns for a given repo (the file patterns that if changed result in rebuilds). + # First add rebuild patterns for requested repo, then add rebuild patterns for each dependency. + # If no rebuild patterns are given, the result is ["^/"]. + # If a projects rebuildPattern is a string, the rebuild patterns are in /. + # If an array, the array lists the rebuild patterns. DEPS=($($0 dependencies $REPO)) PATTERNS=() add_rebuild_patterns $REPO diff --git a/build_manifest.json b/build_manifest.json index 0f7316595d7..3a24db1ef01 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -2,48 +2,40 @@ "barretenberg-x86_64-linux-clang": { "buildDir": "barretenberg/cpp", "dockerfile": "dockerfiles/Dockerfile.x86_64-linux-clang", - "rebuildPatterns": ".rebuild_patterns", - "dependencies": [] + "rebuildPatterns": ".rebuild_patterns" }, "barretenberg-x86_64-linux-clang-assert": { "buildDir": "barretenberg/cpp", "dockerfile": "dockerfiles/Dockerfile.x86_64-linux-clang-assert", - "rebuildPatterns": ".rebuild_patterns", - "dependencies": [] + "rebuildPatterns": ".rebuild_patterns" }, "barretenberg-x86_64-linux-clang-fuzzing": { "buildDir": "barretenberg/cpp", "dockerfile": "dockerfiles/Dockerfile.x86_64-linux-clang-fuzzing", - "rebuildPatterns": ".rebuild_patterns", - "dependencies": [] + "rebuildPatterns": ".rebuild_patterns" }, "barretenberg-x86_64-linux-gcc": { "buildDir": "barretenberg/cpp", "dockerfile": "dockerfiles/Dockerfile.x86_64-linux-gcc", - "rebuildPatterns": ".rebuild_patterns", - "dependencies": [] + "rebuildPatterns": ".rebuild_patterns" }, "barretenberg-wasm-linux-clang": { "buildDir": "barretenberg/cpp", "dockerfile": "dockerfiles/Dockerfile.wasm-linux-clang", - "rebuildPatterns": ".rebuild_patterns", - "dependencies": [] + "rebuildPatterns": ".rebuild_patterns" }, "bb.js": { "buildDir": "barretenberg/ts", - "rebuildPatterns": ["^barretenberg/ts/"], "dependencies": ["barretenberg-wasm-linux-clang"] }, "barretenberg-acir-tests-bb": { "buildDir": "barretenberg/acir_tests", "dockerfile": "Dockerfile.bb", - "rebuildPatterns": ["^barretenberg/acir_tests/"], "dependencies": ["barretenberg-x86_64-linux-clang-assert"] }, "barretenberg-acir-tests-bb.js": { "buildDir": "barretenberg/acir_tests", "dockerfile": "Dockerfile.bb.js", - "rebuildPatterns": ["^barretenberg/acir_tests/"], "dependencies": ["bb.js"] }, "circuits-wasm-linux-clang": { @@ -79,19 +71,14 @@ "docs": { "buildDir": ".", "dockerfile": "docs/Dockerfile", - "rebuildPatterns": ["^docs/", "^.*.cpp$", "^.*.ts$"], - "dependencies": [] + "rebuildPatterns": ["^docs/", "^.*.cpp$", "^.*.ts$"] }, "l1-contracts": { - "buildDir": "l1-contracts", - "dockerfile": "Dockerfile", - "rebuildPatterns": ["^l1-contracts/"], - "dependencies": [] + "buildDir": "l1-contracts" }, "l1-artifacts": { "buildDir": "yarn-project", "projectDir": "yarn-project/l1-artifacts", - "dockerfile": "l1-artifacts/Dockerfile", "rebuildPatterns": ["^l1-contracts/", "^yarn-project/l1-artifacts/"], "dependencies": [] }, @@ -111,92 +98,65 @@ }, "acir-simulator": { "buildDir": "yarn-project", - "projectDir": "yarn-project/acir-simulator", - "dockerfile": "acir-simulator/Dockerfile", - "rebuildPatterns": ["^yarn-project/acir-simulator/"] + "projectDir": "yarn-project/acir-simulator" }, "archiver": { "buildDir": "yarn-project", - "projectDir": "yarn-project/archiver", - "dockerfile": "archiver/Dockerfile", - "rebuildPatterns": ["^yarn-project/archiver/"] + "projectDir": "yarn-project/archiver" }, "cli": { "buildDir": "yarn-project", - "projectDir": "yarn-project/cli", - "dockerfile": "cli/Dockerfile", - "rebuildPatterns": ["^yarn-project/cli/"] + "projectDir": "yarn-project/cli" }, "aztec-rpc": { "buildDir": "yarn-project", - "projectDir": "yarn-project/aztec-rpc", - "dockerfile": "aztec-rpc/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec-rpc/"] + "projectDir": "yarn-project/aztec-rpc" }, "aztec-sandbox": { "buildDir": "yarn-project", - "projectDir": "yarn-project/aztec-sandbox", - "dockerfile": "aztec-sandbox/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec-sandbox/"] + "projectDir": "yarn-project/aztec-sandbox" }, "aztec.js": { "buildDir": "yarn-project", - "projectDir": "yarn-project/aztec.js", - "dockerfile": "aztec.js/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec.js/"] + "projectDir": "yarn-project/aztec.js" }, "canary-build": { "buildDir": "yarn-project", "projectDir": "yarn-project/canary", - "dockerfile": "canary/Dockerfile.build", - "rebuildPatterns": ["^yarn-project/canary/"] + "dockerfile": "Dockerfile.build" }, "canary": { "buildDir": "yarn-project", - "projectDir": "yarn-project/canary", - "dockerfile": "canary/Dockerfile", - "rebuildPatterns": ["^yarn-project/canary/"] + "projectDir": "yarn-project/canary" }, "circuits.js": { "buildDir": "yarn-project", - "projectDir": "yarn-project/circuits.js", - "dockerfile": "circuits.js/Dockerfile", - "rebuildPatterns": ["^yarn-project/circuits.js/"] + "projectDir": "yarn-project/circuits.js" }, "end-to-end": { "buildDir": "yarn-project", - "projectDir": "yarn-project/end-to-end", - "dockerfile": "end-to-end/Dockerfile", - "rebuildPatterns": ["^yarn-project/end-to-end/"] + "projectDir": "yarn-project/end-to-end" }, "ethereum": { "buildDir": "yarn-project", - "projectDir": "yarn-project/ethereum", - "dockerfile": "ethereum/Dockerfile", - "rebuildPatterns": ["^yarn-project/ethereum/"] + "projectDir": "yarn-project/ethereum" }, "foundation": { "buildDir": "yarn-project", - "projectDir": "yarn-project/foundation", - "dockerfile": "foundation/Dockerfile", - "rebuildPatterns": ["^yarn-project/foundation/"] + "projectDir": "yarn-project/foundation" }, "key-store": { "buildDir": "yarn-project", - "projectDir": "yarn-project/key-store", - "dockerfile": "key-store/Dockerfile", - "rebuildPatterns": ["^yarn-project/key-store/"] + "projectDir": "yarn-project/key-store" }, "merkle-tree": { "buildDir": "yarn-project", - "projectDir": "yarn-project/merkle-tree", - "dockerfile": "merkle-tree/Dockerfile", - "rebuildPatterns": ["^yarn-project/merkle-tree/"] + "projectDir": "yarn-project/merkle-tree" }, "noir-contracts-build": { "buildDir": "yarn-project", "projectDir": "yarn-project/noir-contracts", - "dockerfile": "noir-contracts/Dockerfile.build", + "dockerfile": "Dockerfile.build", "rebuildPatterns": [ "^yarn-project/noir-contracts/", "^yarn-project/aztec-nr/" @@ -205,7 +165,6 @@ "noir-contracts": { "buildDir": "yarn-project", "projectDir": "yarn-project/noir-contracts", - "dockerfile": "noir-contracts/Dockerfile", "rebuildPatterns": [ "^yarn-project/noir-contracts/", "^yarn-project/aztec-nr/" @@ -213,56 +172,39 @@ }, "noir-compiler": { "buildDir": "yarn-project", - "projectDir": "yarn-project/noir-compiler", - "dockerfile": "noir-compiler/Dockerfile", - "rebuildPatterns": ["^yarn-project/noir-compiler/"] + "projectDir": "yarn-project/noir-compiler" }, "p2p": { "buildDir": "yarn-project", - "projectDir": "yarn-project/p2p", - "dockerfile": "p2p/Dockerfile", - "rebuildPatterns": ["^yarn-project/p2p/"] + "projectDir": "yarn-project/p2p" }, "p2p-bootstrap": { "buildDir": "yarn-project", "projectDir": "yarn-project/p2p-bootstrap", - "dockerfile": "p2p/Dockerfile", - "rebuildPatterns": ["^yarn-project/p2p-bootstrap/"] + "dockerfile": "../p2p/Dockerfile" }, "prover-client": { "buildDir": "yarn-project", - "projectDir": "yarn-project/prover-client", - "dockerfile": "prover-client/Dockerfile", - "rebuildPatterns": ["^yarn-project/prover-client/"] + "projectDir": "yarn-project/prover-client" }, "rollup-provider": { "buildDir": "yarn-project", - "projectDir": "yarn-project/rollup-provider", - "dockerfile": "rollup-provider/Dockerfile", - "rebuildPatterns": ["^yarn-project/rollup-provider/"] + "projectDir": "yarn-project/rollup-provider" }, "aztec-node": { "buildDir": "yarn-project", - "projectDir": "yarn-project/aztec-node", - "dockerfile": "aztec-node/Dockerfile", - "rebuildPatterns": ["^yarn-project/aztec-node/"] + "projectDir": "yarn-project/aztec-node" }, "sequencer-client": { "buildDir": "yarn-project", - "projectDir": "yarn-project/sequencer-client", - "dockerfile": "sequencer-client/Dockerfile", - "rebuildPatterns": ["^yarn-project/sequencer-client/"] + "projectDir": "yarn-project/sequencer-client" }, "types": { "buildDir": "yarn-project", - "projectDir": "yarn-project/types", - "dockerfile": "types/Dockerfile", - "rebuildPatterns": ["^yarn-project/types/"] + "projectDir": "yarn-project/types" }, "world-state": { "buildDir": "yarn-project", - "projectDir": "yarn-project/world-state", - "dockerfile": "world-state/Dockerfile", - "rebuildPatterns": ["^yarn-project/world-state/"] + "projectDir": "yarn-project/world-state" } } diff --git a/yarn-project/acir-simulator/package.json b/yarn-project/acir-simulator/package.json index ef6fd4d3bfc..d11b6d6fafa 100644 --- a/yarn-project/acir-simulator/package.json +++ b/yarn-project/acir-simulator/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/archiver/package.json b/yarn-project/archiver/package.json index 4dbc4a5465e..48867bed693 100644 --- a/yarn-project/archiver/package.json +++ b/yarn-project/archiver/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/aztec-node/package.json b/yarn-project/aztec-node/package.json index ec5beb82863..8e785e5b058 100644 --- a/yarn-project/aztec-node/package.json +++ b/yarn-project/aztec-node/package.json @@ -12,8 +12,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/aztec-rpc/package.json b/yarn-project/aztec-rpc/package.json index 7ac8adacfc0..78f906e82b5 100644 --- a/yarn-project/aztec-rpc/package.json +++ b/yarn-project/aztec-rpc/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/aztec-sandbox/package.json b/yarn-project/aztec-sandbox/package.json index 041da41d296..d176756f835 100644 --- a/yarn-project/aztec-sandbox/package.json +++ b/yarn-project/aztec-sandbox/package.json @@ -14,13 +14,11 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", "build": "yarn clean && tsc -b", "start": "node --no-warnings ./dest/bin", "clean": "rm -rf ./dest .tsbuildinfo", "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T prettier -w ./src", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build:dev": "tsc -b --watch", "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests", "run:example:token": "DEBUG='aztec:*' node ./dest/examples/private_token_contract.js", diff --git a/yarn-project/aztec.js/package.json b/yarn-project/aztec.js/package.json index 0a67c34d5b3..44e2441449b 100644 --- a/yarn-project/aztec.js/package.json +++ b/yarn-project/aztec.js/package.json @@ -16,8 +16,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b && webpack", "build:web": "webpack", "build:dev": "tsc -b --watch", diff --git a/yarn-project/circuits.js/package.json b/yarn-project/circuits.js/package.json index b2fbac5e846..58628aaf169 100644 --- a/yarn-project/circuits.js/package.json +++ b/yarn-project/circuits.js/package.json @@ -18,8 +18,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/cli/package.json b/yarn-project/cli/package.json index e2541e50de8..fe7da02af0b 100644 --- a/yarn-project/cli/package.json +++ b/yarn-project/cli/package.json @@ -14,8 +14,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/end-to-end/package.json b/yarn-project/end-to-end/package.json index 1e7e6a34e01..01e14a2ecb1 100644 --- a/yarn-project/end-to-end/package.json +++ b/yarn-project/end-to-end/package.json @@ -4,8 +4,6 @@ "type": "module", "exports": "./dest/index.js", "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/ethereum/package.json b/yarn-project/ethereum/package.json index 82a2402ad32..90e6f2ee7c1 100644 --- a/yarn-project/ethereum/package.json +++ b/yarn-project/ethereum/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/foundation/package.json b/yarn-project/foundation/package.json index 7441da40186..3e8e058f4be 100644 --- a/yarn-project/foundation/package.json +++ b/yarn-project/foundation/package.json @@ -35,8 +35,6 @@ "./committable": "./dest/committable/index.js" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/key-store/package.json b/yarn-project/key-store/package.json index e9b76370219..d43c019eef9 100644 --- a/yarn-project/key-store/package.json +++ b/yarn-project/key-store/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/l1-artifacts/package.json b/yarn-project/l1-artifacts/package.json index c1f000e2d95..57e271c6927 100644 --- a/yarn-project/l1-artifacts/package.json +++ b/yarn-project/l1-artifacts/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && yarn generate && tsc -b", "clean": "rm -rf ./dest ./generated .tsbuildinfo", "formatting": "run -T prettier --check ./generated && run -T eslint ./generated", diff --git a/yarn-project/merkle-tree/package.json b/yarn-project/merkle-tree/package.json index 163d6fc8dba..d551bb84868 100644 --- a/yarn-project/merkle-tree/package.json +++ b/yarn-project/merkle-tree/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/noir-compiler/package.json b/yarn-project/noir-compiler/package.json index 7ef409d0bb4..d9efa71dc52 100644 --- a/yarn-project/noir-compiler/package.json +++ b/yarn-project/noir-compiler/package.json @@ -17,8 +17,6 @@ "aztec-compile": "dest/cli.js" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/noir-contracts/package.json b/yarn-project/noir-contracts/package.json index b9d7e5eb3fb..0739cee5976 100644 --- a/yarn-project/noir-contracts/package.json +++ b/yarn-project/noir-contracts/package.json @@ -8,8 +8,6 @@ "./types": "./dest/types/index.js" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/p2p-bootstrap/package.json b/yarn-project/p2p-bootstrap/package.json index 89fc049dba2..646ba2c4abf 100644 --- a/yarn-project/p2p-bootstrap/package.json +++ b/yarn-project/p2p-bootstrap/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/p2p/package.json b/yarn-project/p2p/package.json index f3213003702..2b8e317e603 100644 --- a/yarn-project/p2p/package.json +++ b/yarn-project/p2p/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/package.common.json b/yarn-project/package.common.json index d6231d92f89..6b6f7471258 100644 --- a/yarn-project/package.common.json +++ b/yarn-project/package.common.json @@ -1,7 +1,5 @@ { "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/prover-client/package.json b/yarn-project/prover-client/package.json index fb946ce8d2b..40741c4cc3a 100644 --- a/yarn-project/prover-client/package.json +++ b/yarn-project/prover-client/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/rollup-provider/package.json b/yarn-project/rollup-provider/package.json index 84d68c96dc8..abb5e816970 100644 --- a/yarn-project/rollup-provider/package.json +++ b/yarn-project/rollup-provider/package.json @@ -12,8 +12,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/sequencer-client/package.json b/yarn-project/sequencer-client/package.json index ab89bd8f455..1018b1e7959 100644 --- a/yarn-project/sequencer-client/package.json +++ b/yarn-project/sequencer-client/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/types/package.json b/yarn-project/types/package.json index 6aaac90d5e8..78977f0c5f4 100644 --- a/yarn-project/types/package.json +++ b/yarn-project/types/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json index 36ae514d0ea..67d3c5a7f36 100644 --- a/yarn-project/world-state/package.json +++ b/yarn-project/world-state/package.json @@ -11,8 +11,6 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "prepare": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json", - "prepare:check": "node ../yarn-project-base/scripts/update_build_manifest.mjs package.json --check", "build": "yarn clean && tsc -b", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", diff --git a/yarn-project/yarn-project-base/scripts/update_build_manifest.mjs b/yarn-project/yarn-project-base/scripts/update_build_manifest.mjs deleted file mode 100644 index b915dd8733d..00000000000 --- a/yarn-project/yarn-project-base/scripts/update_build_manifest.mjs +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env node -// Updates build manifest for a package based on a package.json -import { existsSync, readFileSync, writeFileSync } from 'fs'; -import { basename, dirname, join, resolve } from 'path'; -import { cwd } from 'process'; - -// Update build_manifest.json with new dependencies -function updateBuildManifest(buildManifestFile, allDependencies, projectKey, options) { - // Check if build_manifest.json exists - if (!existsSync(buildManifestFile)) { - console.error(`Error: ${buildManifestFile} not found (cwd ${cwd()}).`); - process.exit(2); - } - - // Read build_manifest.json - const buildManifestData = JSON.parse(readFileSync(buildManifestFile, 'utf-8')); - - if (projectKey in buildManifestData) { - // Filter package names from dependencies that start with "@aztec/" - const aztecDependencies = Object.keys(allDependencies).filter(packageName => packageName.startsWith('@aztec/')); - - // Update the "dependencies" key in the corresponding section of the buildManifestData - // Take just the folder name component - // Filter out dependencies that are not themselves in the manifest: - const updatedDependencies = aztecDependencies - .map(packageName => packageName.split('/')[1]) - .filter(depProjectKey => !!buildManifestData[depProjectKey]); - - // If we are just checking, throw if dependencies don't match - if (options.checkOnly) { - const currentDependencies = buildManifestData[projectKey]['dependencies']; - if ( - updatedDependencies.length !== currentDependencies.length || - !updatedDependencies.reduce((ret, val, idx) => ret && val === currentDependencies[idx], true) - ) { - console.error( - `Dependencies for project ${projectKey} have changed and the build_manifest needs to be updated. Run yarn prepare on the yarn-project root.`, - `\n Current: ${JSON.stringify(currentDependencies)}`, - `\n Updated: ${JSON.stringify(updatedDependencies)}`, - ); - process.exit(10); - } - } - // Otherwise, update them - else { - buildManifestData[projectKey]['dependencies'] = updatedDependencies; - } - - // Write the updated data back to build_manifest.json - writeFileSync(buildManifestFile, JSON.stringify(buildManifestData, null, 2)); - } else { - console.error(`Error: '${projectKey}' not found in build_manifest.json`); - process.exit(3); - } -} - -// Entry point for the script -function main() { - try { - // Check if the path to the package.json file is provided as a command-line argument - if (process.argv.length === 2) { - console.error(`Usage: ${process.argv[0]} path/to/package.json`); - process.exit(1); - } - - const packageJsonFile = process.argv[2]; - - // Check if package.json exists - if (!existsSync(packageJsonFile)) { - console.error(`Error: ${packageJsonFile} not found.`); - process.exit(2); - } - - // Process options if any - const options = { checkOnly: false }; - for (const arg of process.argv.slice(3)) { - if (arg === '--check') { - options.checkOnly = true; - } else { - console.error(`Unknown option ${arg}`); - process.exit(3); - } - } - - // Read package.json - const packageData = JSON.parse(readFileSync(packageJsonFile, 'utf-8')); - - // Get the directory name of the directory that holds package.json - const projectKey = basename(dirname(resolve(packageJsonFile))); - - // Add the path to the build-manifest.json file - const buildManifestFile = join(dirname(packageJsonFile), '..', '..', 'build_manifest.json'); - - // Update build_manifest.json with the new dependencies - updateBuildManifest( - buildManifestFile, - { ...packageData.dependencies, ...packageData.devDependencies }, - projectKey, - options, - ); - } catch (err) { - console.error(`Failed updating ${resolve(process.argv[2])}`); - console.error(err); - } -} -main(); From 55e57aca63f7faba1ac475d7baee42a0744e5720 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Thu, 14 Sep 2023 02:09:22 +0000 Subject: [PATCH 10/11] git subrepo push --branch=main barretenberg subrepo: subdir: "barretenberg" merged: "ae9f99c3c" upstream: origin: "https://github.com/AztecProtocol/barretenberg" branch: "main" commit: "ae9f99c3c" git-subrepo: version: "0.4.6" origin: "???" commit: "???" [skip ci] --- barretenberg/.gitrepo | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/barretenberg/.gitrepo b/barretenberg/.gitrepo index c7afea8c09a..875ba73837d 100644 --- a/barretenberg/.gitrepo +++ b/barretenberg/.gitrepo @@ -5,8 +5,8 @@ ; [subrepo] remote = https://github.com/AztecProtocol/barretenberg - branch = master - commit = 7edb1644d0ae472a70fc3554b7d2cfc6c5496168 - parent = 404ec34d38e1a9c3fbe7a3cdb6e88c28f62f72e4 + branch = main + commit = ae9f99c3caf0213882d843577374b03871cc7092 + parent = c8a5cfb375b498475503c12cc83fcdba39f2ec5f method = merge cmdver = 0.4.6 From cd8f349a8d1cc9045699e5f116924ca1ed90be72 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Thu, 14 Sep 2023 02:09:25 +0000 Subject: [PATCH 11/11] git subrepo push --branch=main docs subrepo: subdir: "docs" merged: "a6b558800" upstream: origin: "https://github.com/AztecProtocol/docs" branch: "main" commit: "a6b558800" git-subrepo: version: "0.4.6" origin: "???" commit: "???" [skip ci] --- docs/.gitrepo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/.gitrepo b/docs/.gitrepo index e3df984cbe5..31bff7a92d6 100644 --- a/docs/.gitrepo +++ b/docs/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/docs branch = main - commit = 6905fb906199ab1a69c4c263029f9a0b8708ee4d - parent = 0c3a6271a1d90fa95a0163606e49f432573e66da + commit = a6b558800fa7712fec7045a2d3a238824cf17084 + parent = c8a5cfb375b498475503c12cc83fcdba39f2ec5f method = merge cmdver = 0.4.6