diff --git a/.circleci/config.yml b/.circleci/config.yml index b7f5bffcb17..9e8f705c529 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -356,6 +356,17 @@ jobs: name: "Build and test" command: build l1-contracts + noir-projects: + machine: + image: ubuntu-2204:2023.07.2 + resource_class: large + steps: + - *checkout + - *setup_env + - run: + name: "Build and test" + command: build noir-projects + boxes-files: machine: image: ubuntu-2204:2023.07.2 @@ -1207,14 +1218,20 @@ workflows: - boxes-files: *defaults + - noir-projects: + requires: + - avm-transpiler + - noir-ecr-manifest + <<: *defaults + # Yarn Project - yarn-project-base: requires: - avm-transpiler - l1-contracts - bb-js - - noir-ecr-manifest - noir-packages + - noir-projects - boxes-files <<: *defaults - yarn-project: diff --git a/.github/workflows/mirror_repos.yml b/.github/workflows/mirror_repos.yml index 508887fd79d..e71a40e7ff8 100644 --- a/.github/workflows/mirror_repos.yml +++ b/.github/workflows/mirror_repos.yml @@ -45,14 +45,14 @@ jobs: token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - name: Push to aztec-nr repo run: | - SUBREPO_PATH=yarn-project/aztec-nr + SUBREPO_PATH=aztec-nr git config --global user.name AztecBot git config --global user.email tech@aztecprotocol.com monorepo_url="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY" # list all aztec-packages tags, take the "highest" version monorepo_tag="$(git tag --list aztec-packages-v* | sort --version-sort | tail -1)" - monorepo_protocol_circuits_path="yarn-project/noir-protocol-circuits" + monorepo_protocol_circuits_path="noir-packages/noir-protocol-circuits" # take all Nargo.toml files that reference noir-protocol-circuits nargo_files="$(find $SUBREPO_PATH -name 'Nargo.toml' | xargs grep --files-with-matches 'noir-protocol-circuits')" @@ -60,7 +60,7 @@ jobs: # match lines like this: # protocol_types = { path = "../../noir-protocol-circuits/src/crates/types" } # and replace with - # protocol_types = { git="https://github.com/aztecprotocol/aztec-packages", tag="aztec-packages-v0.16.9", directory="yarn-project/noir-protocol-circuits/src/crates/types" } + # protocol_types = { git="https://github.com/aztecprotocol/aztec-packages", tag="aztec-packages-v0.16.9", directory="noir-projects/noir-protocol-circuits/src/crates/types" } for nargo_file in $nargo_files; do sed --regexp-extended --in-place \ "s;path\s*=\s*\".*noir-protocol-circuits(.*)\";git=\"$monorepo_url\", tag=\"$monorepo_tag\", directory=\"$monorepo_protocol_circuits_path\1\";" \ diff --git a/.github/workflows/protocol-circuits-gate-diff.yml b/.github/workflows/protocol-circuits-gate-diff.yml index 38f0fbb3437..731cb7663af 100644 --- a/.github/workflows/protocol-circuits-gate-diff.yml +++ b/.github/workflows/protocol-circuits-gate-diff.yml @@ -78,7 +78,7 @@ jobs: run: nargo --version - name: Generate gates report - working-directory: ./yarn-project/noir-protocol-circuits/src + working-directory: ./noir-projects/noir-protocol-circuits/src run: | nargo info --json > protocol_circuits_report.json mv protocol_circuits_report.json ../../../protocol_circuits_report.json diff --git a/.gitignore b/.gitignore index a7ebba4e7a3..2a3e0871fe4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,6 @@ cmake-build-debug # Local Netlify folder .netlify -.graphite* \ No newline at end of file +.graphite* + +noir-protocol-circuits/src/target/*.json \ No newline at end of file diff --git a/README.md b/README.md index edf2a3cc4f0..b999a7ed847 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ All the packages that make up [Aztec](https://docs.aztec.network). ## Popular packages -- [Aztec.nr](./yarn-project/aztec-nr/): A [Noir](https://noir-lang.org) framework for smart contracts on Aztec. +- [Aztec.nr](./aztec-nr/): A [Noir](https://noir-lang.org) framework for smart contracts on Aztec. - [Aztec](./yarn-project/aztec/): A package for starting up local dev net modules, including a local 'sandbox' devnet, an Ethereum network, deployed rollup contracts and Aztec execution environment. - [Aztec.js](./yarn-project/aztec.js/): A tool for interacting with the Aztec network. It communicates via the [Private Execution Environment (PXE)](./yarn-project/pxe/). -- [Example contracts](./yarn-project/noir-contracts/): Example contracts for the Aztec network, written in Noir. +- [Example contracts](./noir-contracts/): Example contracts for the Aztec network, written in Noir. - [End to end tests](./yarn-project/end-to-end/): Integration tests written in Typescript--a good reference for how to use the packages for specific tasks. - [Aztec Boxes](./boxes/): Example starter projects. @@ -71,7 +71,8 @@ We currently use [git-subrepo](https://github.com/ingydotnet/git-subrepo) to man There is an automatic mirror pushing noir to a PR on noir side. If the mirror is not working, generally we need to do a "git subrepo pull noir". Recovering if the sync is not happening with basic pull commands: - - manually editing the commit variable in noir/.gitrepo: - this needs to exist in the branch we push to, and have the same content as our base. This is similar to submodules, except instead of pointing to the final state of the module, it points to the last commit we have sync'd from, for purposes of commit replay. This can be fixed to match the commit in master after merges. - - manually editing the parent variable in noir/.gitrepo: this is the parent of the last sync commit on aztec side. If you get errors with a commit not being found in the upstream repo, and the commit mentioned is not the commit variable above, it might indicate this is somehow incorrect. This can happen when commit content is ported without its history, e.g. squashes - - use pull --force ONLY where you would use git reset. That is, if you really want to match some upstream noir for a purpose its fine, but you'll lose local changes (if any) + +- manually editing the commit variable in noir/.gitrepo: + this needs to exist in the branch we push to, and have the same content as our base. This is similar to submodules, except instead of pointing to the final state of the module, it points to the last commit we have sync'd from, for purposes of commit replay. This can be fixed to match the commit in master after merges. +- manually editing the parent variable in noir/.gitrepo: this is the parent of the last sync commit on aztec side. If you get errors with a commit not being found in the upstream repo, and the commit mentioned is not the commit variable above, it might indicate this is somehow incorrect. This can happen when commit content is ported without its history, e.g. squashes +- use pull --force ONLY where you would use git reset. That is, if you really want to match some upstream noir for a purpose its fine, but you'll lose local changes (if any) diff --git a/bootstrap.sh b/bootstrap.sh index 502bdc19956..818d5795637 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -45,7 +45,7 @@ fi # Install pre-commit git hooks. HOOKS_DIR=$(git rev-parse --git-path hooks) -echo "(cd barretenberg/cpp && ./format.sh staged)" > $HOOKS_DIR/pre-commit +echo "(cd barretenberg/cpp && ./format.sh staged)" >$HOOKS_DIR/pre-commit chmod +x $HOOKS_DIR/pre-commit git submodule update --init --recursive @@ -55,6 +55,7 @@ PROJECTS=( noir l1-contracts avm-transpiler + noir-projects yarn-project ) @@ -66,7 +67,7 @@ for P in "${PROJECTS[@]}"; do echo "**************************************" echo $P/bootstrap_cache.sh - else + else echo "**************************************" echo -e "\033[1mBootstrapping $P...\033[0m" echo "**************************************" diff --git a/boxes/Dockerfile b/boxes/Dockerfile index 4191b3559a6..9241170b544 100644 --- a/boxes/Dockerfile +++ b/boxes/Dockerfile @@ -2,11 +2,13 @@ # Produces a container that can be run to test a specific box. See docker-compose.yml. FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/aztec AS aztec FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/noir as noir +FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/noir-projects as noir-projects # We need yarn. Start fresh container. FROM node:18.19.0 COPY --from=aztec /usr/src /usr/src COPY --from=noir /usr/src/noir/target/release/nargo /usr/src/noir/target/release/nargo +COPY --from=noir-projects /usr/src/noir-projects/aztec-nr /usr/src/noir-projects/aztec-nr WORKDIR /usr/src/boxes ENV AZTEC_NARGO=/usr/src/noir/target/release/nargo ENV AZTEC_CLI=/usr/src/yarn-project/cli/aztec-cli-dest diff --git a/boxes/blank-react/src/contracts/Nargo.toml b/boxes/blank-react/src/contracts/Nargo.toml index 66986b634b5..4bada4bb876 100644 --- a/boxes/blank-react/src/contracts/Nargo.toml +++ b/boxes/blank-react/src/contracts/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = ">=0.18.0" type = "contract" [dependencies] -aztec = { path = "../../../../yarn-project/aztec-nr/aztec" } +aztec = { path = "../../../../noir-projects/aztec-nr/aztec" } diff --git a/boxes/blank/src/contracts/Nargo.toml b/boxes/blank/src/contracts/Nargo.toml index 66986b634b5..4bada4bb876 100644 --- a/boxes/blank/src/contracts/Nargo.toml +++ b/boxes/blank/src/contracts/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = ">=0.18.0" type = "contract" [dependencies] -aztec = { path = "../../../../yarn-project/aztec-nr/aztec" } +aztec = { path = "../../../../noir-projects/aztec-nr/aztec" } diff --git a/boxes/token/src/contracts/Nargo.toml b/boxes/token/src/contracts/Nargo.toml index e229ed0cd72..69769304ad6 100644 --- a/boxes/token/src/contracts/Nargo.toml +++ b/boxes/token/src/contracts/Nargo.toml @@ -5,7 +5,7 @@ compiler_version = ">=0.18.0" type = "contract" [dependencies] -aztec = { path = "../../../../yarn-project/aztec-nr/aztec" } -safe_math = { path = "../../../../yarn-project/aztec-nr/safe-math" } -compressed_string = {path = "../../../../yarn-project/aztec-nr/compressed-string"} -authwit = { path = "../../../../yarn-project/aztec-nr/authwit" } +aztec = { path = "../../../../noir-projects/aztec-nr/aztec" } +safe_math = { path = "../../../../noir-projects/aztec-nr/safe-math" } +compressed_string = { path = "../../../../noir-projects/aztec-nr/compressed-string" } +authwit = { path = "../../../../noir-projects/aztec-nr/authwit" } diff --git a/build_manifest.yml b/build_manifest.yml index b5cff869bfe..7a144219eff 100644 --- a/build_manifest.yml +++ b/build_manifest.yml @@ -37,6 +37,12 @@ noir-packages: - ^noir/tooling/noirc_abi - ^noir/tooling/noirc_abi_wasm +noir-projects: + buildDir: noir-projects + dependencies: + - noir + - avm-transpiler + noir-compile-acir-tests: buildDir: noir/test_programs # Awkward. Maybe change dockerfile paths to be absolute. @@ -135,6 +141,7 @@ yarn-project-base: - noir-packages - boxes-files - avm-transpiler + - noir-projects yarn-project: buildDir: yarn-project @@ -179,6 +186,7 @@ boxes: dependencies: - aztec - noir + - noir-projects runDependencies: - aztec @@ -206,6 +214,7 @@ docs: - ^.*.nr$ dependencies: - yarn-project + - noir-projects yellow-paper: buildDir: yellow-paper diff --git a/docs/docs/developers/contracts/compiling_contracts/how_to_compile_contract.md b/docs/docs/developers/contracts/compiling_contracts/how_to_compile_contract.md index 6acdef15c66..7d78818d4ff 100644 --- a/docs/docs/developers/contracts/compiling_contracts/how_to_compile_contract.md +++ b/docs/docs/developers/contracts/compiling_contracts/how_to_compile_contract.md @@ -30,7 +30,7 @@ To generate them, include a `--ts` option in the `codegen` command with a path t aztec-cli codegen ./aztec-nargo/output/target/path -o src/artifacts --ts ``` -Below is typescript code generated from the [Token](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_contract/src/main.nr) contract: +Below is typescript code generated from the [Token](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_contract/src/main.nr) contract: ```ts showLineNumbers export class TokenContract extends ContractBase { @@ -127,7 +127,7 @@ To generate them, include a `--nr` option in the `codegen` command with a path t aztec-cli codegen ./aztec-nargo/output/target/path -o ./path/to/output/folder --nr ``` -Below is an example interface, also generated from the [Token](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_contract/src/main.nr) contract: +Below is an example interface, also generated from the [Token](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_contract/src/main.nr) contract: ```rust impl TokenPrivateContextInterface { diff --git a/docs/docs/developers/contracts/deploying_contracts/how_to_deploy_contract.md b/docs/docs/developers/contracts/deploying_contracts/how_to_deploy_contract.md index 9da2f49e057..2ac74e787e2 100644 --- a/docs/docs/developers/contracts/deploying_contracts/how_to_deploy_contract.md +++ b/docs/docs/developers/contracts/deploying_contracts/how_to_deploy_contract.md @@ -68,7 +68,7 @@ There are several optional arguments that can be passed: -`aztec-cli deploy` takes 1 mandatory argument which is the path to the contract artifact file in a JSON format (e.g. `contracts/target/PrivateToken.json`). Alternatively you can pass the name of an example contract as exported by `@aztec/noir-contracts` (run `aztec-cli example-contracts` to see the full list of contracts available). +`aztec-cli deploy` takes 1 mandatory argument which is the path to the contract artifact file in a JSON format (e.g. `contracts/target/PrivateToken.json`). Alternatively you can pass the name of an example contract as exported by `@aztec/noir-contracts.js` (run `aztec-cli example-contracts` to see the full list of contracts available). The command also takes the following optional arguments: @@ -105,7 +105,7 @@ const tx = ExampleContract.deploy(pxe).send({ ### Deploying token contract -To give you a more complete example we will deploy a `Token` contract whose artifacts are included in the `@aztec/noir-contracts` package. +To give you a more complete example we will deploy a `Token` contract whose artifacts are included in the `@aztec/noir-contracts.js` package. The contract has `admin` as a constructor argument. We will deploy the contract with the `aztec-cli` and pass the `admin` address as an argument. diff --git a/docs/docs/developers/contracts/references/globals.md b/docs/docs/developers/contracts/references/globals.md index 4f66ff577a6..283660d2c47 100644 --- a/docs/docs/developers/contracts/references/globals.md +++ b/docs/docs/developers/contracts/references/globals.md @@ -4,34 +4,41 @@ description: Documentation of Aztec's Global Variables in the Public and Private --- # Global Variables -For developers coming from solidity, this concept will be similar to how the global `block` variable exposes a series of block values. The idea is the same in Aztec. Developers can access a namespace of values made available in each function. -`Aztec` has two execution environments, Private and Public. Each execution environment contains a different global variables object. +For developers coming from solidity, this concept will be similar to how the global `block` variable exposes a series of block values. The idea is the same in Aztec. Developers can access a namespace of values made available in each function. -## Private Global Variables -#include_code private-global-variables /yarn-project/aztec-nr/aztec/src/context/globals/private_global_variables.nr rust +`Aztec` has two execution environments, Private and Public. Each execution environment contains a different global variables object. + +## Private Global Variables + +#include_code private-global-variables /noir-projects/aztec-nr/aztec/src/context/globals/private_global_variables.nr rust The private global variables contain: + ### Chain Id + The chain id differs depending on which Aztec instance you are on ( NOT the Ethereum hardfork that the rollup is settling to ). On original deployment of the network, this value will be 1. + ```rust context.chain_id(); ``` ### Version + The version number indicates which Aztec hardfork you are on. The Genesis block of the network will have the version number 1. ```rust context.version(); ``` - ## Public Global Variables -#include_code global-variables /yarn-project/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr rust + +#include_code global-variables /noir-projects/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr rust The public global variables contain the values present in the `private global variables` described above, with the addition of: ### Timestamp + The timestamp is the unix timestamp in which the block has been executed. The value is provided by the block's proposer (therefore can have variance). This value will always increase. ```rust @@ -39,6 +46,7 @@ context.timestamp(); ``` ### Block Number + The block number is a sequential identifier that labels each individual block of the network. This value will be the block number of the block the accessing transaction is included in. The block number of the genesis block will be 1, with the number increasing by 1 for every block after. @@ -46,7 +54,7 @@ The block number of the genesis block will be 1, with the number increasing by 1 context.block_number(); ``` -:::info *Why do the available global variables differ per execution environment?* -The global variables are constrained by the proving environment. In the case of public functions, they are executed on a sequencer that will know the timestamp and number of the next block ( as they are the block producer ). +:::info _Why do the available global variables differ per execution environment?_ +The global variables are constrained by the proving environment. In the case of public functions, they are executed on a sequencer that will know the timestamp and number of the next block ( as they are the block producer ). In the case of private functions, we cannot be sure which block our transaction will be included in, hence we can not guarantee values for the timestamp or block number. ::: diff --git a/docs/docs/developers/contracts/references/slow_updates_tree.md b/docs/docs/developers/contracts/references/slow_updates_tree.md index 552530edeb7..a179c54a93d 100644 --- a/docs/docs/developers/contracts/references/slow_updates_tree.md +++ b/docs/docs/developers/contracts/references/slow_updates_tree.md @@ -1,17 +1,18 @@ --- -title: Slow Updates Tree +title: Slow Updates Tree --- ## Struct `SlowMap` ### Overview + The `SlowMap` struct is used to interact with a slow updates tree deployed via the SlowTree smart contract. ### Fields -| Name | Type | Description | -|---------|-----------|---------------------------------| -| address | `Field` | The address of the SlowTree contract | +| Name | Type | Description | +| ------- | ------- | ------------------------------------ | +| address | `Field` | The address of the SlowTree contract | ## Functions @@ -21,19 +22,19 @@ Returns an instance of `SlowMap` at the specified address. **Parameters** -| Name | Type | Description | -|----------|----------------|----------------------------| -| `address`| `AztecAddress` | The address of the SlowTree | +| Name | Type | Description | +| --------- | -------------- | --------------------------- | +| `address` | `AztecAddress` | The address of the SlowTree | **Return** -| Name | Type | Description | -|-------|-----------|------------------------------| -| - | `SlowMap` | The `SlowMap` instance | +| Name | Type | Description | +| ---- | --------- | ---------------------- | +| - | `SlowMap` | The `SlowMap` instance | **Example** -#include_code slowmap_at yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code slowmap_at noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust ### initialize @@ -41,19 +42,19 @@ Initializes the `SlowMap`. **Parameters** -| Name | Type | Description | -|-----------|-----------------|----------------------| +| Name | Type | Description | +| --------- | --------------- | --------------------- | | `context` | `PublicContext` | The execution context | **Return** | Name | Type | Description | -|------|------|-------------| +| ---- | ---- | ----------- | | - | - | - | **Example** -#include_code slowmap_initialize yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code slowmap_initialize noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust ### read_at_pub @@ -62,19 +63,19 @@ Reads a value at a specified index from a public function. **Parameters** | Name | Type | Description | -|-----------|-----------------|-----------------------| +| --------- | --------------- | --------------------- | | `context` | `PublicContext` | The execution context | | `index` | `Field` | The index to read at | **Return** -| Name | Type | Description | -|----------|--------|-----------------------| -| `result` | `Field`| The value at `index` | +| Name | Type | Description | +| -------- | ------- | -------------------- | +| `result` | `Field` | The value at `index` | **Example** -#include_code read_at_pub yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code read_at_pub noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust ### read_at @@ -82,20 +83,20 @@ Reads a value at a specified index from a private function. **Parameters** -| Name | Type | Description | -|-----------|--------------------|------------------------| -| `context` | `PrivateContext` | The execution context | -| `index` | `Field` | The index to read at | +| Name | Type | Description | +| --------- | ---------------- | --------------------- | +| `context` | `PrivateContext` | The execution context | +| `index` | `Field` | The index to read at | **Return** -| Name | Type | Description | -|----------|--------|-----------------------| -| `result` | `Field`| The value at `index` | +| Name | Type | Description | +| -------- | ------- | -------------------- | +| `result` | `Field` | The value at `index` | **Example** -#include_code slowmap_read_at yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code slowmap_read_at noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust ### update_at_private @@ -103,15 +104,15 @@ Updates a value at a specified index from a private function. Does not return an **Parameters** -| Name | Type | Description | -|-------------|--------------------|------------------------| -| `context` | `PrivateContext` | The execution context | -| `index` | `Field` | The index to update | -| `new_value` | `Field` | The new value | +| Name | Type | Description | +| ----------- | ---------------- | --------------------- | +| `context` | `PrivateContext` | The execution context | +| `index` | `Field` | The index to update | +| `new_value` | `Field` | The new value | **Example** -#include_code get_and_update_private yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code get_and_update_private noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust ## Updating from public @@ -119,5 +120,4 @@ This is not a method in the interface as it can be done using regular Aztec.nr p **Example** -#include_code write_slow_update_public yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust - +#include_code write_slow_update_public noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust diff --git a/docs/docs/developers/contracts/references/storage/main.md b/docs/docs/developers/contracts/references/storage/main.md index d16a1d1d69f..6bc1f653915 100644 --- a/docs/docs/developers/contracts/references/storage/main.md +++ b/docs/docs/developers/contracts/references/storage/main.md @@ -14,7 +14,7 @@ In this tutorial you will learn how to: - Handle different private note types - Pass data between private and public state -We are going to start with a blank project and fill in the token contract source code defined on Github [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src/main.nr), and explain what is being added as we go. +We are going to start with a blank project and fill in the token contract source code defined on Github [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src/main.nr), and explain what is being added as we go. ## Requirements @@ -58,10 +58,10 @@ compiler_version = ">=0.18.0" type = "contract" [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } -safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/safe-math"} -authwit={ git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/authwit"} -compressed_string = {git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/compressed-string"} +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/safe-math"} +authwit={ git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/authwit"} +compressed_string = {git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/compressed-string"} ``` ## Contract Interface @@ -201,23 +201,23 @@ Before we can implement the functions, we need set up the contract storage, and :::info Copy required files -We will be going over the code in `main.nr` [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src). If you are following along and want to compile `main.nr` yourself, you need to add the other files in the directory as they contain imports that are used in `main.nr`. +We will be going over the code in `main.nr` [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src). If you are following along and want to compile `main.nr` yourself, you need to add the other files in the directory as they contain imports that are used in `main.nr`. ::: Just below the contract definition, add the following imports: -#include_code imports /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code imports /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust -We are importing the Option type, items from the `value_note` library to help manage private value storage, note utilities, context (for managing private and public execution contexts), `state_vars` for helping manage state, `types` for data manipulation and `oracle` for help passing data from the private to public execution context. We also import the `auth` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/auth.nr) to handle token authorizations from [Account Contracts](../../../../learn/concepts/accounts/main.md). Check out the Account Contract with AuthWitness [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr). +We are importing the Option type, items from the `value_note` library to help manage private value storage, note utilities, context (for managing private and public execution contexts), `state_vars` for helping manage state, `types` for data manipulation and `oracle` for help passing data from the private to public execution context. We also import the `auth` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/auth.nr) to handle token authorizations from [Account Contracts](../../../../learn/concepts/accounts/main.md). Check out the Account Contract with AuthWitness [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr). -[SafeU120](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/safe-math/src/safe_u120.nr) is a library to do safe math operations on unsigned integers that protects against overflows and underflows. +[SafeU120](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/safe-math/src/safe_u120.nr) is a library to do safe math operations on unsigned integers that protects against overflows and underflows. For more detail on execution contexts, see [Contract Communication](../../../../learn/concepts/communication/main). ### Types files -We are also importing types from a `types.nr` file, which imports types from the `types` folder. You can view them [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src). +We are also importing types from a `types.nr` file, which imports types from the `types` folder. You can view them [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src). The main thing to note from this types folder is the `TransparentNote` definition. This defines how the contract moves value from the public domain into the private domain. It is similar to the `value_note` that we imported, but with some modifications namely, instead of a defined `owner`, it allows anyone that can produce the pre-image to the stored `secret_hash` to spend the note. @@ -231,7 +231,7 @@ Now that we have dependencies imported into our contract we can define the stora Below the dependencies, paste the following Storage struct: -#include_code storage_struct /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code storage_struct /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust Reading through the storage variables: @@ -252,15 +252,15 @@ Copy and paste the body of each function into the appropriate place in your proj In the source code, the constructor logic is commented out due to some limitations of the current state of the development. -#include_code constructor /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code constructor /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust -The constructor is a private function. There isn't any private state to set up in this function, but there is public state to set up. The `context` is a global variable that is available to private and public functions, but the available methods differ based on the context. You can see the implementation details [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/context.nr). The `context.call_public_function` allows a private function to call a public function on any contract. In this case, the constructor is passing the `msg_sender` as the argument to the `_initialize` function, which is also defined in this contract. +The constructor is a private function. There isn't any private state to set up in this function, but there is public state to set up. The `context` is a global variable that is available to private and public functions, but the available methods differ based on the context. You can see the implementation details [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/context.nr). The `context.call_public_function` allows a private function to call a public function on any contract. In this case, the constructor is passing the `msg_sender` as the argument to the `_initialize` function, which is also defined in this contract. ### Public function implementations Public functions are declared with the `#[aztec(public)]` macro above the function name like so: -#include_code set_admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code set_admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust As described in the [execution contexts section above](#execution-contexts), public function logic and transaction information is transparent to the world. Public functions update public state, but can be used to prepare data to be used in a private context, as we will go over below (e.g. see the [shield](#shield) function). @@ -270,13 +270,13 @@ Storage is referenced as `storage.variable`. After storage is initialized, the contract checks that the `msg_sender` is the `admin`. If not, the transaction will fail. If it is, the `new_admin` is saved as the `admin`. -#include_code set_admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code set_admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `set_minter` This function allows the `admin` to add or a remove a `minter` from the public `minters` mapping. It checks that `msg_sender` is the `admin` and finally adds the `minter` to the `minters` mapping. -#include_code set_minter /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code set_minter /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `mint_public` @@ -286,15 +286,15 @@ First, storage is initialized. Then the function checks that the `msg_sender` is The function returns 1 to indicate successful execution. -#include_code mint_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code mint_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `mint_private` This public function allows an account approved in the public `minters` mapping to create new private tokens that can be claimed by anyone that has the pre-image to the `secret_hash`. -First, public storage is initialized. Then it checks that the `msg_sender` is an approved minter. Then a new `TransparentNote` is created with the specified `amount` and `secret_hash`. You can read the details of the `TransparentNote` in the `types.nr` file [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src/types.nr#L61). The `amount` is added to the existing public `total_supply` and the storage value is updated. Then the new `TransparentNote` is added to the `pending_shields` using the `insert_from_public` function, which is accessible on the `Set` type. Then it's ready to be claimed by anyone with the `secret_hash` pre-image using the `redeem_shield` function. It returns `1` to indicate successful execution. +First, public storage is initialized. Then it checks that the `msg_sender` is an approved minter. Then a new `TransparentNote` is created with the specified `amount` and `secret_hash`. You can read the details of the `TransparentNote` in the `types.nr` file [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src/types.nr#L61). The `amount` is added to the existing public `total_supply` and the storage value is updated. Then the new `TransparentNote` is added to the `pending_shields` using the `insert_from_public` function, which is accessible on the `Set` type. Then it's ready to be claimed by anyone with the `secret_hash` pre-image using the `redeem_shield` function. It returns `1` to indicate successful execution. -#include_code mint_private /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code mint_private /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `shield` @@ -310,7 +310,7 @@ If the `msg_sender` is the same as the account to debit tokens from, the authori It returns `1` to indicate successful execution. -#include_code shield /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code shield /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `transfer_public` @@ -318,7 +318,7 @@ This public function enables public transfers between Aztec accounts. The sender After storage is initialized, the [authorization flow specified above](#authorizing-token-spends) is checked. Then the sender and recipient's balances are updated and saved to storage using the `SafeU120` library. -#include_code transfer_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code transfer_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `burn_public` @@ -326,7 +326,7 @@ This public function enables public burning (destroying) of tokens from the send After storage is initialized, the [authorization flow specified above](#authorizing-token-spends) is checked. Then the sender's public balance and the `total_supply` are updated and saved to storage using the `SafeU120` library. -#include_code burn_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code burn_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Private function implementations @@ -345,11 +345,11 @@ Storage is referenced as `storage.variable`. This private function enables an account to move tokens from a `TransparentNote` in the `pending_shields` mapping to any Aztec account as a `ValueNote` in private `balances`. -Going through the function logic, first the `secret_hash` is generated from the given secret. This ensures that only the entity possessing the secret can use it to redeem the note. Following this, a `TransparentNote` is retrieved from the set, using the provided amount and secret. The note is subsequently removed from the set, allowing it to be redeemed only once. The recipient's private balance is then increased using the `increment` helper function from the `value_note` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/value-note/src/utils.nr). +Going through the function logic, first the `secret_hash` is generated from the given secret. This ensures that only the entity possessing the secret can use it to redeem the note. Following this, a `TransparentNote` is retrieved from the set, using the provided amount and secret. The note is subsequently removed from the set, allowing it to be redeemed only once. The recipient's private balance is then increased using the `increment` helper function from the `value_note` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/value-note/src/utils.nr). The function returns `1` to indicate successful execution. -#include_code redeem_shield /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code redeem_shield /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `unshield` @@ -359,7 +359,7 @@ After initializing storage, the function checks that the `msg_sender` is authori The function returns `1` to indicate successful execution. -#include_code unshield /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code unshield /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `transfer` @@ -367,7 +367,7 @@ This private function enables private token transfers between Aztec accounts. After initializing storage, the function checks that the `msg_sender` is authorized to spend tokens. See [the Authorizing token spends section](#authorizing-token-spends) above for more detail--the only difference being that `assert_valid_message_for` is modified to work specifically in the private context. After authorization, the function gets the current balances for the sender and recipient and decrements and increments them, respectively, using the `value_note` helper functions. -#include_code transfer /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code transfer /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `burn` @@ -375,7 +375,7 @@ This private function enables accounts to privately burn (destroy) tokens. After initializing storage, the function checks that the `msg_sender` is authorized to spend tokens. Then it gets the sender's current balance and decrements it. Finally it stages a public function call to [`_reduce_total_supply`](#_reduce_total_supply). -#include_code burn /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code burn /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Internal function implementations @@ -387,19 +387,19 @@ This function is called via the [constructor](#constructor). This function sets the creator of the contract (passed as `msg_sender` from the constructor) as the admin and makes them a minter. -#include_code initialize /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code initialize /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `_increase_public_balance` This function is called from [`unshield`](#unshield). The account's private balance is decremented in `shield` and the public balance is increased in this function. -#include_code increase_public_balance /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code increase_public_balance /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `_reduce_total_supply` This function is called from [`burn`](#burn). The account's private balance is decremented in `burn` and the public `total_supply` is reduced in this function. -#include_code reduce_total_supply /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code reduce_total_supply /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Unconstrained function implementations @@ -409,31 +409,31 @@ Unconstrained functions are similar to `view` functions in Solidity in that they A getter function for reading the public `admin` value. -#include_code admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `is_minter` A getter function for checking the value of associated with a `minter` in the public `minters` mapping. -#include_code is_minter /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code is_minter /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `total_supply` A getter function for checking the token `total_supply`. -#include_code total_supply /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code total_supply /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `balance_of_private` A getter function for checking the private balance of the provided Aztec account. Note that the [Private Execution Environment (PXE)](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/pxe) must have access to the `owner`s decryption keys in order to decrypt their notes. -#include_code balance_of_private /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code balance_of_private /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `balance_of_public` A getter function for checking the public balance of the provided Aztec account. -#include_code balance_of_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code balance_of_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `compute_note_hash_and_nullifier` @@ -441,13 +441,13 @@ A getter function to compute the note hash and nullifier for notes in the contra This must be included in every contract because it depends on the storage slots, which are defined when we set up storage. -#include_code compute_note_hash_and_nullifier /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust :::danger If your contract works with storage (has Storage struct defined), you **MUST** include a `compute_note_hash_and_nullifier` function. If you don't yet have any private state variables defined put there a placeholder function: -#include_code compute_note_hash_and_nullifier_placeholder /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier_placeholder /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust ::: ## Compiling @@ -478,4 +478,4 @@ https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn The [token bridge tutorial](https://github.com/AztecProtocol/dev-rel/tree/main/tutorials/token-bridge) is a great follow up to this one. -It builds on the Token contract described here and goes into more detail about Aztec contract composability and Ethereum (L1) and Aztec (L2) cross-chain messaging. \ No newline at end of file +It builds on the Token contract described here and goes into more detail about Aztec contract composability and Ethereum (L1) and Aztec (L2) cross-chain messaging. diff --git a/docs/docs/developers/contracts/references/storage/private_state.md b/docs/docs/developers/contracts/references/storage/private_state.md index ccc81c20cd4..4b8d6addec1 100644 --- a/docs/docs/developers/contracts/references/storage/private_state.md +++ b/docs/docs/developers/contracts/references/storage/private_state.md @@ -34,11 +34,11 @@ Notes are the fundamental elements in the private world. A note should implement the following traits: -#include_code note_interface /yarn-project/aztec-nr/aztec/src/note/note_interface.nr rust +#include_code note_interface /noir-projects/aztec-nr/aztec/src/note/note_interface.nr rust -#include_code serialize /yarn-project/noir-protocol-circuits/src/crates/types/src/traits.nr rust +#include_code serialize /noir-projects/noir-protocol-circuits/src/crates/types/src/traits.nr rust -#include_code deserialize /yarn-project/noir-protocol-circuits/src/crates/types/src/traits.nr rust +#include_code deserialize /noir-projects/noir-protocol-circuits/src/crates/types/src/traits.nr rust The interplay between a private state variable and its notes can be confusing. Here's a summary to aid intuition: @@ -70,17 +70,17 @@ Interestingly, if a developer requires a private state to be modifiable by users Singleton is a private state variable that is unique in a way. When a Singleton is initialized, a note is created to represent its value. And the way to update the value is to destroy the current note, and create a new one with the updated value. -Like for public state, we define the struct to have context and a storage slot. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/state_vars/singleton.nr). +Like for public state, we define the struct to have context and a storage slot. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/aztec/src/state_vars/singleton.nr). An example of singleton usage in the account contracts is keeping track of public keys. The `Singleton` is added to the `Storage` struct as follows: -#include_code storage-singleton-declaration /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-singleton-declaration /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust ### `new` As part of the initialization of the `Storage` struct, the `Singleton` is created as follows at the specified storage slot. -#include_code start_vars_singleton /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code start_vars_singleton /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust ### `initialize` @@ -102,9 +102,9 @@ Extend on what happens if you try to use non-initialized state. ### `is_initialized` -An unconstrained method to check whether the Singleton has been initialized or not. It takes an optional owner and returns a boolean. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/state_vars/singleton.nr). +An unconstrained method to check whether the Singleton has been initialized or not. It takes an optional owner and returns a boolean. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/state_vars/singleton.nr). -#include_code singleton_is_initialized /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code singleton_is_initialized /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust ### `replace` @@ -112,7 +112,7 @@ To update the value of a `Singleton`, we can use the `replace` method. The metho An example of this is seen in a example card game, where we create a new note (a `CardNote`) containing some new data, and replace the current note with it: -#include_code state_vars-SingletonReplace /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code state_vars-SingletonReplace /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust If two people are trying to modify the Singleton at the same time, only one will succeed as we don't allow duplicate nullifiers! Developers should put in place appropriate access controls to avoid race conditions (unless a race is intended!). @@ -120,7 +120,7 @@ If two people are trying to modify the Singleton at the same time, only one will This function allows us to get the note of a Singleton, essentially reading the value. -#include_code state_vars-SingletonGet /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code state_vars-SingletonGet /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust #### Nullifying Note reads @@ -134,13 +134,13 @@ Functionally similar to [`get_note`](#get_note), but executed in unconstrained f ## `ImmutableSingleton` -`ImmutableSingleton` represents a unique private state variable that, as the name suggests, is immutable. Once initialized, its value cannot be altered. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/state_vars/immutable_singleton.nr). +`ImmutableSingleton` represents a unique private state variable that, as the name suggests, is immutable. Once initialized, its value cannot be altered. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/state_vars/immutable_singleton.nr). ### `new` As part of the initialization of the `Storage` struct, the `Singleton` is created as follows, here at storage slot 1. -#include_code storage-immutable-singleton-declaration /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-immutable-singleton-declaration /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust ### `initialize` @@ -154,13 +154,13 @@ For example, if the storage slot depends on the an address then it is possible t Set the value of an ImmutableSingleton by calling the `initialize` method: -#include_code initialize-immutable-singleton /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code initialize-immutable-singleton /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust Once initialized, an ImmutableSingleton's value remains unchangeable. This method can only be called once. ### `is_initialized` -An unconstrained method to check if the ImmutableSingleton has been initialized. Takes an optional owner and returns a boolean. You can find the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/state_vars/immutable_singleton.nr). +An unconstrained method to check if the ImmutableSingleton has been initialized. Takes an optional owner and returns a boolean. You can find the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/state_vars/immutable_singleton.nr). ### `get_note` @@ -168,7 +168,7 @@ Similar to the `Singleton`, we can use the `get_note` method to read the value o Use this method to retrieve the value of an initialized ImmutableSingleton. -#include_code get_note-immutable-singleton /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code get_note-immutable-singleton /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust Unlike a `Singleton`, the `get_note` function for an ImmutableSingleton doesn't nullify the current note in the background. This means that multiple accounts can concurrently call this function to read the value. @@ -182,11 +182,11 @@ Functionally similar to `get_note`, but executed unconstrained and can be used b Set is used for managing a collection of notes. All notes in a Set are of the same `NoteType`. But whether these notes all belong to one entity, or are accessible and editable by different entities, is up to the developer. The set is a collection of notes inserted into the data-tree, but notes are never removed from the tree itself, they are only nullified. -You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/state_vars/set.nr). +You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/state_vars/set.nr). And can be added to the `Storage` struct as follows. Here adding a set for a custom note, the TransparentNote (useful for [public -> private communication](../../writing_contracts/functions/call_functions.md)). -#include_code storage-set-declaration /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-set-declaration /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust ### `new` @@ -194,7 +194,7 @@ The `new` method tells the contract how to operate on the underlying storage. We can initialize the set as follows: -#include_code storage-set-init /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-set-init /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust ### `insert` @@ -202,7 +202,7 @@ Allows us to modify the storage by inserting a note into the set. A hash of the note will be generated, and inserted into the note hash tree, allowing us to later use in contract interactions. Recall that the content of the note should be shared with the owner to allow them to use it, as mentioned this can be done via an [encrypted log](../../writing_contracts/events/emit_event.md#encrypted-events), or offchain via web2, or completely offline. -#include_code insert /yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr rust +#include_code insert /noir-projects/aztec-nr/easy-private-state/src/easy_private_state.nr rust ### `insert_from_public` @@ -210,7 +210,7 @@ The `insert_from_public` allow public function to insert notes into private stor The usage is similar to using the `insert` method with the difference that this one is called in public functions. -#include_code insert_from_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code insert_from_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### `remove` @@ -220,27 +220,27 @@ Nullifiers are emitted when reading values to make sure that they are up to date An example of how to use this operation is visible in the `easy_private_state`: -#include_code remove /yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr rust +#include_code remove /noir-projects/aztec-nr/easy-private-state/src/easy_private_state.nr rust ### `get_notes` This function returns the notes the account has access to. -The kernel circuits are constrained to a maximum number of notes this function can return at a time. Check [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr) and look for `MAX_READ_REQUESTS_PER_CALL` for the up-to-date number. +The kernel circuits are constrained to a maximum number of notes this function can return at a time. Check [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-protocol-circuits/src/crates/types/src/constants.nr) and look for `MAX_READ_REQUESTS_PER_CALL` for the up-to-date number. Because of this limit, we should always consider using the second argument `NoteGetterOptions` to limit the number of notes we need to read and constrain in our programs. This is quite important as every extra call increases the time used to prove the program and we don't want to spend more time than necessary. -An example of such options is using the [filter_notes_min_sum](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/value-note/src/filter.nr) to get "enough" notes to cover a given value. Essentially, this function will return just enough notes to cover the amount specified such that we don't need to read all our notes. For users with a lot of notes, this becomes increasingly important. +An example of such options is using the [filter_notes_min_sum](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/value-note/src/filter.nr) to get "enough" notes to cover a given value. Essentially, this function will return just enough notes to cover the amount specified such that we don't need to read all our notes. For users with a lot of notes, this becomes increasingly important. -#include_code get_notes /yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr rust +#include_code get_notes /noir-projects/aztec-nr/easy-private-state/src/easy_private_state.nr rust ### `view_notes` Functionally similar to [`get_notes`](#get_notes), but executed unconstrained and can be used by the wallet to fetch notes for use by front-ends etc. -#include_code view_notes /yarn-project/aztec-nr/value-note/src/balance_utils.nr rust +#include_code view_notes /noir-projects/aztec-nr/value-note/src/balance_utils.nr rust -There's also a limit on the maximum number of notes that can be returned in one go. To find the current limit, refer to [this file](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr) and look for `MAX_NOTES_PER_PAGE`. +There's also a limit on the maximum number of notes that can be returned in one go. To find the current limit, refer to [this file](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-protocol-circuits/src/crates/types/src/constants.nr) and look for `MAX_NOTES_PER_PAGE`. The key distinction is that this method is unconstrained. It does not perform a check to verify if the notes actually exist, which is something the [`get_notes`](#get_notes) method does under the hood. Therefore, it should only be used in an unconstrained contract function. @@ -250,7 +250,7 @@ This function requires a `NoteViewerOptions`. The `NoteViewerOptions` is essenti `NoteGetterOptions` encapsulates a set of configurable options for filtering and retrieving a selection of notes from a [data oracle](../../writing_contracts/oracles/main.md). Developers can design instances of `NoteGetterOptions`, to determine how notes should be filtered and returned to the functions of their smart contracts. -You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/note/note_getter_options.nr). +You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/note/note_getter_options.nr). ### `selects: BoundedVec, N>` @@ -320,11 +320,11 @@ This method sets the status of notes to retrieve (active or nullified). The following code snippet creates an instance of `NoteGetterOptions`, which has been configured to find the cards that belong to `account_address`. The returned cards are sorted by their points in descending order, and the first `offset` cards with the highest points are skipped. -#include_code state_vars-NoteGetterOptionsSelectSortOffset /yarn-project/noir-contracts/contracts/docs_example_contract/src/options.nr rust +#include_code state_vars-NoteGetterOptionsSelectSortOffset /noir-projects/noir-contracts/contracts/docs_example_contract/src/options.nr rust The first value of `.select` and `.sort` is the index of a field in a note type. For the note type `CardNote` that has the following fields: -#include_code state_vars-CardNote /yarn-project/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr rust +#include_code state_vars-CardNote /noir-projects/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr rust The indices are: 0 for `points`, 1 for `secret`, and 2 for `owner`. @@ -334,21 +334,21 @@ In the example, `.select(2, account_address, Option::none())` matches the 2nd fi There can be as many conditions as the number of fields a note type has. The following example finds cards whose fields match the three given values: -#include_code state_vars-NoteGetterOptionsMultiSelects /yarn-project/noir-contracts/contracts/docs_example_contract/src/options.nr rust +#include_code state_vars-NoteGetterOptionsMultiSelects /noir-projects/noir-contracts/contracts/docs_example_contract/src/options.nr rust While `selects` lets us find notes with specific values, `filter` lets us find notes in a more dynamic way. The function below picks the cards whose points are at least `min_points`, although this now can be done by using the select function with a GTE comparator: -#include_code state_vars-OptionFilter /yarn-project/noir-contracts/contracts/docs_example_contract/src/options.nr rust +#include_code state_vars-OptionFilter /noir-projects/noir-contracts/contracts/docs_example_contract/src/options.nr rust We can use it as a filter to further reduce the number of the final notes: -#include_code state_vars-NoteGetterOptionsFilter /yarn-project/noir-contracts/contracts/docs_example_contract/src/options.nr rust +#include_code state_vars-NoteGetterOptionsFilter /noir-projects/noir-contracts/contracts/docs_example_contract/src/options.nr rust One thing to remember is, `filter` will be applied on the notes after they are picked from the database, so it is more efficient to use select with comparators where possible. Another side effect of this is that it's possible that the actual notes we end up getting are fewer than the limit. The limit is `MAX_READ_REQUESTS_PER_CALL` by default. But we can set it to any value **smaller** than that: -#include_code state_vars-NoteGetterOptionsPickOne /yarn-project/noir-contracts/contracts/docs_example_contract/src/options.nr rust +#include_code state_vars-NoteGetterOptionsPickOne /noir-projects/noir-contracts/contracts/docs_example_contract/src/options.nr rust #### Example 2 @@ -358,4 +358,4 @@ An example of how we can use a Comparator to select notes when calling a Noir co In this example, we use the above typescript code to invoke a call to our Noir contract below. This Noir contract function takes an input to match with, and a comparator to use when fetching and selecting notes from storage. -#include_code state_vars-NoteGetterOptionsComparatorExampleNoir /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code state_vars-NoteGetterOptionsComparatorExampleNoir /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust diff --git a/docs/docs/developers/contracts/references/storage/public_state.md b/docs/docs/developers/contracts/references/storage/public_state.md index 68eeb5bfdc1..d96866b4fd8 100644 --- a/docs/docs/developers/contracts/references/storage/public_state.md +++ b/docs/docs/developers/contracts/references/storage/public_state.md @@ -10,30 +10,30 @@ For a higher level overview of the state model in Aztec, see the [state model](. The `PublicState` struct is generic over the variable type `T`. The type _must_ implement Serialize and Deserialize traits, as specified here: -#include_code serialize /yarn-project/noir-protocol-circuits/src/crates/types/src/traits.nr rust -#include_code deserialize /yarn-project/noir-protocol-circuits/src/crates/types/src/traits.nr rust +#include_code serialize /noir-projects/noir-protocol-circuits/src/crates/types/src/traits.nr rust +#include_code deserialize /noir-projects/noir-protocol-circuits/src/crates/types/src/traits.nr rust The struct contains a `storage_slot` which, similar to Ethereum, is used to figure out _where_ in storage the variable is located. Notice that while we don't have the exact same [state model](../../../../learn/concepts/hybrid_state/main.md) as EVM chains it will look similar from the contract developers point of view. -You can find the details of `PublicState` in the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr). +You can find the details of `PublicState` in the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/state_vars/public_state.nr). :::info -An example using a larger struct can be found in the [lending example](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/contracts/lending_contract)'s use of an [`Asset`](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/noir-contracts/contracts/lending_contract/src/asset.nr). +An example using a larger struct can be found in the [lending example](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts/lending_contract)'s use of an [`Asset`](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/noir-projects/noir-contracts/contracts/lending_contract/src/asset.nr). ::: ### `new` -When declaring the storage for `T` as a persistent public storage variable, we use the `PublicState::new()` constructor. As seen below, this takes the `storage_slot` and the `serialization_methods` as arguments along with the [`Context`](../../writing_contracts/functions/context.md), which in this case is used to share interface with other structures. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr). +When declaring the storage for `T` as a persistent public storage variable, we use the `PublicState::new()` constructor. As seen below, this takes the `storage_slot` and the `serialization_methods` as arguments along with the [`Context`](../../writing_contracts/functions/context.md), which in this case is used to share interface with other structures. You can view the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/state_vars/public_state.nr). #### Single value example Say that we wish to add `admin` public state variable into our storage struct. In the struct we can define it as: -#include_code storage-leader-declaration /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-leader-declaration /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust And then when initializing it in the `Storage::init` function we can do: -#include_code storage-leader-init /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-leader-init /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust We have specified that we are storing a `Field` that should be placed in storage slot `1`. This is just a single value, and is similar to the following in solidity: @@ -45,11 +45,11 @@ address internal admin; Say we want to have a group of `minters` that are able to mint assets in our contract, and we want them in public storage, because [access control in private is quite cumbersome](../../../../learn/concepts/communication/cross_chain_calls.md#a-note-on-l2-access-control). In the `Storage` struct we can add it as follows: -#include_code storage-minters-declaration /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-minters-declaration /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust And then when initializing it in the `Storage::init` function we can do it as follows: -#include_code storage-minters-init /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-minters-init /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust In this case, specifying that we are dealing with a map of Fields, and that it should be put at slot 2. @@ -67,13 +67,13 @@ On the `PublicState` structs we have a `read` method to read the value at the lo For our `admin` example from earlier, this could be used as follows to check that the stored value matches the `msg_sender()`. -#include_code read_admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code read_admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### Reading from our `minters` example As we saw in the Map earlier, a very similar operation can be done to perform a lookup in a map. -#include_code read_minter /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code read_minter /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### `write` @@ -81,11 +81,11 @@ We have a `write` method on the `PublicState` struct that takes the value to wri #### Writing to our `admin` example -#include_code write_admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code write_admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### Writing to our `minters` example -#include_code write_minter /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code write_minter /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust --- @@ -99,19 +99,19 @@ This makes the stable public variables useful for stuff that you would usually h Just like the `PublicState` it is generic over the variable type `T`. The type `MUST` implement Serialize and Deserialize traits. -You can find the details of `StablePublicState` in the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/state_vars/stable_public_state.nr). +You can find the details of `StablePublicState` in the implementation [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/state_vars/stable_public_state.nr). ### `new` Is done exactly like the `PublicState` struct, but with the `StablePublicState` struct. -#include_code storage-stable-declaration /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-stable-declaration /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust -#include_code storage-stable-init /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-stable-init /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust ### `initialize` -#include_code initialize_decimals /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code initialize_decimals /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust :::warning Should only be called as part of the deployment. If this is called outside the deployment transaction multiple values could be used down the line, potentially breaking the contract. @@ -122,10 +122,10 @@ Currently this is not constrained as we are in the middle of changing deployment ### `read_public` Reading the value is like `PublicState`, simply with `read_public` instead of `read`. -#include_code read_decimals_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code read_decimals_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### `read_private` Reading the value is like `PublicState`, simply with `read_private` instead of `read`. This part can only be executed in private. -#include_code read_decimals_private /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code read_decimals_private /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust diff --git a/docs/docs/developers/contracts/resources/common_patterns/authwit.md b/docs/docs/developers/contracts/resources/common_patterns/authwit.md index 40aed935b93..f2dc1bc723c 100644 --- a/docs/docs/developers/contracts/resources/common_patterns/authwit.md +++ b/docs/docs/developers/contracts/resources/common_patterns/authwit.md @@ -88,7 +88,7 @@ For our purposes here (not building a wallet), the most important part of the li ### General utilities -The primary general utility is the `compute_authwit_message_hash` function which computes the action hash from its components. This is useful for when you need to generate a hash that is not for the current call, such as when you want to update a public approval state value that is later used for [authentication in public](#updating-approval-state-in-noir). You can view the implementation of this function [here](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/authwit/src/auth.nr). +The primary general utility is the `compute_authwit_message_hash` function which computes the action hash from its components. This is useful for when you need to generate a hash that is not for the current call, such as when you want to update a public approval state value that is later used for [authentication in public](#updating-approval-state-in-noir). You can view the implementation of this function [here](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/authwit/src/auth.nr). #### TypeScript utilities @@ -110,7 +110,7 @@ This function computes the message hash, and then forwards the call to the more #### Example -#include_code assert_current_call_valid_authwit /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code assert_current_call_valid_authwit /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Utilities for public calls @@ -118,7 +118,7 @@ Very similar to the above, we have variations that work in the public domain. Th #### Example -#include_code assert_current_call_valid_authwit_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code assert_current_call_valid_authwit_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ## Usage @@ -130,13 +130,13 @@ To add it to your project, add the `authwit` library to your `Nargo.toml` file. ```toml [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } -authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/authwit"} +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/authwit"} ``` Then you will be able to import it into your contracts as follows. -#include_code import_authwit /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code import_authwit /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Private Functions @@ -144,7 +144,7 @@ Then you will be able to import it into your contracts as follows. Based on the diagram earlier on this page let's take a look at how we can implement the `transfer` function such that it checks if the tokens are to be transferred `from` the caller or needs to be authenticated with an authentication witness. -#include_code transfer /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code transfer /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust The first thing we see in the snippet above, is that if `from` is not the call we are calling the `assert_current_call_valid_authwit` function from [earlier](#private-functions). If the call is not throwing, we are all good and can continue with the transfer. @@ -162,7 +162,7 @@ With private functions covered, how can we use this in a public function? Well, #### Checking if the current call is authenticated -#include_code transfer_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code transfer_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### Authenticating an action in TypeScript @@ -178,13 +178,13 @@ We have cases where we need a non-wallet contract to approve an action to be exe To support this, we must implement the `is_valid_public` function as seen in the snippet below. -#include_code authwit_uniswap_get /yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code authwit_uniswap_get /noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust It also needs a way to update those storage values. Since we want the updates to be trustless, we can compute the action based on the function inputs, and then have the contract compute the key at which it must add a `true` to approve the action. An example of this would be our Uniswap example which performs a cross chain swap on L1. In here, we both do private and public auth witnesses, where the public is set by the uniswap L2 contract itself. In the below snippet, you can see that we compute the action hash, and then update an `approved_action` mapping with the hash as key and `true` as value. When we then call the `token_bridge` to execute afterwards, it reads this value, burns the tokens, and consumes the authentication. -#include_code authwit_uniswap_set /yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code authwit_uniswap_set /noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust Outlining more of the `swap` flow: this simplified diagram shows how it will look for contracts that are not wallets but also need to support authentication witnesses. diff --git a/docs/docs/developers/contracts/resources/common_patterns/main.md b/docs/docs/developers/contracts/resources/common_patterns/main.md index e19d9d14c76..10af032bbef 100644 --- a/docs/docs/developers/contracts/resources/common_patterns/main.md +++ b/docs/docs/developers/contracts/resources/common_patterns/main.md @@ -2,7 +2,7 @@ title: Common Patterns and Anti-Patterns --- -There are many common patterns have been devised by the Aztec core engineering team and the work of the external community as we build Aztec.nr contracts internally (see some of them [here](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts)). +There are many common patterns have been devised by the Aztec core engineering team and the work of the external community as we build Aztec.nr contracts internally (see some of them [here](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts)). This doc aims to summarize some of them! @@ -38,7 +38,7 @@ E.g. you don't want a user to subscribe once they have subscribed already. Or yo Emit a nullifier in your function. By adding this nullifier into the tree, you prevent another nullifier from being added again. This is also why in authwit, we emit a nullifier, to prevent someone from reusing their approval. -#include_code assert_valid_authwit_public /yarn-project/aztec-nr/authwit/src/auth.nr rust +#include_code assert_valid_authwit_public /noir-projects/aztec-nr/authwit/src/auth.nr rust Note be careful to ensure that the nullifier is not deterministic and that no one could do a preimage analysis attack. More in [the anti pattern section on deterministic nullifiers](#deterministic-nullifiers) @@ -65,9 +65,9 @@ contract Bridge { amount: Field, ) -> Field { ... - #include_code call_assert_token_is_same /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr raw + #include_code call_assert_token_is_same /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr raw } - #include_code assert_token_is_same /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr raw + #include_code assert_token_is_same /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr raw } ``` @@ -76,6 +76,7 @@ This leaks information about the private function being called and the data whic ::: ### Writing public storage from private + When calling a private function, you can update public state by calling a public function. In this situation, try to mark the public function as `internal`. This ensures your flow works as intended and that no one can call the public function without going through the private function first! @@ -118,18 +119,18 @@ Notes are hashed and stored in the merkle tree. While notes do have a header wit Hence, it's necessary to add a "randomness" field to your note to prevent such attacks. -#include_code address_note_def yarn-project/aztec-nr/address-note/src/address_note.nr rust +#include_code address_note_def noir-projects/aztec-nr/address-note/src/address_note.nr rust ### Working with `compute_note_hash_and_nullifier()` Currently, if you have storage defined, the compiler will error if you don't have a `compute_note_hash_and_nullifier()` defined. Without this, the PXE can't process encrypted events and discover your notes. If your contract doesn't have anything to do with notes (e.g. operates solely in the public domain), you can do the following: -#include_code compute_note_hash_and_nullifier_placeholder /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier_placeholder /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust Otherwise, you need this method to help the PXE with processing your notes. In our [demo token contract](../../../tutorials/writing_token_contract.md#compute_note_hash_and_nullifier), we work with 2 kinds of notes: `ValueNote` and `TransparentNote`. Hence this method must define how to work with both: -#include_code compute_note_hash_and_nullifier /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### L1 -- L2 interactions @@ -171,4 +172,4 @@ In the [Prevent the same user flow from happening twice using nullifier](#preven E.g. for a voting contract, if your nullifier simply emits just the `user_address`, then privacy can easily be leaked as nullifiers are deterministic (have no randomness), especially if there are few users of the contract. So you need some kind of randomness. You can add the user's secret key into the nullifier to add randomness. We call this "nullifier secrets" as explained [here](../../../../learn/concepts/accounts/keys.md#nullifier-secrets). E.g.: -#include_code nullifier /yarn-project/aztec-nr/value-note/src/value_note.nr rust +#include_code nullifier /noir-projects/aztec-nr/value-note/src/value_note.nr rust diff --git a/docs/docs/developers/contracts/resources/dependencies.md b/docs/docs/developers/contracts/resources/dependencies.md index 36ed74a3bf0..fbee858c1da 100644 --- a/docs/docs/developers/contracts/resources/dependencies.md +++ b/docs/docs/developers/contracts/resources/dependencies.md @@ -7,7 +7,7 @@ On this page you will find information about Aztec.nr dependencies and up-to-dat ## Aztec ```toml -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } ``` This is the core Aztec library that is required for every Aztec.nr smart contract. @@ -15,7 +15,7 @@ This is the core Aztec library that is required for every Aztec.nr smart contrac ## Authwit ```toml -authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/authwit"} +authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/authwit"} ``` This allows you to use authentication witnesses in your contract. Find more about its usage [here](../resources/common_patterns/authwit.md). @@ -23,39 +23,39 @@ This allows you to use authentication witnesses in your contract. Find more abou ## Address note ```toml -address_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/address-note" } +address_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/address-note" } ``` -This is a library for utilizing notes that hold addresses. Find it on [GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/aztec-nr/address-note/src). +This is a library for utilizing notes that hold addresses. Find it on [GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/aztec-nr/address-note/src). ## Easy private state ```toml -easy_private_state = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/easy-private-state" } +easy_private_state = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/easy-private-state" } ``` -This is an abstraction library for using private variables like [`EasyPrivateUint`](https://github.com/AztecProtocol/aztec-packages/blob/6c20b45993ee9cbd319ab8351e2722e0c912f427/yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr#L17). +This is an abstraction library for using private variables like [`EasyPrivateUint`](https://github.com/AztecProtocol/aztec-packages/blob/6c20b45993ee9cbd319ab8351e2722e0c912f427/noir-projects/aztec-nr/easy-private-state/src/easy_private_state.nr#L17). ## Protocol Types ```toml -protocol_types = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/noir-protocol-circuits/src/crates/types"} +protocol_types = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/noir-protocol-circuits/src/crates/types"} ``` -This library contains types that are used in the Aztec protocol. Find it on [GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-protocol-circuits/src/crates/types/src). +This library contains types that are used in the Aztec protocol. Find it on [GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-protocol-circuits/src/crates/types/src). ## Safe math ```toml -safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/safe-math" } +safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/safe-math" } ``` -This is a library for safe arithmetic, similar to OpenZeppelin's safe math library. Find it on [GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/aztec-nr/safe-math). +This is a library for safe arithmetic, similar to OpenZeppelin's safe math library. Find it on [GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/aztec-nr/safe-math). ## Value note ```toml -value_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/value-note" } +value_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/value-note" } ``` This is a library for a note that stores one arbitrary value. You can see an example of how it might be used in the [token contract tutorial](../../tutorials/writing_token_contract.md). diff --git a/docs/docs/developers/contracts/setup.md b/docs/docs/developers/contracts/setup.md index 482b7795383..7ea682a2bc5 100644 --- a/docs/docs/developers/contracts/setup.md +++ b/docs/docs/developers/contracts/setup.md @@ -70,11 +70,11 @@ type = "contract" [dependencies] # Framework import -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } # Utility dependencies -value_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/value-note"} -safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/safe-math"} +value_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/value-note"} +safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/safe-math"} ``` :::info @@ -86,4 +86,4 @@ You are now ready to write your own contracts! ## Next Steps - Follow a [tutorial](../tutorials/main.md) OR -- Read more +- Read more diff --git a/docs/docs/developers/contracts/writing_contracts/accounts/write_accounts_contract.md b/docs/docs/developers/contracts/writing_contracts/accounts/write_accounts_contract.md index a9437be61e5..030ea894fb1 100644 --- a/docs/docs/developers/contracts/writing_contracts/accounts/write_accounts_contract.md +++ b/docs/docs/developers/contracts/writing_contracts/accounts/write_accounts_contract.md @@ -27,7 +27,7 @@ For the sake of simplicity, we will hardcode the signing public key into the con Let's start with the account contract itself in Aztec.nr. Create [a new Aztec.nr contract project](../../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/contracts/schnorr_hardcoded_account_contract/src/main.nr rust +#include_code contract noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr rust :::info You can use [the Aztec CLI](../../../sandbox/main.md) to generate a new keypair if you want to use a different one: @@ -45,11 +45,11 @@ 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: authenticating the transaction and executing calls. It receives a `payload` with the list of function calls to execute, and requests a corresponding auth witness from an oracle to validate it. You will find this logic implemented in the `AccountActions` module, which use the `AppPayload` and `FeePayload` structs: -#include_code entrypoint yarn-project/aztec-nr/authwit/src/account.nr rust +#include_code entrypoint noir-projects/aztec-nr/authwit/src/account.nr rust -#include_code app-payload-struct yarn-project/aztec-nr/authwit/src/entrypoint/app.nr rust +#include_code app-payload-struct noir-projects/aztec-nr/authwit/src/entrypoint/app.nr rust -#include_code fee-payload-struct yarn-project/aztec-nr/authwit/src/entrypoint/fee.nr rust +#include_code fee-payload-struct noir-projects/aztec-nr/authwit/src/entrypoint/fee.nr rust :::info Using the `AccountActions` module and the payload structs is not mandatory. You can package the instructions to be carried out by your account contract however you want. However, using these modules can save you a lot of time when writing a new account contract, both in Noir and in Typescript. @@ -57,7 +57,7 @@ Using the `AccountActions` module and the payload structs is not mandatory. You The `AccountActions` module provides default implementations for most of the account contract methods needed, but it requires a function for validating an auth witness. In this function you will customize how your account validates an action: whether it is using a specific signature scheme, a multi-party approval, a password, etc. -#include_code is-valid yarn-project/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr rust +#include_code is-valid noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr rust For our account contract, we will take the hash of the action to authorize, request the corresponding auth witness from the oracle, and validate it against our hardcoded public key. If the signature is correct, we authorize the action. diff --git a/docs/docs/developers/contracts/writing_contracts/events/emit_event.md b/docs/docs/developers/contracts/writing_contracts/events/emit_event.md index f0631f076e9..002f01284b4 100644 --- a/docs/docs/developers/contracts/writing_contracts/events/emit_event.md +++ b/docs/docs/developers/contracts/writing_contracts/events/emit_event.md @@ -67,13 +67,13 @@ In the future we will allow emitting arbitrary information. To emit encrypted logs first import the `emit_encrypted_log` utility function which wraps an [oracle](../oracles/main.md): -#include_code encrypted_import /yarn-project/aztec-nr/address-note/src/address_note.nr rust +#include_code encrypted_import /noir-projects/aztec-nr/address-note/src/address_note.nr rust ### Call emit_encrypted_log After importing, you can call the function: -#include_code encrypted /yarn-project/aztec-nr/address-note/src/address_note.nr rust +#include_code encrypted /noir-projects/aztec-nr/address-note/src/address_note.nr rust ### Successfully process the encrypted event @@ -91,8 +91,7 @@ If your contract works with storage (has Storage struct defined), you **MUST** i Every time a new note is successfully decrypted, the PXE will expect the existence of a `compute_note_hash_and_nullifier` function, which must teach it how to correctly process the new note. -#include_code compute_note_hash_and_nullifier /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust - +#include_code compute_note_hash_and_nullifier /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ## Unencrypted Events @@ -100,21 +99,22 @@ Unencrypted events are events which can be read by anyone. They can be emitted by both public and private functions. :::danger + - Emitting unencrypted events from private function is a significant privacy leak and it should be considered by the developer whether it is acceptable. - Unencrypted events are currently **NOT** linked to the contract emitting them, so it is practically a [`debug_log`](../oracles/main.md#a-few-useful-inbuilt-oracles). -::: + ::: ### Import library To emit unencrypted logs first import the `emit_unencrypted_log` utility function inside your contract: -#include_code unencrypted_import /yarn-project/noir-contracts/contracts/test_contract/src/main.nr rust +#include_code unencrypted_import /noir-projects/noir-contracts/contracts/test_contract/src/main.nr rust ### Call emit_unencrypted_log After importing, you can call the function: -#include_code emit_unencrypted /yarn-project/noir-contracts/contracts/test_contract/src/main.nr rust +#include_code emit_unencrypted /noir-projects/noir-contracts/contracts/test_contract/src/main.nr rust ### Querying the unencrypted event @@ -149,7 +149,7 @@ In the Sandbox, an encrypted note has a fixed overhead of 4 field elements (to b A `ValueNote`, for example, currently uses 3 fields elements (plus the fixed overhead of 4). That's roughly `7 * 32 = 224` bytes of information. -#include_code value-note-def /yarn-project/aztec-nr/value-note/src/value_note.nr +#include_code value-note-def /noir-projects/aztec-nr/value-note/src/value_note.nr - There are plans to compress encrypted note data further. -- There are plans to adopt EIP-4844 blobs to reduce the cost of data submission further. \ No newline at end of file +- There are plans to adopt EIP-4844 blobs to reduce the cost of data submission further. diff --git a/docs/docs/developers/contracts/writing_contracts/example_contract.md b/docs/docs/developers/contracts/writing_contracts/example_contract.md index 692c8c21b97..bb6806b49c1 100644 --- a/docs/docs/developers/contracts/writing_contracts/example_contract.md +++ b/docs/docs/developers/contracts/writing_contracts/example_contract.md @@ -6,7 +6,7 @@ title: What a contract looks like In keeping with the origins of blockchain, here's an example of a simple private token contract. Everyone's balances are private. -#include_code easy_private_token_contract /yarn-project/noir-contracts/contracts/easy_private_token_contract/src/main.nr rust +#include_code easy_private_token_contract /noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr rust :::info Disclaimer Please note that any example contract set out herein is provided solely for informational purposes only and does not constitute any inducement to use or deploy. Any implementation of any such contract with an interface or any other infrastructure should be used in accordance with applicable laws and regulations. diff --git a/docs/docs/developers/contracts/writing_contracts/functions/context.md b/docs/docs/developers/contracts/writing_contracts/functions/context.md index a9b5609cff0..e80d34e4ec2 100644 --- a/docs/docs/developers/contracts/writing_contracts/functions/context.md +++ b/docs/docs/developers/contracts/writing_contracts/functions/context.md @@ -19,7 +19,8 @@ On this page, you'll learn - Differences between the private and public contexts, especially the unique features and variables in the public context ## Two contexts, one API -The `Aztec` blockchain contains two environments [public and private](../../../../learn/concepts/hybrid_state/main.md). + +The `Aztec` blockchain contains two environments [public and private](../../../../learn/concepts/hybrid_state/main.md). - Private, for private transactions taking place on user's devices. - Public, for public transactions taking place on the network's sequencers. @@ -31,7 +32,7 @@ The following section will cover both contexts. ## The Private Context The code snippet below shows what is contained within the private context. -#include_code private-context /yarn-project/aztec-nr/aztec/src/context/private_context.nr rust +#include_code private-context /noir-projects/aztec-nr/aztec/src/context/private_context.nr rust ### Private Context Broken Down @@ -39,13 +40,13 @@ The code snippet below shows what is contained within the private context. The context inputs includes all of the information that is passed from the kernel circuit into the application circuit. It contains the following values. -#include_code private-context-inputs /yarn-project/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr rust +#include_code private-context-inputs /noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr rust As shown in the snippet, the application context is made up of 4 main structures. The call context, the block header, the contract deployment data and the private global variables. First of all, the call context. -#include_code call-context /yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr rust +#include_code call-context /noir-projects/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr rust The call context contains information about the current call being made: @@ -74,19 +75,19 @@ Another structure that is contained within the context is the Header object. In the private context this is a header of a block which used to generate proofs against. In the public context this header is set by sequencer (sequencer executes public calls) and it is set to 1 block before the block in which the transaction is included. -#include_code header /yarn-project/noir-protocol-circuits/src/crates/types/src/header.nr rust +#include_code header /noir-projects/noir-protocol-circuits/src/crates/types/src/header.nr rust ### Contract Deployment Data Just like with the `is_contract_deployment` flag mentioned earlier. This data will only be set to true when the current transaction is one in which a contract is being deployed. -#include_code contract-deployment-data /yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr rust +#include_code contract-deployment-data /noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr rust ### Private Global Variables In the private execution context, we only have access to a subset of the total global variables, we are restricted to those which can be reliably proven by the kernel circuits. -#include_code private-global-variables /yarn-project/aztec-nr/aztec/src/context/globals/private_global_variables.nr rust +#include_code private-global-variables /noir-projects/aztec-nr/aztec/src/context/globals/private_global_variables.nr rust ### Args Hash @@ -114,7 +115,7 @@ New nullifiers contains an array of the new nullifiers emitted from the current ### Nullified Commitments -Nullified commitments is an optimization for introduced to help reduce state growth. There are often cases where commitments are created and nullified within the same transaction. +Nullified commitments is an optimization for introduced to help reduce state growth. There are often cases where commitments are created and nullified within the same transaction. In these cases there is no reason that these commitments should take up space on the node's commitment/nullifier trees. Keeping track of nullified commitments allows us to "cancel out" and prove these cases. ### Private Call Stack @@ -138,10 +139,10 @@ The Public Context includes all of the information passed from the `Public VM` i In the current version of the system, the public context is almost a clone of the private execution context. It contains the same call context data, access to the same historical tree roots, however it does NOT have access to contract deployment data, this is due to traditional contract deployments only currently being possible from private transactions. -#include_code public-context-inputs /yarn-project/aztec-nr/aztec/src/context/inputs/public_context_inputs.nr rust +#include_code public-context-inputs /noir-projects/aztec-nr/aztec/src/context/inputs/public_context_inputs.nr rust ### Public Global Variables The public global variables are provided by the rollup sequencer and consequently contain some more values than the private global variables. -#include_code global-variables /yarn-project/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr rust +#include_code global-variables /noir-projects/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr rust diff --git a/docs/docs/developers/contracts/writing_contracts/functions/inner_workings.md b/docs/docs/developers/contracts/writing_contracts/functions/inner_workings.md index 47f2316d2f5..0d343cd7475 100644 --- a/docs/docs/developers/contracts/writing_contracts/functions/inner_workings.md +++ b/docs/docs/developers/contracts/writing_contracts/functions/inner_workings.md @@ -16,18 +16,18 @@ To help illustrate how this interacts with the internals of Aztec and its kernel #### Before expansion -#include_code simple_macro_example /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code simple_macro_example /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust #### After expansion -#include_code simple_macro_example_expanded /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code simple_macro_example_expanded /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust #### The expansion broken down? Viewing the expanded Aztec contract uncovers a lot about how Aztec contracts interact with the [kernel](../../../../learn/concepts/circuits/kernels/private_kernel.md). To aid with developing intuition, we will break down each inserted line. **Receiving context from the kernel.** -#include_code context-example-inputs /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code context-example-inputs /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust Private function calls are able to interact with each other through orchestration from within the [kernel circuit](../../../../learn/concepts/circuits/kernels/private_kernel.md). The kernel circuit forwards information to each contract function (recall each contract function is a circuit). This information then becomes part of the private context. For example, within each private function we can access some global variables. To access them we can call on the `context`, e.g. `context.chain_id()`. The value of the chain ID comes from the values passed into the circuit from the kernel. @@ -35,41 +35,41 @@ For example, within each private function we can access some global variables. T The kernel checks that all of the values passed to each circuit in a function call are the same. **Returning the context to the kernel.** -#include_code context-example-return /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code context-example-return /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust The contract function must return information about the execution back to the kernel. This is done through a rigid structure we call the `PrivateCircuitPublicInputs`. -> _Why is it called the `PrivateCircuitPublicInputs`?_ +> _Why is it called the `PrivateCircuitPublicInputs`?_ > When verifying zk programs, return values are not computed at verification runtime, rather expected return values are provided as inputs and checked for correctness. Hence, the return values are considered public inputs. This structure contains a host of information about the executed program. It will contain any newly created nullifiers, any messages to be sent to l2 and most importantly it will contain the return values of the function. **Hashing the function inputs.** -#include_code context-example-hasher /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code context-example-hasher /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust _What is the hasher and why is it needed?_ Inside the kernel circuits, the inputs to functions are reduced to a single value; the inputs hash. This prevents the need for multiple different kernel circuits; each supporting differing numbers of inputs. The hasher abstraction that allows us to create an array of all of the inputs that can be reduced to a single value. **Creating the function's context.** -#include_code context-example-context /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code context-example-context /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust Each Aztec function has access to a [context](../functions/context.md) object. This object, although labelled a global variable, is created locally on a users' device. It is initialized from the inputs provided by the kernel, and a hash of the function's inputs. -#include_code context-example-context-return /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code context-example-context-return /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust We use the kernel to pass information between circuits. This means that the return values of functions must also be passed to the kernel (where they can be later passed on to another function). We achieve this by pushing return values to the execution context, which we then pass to the kernel. **Making the contract's storage available** -#include_code storage-example-context /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code storage-example-context /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust When a [`Storage` struct](../storage/define_storage.md) is declared within a contract, the `storage` keyword is made available. As shown in the macro expansion above, this calls the init function on the storage struct with the current function's context. Any state variables declared in the `Storage` struct can now be accessed as normal struct members. **Returning the function context to the kernel.** -#include_code context-example-finish /yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rust +#include_code context-example-finish /noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr rust This function takes the application context, and converts it into the `PrivateCircuitPublicInputs` structure. This structure is then passed to the kernel circuit. diff --git a/docs/docs/developers/contracts/writing_contracts/functions/public_private_unconstrained.md b/docs/docs/developers/contracts/writing_contracts/functions/public_private_unconstrained.md index 935a958cd8e..607a6763ba2 100644 --- a/docs/docs/developers/contracts/writing_contracts/functions/public_private_unconstrained.md +++ b/docs/docs/developers/contracts/writing_contracts/functions/public_private_unconstrained.md @@ -14,13 +14,13 @@ All data inserted into private storage from a public function will be publicly v To create a public function you can annotate it with the `#[aztec(public)]` attribute. This will make the [public context](./context.md) available within the function's execution scope. -#include_code set_minter /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code set_minter /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ## `Private` Functions A private function operates on private information, and is executed by the user. Annotate the function with the `#[aztec(private)]` attribute to tell the compiler it's a private function. This will make the [private context](./context.md#the-private-context) available within the function's execution scope. -#include_code redeem_shield /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code redeem_shield /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ## `unconstrained` functions @@ -28,7 +28,7 @@ Unconstrained functions are an underlying part of Noir - a deeper explanation ca Beyond using them inside your other functions, they are convenient for providing an interface that reads storage, applies logic and returns values to a UI or test. Below is a snippet from exposing the `balance_of_private` function from a token implementation, which allows a user to easily read their balance, similar to the `balanceOf` function in the ERC20 standard. -#include_code balance_of_private /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code balance_of_private /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust :::info Note, that unconstrained functions can have access to both public and private data when executed on the user's device. This is possible since it is not actually part of the circuits that are executed in contract execution. diff --git a/docs/docs/developers/contracts/writing_contracts/functions/write_constructor.md b/docs/docs/developers/contracts/writing_contracts/functions/write_constructor.md index 868199b7015..618f5ff1863 100644 --- a/docs/docs/developers/contracts/writing_contracts/functions/write_constructor.md +++ b/docs/docs/developers/contracts/writing_contracts/functions/write_constructor.md @@ -30,8 +30,8 @@ fn constructor() {} Constructors are commonly used to set an admin, such as this example: -#include_code constructor /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code constructor /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust Here, the constructor is calling a public function. It can also call a private function. Learn more about calling functions from functions [here](../functions/call_functions.md). -To see constructors in action, check out the [Aztec.nr getting started guide](../../../getting_started/aztecnr-getting-started.md). \ No newline at end of file +To see constructors in action, check out the [Aztec.nr getting started guide](../../../getting_started/aztecnr-getting-started.md). diff --git a/docs/docs/developers/contracts/writing_contracts/historical_data/archive_tree/how_to_prove_history.md b/docs/docs/developers/contracts/writing_contracts/historical_data/archive_tree/how_to_prove_history.md index 4dc3711fbcd..8b604ca6863 100644 --- a/docs/docs/developers/contracts/writing_contracts/historical_data/archive_tree/how_to_prove_history.md +++ b/docs/docs/developers/contracts/writing_contracts/historical_data/archive_tree/how_to_prove_history.md @@ -9,23 +9,25 @@ View the History lib reference [here](../../../references/history_lib_reference. # History library The history library allows you to prove any of the following at a given block height before the current height: -* Note inclusion -* Nullifier inclusion -* Note validity -* Existence of public value -* Contract inclusion + +- Note inclusion +- Nullifier inclusion +- Note validity +- Existence of public value +- Contract inclusion Using this library, you can check that specific notes or nullifiers were part of Aztec network state at specific blocks. This can be useful for things such as: -* Verifying a minimum timestamp from a private context -* Checking eligibility based on historical events (e.g. for an airdrop by proving that you owned a note) -* Verifying historic ownership / relinquishing of assets -* Proving existence of a value in public data tree at a given contract slot -* Proving that a contract was deployed in a given block with some parameters +- Verifying a minimum timestamp from a private context +- Checking eligibility based on historical events (e.g. for an airdrop by proving that you owned a note) +- Verifying historic ownership / relinquishing of assets +- Proving existence of a value in public data tree at a given contract slot +- Proving that a contract was deployed in a given block with some parameters **In this guide you will learn how to** -* Prove a note was included in a specified block -* Create a nullifier and prove it was not included in a specified block + +- Prove a note was included in a specified block +- Create a nullifier and prove it was not included in a specified block For a more extensive reference, go to [the reference page](../../../references/history_lib_reference.md). @@ -33,7 +35,7 @@ For a more extensive reference, go to [the reference page](../../../references/h ```rust aztec::{ - #include_code imports yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr raw + #include_code imports noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr raw } ``` @@ -43,13 +45,13 @@ This imports all functions from the `history` library. You should only import th In general you will likely have the note you want to prove inclusion of. But if you are just experimenting you can create a note with a function like below: -#include_code create_note yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust +#include_code create_note noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust ## 3. Get the note from the PXE Retrieve the note from the user's PXE. -#include_code get_note_from_pxe yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust +#include_code get_note_from_pxe noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust In this example, the user's notes are stored in a map called `private_values`. We retrieve this map, then select 1 note from it with the value of `1`. @@ -57,7 +59,7 @@ In this example, the user's notes are stored in a map called `private_values`. W To prove that a note existed in a specified block, call `prove_note_inclusion_at` as shown in this example: -#include_code prove_note_inclusion yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust +#include_code prove_note_inclusion noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust This function takes in 3 arguments: @@ -67,13 +69,13 @@ This function takes in 3 arguments: This will only prove the note existed at the specific block number, not whether or not the note has been nullified. You can prove that a note existed and had not been nullified in a specified block by using `prove_note_validity_at` which takes the same arguments: -#include_code prove_note_validity yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust +#include_code prove_note_validity noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust ## 5. Create a nullifier to prove inclusion of You can easily nullify a note like so: -#include_code nullify_note yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust +#include_code nullify_note noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust This function gets a note from the PXE like we did in [step 3](#3-get-the-note-from-the-pxe) and nullifies it with `remove()`. @@ -83,9 +85,10 @@ You can then compute this nullifier with `note.compute_nullifier(&mut context)`. Call `prove_nullifier_inclusion_at` like so: -#include_code prove_nullifier_inclusion yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust +#include_code prove_nullifier_inclusion noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rust + +This takes three arguments: -This takes three arguments: 1. The nullifier 2. Block number 3. Private context diff --git a/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/implement_slow_updates.md b/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/implement_slow_updates.md index ce6d4710ced..d738af37879 100644 --- a/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/implement_slow_updates.md +++ b/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/implement_slow_updates.md @@ -8,27 +8,27 @@ On this page you will learn how to implement a slow updates tree into your contr # How to implement a slow updates tree -1. Copy the *SlowTree.nr* example and its dependencies, found [here](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/contracts/slow_tree_contract). Replace the constants with whatever you like and deploy it to your sandbox -2. Copy the *SlowMap interface* for easy interaction with your deployed SlowTree. Find it [here](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr) +1. Copy the _SlowTree.nr_ example and its dependencies, found [here](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts/slow_tree_contract). Replace the constants with whatever you like and deploy it to your sandbox +2. Copy the _SlowMap interface_ for easy interaction with your deployed SlowTree. Find it [here](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr) 3. Import this interface into your contract -#include_code interface yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code interface noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust 5. Store the SlowTree address in private storage as a FieldNote -#include_code constructor yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code constructor noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust 6. Store the SlowTree address in public storage and initialize an instance of SlowMap using this address -#include_code write_slow_update_public yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code write_slow_update_public noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust 7. Now you can read and update from private functions: -#include_code get_and_update_private yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code get_and_update_private noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust 8. Or from public functions: -#include_code get_public yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code get_public noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust View the [reference](../../../references/slow_updates_tree.md) for more information. @@ -36,13 +36,13 @@ View the [reference](../../../references/slow_updates_tree.md) for more informat The `TokenBlacklist` contract is a token contract that does not allow blacklisted accounts to perform mints or transfers. In this section we will go through how this is achieved through the slow updates tree. -You can find the full code for the TokenBlacklist smart contract [here](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/contracts/token_blacklist_contract). +You can find the full code for the TokenBlacklist smart contract [here](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts/token_blacklist_contract). ### Importing SlowMap The contract first imports the **`SlowMap`** interface: -#include_code interface yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code interface noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust This interface allows the contract to interact with its attached SlowTree. It abstracts these functions so they do not have to be implemented in the TokenBlacklist contract. @@ -50,14 +50,14 @@ This interface allows the contract to interact with its attached SlowTree. It ab The contract's constructor takes the address of the slow updates contract: -#include_code constructor yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code constructor noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust -This initialization sets up the connection between the **`TokenBlacklist`** contract and a previously deployed SlowTree, allowing it to use the interface to directly interact with the SlowTree. +This initialization sets up the connection between the **`TokenBlacklist`** contract and a previously deployed SlowTree, allowing it to use the interface to directly interact with the SlowTree. ### Private transfer function utilizing the slow updates tree In the private transfer function, the contract uses the interface to check if a user is blacklisted: -#include_code transfer_private yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust +#include_code transfer_private noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr rust Here, the contract reads the roles of the sender and recipient from the SlowTree using the **`read_at`** function in the interface. It checks if either party is blacklisted, and if so, the transaction does not go ahead. diff --git a/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/main.md b/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/main.md index 6c40f80c440..170981942d9 100644 --- a/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/main.md +++ b/docs/docs/developers/contracts/writing_contracts/historical_data/slow_updates_tree/main.md @@ -16,29 +16,29 @@ There are generally 4 main components involved to make it easier to use a slow u This is the primary smart contract that will use the slow updates tree. In the example we use a [token with blacklisting features](./implement_slow_updates.md#exploring-an-example-integration-through-a-tokenblacklist-smart-contract). -## Interface +## Interface -This interface of the slow updates tree contract allows your contract to interact with the Slow Updates Tree contract. It provides methods for reading and updating values in the tree in both public and private contexts. You can find it [here](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr). +This interface of the slow updates tree contract allows your contract to interact with the Slow Updates Tree contract. It provides methods for reading and updating values in the tree in both public and private contexts. You can find it [here](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr). ## SlowTree.nr contract This is a smart contract developed by Aztec that establishes and manages a slow updates tree structure. It allows developers to access and interact with the tree, such as reading and updating data. -You can find it [here](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/contracts/slow_tree_contract). +You can find it [here](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts/slow_tree_contract). ## SlowMap type -This is a type in the Aztec.nr library that is utilized by the SlowTree contract. It defines the underlying data structure for the slow updates tree, and handles storing both the current and pending values for each data entry. +This is a type in the Aztec.nr library that is utilized by the SlowTree contract. It defines the underlying data structure for the slow updates tree, and handles storing both the current and pending values for each data entry. You can find it [here](https://github.com/AztecProtocol/aztec-nr/blob/master/slow-updates-tree/src/slow_map.nr). -The diagram below describes how these components work together. It does not contain all the functionality. +The diagram below describes how these components work together. It does not contain all the functionality. ```mermaid graph TD MSC[Main Smart Contract] --> INT[Interface] STC --> SMT - + INT_RAP[read_at_pub] <--> STC_RAP[read_at_public] INT_RA[read_at] <--> STC_RA[read_at] INT_UAP[update_at_public] <--> STC_UAP[update_at_public] @@ -46,21 +46,21 @@ graph TD STC_RA <--> VMP[verify_membership_proof] STC_UA <--> CR[compute_roots] - + subgraph INT[Interface] INT_RAP INT_UAP INT_RA INT_UA end - + subgraph STC[SlowTree.nr] STC_RAP STC_UAP STC_RA STC_UA end - + subgraph SMT[SlowMap Type] Change{Epoch Over} -->|True| Current{Current} Change -->|False| Pending{Pending} @@ -78,4 +78,4 @@ graph TD style INT fill:#fff,stroke:#333,stroke-width:1px style STC fill:#fff,stroke:#333,stroke-width:1px style SMT fill:#fff,stroke:#333,stroke-width:1px -``` \ No newline at end of file +``` diff --git a/docs/docs/developers/contracts/writing_contracts/oracles/inbuilt_oracles.md b/docs/docs/developers/contracts/writing_contracts/oracles/inbuilt_oracles.md index 6f8a40b23bc..4daae5373f0 100644 --- a/docs/docs/developers/contracts/writing_contracts/oracles/inbuilt_oracles.md +++ b/docs/docs/developers/contracts/writing_contracts/oracles/inbuilt_oracles.md @@ -6,12 +6,12 @@ This page goes over all the oracles that are available in Aztec.nr. If you'd lik ## Inbuilt oracles -- [`debug_log`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/debug_log.nr) - Provides a couple of debug functions that can be used to log information to the console. Read more about debugging [here](../../../debugging/main.md#logging-in-aztecnr). -- [`auth_witness`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/authwit/src/auth_witness.nr) - Provides a way to fetch the authentication witness for a given address. This is useful when building account contracts to support approve-like functionality. -- [`get_l1_to_l2_message`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr) - Useful for application that receive messages from L1 to be consumed on L2, such as token bridges or other cross-chain applications. -- [`notes`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/notes.nr) - Provides a lot of functions related to notes, such as fetches notes from storage etc, used behind the scenes for value notes and other pre-build note implementations. -- [`logs`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/logs.nr) - Provides the to log encrypted and unencrypted data. +- [`debug_log`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/aztec/src/oracle/debug_log.nr) - Provides a couple of debug functions that can be used to log information to the console. Read more about debugging [here](../../../debugging/main.md#logging-in-aztecnr). +- [`auth_witness`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/authwit/src/auth_witness.nr) - Provides a way to fetch the authentication witness for a given address. This is useful when building account contracts to support approve-like functionality. +- [`get_l1_to_l2_message`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr) - Useful for application that receive messages from L1 to be consumed on L2, such as token bridges or other cross-chain applications. +- [`notes`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/aztec/src/oracle/notes.nr) - Provides a lot of functions related to notes, such as fetches notes from storage etc, used behind the scenes for value notes and other pre-build note implementations. +- [`logs`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/aztec/src/oracle/logs.nr) - Provides the to log encrypted and unencrypted data. -Find a full list [on GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/aztec-nr/aztec/src/oracle). +Find a full list [on GitHub](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/aztec-nr/aztec/src/oracle). -Please note that it is **not** possible to write a custom oracle for your dapp. Oracles are implemented in the PXE, so all users of your dapp would have to use a PXE service with your custom oracle included. If you want to inject some arbitrary data that does not have a dedicated oracle, you can use [popCapsule](./pop_capsule.md). \ No newline at end of file +Please note that it is **not** possible to write a custom oracle for your dapp. Oracles are implemented in the PXE, so all users of your dapp would have to use a PXE service with your custom oracle included. If you want to inject some arbitrary data that does not have a dedicated oracle, you can use [popCapsule](./pop_capsule.md). diff --git a/docs/docs/developers/contracts/writing_contracts/oracles/main.md b/docs/docs/developers/contracts/writing_contracts/oracles/main.md index 673dbfce389..c2c76df377d 100644 --- a/docs/docs/developers/contracts/writing_contracts/oracles/main.md +++ b/docs/docs/developers/contracts/writing_contracts/oracles/main.md @@ -2,22 +2,20 @@ title: Oracle Functions --- -This page goes over what oracles are in Aztec and how they work. +This page goes over what oracles are in Aztec and how they work. Looking for a hands-on guide? You can learn how to use oracles in a smart contract [here](./pop_capsule.md). An oracle is something that allows us to get data from the outside world into our contracts. The most widely-known types of oracles in blockchain systems are probably Chainlink price feeds, which allow us to get the price of an asset in USD taking non-blockchain data into account. -While this is one type of oracle, the more general oracle, allows us to get any data into the contract. In the context of oracle functions or oracle calls in Aztec, it can essentially be seen as user-provided arguments, that can be fetched at any point in the circuit, and don't need to be an input parameter. +While this is one type of oracle, the more general oracle, allows us to get any data into the contract. In the context of oracle functions or oracle calls in Aztec, it can essentially be seen as user-provided arguments, that can be fetched at any point in the circuit, and don't need to be an input parameter. **Why is this useful? Why don't just pass them as input parameters?** In the world of EVM, you would just read the values directly from storage and call it a day. However, when we are working with circuits for private execution, this becomes more tricky as you cannot just read the storage directly from your state tree, because there are only commitments (e.g. hashes) there. The pre-images (content) of your commitments need to be provided to the function to prove that you actually allowed to modify them. - If we fetch the notes using an oracle call, we can keep the function signature independent of the underlying data and make it easier to use. A similar idea, applied to the authentication mechanism is used for the Authentication Witnesses that allow us to have a single function signature for any wallet implementation, see [AuthWit](../../../wallets/main#authorizing-actions) for more information on this. Oracles introduce **non-determinism** into a circuit, and thus are `unconstrained`. It is important that any information that is injected into a circuit through an oracle is later constrained for correctness. Otherwise, the circuit will be **under-constrained** and potentially insecure! `Aztec.nr` has a module dedicated to its oracles. If you are interested, you can view them by following the link below: -#include_code oracles-module /yarn-project/aztec-nr/aztec/src/oracle.nr rust - +#include_code oracles-module /noir-projects/aztec-nr/aztec/src/oracle.nr rust diff --git a/docs/docs/developers/contracts/writing_contracts/oracles/pop_capsule.md b/docs/docs/developers/contracts/writing_contracts/oracles/pop_capsule.md index f7d4c02c800..a364be5d881 100644 --- a/docs/docs/developers/contracts/writing_contracts/oracles/pop_capsule.md +++ b/docs/docs/developers/contracts/writing_contracts/oracles/pop_capsule.md @@ -12,18 +12,16 @@ On this page you will learn how to use the `popCapsule` oracle. To see what othe In a new file on the same level as your `main.nr`, implement an unconstrained function that calls the pop_capsule oracle: -#include_code pop_capsule yarn-project/noir-contracts/contracts/slow_tree_contract/src/capsule.nr rust +#include_code pop_capsule noir-projects/noir-contracts/contracts/slow_tree_contract/src/capsule.nr rust ### 2. Import this into your smart contract If it lies in the same directory as your smart contract, you can import it like this: -#include_code import_pop_capsule yarn-project/noir-contracts/contracts/slow_tree_contract/src/main.nr rust +#include_code import_pop_capsule noir-projects/noir-contracts/contracts/slow_tree_contract/src/main.nr rust ### 3. Use it as any other oracle Now it becomes a regular oracle you can call like this: -#include_code pop_capsule yarn-project/noir-contracts/contracts/slow_tree_contract/src/main.nr rust - - +#include_code pop_capsule noir-projects/noir-contracts/contracts/slow_tree_contract/src/main.nr rust diff --git a/docs/docs/developers/contracts/writing_contracts/portals/communicate_with_portal.md b/docs/docs/developers/contracts/writing_contracts/portals/communicate_with_portal.md index d2e62dedda1..3946fb58ba0 100644 --- a/docs/docs/developers/contracts/writing_contracts/portals/communicate_with_portal.md +++ b/docs/docs/developers/contracts/writing_contracts/portals/communicate_with_portal.md @@ -17,7 +17,7 @@ When sending messages, we need to specify quite a bit of information beyond just | Name | Type | Description | | ----------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Recipient | `L2Actor` | The message recipient. This **MUST** match the rollup version and an Aztec contract that is **attached** to the contract making this call. If the recipient is not attached to the caller, the message cannot be consumed by it. | -| Deadline | `uint256` | The deadline for the message to be consumed. If the message has not been removed from the `Inbox` and included in a rollup block by this point, it can be _canceled_ by the portal (the portal must implement logic to cancel). | +| Deadline | `uint256` | The deadline for the message to be consumed. If the message has not been removed from the `Inbox` and included in a rollup block by this point, it can be _canceled_ by the portal (the portal must implement logic to cancel). | | Content | `field` (~254 bits) | The content of the message. This is the data that will be passed to the recipient. The content is limited to be a single field. If the content is small enough it can just be passed along, otherwise it should be hashed and the hash passed along (you can use our [`Hash`](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/core/libraries/Hash.sol) utilities with `sha256ToField` functions) | | Secret Hash | `field` (~254 bits) | A hash of a secret that is used when consuming the message on L2. Keep this preimage a secret to make the consumption private. To consume the message the caller must know the pre-image (the value that was hashed) - so make sure your app keeps track of the pre-images! Use the [`computeMessageSecretHash`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec.js/src/utils/secrets.ts) to compute it from a secret. | | Fee | `uint64` | The fee to the sequencer for including the message. This is the amount of ETH that the sequencer will receive for including the message. Note that it is not a full `uint256` but only `uint64` | @@ -39,17 +39,17 @@ To consume the message, we can use the `consume_l1_to_l2_message` function withi Note that while the `secret` and the `content` are both hashed, they are actually hashed with different hash functions! ::: -#include_code context_consume_l1_to_l2_message /yarn-project/aztec-nr/aztec/src/context/private_context.nr rust +#include_code context_consume_l1_to_l2_message /noir-projects/aztec-nr/aztec/src/context/private_context.nr rust -Computing the `content` must be done manually in its current form, as we are still adding a number of bytes utilities. A good example exists within the [Token bridge example](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_bridge_contract/src/util.nr). +Computing the `content` must be done manually in its current form, as we are still adding a number of bytes utilities. A good example exists within the [Token bridge example](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_bridge_contract/src/util.nr). -#include_code claim_public /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code claim_public /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust :::info The `content_hash` is a sha256 truncated to a field element (~ 254 bits). In Aztec-nr, you can use our `sha256_to_field()` to do a sha256 hash which fits in one field element ::: -#include_code mint_public_content_hash_nr /yarn-project/noir-contracts/contracts/token_portal_content_hash_lib/src/lib.nr rust +#include_code mint_public_content_hash_nr /noir-projects/noir-contracts/contracts/token_portal_content_hash_lib/src/lib.nr rust In Solidity, you can use our `Hash.sha256ToField()` method: @@ -75,7 +75,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 a `Field`). -#include_code context_message_portal /yarn-project/aztec-nr/aztec/src/context/private_context.nr rust +#include_code context_message_portal /noir-projects/aztec-nr/aztec/src/context/private_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). @@ -85,7 +85,7 @@ Access control on the L1 portal contract is essential to prevent consumption of As earlier, we can use a token bridge as an example. In this case, we are burning tokens on L2 and sending a message to the portal to free them on L1. -#include_code exit_to_l1_private yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code exit_to_l1_private noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust When the transaction is included in a rollup block the message will be inserted into the `Outbox`, where the recipient portal can consume it from. When consuming, the `msg.sender` must match the `recipient` meaning that only portal can actually consume the message. @@ -175,7 +175,7 @@ bytes memory message = abi.encodeWithSignature( This way, the message can be consumed by the portal contract, but only if the caller is the designated caller. By being a bit clever when specifying the designated caller, we can ensure that the calls are done in the correct order. For the Uniswap example, say that we have token portals implemented as we have done throughout this page, and a Uniswap portal implementing the designated caller. -We require that the Uniswap portal is the caller of the withdrawal, and that the uniswap portal implementation is executing the withdrawal before the swap. +We require that the Uniswap portal is the caller of the withdrawal, and that the uniswap portal implementation is executing the withdrawal before the swap. The order of execution can be constrained in the contract. Since all of the messages are emitted to L1 in the same transaction, we can leverage transaction atomicity to ensure success of failure of all messages. Note, that crossing the L1/L2 chasm is asynchronous, so there could be a situation where the user has burned their assets on L2 but the swap fails on L1! This could be due to major price movements or the like. In such a case, the user could be stuck with funds on L1 that they cannot get back to L2 unless the portal contract implements a way to properly handle such errors. @@ -188,4 +188,4 @@ Designated callers are enforced at the contract level for contracts that are not - Token bridge (Portal contract built for L1 -> L2, i.e., a non-native L2 asset) - [Portal contract](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/test/portals/TokenPortal.sol) - - [Aztec contract](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr) + - [Aztec contract](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr) diff --git a/docs/docs/developers/contracts/writing_contracts/storage/define_storage.md b/docs/docs/developers/contracts/writing_contracts/storage/define_storage.md index 49804252051..74e555622a4 100644 --- a/docs/docs/developers/contracts/writing_contracts/storage/define_storage.md +++ b/docs/docs/developers/contracts/writing_contracts/storage/define_storage.md @@ -24,7 +24,7 @@ If your contract uses storage (has Storage struct defined), you **MUST** include If you don't yet have any private state variables defined you can use this placeholder function: -#include_code compute_note_hash_and_nullifier_placeholder /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier_placeholder /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust ::: Since Aztec.nr is written in Noir, which is state-less, we need to specify how the storage struct should be initialized to read and write data correctly. This is done by specifying an `init` function that is run in functions that rely on reading or altering the state variables. This `init` function must declare the Storage struct with an instantiation defining how variables are accessed and manipulated. The function MUST be called `init` for the Aztec.nr library to properly handle it (this will be relaxed in the future). diff --git a/docs/docs/developers/contracts/writing_contracts/storage/storage_slots.md b/docs/docs/developers/contracts/writing_contracts/storage/storage_slots.md index 7888d77aae7..4ed1d5cce78 100644 --- a/docs/docs/developers/contracts/writing_contracts/storage/storage_slots.md +++ b/docs/docs/developers/contracts/writing_contracts/storage/storage_slots.md @@ -6,12 +6,12 @@ From the description of storage slots [in the Concepts](./../../../../learn/conc For the case of the example, we will look at what is inserted into the note hashes tree when adding a note in the Token contract. Specifically, we are looking at the last part of the `transfer` function: -#include_code increase_private_balance yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code increase_private_balance noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust -This function is creating a new note and inserting it into the balance set of the recipient `to`. Recall that to ensure privacy, only the note commitment is really inserted into the note hashes tree. To share the contents of the note with `to` the contract can emit an encrypted log (which this one does), or it can require an out-of-band data transfer sharing the information. Below, we will walk through the steps of how the note commitment is computed and inserted into the tree. For this, we don't care about the encrypted log, so we are going to ignore that part of the function call for now. +This function is creating a new note and inserting it into the balance set of the recipient `to`. Recall that to ensure privacy, only the note commitment is really inserted into the note hashes tree. To share the contents of the note with `to` the contract can emit an encrypted log (which this one does), or it can require an out-of-band data transfer sharing the information. Below, we will walk through the steps of how the note commitment is computed and inserted into the tree. For this, we don't care about the encrypted log, so we are going to ignore that part of the function call for now. Outlining it in more detail below as a sequence diagram, we can see how the calls make their way down the stack. -In the end a siloed note hash is computed in the kernel. +In the end a siloed note hash is computed in the kernel. :::info Some of the syntax below is a little butchered to make it easier to follow variables without the full code. diff --git a/docs/docs/developers/debugging/aztecnr-errors.md b/docs/docs/developers/debugging/aztecnr-errors.md index 9e2e8236702..5045e564c24 100644 --- a/docs/docs/developers/debugging/aztecnr-errors.md +++ b/docs/docs/developers/debugging/aztecnr-errors.md @@ -9,18 +9,18 @@ This section contains some errors that you may encounter when writing and compil All smart contracts written in Aztec.nr need the `aztec` dependency. In your `Nargo.toml` under `[dependencies]`, add this: ```toml -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } ``` You can learn more about dependencies and their paths [here](../contracts/resources/dependencies.md). #### `compute_note_hash_and_nullifier function not found. Define it in your contract` -Any smart contract that works with storage must include a [`compute_note_hash_and_nullifier`](https://github.com/AztecProtocol/aztec-packages/blob/6c20b45993ee9cbd319ab8351e2722e0c912f427/yarn-project/aztec-nr/aztec/src/note/utils.nr#L69) function to allow the PXE to process encrypted events. +Any smart contract that works with storage must include a [`compute_note_hash_and_nullifier`](https://github.com/AztecProtocol/aztec-packages/blob/6c20b45993ee9cbd319ab8351e2722e0c912f427/noir-projects/aztec-nr/aztec/src/note/utils.nr#L69) function to allow the PXE to process encrypted events. This is an example of this function in the token contract: -#include_code compute_note_hash_and_nullifier yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust This error may also show if the `compute_note_hash_and_nullifier` function is not correct or sits outside of the contract. diff --git a/docs/docs/developers/debugging/main.md b/docs/docs/developers/debugging/main.md index b2a0e0de46f..464f42b8936 100644 --- a/docs/docs/developers/debugging/main.md +++ b/docs/docs/developers/debugging/main.md @@ -11,7 +11,7 @@ On this section you can learn how to debug your Aztec.nr smart contracts and com You can log statements from Aztec.nr contracts that will show ups in the Sandbox. **Import debug_log** -Import the [`debug_log`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/debug_log.nr) dependency from Aztec oracles: +Import the [`debug_log`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/aztec-nr/aztec/src/oracle/debug_log.nr) dependency from Aztec oracles: ```rust use dep::aztec::oracle::debug_log::{ debug_log }; diff --git a/docs/docs/developers/debugging/sandbox-errors.md b/docs/docs/developers/debugging/sandbox-errors.md index 6e1a92f154e..e107e71e693 100644 --- a/docs/docs/developers/debugging/sandbox-errors.md +++ b/docs/docs/developers/debugging/sandbox-errors.md @@ -160,7 +160,7 @@ Circuits work by having a fixed size array. As such, we have limits on how many - too many transient read requests in one tx - too many transient read request membership witnesses in one tx -You can have a look at our current constants/limitations in [constants.nr](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr) +You can have a look at our current constants/limitations in [constants.nr](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-protocol-circuits/src/crates/types/src/constants.nr) #### 7008 - MEMBERSHIP_CHECK_FAILED diff --git a/docs/docs/developers/getting_started/aztecjs-getting-started.md b/docs/docs/developers/getting_started/aztecjs-getting-started.md index 1efb1b0742e..298b4c2e722 100644 --- a/docs/docs/developers/getting_started/aztecjs-getting-started.md +++ b/docs/docs/developers/getting_started/aztecjs-getting-started.md @@ -39,7 +39,7 @@ mkdir src 3. Add necessary yarn packages (and optionally add typescript too) ```sh -yarn add @aztec/aztec.js @aztec/accounts @aztec/noir-contracts typescript @types/node +yarn add @aztec/aztec.js @aztec/accounts @aztec/noir-contracts.js typescript @types/node ``` 4. [Optional] If creating a typescript file, add a `tsconfig.json` file into the project root, here is an example: @@ -90,7 +90,7 @@ yarn add @aztec/aztec.js @aztec/accounts @aztec/noir-contracts typescript @types "dependencies": { "@aztec/accounts": "latest", "@aztec/aztec.js": "latest", - "@aztec/noir-contracts": "latest", + "@aztec/noir-contracts.js": "latest", "@types/node": "^20.6.3", "typescript": "^5.2.2" } @@ -158,7 +158,7 @@ If you want more accounts, you can find instructions in the [Account creation se ## Deploy a contract -Now that we have our accounts loaded, let's move on to deploy our pre-compiled token smart contract. You can find the full code for the contract [here](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/contracts/token_contract/src). Add this to `index.ts` below the code you added earlier: +Now that we have our accounts loaded, let's move on to deploy our pre-compiled token smart contract. You can find the full code for the contract [here](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts/token_contract/src). Add this to `index.ts` below the code you added earlier: #include_code Deployment /yarn-project/end-to-end/src/e2e_sandbox_example.test.ts typescript diff --git a/docs/docs/developers/getting_started/aztecnr-getting-started.md b/docs/docs/developers/getting_started/aztecnr-getting-started.md index ab717925cdd..e541e346829 100644 --- a/docs/docs/developers/getting_started/aztecnr-getting-started.md +++ b/docs/docs/developers/getting_started/aztecnr-getting-started.md @@ -50,9 +50,9 @@ authors = [""] compiler_version = ">=0.18.0" [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } -value_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/value-note"} -easy_private_state = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/easy-private-state"} +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +value_note = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/value-note"} +easy_private_state = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/easy-private-state"} ``` ## Define the functions @@ -72,7 +72,7 @@ We need to define some imports. Write this within your contract at the top -#include_code imports /yarn-project/noir-contracts/contracts/counter_contract/src/main.nr rust +#include_code imports /noir-projects/noir-contracts/contracts/counter_contract/src/main.nr rust `context::{PrivateContext, Context}` @@ -98,7 +98,7 @@ Now we’ve got a mechanism for storing our private state, we can start using it Let’s create a `constructor` method to run on deployment that assigns an initial supply of tokens to a specified owner. In the constructor we created in the first step, write this: -#include_code constructor /yarn-project/noir-contracts/contracts/counter_contract/src/main.nr rust +#include_code constructor /noir-projects/noir-contracts/contracts/counter_contract/src/main.nr rust This function accesses the counts from storage. Then it assigns the passed initial counter to the `owner`'s counter privately using `at().add()`. @@ -108,7 +108,7 @@ We have annotated this and other functions with `#[aztec(private)]` which are AB Now let’s implement the `increment` function we defined in the first step. -#include_code increment /yarn-project/noir-contracts/contracts/counter_contract/src/main.nr rust +#include_code increment /noir-projects/noir-contracts/contracts/counter_contract/src/main.nr rust The `increment` function works very similarly to the `constructor`, but instead directly adds 1 to the counter rather than passing in an initial count parameter. @@ -118,7 +118,7 @@ Because our counters are private, the network can't directly verify if a note wa Add a new function into your contract as shown below: -#include_code nullifier /yarn-project/noir-contracts/contracts/counter_contract/src/main.nr rust +#include_code nullifier /noir-projects/noir-contracts/contracts/counter_contract/src/main.nr rust Here, we're computing both the note hash and the nullifier. The nullifier computation uses Aztec’s `compute_note_hash_and_nullifier` function, which takes details about the note's attributes eg contract address, nonce, storage slot, type id, and preimage. @@ -126,7 +126,7 @@ Here, we're computing both the note hash and the nullifier. The nullifier comput The last thing we need to implement is the function in order to retrieve a counter. In the `getCounter` we defined in the first step, write this: -#include_code get_counter /yarn-project/noir-contracts/contracts/counter_contract/src/main.nr rust +#include_code get_counter /noir-projects/noir-contracts/contracts/counter_contract/src/main.nr rust This function is `unconstrained` which allows us to fetch data from storage without a transaction. We retrieve a reference to the `owner`'s `counter` from the `counters` Map. The `get_balance` function then operates on the owner's counter. This yields a private counter that only the private key owner can decrypt. diff --git a/docs/docs/developers/limitations/main.md b/docs/docs/developers/limitations/main.md index 0147994b05a..971690e07e0 100644 --- a/docs/docs/developers/limitations/main.md +++ b/docs/docs/developers/limitations/main.md @@ -189,7 +189,7 @@ Due to the rigidity of zk-SNARK circuits, there are upper bounds on the amount o Here are the current constants: -#include_code constants /yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr rust +#include_code constants /noir-projects/noir-protocol-circuits/src/crates/types/src/constants.nr rust #### What are the consequences? diff --git a/docs/docs/developers/sandbox/references/cli-commands.md b/docs/docs/developers/sandbox/references/cli-commands.md index 6f8d13e965a..3b74c795ebf 100644 --- a/docs/docs/developers/sandbox/references/cli-commands.md +++ b/docs/docs/developers/sandbox/references/cli-commands.md @@ -72,7 +72,7 @@ export ADDRESS2= ## Deploying a Token Contract -We will now deploy a token contract using the `deploy` command, and set an address of the admin via a constructor argument. You can find the contract we are deploying [here](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_contract/src/main.nr) (or write it for yourself in [this tutorial!](../../tutorials/writing_token_contract.md)) +We will now deploy a token contract using the `deploy` command, and set an address of the admin via a constructor argument. You can find the contract we are deploying [here](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_contract/src/main.nr) (or write it for yourself in [this tutorial!](../../tutorials/writing_token_contract.md)) Make sure to replace this address with one of the two you created earlier. #include_code deploy yarn-project/end-to-end/src/cli_docs_sandbox.test.ts bash @@ -102,7 +102,7 @@ The `send` command expect the function name as the first unnamed argument and th #include_code send yarn-project/end-to-end/src/cli_docs_sandbox.test.ts bash -We called the [`mint_public`](https://github.com/AztecProtocol/aztec-packages/blob/87fa621347e55f82e36c70515c1824161eee5282/yarn-project/noir-contracts/contracts/token_contract/src/main.nr#L157C10-L157C10) function and provided it with the 2 arguments it expects: the recipient's address and the amount to be minted. Make sure to replace all addresses in this command with yours. +We called the [`mint_public`](https://github.com/AztecProtocol/aztec-packages/blob/87fa621347e55f82e36c70515c1824161eee5282/noir-projects/noir-contracts/contracts/token_contract/src/main.nr#L157C10-L157C10) function and provided it with the 2 arguments it expects: the recipient's address and the amount to be minted. Make sure to replace all addresses in this command with yours. The command output tells us the details of the transaction such as its hash and status. We can use this hash to query the receipt of the transaction at a later time: diff --git a/docs/docs/developers/sandbox/references/sandbox-reference.md b/docs/docs/developers/sandbox/references/sandbox-reference.md index b1ed012f56c..72c31a6c177 100644 --- a/docs/docs/developers/sandbox/references/sandbox-reference.md +++ b/docs/docs/developers/sandbox/references/sandbox-reference.md @@ -176,7 +176,7 @@ You can find the cheat code reference [here](../../sandbox/references/cheat_code ## Contracts -We have shipped a number of example contracts in the `@aztec/noir-contracts` [npm package](https://www.npmjs.com/package/@aztec/noir-contracts). This is included with the cli by default so you are able to use these contracts to test with. To get a list of the names of the contracts run: +We have shipped a number of example contracts in the `@aztec/noir-contracts.js` [npm package](https://www.npmjs.com/package/@aztec/noir-contracts.js). This is included with the cli by default so you are able to use these contracts to test with. To get a list of the names of the contracts run: ```bash title="example-contracts" showLineNumbers % aztec-cli example-contracts @@ -209,7 +209,7 @@ UniswapContractArtifact > Source code: /yarn-project/end-to-end/src/cli_docs_sandbox.test.ts#L95-L118 -You can see all of our example contracts in the monorepo [here](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/contracts). +You can see all of our example contracts in the monorepo [here](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts). ## Boxes diff --git a/docs/docs/developers/tutorials/testing.md b/docs/docs/developers/tutorials/testing.md index e0ec74a519b..e1f9e867f14 100644 --- a/docs/docs/developers/tutorials/testing.md +++ b/docs/docs/developers/tutorials/testing.md @@ -12,7 +12,7 @@ Let's start with a simple example for a test using the [Sandbox](../sandbox/refe #include_code sandbox-example /yarn-project/end-to-end/src/guides/dapp_testing.test.ts typescript -This test sets up the environment by creating a client to the Private Execution Environment (PXE) running on the Sandbox on port 8080. It then creates two new accounts, dubbed `owner` and `recipient`. Last, it deploys an instance of the [Token contract](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_contract/src/main.nr), minting an initial 100 tokens to the owner. +This test sets up the environment by creating a client to the Private Execution Environment (PXE) running on the Sandbox on port 8080. It then creates two new accounts, dubbed `owner` and `recipient`. Last, it deploys an instance of the [Token contract](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_contract/src/main.nr), minting an initial 100 tokens to the owner. Once we have this setup, the test itself is simple. We check the balance of the `recipient` user to ensure it has no tokens, send and await a deployment transaction, and then check the balance again to ensure it was increased. Note that all numeric values are represented as [native bigints](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) to avoid loss of precision. @@ -120,7 +120,7 @@ We can have private transactions that work fine locally, but are dropped by the #### A public call fails locally -Public function calls can be caught failing locally similar to how we catch private function calls. For this example, we use a [`TokenContract`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_contract/src/main.nr) instead of a private one. +Public function calls can be caught failing locally similar to how we catch private function calls. For this example, we use a [`TokenContract`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_contract/src/main.nr) instead of a private one. :::info Keep in mind that public function calls behave as in EVM blockchains, in that they are executed by the sequencer and not locally. Local simulation helps alert the user of a potential failure, but the actual execution path of a public function call will depend on when it gets mined. @@ -156,7 +156,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](../../learn/concepts/hybrid_state/main.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/aztec-nr/value-note/src/value_note.nr rust +#include_code value-note-def noir-projects/aztec-nr/value-note/src/value_note.nr rust We can query the Private eXecution Environment (PXE) 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. @@ -164,7 +164,7 @@ We can query the Private eXecution Environment (PXE) for all notes encrypted for #### Querying public state -[Public state](../../learn/concepts/hybrid_state/main.md#public-state) behaves as a key-value store, much like in the EVM. This scenario is much more straightforward, in that we can directly query the target slot and get the result back as a buffer. Note that we use the [`TokenContract`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/token_contract/src/main.nr) in this example, which defines a mapping of public balances on slot 6. +[Public state](../../learn/concepts/hybrid_state/main.md#public-state) behaves as a key-value store, much like in the EVM. This scenario is much more straightforward, in that we can directly query the target slot and get the result back as a buffer. Note that we use the [`TokenContract`](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/token_contract/src/main.nr) in this example, which defines a mapping of public balances on slot 6. #include_code public-storage /yarn-project/end-to-end/src/guides/dapp_testing.test.ts typescript @@ -190,7 +190,7 @@ The [`CheatCodes`](../sandbox/references/cheat_codes.md) class, which we used fo The `warp` method sets the time for next execution, both on L1 and L2. We can test this using an `isTimeEqual` function in a `Test` contract defined like the following: -#include_code is-time-equal yarn-project/noir-contracts/contracts/test_contract/src/main.nr rust +#include_code is-time-equal noir-projects/noir-contracts/contracts/test_contract/src/main.nr rust We can then call `warp` and rely on the `isTimeEqual` function to check that the timestamp was properly modified. diff --git a/docs/docs/developers/tutorials/token_portal/minting_on_aztec.md b/docs/docs/developers/tutorials/token_portal/minting_on_aztec.md index c04563fc24a..877a507122d 100644 --- a/docs/docs/developers/tutorials/token_portal/minting_on_aztec.md +++ b/docs/docs/developers/tutorials/token_portal/minting_on_aztec.md @@ -8,23 +8,23 @@ In this step we will start writing our Aztec.nr bridge smart contract and write In our `token-bridge` Aztec project in `aztec-contracts`, under `src` there is an example `main.nr` file. Paste this to define imports and initialize the constructor: -#include_code token_bridge_imports /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code token_bridge_imports /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust -#include_code token_bridge_storage_and_constructor /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code token_bridge_storage_and_constructor /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust This imports Aztec-related dependencies and our helper file `token_interface.nr`. (The code above will give errors right now - this is because we haven't implemented util and token_interface yet.) In `token_interface.nr`, add this: -#include_code token_bridge_token_interface /yarn-project/noir-contracts/contracts/token_bridge_contract/src/token_interface.nr rust +#include_code token_bridge_token_interface /noir-projects/noir-contracts/contracts/token_bridge_contract/src/token_interface.nr rust ## Consume the L1 message In the previous step, we have moved our funds to the portal and created a L1->L2 message. Upon building the next rollup, the sequencer asks the inbox for any incoming messages and adds them to Aztec’s L1->L2 message tree, so an application on L2 can prove that the message exists and consumes it. In `main.nr`, now paste this `claim_public` function: -#include_code claim_public /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code claim_public /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust The `claim_public` function enables anyone to consume the message on the user's behalf and mint tokens for them on L2. This is fine as the minting of tokens is done publicly anyway. @@ -43,9 +43,9 @@ The `claim_public` function enables anyone to consume the message on the user's Now we will create a function to mint the amount privately. Paste this into your `main.nr` -#include_code claim_private /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code claim_private /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust -#include_code call_mint_on_token /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code call_mint_on_token /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust The `get_mint_private_content_hash` function is imported from the `token_portal_content_hash_lib`. diff --git a/docs/docs/developers/tutorials/token_portal/setup.md b/docs/docs/developers/tutorials/token_portal/setup.md index 6737c6d3171..1678df1f98e 100644 --- a/docs/docs/developers/tutorials/token_portal/setup.md +++ b/docs/docs/developers/tutorials/token_portal/setup.md @@ -61,8 +61,8 @@ compiler_version = ">=0.18.0" type = "contract" [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } -token_portal_content_hash_lib = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/noir-contracts/contracts/token_portal_content_hash_lib" } +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +token_portal_content_hash_lib = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/noir-contracts/contracts/token_portal_content_hash_lib" } ``` We will also be writing some helper functions that should exist elsewhere so we don't overcomplicated our contract. In `src` create two more files - one called `util.nr` and one called `token_interface` - so your dir structure should now look like this: @@ -130,7 +130,7 @@ Inside the `packages` directory, run ```bash mkdir src && cd src && yarn init -yp -yarn add typescript @aztec/aztec.js @aztec/accounts @aztec/noir-contracts @aztec/types @aztec/foundation @aztec/l1-artifacts viem@1.21.4 "@types/node@^20.8.2" +yarn add typescript @aztec/aztec.js @aztec/accounts @aztec/noir-contracts.js @aztec/types @aztec/foundation @aztec/l1-artifacts viem@1.21.4 "@types/node@^20.8.2" yarn add -D jest @jest/globals ts-jest ``` diff --git a/docs/docs/developers/tutorials/token_portal/typescript_glue_code.md b/docs/docs/developers/tutorials/token_portal/typescript_glue_code.md index ca4e63c1994..6df8685c419 100644 --- a/docs/docs/developers/tutorials/token_portal/typescript_glue_code.md +++ b/docs/docs/developers/tutorials/token_portal/typescript_glue_code.md @@ -24,6 +24,7 @@ In `cross_chain_test_harness.ts`, add: #include_code cross_chain_test_harness /yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts typescript This + - gets your Solidity contract ABIs - uses Aztec.js to deploy them to Ethereum - uses Aztec.js to deploy the token and token bridge contract on L2, sets the bridge's portal address to `tokenPortalAddress` and initializes all the contracts @@ -42,8 +43,8 @@ Open `cross_chain_messaging.test.ts` and paste the initial description of the te import { expect, jest} from '@jest/globals' import { AccountWallet, AztecAddress, DebugLogger, EthAddress, Fr, computeAuthWitMessageHash, createDebugLogger, createPXEClient, waitForSandbox } from '@aztec/aztec.js'; import { getSandboxAccountsWallets } from '@aztec/accounts/testing'; -import { TokenContract } from '@aztec/noir-contracts/Token'; -import { TokenBridgeContract } from '@aztec/noir-contracts/TokenBridge'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; +import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge'; import { CrossChainTestHarness } from './shared/cross_chain_test_harness.js'; import { delay } from './fixtures/utils.js'; diff --git a/docs/docs/developers/tutorials/token_portal/withdrawing_to_l1.md b/docs/docs/developers/tutorials/token_portal/withdrawing_to_l1.md index ff0be84bb85..cacc357bfe0 100644 --- a/docs/docs/developers/tutorials/token_portal/withdrawing_to_l1.md +++ b/docs/docs/developers/tutorials/token_portal/withdrawing_to_l1.md @@ -8,7 +8,7 @@ This is where we have tokens on Aztec and want to withdraw them back to L1 (i.e. Go back to your `main.nr` and paste this: -#include_code exit_to_l1_public /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code exit_to_l1_public /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust For this to work we import the `get_withdraw_content_hash` helper function from the `token_portal_content_hash_lib`. @@ -25,9 +25,9 @@ The `exit_to_l1_public` function enables anyone to withdraw their L2 tokens back This function works very similarly to the public version, except here we burn user’s private notes. Under the public function in your `main.nr`, paste this: -#include_code exit_to_l1_private /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code exit_to_l1_private /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust -#include_code assert_token_is_same /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code assert_token_is_same /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust Since this is a private method, it can't read what token is publicly stored. So instead the user passes a token address, and `_assert_token_is_same()` checks that this user provided address is same as the one in storage. @@ -42,6 +42,7 @@ For both the public and private flow, we use the same mechanism to determine the After the transaction is completed on L2, the portal must call the outbox to successfully transfer funds to the user on L1. Like with deposits, things can be complex here. For example, what happens if the transaction was done on L2 to burn tokens but can’t be withdrawn to L1? Then the funds are lost forever! How do we prevent this? Paste this in your `TokenPortal.sol`: + ```solidity #include_code token_portal_withdraw /l1-contracts/test/portals/TokenPortal.sol raw } @@ -57,16 +58,15 @@ Before we can compile and use the contract, we need to add two additional functi We need a function that lets us read the token value. Paste this into `main.nr`: -#include_code read_token /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code read_token /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust And the `compute_note_hash_and_nullifier` required on every contract: ```rust -#include_code compute_note_hash_and_nullifier_placeholder /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr raw +#include_code compute_note_hash_and_nullifier_placeholder /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr raw } ``` - ## Compile code Congratulations, you have written all the contracts we need for this tutorial! Now let's compile them. diff --git a/docs/docs/developers/tutorials/uniswap/l2_contract_setup.md b/docs/docs/developers/tutorials/uniswap/l2_contract_setup.md index 9bdec48ed59..a7b54b17975 100644 --- a/docs/docs/developers/tutorials/uniswap/l2_contract_setup.md +++ b/docs/docs/developers/tutorials/uniswap/l2_contract_setup.md @@ -8,7 +8,7 @@ In this step, we will set up the storage struct for our Uniswap contract and def Our main contract will live inside `uniswap/src/main.nr`. In `main.nr`, paste this initial setup code: -#include_code uniswap_setup yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code uniswap_setup noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust **What’s happening here?** @@ -17,9 +17,10 @@ Because Uniswap has to approve the bridge to withdraw funds, it has to handle th To ensure there are no collisions (i.e. when the contract wants to approve the bridge of the exact same amount, the message hash would be the same), we also keep a nonce that gets incremented each time after use in a message. ## Building the approval flow + Next, paste this function: -#include_code authwit_uniswap_get yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code authwit_uniswap_get noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust In this function, the token contract calls the Uniswap contract to check if Uniswap has indeed done the approval. The token contract expects a `is_valid()` function to exit for private approvals and `is_valid_public()` for public approvals. If the action is indeed approved, it expects that the contract would return the function selector for `is_valid()`  in both cases. The Aztec.nr library exposes this constant for ease of use. The token contract also emits a nullifier for this message so that this approval (with the nonce) can’t be used again. @@ -27,7 +28,7 @@ This is similar to the [Authwit flow](../../contracts/resources/common_patterns/ However we don't have a function that actually creates the approved message and stores the action. This method should be responsible for creating the approval and then calling the token bridge to withdraw the funds to L1: -#include_code authwit_uniswap_set yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code authwit_uniswap_set noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust Notice how the nonce also gets incremented. diff --git a/docs/docs/developers/tutorials/uniswap/setup.md b/docs/docs/developers/tutorials/uniswap/setup.md index 6a918d224b5..a80b63e734a 100644 --- a/docs/docs/developers/tutorials/uniswap/setup.md +++ b/docs/docs/developers/tutorials/uniswap/setup.md @@ -48,8 +48,8 @@ Inside `uniswap/Nargo.toml` paste this in `[dependencies]`: ```json [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } -authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/authwit"} +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/authwit"} ``` ## L2 contracts @@ -62,7 +62,7 @@ cd uniswap/src && touch util.nr && touch interfaces.nr Inside `interfaces.nr` paste this: -#include_code interfaces yarn-project/noir-contracts/contracts/uniswap_contract/src/interfaces.nr rust +#include_code interfaces noir-projects/noir-contracts/contracts/uniswap_contract/src/interfaces.nr rust This creates interfaces for the `Token` contract and `TokenBridge` contract diff --git a/docs/docs/developers/tutorials/uniswap/swap_privately.md b/docs/docs/developers/tutorials/uniswap/swap_privately.md index cae2043165f..1e964019416 100644 --- a/docs/docs/developers/tutorials/uniswap/swap_privately.md +++ b/docs/docs/developers/tutorials/uniswap/swap_privately.md @@ -4,13 +4,13 @@ title: Swapping Privately In the `uniswap/src/main.nr` contract we created [previously](./l2_contract_setup.md) in `aztec-contracts/uniswap`, paste these functions: -#include_code swap_private yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust -#include_code assert_token_is_same yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code swap_private noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code assert_token_is_same noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust This uses a util function `compute_swap_private_content_hash()` - let's add that. In `util.nr`, add: -#include_code compute_swap_private_content_hash yarn-project/noir-contracts/contracts/uniswap_contract/src/util.nr rust +#include_code compute_swap_private_content_hash noir-projects/noir-contracts/contracts/uniswap_contract/src/util.nr rust This flow works similarly to the public flow with a few notable changes: diff --git a/docs/docs/developers/tutorials/uniswap/swap_publicly.md b/docs/docs/developers/tutorials/uniswap/swap_publicly.md index 91f4864e65d..c6516dd3b21 100644 --- a/docs/docs/developers/tutorials/uniswap/swap_publicly.md +++ b/docs/docs/developers/tutorials/uniswap/swap_publicly.md @@ -6,12 +6,12 @@ In this step we will create the flow for allowing a user to swap their tokens pu In `main.nr` paste this: -#include_code swap_public yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rust +#include_code swap_public noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr rust This uses a util function `compute_swap_public_content_hash()` - let's add that. In `util.nr`, add: -#include_code uniswap_public_content_hash yarn-project/noir-contracts/contracts/uniswap_contract/src/util.nr rust +#include_code uniswap_public_content_hash noir-projects/noir-contracts/contracts/uniswap_contract/src/util.nr rust **What’s happening here?** diff --git a/docs/docs/developers/tutorials/writing_dapp/contract_deployment.md b/docs/docs/developers/tutorials/writing_dapp/contract_deployment.md index ab3c33912e9..79cb2293882 100644 --- a/docs/docs/developers/tutorials/writing_dapp/contract_deployment.md +++ b/docs/docs/developers/tutorials/writing_dapp/contract_deployment.md @@ -19,19 +19,19 @@ Then, open the `contracts/token/Nargo.toml` configuration file, and add the `azt ```toml [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } -authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/authwit"} -safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/safe-math"} -compressed_string = {git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/compressed-string"} +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +authwit = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/authwit"} +safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/safe-math"} +compressed_string = {git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/compressed-string"} ``` Last, copy-paste the code from the `Token` contract into `contracts/token/main.nr`: -#include_code token_all yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code token_all noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Helper files -The `Token` contract also requires some helper files. You can view the files [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src). Copy the `types.nr` and the `types` folder into `contracts/token/src`. +The `Token` contract also requires some helper files. You can view the files [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src). Copy the `types.nr` and the `types` folder into `contracts/token/src`. ## Compile your contract diff --git a/docs/docs/developers/tutorials/writing_dapp/contract_interaction.md b/docs/docs/developers/tutorials/writing_dapp/contract_interaction.md index 058fa3483f5..692494626b0 100644 --- a/docs/docs/developers/tutorials/writing_dapp/contract_interaction.md +++ b/docs/docs/developers/tutorials/writing_dapp/contract_interaction.md @@ -6,7 +6,7 @@ In this section, we'll write the logic in our app that will interact with the co Let's start by showing our user's private balance for the token across their accounts. To do this, we can leverage the `balance_of_private` unconstrained view function of the token contract: -#include_code balance_of_private yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code balance_of_private noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust :::info Note that this function will only return a valid response for accounts registered in the Private eXecution Environment (PXE), since it requires access to the [user's private state](../../wallets/main.md#private-state). In other words, you cannot query the private balance of another user for the token contract. @@ -56,10 +56,10 @@ const wallet = await getSchnorrAccount( ).getWallet(); ``` -For ease of use, `accounts` also ships with a helper `getInitialTestAccountsWallets` method that returns a wallet for each of the pre-initialized accounts in the Sandbox, so you can send transactions as any of them. +For ease of use, `accounts` also ships with a helper `getInitialTestAccountsWallets` method that returns a wallet for each of the pre-initialized accounts in the Sandbox, so you can send transactions as any of them. ```js -import { getInitialTestAccountsWallets } from '@aztec/accounts/testing'; +import { getInitialTestAccountsWallets } from "@aztec/accounts/testing"; ``` We'll use one of these wallets to initialize the `Contract` instance that represents our private token contract, so every transaction sent through it will be sent through that wallet. diff --git a/docs/docs/developers/tutorials/writing_dapp/testing.md b/docs/docs/developers/tutorials/writing_dapp/testing.md index 51065b0ff87..8aea22e1de0 100644 --- a/docs/docs/developers/tutorials/writing_dapp/testing.md +++ b/docs/docs/developers/tutorials/writing_dapp/testing.md @@ -30,8 +30,8 @@ import { createPXEClient, waitForPXE, } from "@aztec/aztec.js"; -import { createAccount } from '@aztec/accounts/testing'; -import { TokenContractArtifact } from "@aztec/noir-contracts/Token"; +import { createAccount } from "@aztec/accounts/testing"; +import { TokenContractArtifact } from "@aztec/noir-contracts.js/Token"; const { PXE_URL = "http://localhost:8080", diff --git a/docs/docs/developers/tutorials/writing_private_voting_contract.md b/docs/docs/developers/tutorials/writing_private_voting_contract.md index 57efa5c7066..22d0b99406f 100644 --- a/docs/docs/developers/tutorials/writing_private_voting_contract.md +++ b/docs/docs/developers/tutorials/writing_private_voting_contract.md @@ -49,7 +49,7 @@ authors = [""] compiler_version = ">=0.18.0" [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } +aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } ``` ## Initiate the contract and define imports @@ -66,7 +66,7 @@ This defines a contract called `Voter`. Everything will sit inside this block. Inside this, paste these imports: -#include_code imports yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code imports noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust We are using various utils within the Aztec library: @@ -80,10 +80,10 @@ We are using various utils within the Aztec library: ## Set up storage -Under these imports, we need to set up our contract storage. +Under these imports, we need to set up our contract storage. Define the storage struct like so: -#include_code storage_struct yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code storage_struct noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust In this contract, we will store three vars: @@ -99,7 +99,7 @@ All constructors must be private, and because the admin is in public storage, we Therefore our constructor must call a public function by using `context.call_public_function()`. Paste this under the `impl` storage block: -#include_code constructor yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code constructor noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust `context.call_public_function()` takes three arguments: @@ -109,7 +109,7 @@ Therefore our constructor must call a public function by using `context.call_pub We now need to write the `_initialize()` function: -#include_code initialize yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code initialize noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust This function takes the admin argument and writes it to the storage. We are also using this function to set the `voteEnded` boolean as false in the same way. @@ -127,7 +127,7 @@ To ensure someone only votes once, we will create a nullifier as part of the fun Create a private function called `cast_vote`: -#include_code cast_vote yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code cast_vote noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust In this function, we do not create a nullifier with the address directly. This would leak privacy as it would be easy to reverse-engineer. We must add some randomness or some form of secret, like [nullifier secrets](../../learn/concepts/accounts/keys.md#nullifier-secrets). @@ -137,7 +137,7 @@ After pushing the nullifier, we update the `tally` to reflect this vote. As we k Create this new public function like this: -#include_code add_to_tally_public yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code add_to_tally_public noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust The first thing we do here is assert that the vote has not ended. @@ -149,7 +149,7 @@ The code after the assertion will only run if the assertion is true. In this sni We will create a function that anyone can call that will return the number of votes at a given vote Id. Paste this in your contract: -#include_code get_vote yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code get_vote noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust We set it as `unconstrained` and do not annotate it because it is only reading from state. You can read more about unconstrained functions [here](../../learn/concepts/pxe/acir_simulator.md#unconstrained-functions). @@ -159,7 +159,7 @@ To ensure that only an admin can end a voting period, we can use another `assert Paste this function in your contract: -#include_code end_vote yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code end_vote noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust Here, we are asserting that the `msg_sender()` is equal to the admin stored in public state. We have to create an `AztecAddress` type from the `msg_sender()` in order to do a direct comparison. @@ -169,7 +169,7 @@ Every Aztec contract that has storage must have a `compute_note_hash_and_nullifi At the end of the contract, paste this: -#include_code compute_note_hash_and_nullifier yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rust We can simply return `[0,0,0,0]` because we are not creating any notes in our contract. diff --git a/docs/docs/developers/tutorials/writing_token_contract.md b/docs/docs/developers/tutorials/writing_token_contract.md index 6002d717b61..7a25ad513f5 100644 --- a/docs/docs/developers/tutorials/writing_token_contract.md +++ b/docs/docs/developers/tutorials/writing_token_contract.md @@ -14,7 +14,7 @@ In this tutorial you will learn how to: - Handle different private note types - Pass data between private and public state -We are going to start with a blank project and fill in the token contract source code defined on Github [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src/main.nr), and explain what is being added as we go. +We are going to start with a blank project and fill in the token contract source code defined on Github [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src/main.nr), and explain what is being added as we go. ## Requirements @@ -58,10 +58,10 @@ compiler_version = ">=0.18.0" type = "contract" [dependencies] -aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } -safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/safe-math"} -authwit={ git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/authwit"} -compressed_string = {git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="yarn-project/aztec-nr/compressed-string"} +aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +safe_math = { git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/safe-math"} +authwit={ git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/authwit"} +compressed_string = {git="https://github.com/AztecProtocol/aztec-packages/", tag="#include_aztec_version", directory="noir-projects/aztec-nr/compressed-string"} ``` ## Contract Interface @@ -201,23 +201,23 @@ Before we can implement the functions, we need set up the contract storage, and :::info Copy required files -We will be going over the code in `main.nr` [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src). If you are following along and want to compile `main.nr` yourself, you need to add the other files in the directory as they contain imports that are used in `main.nr`. +We will be going over the code in `main.nr` [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src). If you are following along and want to compile `main.nr` yourself, you need to add the other files in the directory as they contain imports that are used in `main.nr`. ::: Just below the contract definition, add the following imports: -#include_code imports /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code imports /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust -We are importing the Option type, items from the `value_note` library to help manage private value storage, note utilities, context (for managing private and public execution contexts), `state_vars` for helping manage state, `types` for data manipulation and `oracle` for help passing data from the private to public execution context. We also import the `auth` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/auth.nr) to handle token authorizations from [Account Contracts](../../learn/concepts/accounts/main). Check out the Account Contract with AuthWitness [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr). +We are importing the Option type, items from the `value_note` library to help manage private value storage, note utilities, context (for managing private and public execution contexts), `state_vars` for helping manage state, `types` for data manipulation and `oracle` for help passing data from the private to public execution context. We also import the `auth` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/auth.nr) to handle token authorizations from [Account Contracts](../../learn/concepts/accounts/main). Check out the Account Contract with AuthWitness [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr). -[SafeU120](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/safe-math/src/safe_u120.nr) is a library to do safe math operations on unsigned integers that protects against overflows and underflows. +[SafeU120](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/safe-math/src/safe_u120.nr) is a library to do safe math operations on unsigned integers that protects against overflows and underflows. For more detail on execution contexts, see [Contract Communication](../../learn/concepts/communication/main). ### Types files -We are also importing types from a `types.nr` file, which imports types from the `types` folder. You can view them [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src). +We are also importing types from a `types.nr` file, which imports types from the `types` folder. You can view them [here](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src). The main thing to note from this types folder is the `TransparentNote` definition. This defines how the contract moves value from the public domain into the private domain. It is similar to the `value_note` that we imported, but with some modifications namely, instead of a defined `owner`, it allows anyone that can produce the pre-image to the stored `secret_hash` to spend the note. @@ -231,7 +231,7 @@ Now that we have dependencies imported into our contract we can define the stora Below the dependencies, paste the following Storage struct: -#include_code storage_struct /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code storage_struct /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust Reading through the storage variables: @@ -252,15 +252,15 @@ Copy and paste the body of each function into the appropriate place in your proj In the source code, the constructor logic is commented out due to some limitations of the current state of the development. -#include_code constructor /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code constructor /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust -The constructor is a private function. There isn't any private state to set up in this function, but there is public state to set up. The `context` is a global variable that is available to private and public functions, but the available methods differ based on the context. You can see the implementation details [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/aztec/src/context.nr). The `context.call_public_function` allows a private function to call a public function on any contract. In this case, the constructor is passing the `msg_sender` as the argument to the `_initialize` function, which is also defined in this contract. +The constructor is a private function. There isn't any private state to set up in this function, but there is public state to set up. The `context` is a global variable that is available to private and public functions, but the available methods differ based on the context. You can see the implementation details [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/aztec/src/context.nr). The `context.call_public_function` allows a private function to call a public function on any contract. In this case, the constructor is passing the `msg_sender` as the argument to the `_initialize` function, which is also defined in this contract. ### Public function implementations Public functions are declared with the `#[aztec(public)]` macro above the function name like so: -#include_code set_admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code set_admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust As described in the [execution contexts section above](#execution-contexts), public function logic and transaction information is transparent to the world. Public functions update public state, but can be used to prepare data to be used in a private context, as we will go over below (e.g. see the [shield](#shield) function). @@ -270,13 +270,13 @@ Storage is referenced as `storage.variable`. After storage is initialized, the contract checks that the `msg_sender` is the `admin`. If not, the transaction will fail. If it is, the `new_admin` is saved as the `admin`. -#include_code set_admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code set_admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `set_minter` This function allows the `admin` to add or a remove a `minter` from the public `minters` mapping. It checks that `msg_sender` is the `admin` and finally adds the `minter` to the `minters` mapping. -#include_code set_minter /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code set_minter /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `mint_public` @@ -286,15 +286,15 @@ First, storage is initialized. Then the function checks that the `msg_sender` is The function returns 1 to indicate successful execution. -#include_code mint_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code mint_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `mint_private` This public function allows an account approved in the public `minters` mapping to create new private tokens that can be claimed by anyone that has the pre-image to the `secret_hash`. -First, public storage is initialized. Then it checks that the `msg_sender` is an approved minter. Then a new `TransparentNote` is created with the specified `amount` and `secret_hash`. You can read the details of the `TransparentNote` in the `types.nr` file [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/noir-contracts/contracts/token_contract/src/types.nr#L61). The `amount` is added to the existing public `total_supply` and the storage value is updated. Then the new `TransparentNote` is added to the `pending_shields` using the `insert_from_public` function, which is accessible on the `Set` type. Then it's ready to be claimed by anyone with the `secret_hash` pre-image using the `redeem_shield` function. It returns `1` to indicate successful execution. +First, public storage is initialized. Then it checks that the `msg_sender` is an approved minter. Then a new `TransparentNote` is created with the specified `amount` and `secret_hash`. You can read the details of the `TransparentNote` in the `types.nr` file [here](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src/types.nr#L61). The `amount` is added to the existing public `total_supply` and the storage value is updated. Then the new `TransparentNote` is added to the `pending_shields` using the `insert_from_public` function, which is accessible on the `Set` type. Then it's ready to be claimed by anyone with the `secret_hash` pre-image using the `redeem_shield` function. It returns `1` to indicate successful execution. -#include_code mint_private /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code mint_private /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `shield` @@ -310,7 +310,7 @@ If the `msg_sender` is the same as the account to debit tokens from, the authori It returns `1` to indicate successful execution. -#include_code shield /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code shield /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `transfer_public` @@ -318,7 +318,7 @@ This public function enables public transfers between Aztec accounts. The sender After storage is initialized, the [authorization flow specified above](#authorizing-token-spends) is checked. Then the sender and recipient's balances are updated and saved to storage using the `SafeU120` library. -#include_code transfer_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code transfer_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `burn_public` @@ -326,7 +326,7 @@ This public function enables public burning (destroying) of tokens from the send After storage is initialized, the [authorization flow specified above](#authorizing-token-spends) is checked. Then the sender's public balance and the `total_supply` are updated and saved to storage using the `SafeU120` library. -#include_code burn_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code burn_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Private function implementations @@ -345,11 +345,11 @@ Storage is referenced as `storage.variable`. This private function enables an account to move tokens from a `TransparentNote` in the `pending_shields` mapping to any Aztec account as a `ValueNote` in private `balances`. -Going through the function logic, first the `secret_hash` is generated from the given secret. This ensures that only the entity possessing the secret can use it to redeem the note. Following this, a `TransparentNote` is retrieved from the set, using the provided amount and secret. The note is subsequently removed from the set, allowing it to be redeemed only once. The recipient's private balance is then increased using the `increment` helper function from the `value_note` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/yarn-project/aztec-nr/value-note/src/utils.nr). +Going through the function logic, first the `secret_hash` is generated from the given secret. This ensures that only the entity possessing the secret can use it to redeem the note. Following this, a `TransparentNote` is retrieved from the set, using the provided amount and secret. The note is subsequently removed from the set, allowing it to be redeemed only once. The recipient's private balance is then increased using the `increment` helper function from the `value_note` [library](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/aztec-nr/value-note/src/utils.nr). The function returns `1` to indicate successful execution. -#include_code redeem_shield /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code redeem_shield /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `unshield` @@ -359,7 +359,7 @@ After initializing storage, the function checks that the `msg_sender` is authori The function returns `1` to indicate successful execution. -#include_code unshield /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code unshield /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `transfer` @@ -367,7 +367,7 @@ This private function enables private token transfers between Aztec accounts. After initializing storage, the function checks that the `msg_sender` is authorized to spend tokens. See [the Authorizing token spends section](#authorizing-token-spends) above for more detail--the only difference being that `assert_valid_message_for` is modified to work specifically in the private context. After authorization, the function gets the current balances for the sender and recipient and decrements and increments them, respectively, using the `value_note` helper functions. -#include_code transfer /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code transfer /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `burn` @@ -375,7 +375,7 @@ This private function enables accounts to privately burn (destroy) tokens. After initializing storage, the function checks that the `msg_sender` is authorized to spend tokens. Then it gets the sender's current balance and decrements it. Finally it stages a public function call to [`_reduce_total_supply`](#_reduce_total_supply). -#include_code burn /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code burn /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Internal function implementations @@ -387,19 +387,19 @@ This function is called via the [constructor](#constructor). This function sets the creator of the contract (passed as `msg_sender` from the constructor) as the admin and makes them a minter. -#include_code initialize /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code initialize /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `_increase_public_balance` This function is called from [`unshield`](#unshield). The account's private balance is decremented in `shield` and the public balance is increased in this function. -#include_code increase_public_balance /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code increase_public_balance /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `_reduce_total_supply` This function is called from [`burn`](#burn). The account's private balance is decremented in `burn` and the public `total_supply` is reduced in this function. -#include_code reduce_total_supply /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code reduce_total_supply /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust ### Unconstrained function implementations @@ -409,31 +409,31 @@ Unconstrained functions are similar to `view` functions in Solidity in that they A getter function for reading the public `admin` value. -#include_code admin /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code admin /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `is_minter` A getter function for checking the value of associated with a `minter` in the public `minters` mapping. -#include_code is_minter /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code is_minter /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `total_supply` A getter function for checking the token `total_supply`. -#include_code total_supply /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code total_supply /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `balance_of_private` A getter function for checking the private balance of the provided Aztec account. Note that the [Private Execution Environment (PXE)](https://github.com/AztecProtocol/aztec-packages/tree/#include_aztec_version/yarn-project/pxe) must have access to the `owner`s decryption keys in order to decrypt their notes. -#include_code balance_of_private /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code balance_of_private /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `balance_of_public` A getter function for checking the public balance of the provided Aztec account. -#include_code balance_of_public /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code balance_of_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `compute_note_hash_and_nullifier` @@ -441,13 +441,13 @@ A getter function to compute the note hash and nullifier for notes in the contra This must be included in every contract because it depends on the storage slots, which are defined when we set up storage. -#include_code compute_note_hash_and_nullifier /yarn-project/noir-contracts/contracts/token_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust :::danger If your contract works with storage (has Storage struct defined), you **MUST** include a `compute_note_hash_and_nullifier` function. If you don't yet have any private state variables defined put there a placeholder function: -#include_code compute_note_hash_and_nullifier_placeholder /yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rust +#include_code compute_note_hash_and_nullifier_placeholder /noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr rust ::: ## Compiling diff --git a/docs/docs/developers/updating.md b/docs/docs/developers/updating.md index 73eb2549a38..8a1d95b88f0 100644 --- a/docs/docs/developers/updating.md +++ b/docs/docs/developers/updating.md @@ -51,10 +51,10 @@ To update the aztec.nr packages manually, update the tags of the `aztec.nr` depe ```diff [dependencies] --aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.7.5", directory="yarn-project/aztec-nr/aztec" } -+aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } --value_note = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.7.5", directory="yarn-project/aztec-nr/value-note" } -+value_note = { git="https://github.com/AztecProtocol/aztec-packages", tag="#include_aztec_version", directory="yarn-project/aztec-nr/value-note" } +-aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.7.5", directory="noir-projects/aztec-nr/aztec" } ++aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="#include_aztec_version", directory="noir-projects/aztec-nr/aztec" } +-value_note = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.7.5", directory="noir-projects/aztec-nr/value-note" } ++value_note = { git="https://github.com/AztecProtocol/aztec-packages", tag="#include_aztec_version", directory="noir-projects/aztec-nr/value-note" } ``` Go to the contract directory and try compiling it with `aztec-nargo compile` to verify that the update was successful: diff --git a/docs/docs/developers/wallets/main.md b/docs/docs/developers/wallets/main.md index c12288e5478..1e1b127ca7a 100644 --- a/docs/docs/developers/wallets/main.md +++ b/docs/docs/developers/wallets/main.md @@ -2,11 +2,11 @@ title: Wallets --- -In this page we will cover the main responsibilities of a wallet in the Aztec network. +In this page we will cover the main responsibilities of a wallet in the Aztec network. Refer to [_writing an account contract_](../contracts/writing_contracts/accounts/write_accounts_contract.md) for a tutorial on how to write a contract to back a user's account. -Go to [_wallet architecture](./architecture.md) for an overview of its architecture and a reference on the interface a wallet must implement. +Go to [\_wallet architecture](./architecture.md) for an overview of its architecture and a reference on the interface a wallet must implement. Wallets are the applications through which users manage their accounts. Users rely on wallets to browse through their accounts, monitor their balances, and create new accounts. Wallets also store seed phrases and private keys, or interact with external keystores such as hardware wallets. @@ -26,7 +26,7 @@ Note that users must be able to receive funds in Aztec before deploying their ac Every transaction in Aztec is broadcast to the network as a zero-knowledge proof of correct execution, in order to preserve privacy. This means that transaction proofs are generated on the wallet and not on a remote node. This is one of the biggest differences with regard to EVM chain wallets. -A wallet is responsible for **creating** an [_execution request_](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/types/src/tx_execution_request.ts) out of one or more [_function calls_](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/types/src/function_call.ts) requested by a dapp. For example, a dapp may request a wallet to "invoke the `transfer` function on the contract at `0x1234` with the following arguments", in response to a user action. The wallet [turns that into an execution request](../../learn/concepts/accounts/main.md#execution-requests) with the signed instructions to execute that function call from the user's account contract. In an [ECDSA-based account](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/noir-contracts/contracts/ecdsa_account_contract/src/main.nr), for instance, this is an execution request that encodes the function call in the _entrypoint payload_, and includes its ECDSA signature with the account's signing private key. +A wallet is responsible for **creating** an [_execution request_](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/types/src/tx_execution_request.ts) out of one or more [_function calls_](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/types/src/function_call.ts) requested by a dapp. For example, a dapp may request a wallet to "invoke the `transfer` function on the contract at `0x1234` with the following arguments", in response to a user action. The wallet [turns that into an execution request](../../learn/concepts/accounts/main.md#execution-requests) with the signed instructions to execute that function call from the user's account contract. In an [ECDSA-based account](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr), for instance, this is an execution request that encodes the function call in the _entrypoint payload_, and includes its ECDSA signature with the account's signing private key. Once the _execution request_ is created, the wallet is responsible for **simulating** and **proving** the execution of its private functions. The simulation yields an execution trace, which can be used to provide the user with a list of side effects of the private execution of the transaction. During this simulation, the wallet is responsible of providing data to the virtual machine, such as private notes, encryption keys, or nullifier secrets. This execution trace is fed into the prover, which returns a zero-knowledge proof that guarantees correct execution and hides all private information. The output of this process is a [_transaction_](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/types/src/tx/tx.ts) object. @@ -53,6 +53,7 @@ As in EVM-based chains, wallets are expected to manage user keys, or provide an :::info Due to limitations in the current architecture, privacy keys need to be available in the wallet software itself and cannot be punted to an external keystore. This restriction may be lifted in a future release. ::: + ## Recipient encryption keys Wallets are also expected to manage the public encryption keys of any recipients of local transactions. When creating an encrypted note for a recipient given their address, the wallet needs to provide their [complete address](../../learn/concepts/accounts/keys.md#addresses-partial-addresses-and-public-keys). Recipients broadcast their complete addresses when deploying their account contracts, and wallets collect this information and save it in a local registry for easy access when needed. diff --git a/docs/docs/learn/concepts/accounts/keys.md b/docs/docs/learn/concepts/accounts/keys.md index 63cd27b0f3a..ed91e7928fe 100644 --- a/docs/docs/learn/concepts/accounts/keys.md +++ b/docs/docs/learn/concepts/accounts/keys.md @@ -1,18 +1,19 @@ # Keys Typically, each account in Aztec is backed by two separate keys: + - A **signing key** used for authenticating the owner of the account. - A **privacy master key** used for deriving encryption and nullifying keys for managing private state. ## Signing keys -Signing keys allow their holder to act as their corresponding account in Aztec, similarly to the keys used for an Ethereum account. If a signing key is leaked, the user can potentially lose all their funds. +Signing keys allow their holder to act as their corresponding account in Aztec, similarly to the keys used for an Ethereum account. If a signing key is leaked, the user can potentially lose all their funds. Since Aztec implements full [signature abstraction](./main.md), signing keys depend on the account contract implementation for each user. Usually, an account contract will validate a signature of the incoming payload against a known public key. This is a snippet of our Schnorr Account contract implementation, which uses Schnorr signatures for authentication: -#include_code entrypoint /yarn-project/noir-contracts/contracts/schnorr_account_contract/src/main.nr rust +#include_code entrypoint /noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr rust Still, different accounts may use different signing schemes, may require multi-factor authentication, or _may not even use signing keys_ and instead rely on other authentication mechanisms. Read [how to write an account contract](../../../developers/contracts/writing_contracts/accounts/write_accounts_contract.md) for a full example of how to manage authentication. @@ -65,13 +66,13 @@ A side effect of enshrining and encoding privacy keys into the account address i ### Encryption keys -The privacy master key is used to derive encryption keys. Encryption keys, as their name implies, are used for encrypting private notes for a recipient, where the public key is used for encryption and the corresponding private key used for decryption. +The privacy master key is used to derive encryption keys. Encryption keys, as their name implies, are used for encrypting private notes for a recipient, where the public key is used for encryption and the corresponding private key used for decryption. 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 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/aztec-nr/address-note/src/address_note.nr rust +#include_code encrypted /noir-projects/aztec-nr/address-note/src/address_note.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 Private Execution Environment (PXE), callable either via aztec.js or the CLI. @@ -84,7 +85,7 @@ In addition to deriving encryption keys, the privacy master key is used for deri An application in Aztec.nr can request a secret from the current user for computing the nullifier of a note via the `request_nullifier_secret_key` api: -#include_code nullifier /yarn-project/aztec-nr/value-note/src/value_note.nr rust +#include_code nullifier /noir-projects/aztec-nr/value-note/src/value_note.nr rust ### Scoped keys @@ -100,7 +101,7 @@ In the case of nullifier secrets, there is also a security reason involved. Sinc ### Security considerations -A leaked privacy master key means a loss of privacy for the affected user. An attacker who holds the privacy private key of a user can derive the encryption private keys to decrypt all past inbound and outbound private notes, and can derive the nullifier secrets to determine when these notes were consumed. +A leaked privacy master key means a loss of privacy for the affected user. An attacker who holds the privacy private key of a user can derive the encryption private keys to decrypt all past inbound and outbound private notes, and can derive the nullifier secrets to determine when these notes were consumed. Nevertheless, the attacker cannot steal the affected user's funds, since authentication and access control depend on the signing keys and are managed by the user's account contract. diff --git a/docs/docs/misc/migration_notes.md b/docs/docs/misc/migration_notes.md index cdee45c4ecf..4def648a503 100644 --- a/docs/docs/misc/migration_notes.md +++ b/docs/docs/misc/migration_notes.md @@ -66,6 +66,40 @@ impl NoteInterface for MyCustomNote { } ``` +## 0.24.0 + +### [js] Importing contracts in JS + +`@aztec/noir-contracts` is now `@aztec/noir-contracts.js`. You'll need to update your package.json & imports. + +Before: + +```js +import { TokenContract } from "@aztec/noir-contracts/Token"; +``` + +Now: + +```js +import { TokenContract } from "@aztec/noir-contracts.js/Token"; +``` + +### [Aztec.nr] aztec-nr contracts location change in Nargo.toml + +Aztec contracts are now moved outside of the `yarn-project` folder and into `noir-projects`, so you need to update your imports. + +Before: + +```rust +easy_private_token_contract = {git = "https://github.com/AztecProtocol/aztec-packages/", tag ="v0.23.0", directory = "yarn-project/noir-contracts/src/contracts/easy_private_token_contract"} +``` + +Now, update the `yarn-project` folder for `noir-projects`: + +```rust +easy_private_token_contract = {git = "https://github.com/AztecProtocol/aztec-packages/", tag ="v0.24.0", directory = "noir-projects/noir-contracts/contracts/easy_private_token_contract"} +``` + ## 0.22.0 ### `Note::compute_note_hash` renamed to `Note::compute_note_content_hash` diff --git a/docs/src/components/GithubCode/index.js b/docs/src/components/GithubCode/index.js index 27cef562bab..0ee2d6f81a3 100644 --- a/docs/src/components/GithubCode/index.js +++ b/docs/src/components/GithubCode/index.js @@ -12,7 +12,7 @@ import github from "prism-react-renderer/themes/github"; * Inside a markdown file: * * import GithubCode from '../src/components/GithubCode'; - * + * */ const GithubCode = ({ diff --git a/noir-projects/.dockerignore b/noir-projects/.dockerignore new file mode 100644 index 00000000000..f01ca50f653 --- /dev/null +++ b/noir-projects/.dockerignore @@ -0,0 +1,2 @@ +aztec-nr/.gitattributes +aztec-nr/.gitrepo diff --git a/noir-projects/Dockerfile b/noir-projects/Dockerfile new file mode 100644 index 00000000000..f6a55098e18 --- /dev/null +++ b/noir-projects/Dockerfile @@ -0,0 +1,18 @@ +FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/noir as noir +FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/avm-transpiler as transpiler +FROM ubuntu:lunar + +# Copy in nargo +COPY --from=noir /usr/src/noir/target/release/nargo /usr/src/noir/target/release/nargo +# Copy in transpiler +COPY --from=transpiler /usr/src/avm-transpiler/target/release/avm-transpiler /usr/src/avm-transpiler/target/release/avm-transpiler + +WORKDIR /usr/src/noir-projects +# Copy in noir projects +COPY . . +# Build +WORKDIR /usr/src/noir-projects/noir-contracts +RUN ./scripts/compile.sh && ./scripts/transpile.sh + +WORKDIR /usr/src/noir-projects/noir-protocol-circuits +RUN cd src && ../../../noir/target/release/nargo compile --silence-warnings diff --git a/yarn-project/aztec-nr/.gitattributes b/noir-projects/aztec-nr/.gitattributes similarity index 100% rename from yarn-project/aztec-nr/.gitattributes rename to noir-projects/aztec-nr/.gitattributes diff --git a/yarn-project/aztec-nr/.gitrepo b/noir-projects/aztec-nr/.gitrepo similarity index 100% rename from yarn-project/aztec-nr/.gitrepo rename to noir-projects/aztec-nr/.gitrepo diff --git a/yarn-project/aztec-nr/LICENCE b/noir-projects/aztec-nr/LICENCE similarity index 100% rename from yarn-project/aztec-nr/LICENCE rename to noir-projects/aztec-nr/LICENCE diff --git a/yarn-project/aztec-nr/README.md b/noir-projects/aztec-nr/README.md similarity index 100% rename from yarn-project/aztec-nr/README.md rename to noir-projects/aztec-nr/README.md diff --git a/yarn-project/aztec-nr/address-note/Nargo.toml b/noir-projects/aztec-nr/address-note/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/address-note/Nargo.toml rename to noir-projects/aztec-nr/address-note/Nargo.toml diff --git a/yarn-project/aztec-nr/address-note/src/address_note.nr b/noir-projects/aztec-nr/address-note/src/address_note.nr similarity index 100% rename from yarn-project/aztec-nr/address-note/src/address_note.nr rename to noir-projects/aztec-nr/address-note/src/address_note.nr diff --git a/yarn-project/aztec-nr/address-note/src/lib.nr b/noir-projects/aztec-nr/address-note/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/address-note/src/lib.nr rename to noir-projects/aztec-nr/address-note/src/lib.nr diff --git a/yarn-project/aztec-nr/assets/Aztec_banner.png b/noir-projects/aztec-nr/assets/Aztec_banner.png similarity index 100% rename from yarn-project/aztec-nr/assets/Aztec_banner.png rename to noir-projects/aztec-nr/assets/Aztec_banner.png diff --git a/yarn-project/aztec-nr/authwit/Nargo.toml b/noir-projects/aztec-nr/authwit/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/authwit/Nargo.toml rename to noir-projects/aztec-nr/authwit/Nargo.toml diff --git a/yarn-project/aztec-nr/authwit/src/account.nr b/noir-projects/aztec-nr/authwit/src/account.nr similarity index 100% rename from yarn-project/aztec-nr/authwit/src/account.nr rename to noir-projects/aztec-nr/authwit/src/account.nr diff --git a/yarn-project/aztec-nr/authwit/src/auth.nr b/noir-projects/aztec-nr/authwit/src/auth.nr similarity index 100% rename from yarn-project/aztec-nr/authwit/src/auth.nr rename to noir-projects/aztec-nr/authwit/src/auth.nr diff --git a/yarn-project/aztec-nr/authwit/src/auth_witness.nr b/noir-projects/aztec-nr/authwit/src/auth_witness.nr similarity index 100% rename from yarn-project/aztec-nr/authwit/src/auth_witness.nr rename to noir-projects/aztec-nr/authwit/src/auth_witness.nr diff --git a/yarn-project/aztec-nr/authwit/src/entrypoint.nr b/noir-projects/aztec-nr/authwit/src/entrypoint.nr similarity index 100% rename from yarn-project/aztec-nr/authwit/src/entrypoint.nr rename to noir-projects/aztec-nr/authwit/src/entrypoint.nr diff --git a/yarn-project/aztec-nr/authwit/src/entrypoint/app.nr b/noir-projects/aztec-nr/authwit/src/entrypoint/app.nr similarity index 100% rename from yarn-project/aztec-nr/authwit/src/entrypoint/app.nr rename to noir-projects/aztec-nr/authwit/src/entrypoint/app.nr diff --git a/yarn-project/aztec-nr/authwit/src/entrypoint/fee.nr b/noir-projects/aztec-nr/authwit/src/entrypoint/fee.nr similarity index 99% rename from yarn-project/aztec-nr/authwit/src/entrypoint/fee.nr rename to noir-projects/aztec-nr/authwit/src/entrypoint/fee.nr index 6858e4fdd7a..318330295bc 100644 --- a/yarn-project/aztec-nr/authwit/src/entrypoint/fee.nr +++ b/noir-projects/aztec-nr/authwit/src/entrypoint/fee.nr @@ -62,4 +62,3 @@ impl FeePayload { } } } - diff --git a/yarn-project/aztec-nr/authwit/src/entrypoint/function_call.nr b/noir-projects/aztec-nr/authwit/src/entrypoint/function_call.nr similarity index 100% rename from yarn-project/aztec-nr/authwit/src/entrypoint/function_call.nr rename to noir-projects/aztec-nr/authwit/src/entrypoint/function_call.nr diff --git a/yarn-project/aztec-nr/authwit/src/lib.nr b/noir-projects/aztec-nr/authwit/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/authwit/src/lib.nr rename to noir-projects/aztec-nr/authwit/src/lib.nr diff --git a/yarn-project/aztec-nr/aztec/Nargo.toml b/noir-projects/aztec-nr/aztec/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/aztec/Nargo.toml rename to noir-projects/aztec-nr/aztec/Nargo.toml diff --git a/yarn-project/aztec-nr/aztec/src/avm.nr b/noir-projects/aztec-nr/aztec/src/avm.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/avm.nr rename to noir-projects/aztec-nr/aztec/src/avm.nr diff --git a/yarn-project/aztec-nr/aztec/src/avm/context.nr b/noir-projects/aztec-nr/aztec/src/avm/context.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/avm/context.nr rename to noir-projects/aztec-nr/aztec/src/avm/context.nr diff --git a/yarn-project/aztec-nr/aztec/src/context.nr b/noir-projects/aztec-nr/aztec/src/context.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context.nr rename to noir-projects/aztec-nr/aztec/src/context.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/avm.nr b/noir-projects/aztec-nr/aztec/src/context/avm.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/avm.nr rename to noir-projects/aztec-nr/aztec/src/context/avm.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/globals.nr b/noir-projects/aztec-nr/aztec/src/context/globals.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/globals.nr rename to noir-projects/aztec-nr/aztec/src/context/globals.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/globals/private_global_variables.nr b/noir-projects/aztec-nr/aztec/src/context/globals/private_global_variables.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/globals/private_global_variables.nr rename to noir-projects/aztec-nr/aztec/src/context/globals/private_global_variables.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/globals/public_global_variables.nr b/noir-projects/aztec-nr/aztec/src/context/globals/public_global_variables.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/globals/public_global_variables.nr rename to noir-projects/aztec-nr/aztec/src/context/globals/public_global_variables.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/inputs.nr b/noir-projects/aztec-nr/aztec/src/context/inputs.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/inputs.nr rename to noir-projects/aztec-nr/aztec/src/context/inputs.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr b/noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr rename to noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/inputs/public_context_inputs.nr b/noir-projects/aztec-nr/aztec/src/context/inputs/public_context_inputs.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/inputs/public_context_inputs.nr rename to noir-projects/aztec-nr/aztec/src/context/inputs/public_context_inputs.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/private_context.nr b/noir-projects/aztec-nr/aztec/src/context/private_context.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/private_context.nr rename to noir-projects/aztec-nr/aztec/src/context/private_context.nr diff --git a/yarn-project/aztec-nr/aztec/src/context/public_context.nr b/noir-projects/aztec-nr/aztec/src/context/public_context.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/context/public_context.nr rename to noir-projects/aztec-nr/aztec/src/context/public_context.nr diff --git a/yarn-project/aztec-nr/aztec/src/hash.nr b/noir-projects/aztec-nr/aztec/src/hash.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/hash.nr rename to noir-projects/aztec-nr/aztec/src/hash.nr diff --git a/yarn-project/aztec-nr/aztec/src/hasher.nr b/noir-projects/aztec-nr/aztec/src/hasher.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/hasher.nr rename to noir-projects/aztec-nr/aztec/src/hasher.nr diff --git a/yarn-project/aztec-nr/aztec/src/history.nr b/noir-projects/aztec-nr/aztec/src/history.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/history.nr rename to noir-projects/aztec-nr/aztec/src/history.nr diff --git a/yarn-project/aztec-nr/aztec/src/history/contract_inclusion.nr b/noir-projects/aztec-nr/aztec/src/history/contract_inclusion.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/history/contract_inclusion.nr rename to noir-projects/aztec-nr/aztec/src/history/contract_inclusion.nr diff --git a/yarn-project/aztec-nr/aztec/src/history/note_inclusion.nr b/noir-projects/aztec-nr/aztec/src/history/note_inclusion.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/history/note_inclusion.nr rename to noir-projects/aztec-nr/aztec/src/history/note_inclusion.nr diff --git a/yarn-project/aztec-nr/aztec/src/history/note_validity.nr b/noir-projects/aztec-nr/aztec/src/history/note_validity.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/history/note_validity.nr rename to noir-projects/aztec-nr/aztec/src/history/note_validity.nr diff --git a/yarn-project/aztec-nr/aztec/src/history/nullifier_inclusion.nr b/noir-projects/aztec-nr/aztec/src/history/nullifier_inclusion.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/history/nullifier_inclusion.nr rename to noir-projects/aztec-nr/aztec/src/history/nullifier_inclusion.nr diff --git a/yarn-project/aztec-nr/aztec/src/history/nullifier_non_inclusion.nr b/noir-projects/aztec-nr/aztec/src/history/nullifier_non_inclusion.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/history/nullifier_non_inclusion.nr rename to noir-projects/aztec-nr/aztec/src/history/nullifier_non_inclusion.nr diff --git a/yarn-project/aztec-nr/aztec/src/history/public_value_inclusion.nr b/noir-projects/aztec-nr/aztec/src/history/public_value_inclusion.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/history/public_value_inclusion.nr rename to noir-projects/aztec-nr/aztec/src/history/public_value_inclusion.nr diff --git a/yarn-project/aztec-nr/aztec/src/key.nr b/noir-projects/aztec-nr/aztec/src/key.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/key.nr rename to noir-projects/aztec-nr/aztec/src/key.nr diff --git a/yarn-project/aztec-nr/aztec/src/key/nullifier_key.nr b/noir-projects/aztec-nr/aztec/src/key/nullifier_key.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/key/nullifier_key.nr rename to noir-projects/aztec-nr/aztec/src/key/nullifier_key.nr diff --git a/yarn-project/aztec-nr/aztec/src/lib.nr b/noir-projects/aztec-nr/aztec/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/lib.nr rename to noir-projects/aztec-nr/aztec/src/lib.nr diff --git a/yarn-project/aztec-nr/aztec/src/log.nr b/noir-projects/aztec-nr/aztec/src/log.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/log.nr rename to noir-projects/aztec-nr/aztec/src/log.nr diff --git a/yarn-project/aztec-nr/aztec/src/messaging.nr b/noir-projects/aztec-nr/aztec/src/messaging.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/messaging.nr rename to noir-projects/aztec-nr/aztec/src/messaging.nr diff --git a/yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message.nr b/noir-projects/aztec-nr/aztec/src/messaging/l1_to_l2_message.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message.nr rename to noir-projects/aztec-nr/aztec/src/messaging/l1_to_l2_message.nr diff --git a/yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message_getter_data.nr b/noir-projects/aztec-nr/aztec/src/messaging/l1_to_l2_message_getter_data.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/messaging/l1_to_l2_message_getter_data.nr rename to noir-projects/aztec-nr/aztec/src/messaging/l1_to_l2_message_getter_data.nr diff --git a/yarn-project/aztec-nr/aztec/src/note.nr b/noir-projects/aztec-nr/aztec/src/note.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note.nr rename to noir-projects/aztec-nr/aztec/src/note.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/lifecycle.nr b/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/lifecycle.nr rename to noir-projects/aztec-nr/aztec/src/note/lifecycle.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/note_getter.nr b/noir-projects/aztec-nr/aztec/src/note/note_getter.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/note_getter.nr rename to noir-projects/aztec-nr/aztec/src/note/note_getter.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/note_getter_options.nr b/noir-projects/aztec-nr/aztec/src/note/note_getter_options.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/note_getter_options.nr rename to noir-projects/aztec-nr/aztec/src/note/note_getter_options.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/note_header.nr b/noir-projects/aztec-nr/aztec/src/note/note_header.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/note_header.nr rename to noir-projects/aztec-nr/aztec/src/note/note_header.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/note_interface.nr b/noir-projects/aztec-nr/aztec/src/note/note_interface.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/note_interface.nr rename to noir-projects/aztec-nr/aztec/src/note/note_interface.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/note_type_id.nr b/noir-projects/aztec-nr/aztec/src/note/note_type_id.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/note_type_id.nr rename to noir-projects/aztec-nr/aztec/src/note/note_type_id.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/note_viewer_options.nr b/noir-projects/aztec-nr/aztec/src/note/note_viewer_options.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/note_viewer_options.nr rename to noir-projects/aztec-nr/aztec/src/note/note_viewer_options.nr diff --git a/yarn-project/aztec-nr/aztec/src/note/utils.nr b/noir-projects/aztec-nr/aztec/src/note/utils.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/note/utils.nr rename to noir-projects/aztec-nr/aztec/src/note/utils.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle.nr b/noir-projects/aztec-nr/aztec/src/oracle.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle.nr rename to noir-projects/aztec-nr/aztec/src/oracle.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/arguments.nr b/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/arguments.nr rename to noir-projects/aztec-nr/aztec/src/oracle/arguments.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr b/noir-projects/aztec-nr/aztec/src/oracle/call_private_function.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr rename to noir-projects/aztec-nr/aztec/src/oracle/call_private_function.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/context.nr b/noir-projects/aztec-nr/aztec/src/oracle/context.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/context.nr rename to noir-projects/aztec-nr/aztec/src/oracle/context.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/create_commitment.nr b/noir-projects/aztec-nr/aztec/src/oracle/create_commitment.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/create_commitment.nr rename to noir-projects/aztec-nr/aztec/src/oracle/create_commitment.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/debug_log.nr b/noir-projects/aztec-nr/aztec/src/oracle/debug_log.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/debug_log.nr rename to noir-projects/aztec-nr/aztec/src/oracle/debug_log.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr b/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr rename to noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr rename to noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/get_membership_witness.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_membership_witness.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/get_membership_witness.nr rename to noir-projects/aztec-nr/aztec/src/oracle/get_membership_witness.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/get_nullifier_membership_witness.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_nullifier_membership_witness.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/get_nullifier_membership_witness.nr rename to noir-projects/aztec-nr/aztec/src/oracle/get_nullifier_membership_witness.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/get_public_data_witness.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_public_data_witness.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/get_public_data_witness.nr rename to noir-projects/aztec-nr/aztec/src/oracle/get_public_data_witness.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/get_public_key.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_public_key.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/get_public_key.nr rename to noir-projects/aztec-nr/aztec/src/oracle/get_public_key.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/get_sibling_path.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_sibling_path.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/get_sibling_path.nr rename to noir-projects/aztec-nr/aztec/src/oracle/get_sibling_path.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/header.nr b/noir-projects/aztec-nr/aztec/src/oracle/header.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/header.nr rename to noir-projects/aztec-nr/aztec/src/oracle/header.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/logs.nr b/noir-projects/aztec-nr/aztec/src/oracle/logs.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/logs.nr rename to noir-projects/aztec-nr/aztec/src/oracle/logs.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/notes.nr b/noir-projects/aztec-nr/aztec/src/oracle/notes.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/notes.nr rename to noir-projects/aztec-nr/aztec/src/oracle/notes.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/nullifier_key.nr b/noir-projects/aztec-nr/aztec/src/oracle/nullifier_key.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/nullifier_key.nr rename to noir-projects/aztec-nr/aztec/src/oracle/nullifier_key.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/public_call.nr b/noir-projects/aztec-nr/aztec/src/oracle/public_call.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/public_call.nr rename to noir-projects/aztec-nr/aztec/src/oracle/public_call.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/rand.nr b/noir-projects/aztec-nr/aztec/src/oracle/rand.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/rand.nr rename to noir-projects/aztec-nr/aztec/src/oracle/rand.nr diff --git a/yarn-project/aztec-nr/aztec/src/oracle/storage.nr b/noir-projects/aztec-nr/aztec/src/oracle/storage.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/oracle/storage.nr rename to noir-projects/aztec-nr/aztec/src/oracle/storage.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars.nr b/noir-projects/aztec-nr/aztec/src/state_vars.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars.nr rename to noir-projects/aztec-nr/aztec/src/state_vars.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars/immutable_singleton.nr b/noir-projects/aztec-nr/aztec/src/state_vars/immutable_singleton.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars/immutable_singleton.nr rename to noir-projects/aztec-nr/aztec/src/state_vars/immutable_singleton.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars/map.nr b/noir-projects/aztec-nr/aztec/src/state_vars/map.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars/map.nr rename to noir-projects/aztec-nr/aztec/src/state_vars/map.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr b/noir-projects/aztec-nr/aztec/src/state_vars/public_state.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr rename to noir-projects/aztec-nr/aztec/src/state_vars/public_state.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars/set.nr b/noir-projects/aztec-nr/aztec/src/state_vars/set.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars/set.nr rename to noir-projects/aztec-nr/aztec/src/state_vars/set.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars/singleton.nr b/noir-projects/aztec-nr/aztec/src/state_vars/singleton.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars/singleton.nr rename to noir-projects/aztec-nr/aztec/src/state_vars/singleton.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars/stable_public_state.nr b/noir-projects/aztec-nr/aztec/src/state_vars/stable_public_state.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars/stable_public_state.nr rename to noir-projects/aztec-nr/aztec/src/state_vars/stable_public_state.nr diff --git a/yarn-project/aztec-nr/aztec/src/state_vars/storage.nr b/noir-projects/aztec-nr/aztec/src/state_vars/storage.nr similarity index 100% rename from yarn-project/aztec-nr/aztec/src/state_vars/storage.nr rename to noir-projects/aztec-nr/aztec/src/state_vars/storage.nr diff --git a/yarn-project/aztec-nr/compressed-string/Nargo.toml b/noir-projects/aztec-nr/compressed-string/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/compressed-string/Nargo.toml rename to noir-projects/aztec-nr/compressed-string/Nargo.toml diff --git a/yarn-project/aztec-nr/compressed-string/src/compressed_string.nr b/noir-projects/aztec-nr/compressed-string/src/compressed_string.nr similarity index 100% rename from yarn-project/aztec-nr/compressed-string/src/compressed_string.nr rename to noir-projects/aztec-nr/compressed-string/src/compressed_string.nr diff --git a/yarn-project/aztec-nr/compressed-string/src/lib.nr b/noir-projects/aztec-nr/compressed-string/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/compressed-string/src/lib.nr rename to noir-projects/aztec-nr/compressed-string/src/lib.nr diff --git a/yarn-project/aztec-nr/easy-private-state/Nargo.toml b/noir-projects/aztec-nr/easy-private-state/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/easy-private-state/Nargo.toml rename to noir-projects/aztec-nr/easy-private-state/Nargo.toml diff --git a/yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr b/noir-projects/aztec-nr/easy-private-state/src/easy_private_state.nr similarity index 100% rename from yarn-project/aztec-nr/easy-private-state/src/easy_private_state.nr rename to noir-projects/aztec-nr/easy-private-state/src/easy_private_state.nr diff --git a/yarn-project/aztec-nr/easy-private-state/src/lib.nr b/noir-projects/aztec-nr/easy-private-state/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/easy-private-state/src/lib.nr rename to noir-projects/aztec-nr/easy-private-state/src/lib.nr diff --git a/yarn-project/aztec-nr/field-note/Nargo.toml b/noir-projects/aztec-nr/field-note/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/field-note/Nargo.toml rename to noir-projects/aztec-nr/field-note/Nargo.toml diff --git a/yarn-project/aztec-nr/field-note/src/field_note.nr b/noir-projects/aztec-nr/field-note/src/field_note.nr similarity index 100% rename from yarn-project/aztec-nr/field-note/src/field_note.nr rename to noir-projects/aztec-nr/field-note/src/field_note.nr diff --git a/yarn-project/aztec-nr/field-note/src/lib.nr b/noir-projects/aztec-nr/field-note/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/field-note/src/lib.nr rename to noir-projects/aztec-nr/field-note/src/lib.nr diff --git a/yarn-project/aztec-nr/safe-math/Nargo.toml b/noir-projects/aztec-nr/safe-math/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/safe-math/Nargo.toml rename to noir-projects/aztec-nr/safe-math/Nargo.toml diff --git a/yarn-project/aztec-nr/safe-math/src/lib.nr b/noir-projects/aztec-nr/safe-math/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/safe-math/src/lib.nr rename to noir-projects/aztec-nr/safe-math/src/lib.nr diff --git a/yarn-project/aztec-nr/safe-math/src/safe_u120.nr b/noir-projects/aztec-nr/safe-math/src/safe_u120.nr similarity index 100% rename from yarn-project/aztec-nr/safe-math/src/safe_u120.nr rename to noir-projects/aztec-nr/safe-math/src/safe_u120.nr diff --git a/yarn-project/aztec-nr/slow-updates-tree/Nargo.toml b/noir-projects/aztec-nr/slow-updates-tree/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/slow-updates-tree/Nargo.toml rename to noir-projects/aztec-nr/slow-updates-tree/Nargo.toml diff --git a/yarn-project/aztec-nr/slow-updates-tree/src/lib.nr b/noir-projects/aztec-nr/slow-updates-tree/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/slow-updates-tree/src/lib.nr rename to noir-projects/aztec-nr/slow-updates-tree/src/lib.nr diff --git a/yarn-project/aztec-nr/slow-updates-tree/src/slow_map.nr b/noir-projects/aztec-nr/slow-updates-tree/src/slow_map.nr similarity index 100% rename from yarn-project/aztec-nr/slow-updates-tree/src/slow_map.nr rename to noir-projects/aztec-nr/slow-updates-tree/src/slow_map.nr diff --git a/yarn-project/aztec-nr/value-note/Nargo.toml b/noir-projects/aztec-nr/value-note/Nargo.toml similarity index 100% rename from yarn-project/aztec-nr/value-note/Nargo.toml rename to noir-projects/aztec-nr/value-note/Nargo.toml diff --git a/yarn-project/aztec-nr/value-note/src/balance_utils.nr b/noir-projects/aztec-nr/value-note/src/balance_utils.nr similarity index 100% rename from yarn-project/aztec-nr/value-note/src/balance_utils.nr rename to noir-projects/aztec-nr/value-note/src/balance_utils.nr diff --git a/yarn-project/aztec-nr/value-note/src/filter.nr b/noir-projects/aztec-nr/value-note/src/filter.nr similarity index 100% rename from yarn-project/aztec-nr/value-note/src/filter.nr rename to noir-projects/aztec-nr/value-note/src/filter.nr diff --git a/yarn-project/aztec-nr/value-note/src/lib.nr b/noir-projects/aztec-nr/value-note/src/lib.nr similarity index 100% rename from yarn-project/aztec-nr/value-note/src/lib.nr rename to noir-projects/aztec-nr/value-note/src/lib.nr diff --git a/yarn-project/aztec-nr/value-note/src/utils.nr b/noir-projects/aztec-nr/value-note/src/utils.nr similarity index 100% rename from yarn-project/aztec-nr/value-note/src/utils.nr rename to noir-projects/aztec-nr/value-note/src/utils.nr diff --git a/yarn-project/aztec-nr/value-note/src/value_note.nr b/noir-projects/aztec-nr/value-note/src/value_note.nr similarity index 100% rename from yarn-project/aztec-nr/value-note/src/value_note.nr rename to noir-projects/aztec-nr/value-note/src/value_note.nr diff --git a/noir-projects/bootstrap.sh b/noir-projects/bootstrap.sh new file mode 100755 index 00000000000..20d1da50304 --- /dev/null +++ b/noir-projects/bootstrap.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -eu + +cd "$(dirname "$0")" + +PROJECTS=( + noir-contracts + noir-protocol-circuits +) + +for PROJECT in "${PROJECTS[@]}"; do + (cd "./$PROJECT" && ./bootstrap.sh "$@") +done diff --git a/yarn-project/noir-contracts/.gitignore b/noir-projects/noir-contracts/.gitignore similarity index 100% rename from yarn-project/noir-contracts/.gitignore rename to noir-projects/noir-contracts/.gitignore diff --git a/yarn-project/noir-contracts/Nargo.toml b/noir-projects/noir-contracts/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/Nargo.toml rename to noir-projects/noir-contracts/Nargo.toml diff --git a/yarn-project/noir-contracts/README.md b/noir-projects/noir-contracts/README.md similarity index 97% rename from yarn-project/noir-contracts/README.md rename to noir-projects/noir-contracts/README.md index 67caf84eb38..a7c3aac97be 100644 --- a/yarn-project/noir-contracts/README.md +++ b/noir-projects/noir-contracts/README.md @@ -31,7 +31,7 @@ It has prebuilt binaries and is super easy to install using `noirup` noirup -v aztec ``` -> Pinning Aztec flavoured noir releases +> Pinning Aztec flavoured noir releases > Aztec noir is released with semver alongside noir. If you would like to pin to a specific version you can run: > > ```bash @@ -97,7 +97,7 @@ It has prebuilt binaries and is super easy to install using `noirup` ### Building the contracts -- In the aztec-packages repository, go to the directory yarn-project/noir-contracts +- In the aztec-packages repository, go to the directory noir-contracts - Use the `noir:build:all` script to compile the contracts you want and prepare the ABI for consumption diff --git a/noir-projects/noir-contracts/bootstrap.sh b/noir-projects/noir-contracts/bootstrap.sh new file mode 100755 index 00000000000..f05aac67315 --- /dev/null +++ b/noir-projects/noir-contracts/bootstrap.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -eu + +cd "$(dirname "$0")" + +CMD=${1:-} + +if [ -n "$CMD" ]; then + if [ "$CMD" = "clean" ]; then + git clean -fdx + exit 0 + else + echo "Unknown command: $CMD" + exit 1 + fi +fi + +# Build the contracts. `yarn build` handles cleaning as well +yarn build diff --git a/yarn-project/noir-contracts/contracts/avm_test_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/avm_test_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/avm_test_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/avm_test_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/avm_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/avm_test_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/benchmarking_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/benchmarking_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/benchmarking_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/benchmarking_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/benchmarking_contract/src/main.nr b/noir-projects/noir-contracts/contracts/benchmarking_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/benchmarking_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/benchmarking_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/card_game_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/card_game_contract/Nargo.toml similarity index 74% rename from yarn-project/noir-contracts/contracts/card_game_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/card_game_contract/Nargo.toml index c425ae39426..05469dce29c 100644 --- a/yarn-project/noir-contracts/contracts/card_game_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/card_game_contract/Nargo.toml @@ -6,5 +6,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -value_note = { path = "../../../aztec-nr/value-note"} - +value_note = { path = "../../../aztec-nr/value-note" } diff --git a/yarn-project/noir-contracts/contracts/card_game_contract/src/cards.nr b/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/card_game_contract/src/cards.nr rename to noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr diff --git a/yarn-project/noir-contracts/contracts/card_game_contract/src/game.nr b/noir-projects/noir-contracts/contracts/card_game_contract/src/game.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/card_game_contract/src/game.nr rename to noir-projects/noir-contracts/contracts/card_game_contract/src/game.nr diff --git a/yarn-project/noir-contracts/contracts/card_game_contract/src/main.nr b/noir-projects/noir-contracts/contracts/card_game_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/card_game_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/card_game_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/child_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/child_contract/Nargo.toml similarity index 99% rename from yarn-project/noir-contracts/contracts/child_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/child_contract/Nargo.toml index c3cd8225777..38047ccb17a 100644 --- a/yarn-project/noir-contracts/contracts/child_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/child_contract/Nargo.toml @@ -6,4 +6,3 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } - diff --git a/yarn-project/noir-contracts/contracts/child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/child_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/child_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/child_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/contract_class_registerer_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_class_registerer_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/contract_class_registerer_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events.nr b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events.nr rename to noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events.nr diff --git a/yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events/class_registered.nr b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events/class_registered.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events/class_registered.nr rename to noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events/class_registered.nr diff --git a/yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events/private_function_broadcasted.nr b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events/private_function_broadcasted.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events/private_function_broadcasted.nr rename to noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events/private_function_broadcasted.nr diff --git a/yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events/unconstrained_function_broadcasted.nr b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events/unconstrained_function_broadcasted.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/events/unconstrained_function_broadcasted.nr rename to noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/events/unconstrained_function_broadcasted.nr diff --git a/yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/src/events.nr b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/events.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/src/events.nr rename to noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/events.nr diff --git a/yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/src/events/instance_deployed.nr b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/events/instance_deployed.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/src/events/instance_deployed.nr rename to noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/events/instance_deployed.nr diff --git a/yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/counter_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/counter_contract/Nargo.toml similarity index 97% rename from yarn-project/noir-contracts/contracts/counter_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/counter_contract/Nargo.toml index abaa2f0011b..c9e0e9178f7 100644 --- a/yarn-project/noir-contracts/contracts/counter_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/counter_contract/Nargo.toml @@ -7,4 +7,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } value_note = { path = "../../../aztec-nr/value-note" } -easy_private_state = { path = "../../../aztec-nr/easy-private-state"} +easy_private_state = { path = "../../../aztec-nr/easy-private-state" } diff --git a/yarn-project/noir-contracts/contracts/counter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/counter_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/counter_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/docs_example_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/docs_example_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/docs_example_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/docs_example_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/docs_example_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/docs_example_contract/src/options.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/options.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/docs_example_contract/src/options.nr rename to noir-projects/noir-contracts/contracts/docs_example_contract/src/options.nr diff --git a/yarn-project/noir-contracts/contracts/docs_example_contract/src/types.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/types.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/docs_example_contract/src/types.nr rename to noir-projects/noir-contracts/contracts/docs_example_contract/src/types.nr diff --git a/yarn-project/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr rename to noir-projects/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr diff --git a/yarn-project/noir-contracts/contracts/docs_example_contract/src/types/leader.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/types/leader.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/docs_example_contract/src/types/leader.nr rename to noir-projects/noir-contracts/contracts/docs_example_contract/src/types/leader.nr diff --git a/yarn-project/noir-contracts/contracts/easy_private_token_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/easy_private_token_contract/Nargo.toml similarity index 79% rename from yarn-project/noir-contracts/contracts/easy_private_token_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/easy_private_token_contract/Nargo.toml index cac909c9303..b85e05944e1 100644 --- a/yarn-project/noir-contracts/contracts/easy_private_token_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/easy_private_token_contract/Nargo.toml @@ -6,5 +6,5 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -value_note = { path = "../../../aztec-nr/value-note"} -easy_private_state = { path = "../../../aztec-nr/easy-private-state"} +value_note = { path = "../../../aztec-nr/value-note" } +easy_private_state = { path = "../../../aztec-nr/easy-private-state" } diff --git a/yarn-project/noir-contracts/contracts/easy_private_token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/easy_private_token_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/easy_private_voting_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/easy_private_voting_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/easy_private_voting_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/easy_private_voting_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/ecdsa_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/ecdsa_account_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/ecdsa_account_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr rename to noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr diff --git a/yarn-project/noir-contracts/contracts/ecdsa_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/ecdsa_account_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/escrow_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/escrow_contract/Nargo.toml similarity index 72% rename from yarn-project/noir-contracts/contracts/escrow_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/escrow_contract/Nargo.toml index eb586ad28b0..5c5ed7ccdce 100644 --- a/yarn-project/noir-contracts/contracts/escrow_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/escrow_contract/Nargo.toml @@ -6,4 +6,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -address_note = { path = "../../../aztec-nr/address-note"} +address_note = { path = "../../../aztec-nr/address-note" } diff --git a/yarn-project/noir-contracts/contracts/escrow_contract/src/main.nr b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/escrow_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/import_test_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/import_test_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/import_test_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/import_test_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/import_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/import_test_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/import_test_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/import_test_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/import_test_contract/src/test_contract_interface.nr b/noir-projects/noir-contracts/contracts/import_test_contract/src/test_contract_interface.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/import_test_contract/src/test_contract_interface.nr rename to noir-projects/noir-contracts/contracts/import_test_contract/src/test_contract_interface.nr diff --git a/yarn-project/noir-contracts/contracts/inclusion_proofs_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/inclusion_proofs_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/inclusion_proofs_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/lending_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/lending_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/lending_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/lending_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/lending_contract/src/asset.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/asset.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/lending_contract/src/asset.nr rename to noir-projects/noir-contracts/contracts/lending_contract/src/asset.nr diff --git a/yarn-project/noir-contracts/contracts/lending_contract/src/helpers.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/helpers.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/lending_contract/src/helpers.nr rename to noir-projects/noir-contracts/contracts/lending_contract/src/helpers.nr diff --git a/yarn-project/noir-contracts/contracts/lending_contract/src/interest_math.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/interest_math.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/lending_contract/src/interest_math.nr rename to noir-projects/noir-contracts/contracts/lending_contract/src/interest_math.nr diff --git a/yarn-project/noir-contracts/contracts/lending_contract/src/interfaces.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/interfaces.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/lending_contract/src/interfaces.nr rename to noir-projects/noir-contracts/contracts/lending_contract/src/interfaces.nr diff --git a/yarn-project/noir-contracts/contracts/lending_contract/src/main.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/lending_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/lending_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/parent_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/parent_contract/Nargo.toml similarity index 99% rename from yarn-project/noir-contracts/contracts/parent_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/parent_contract/Nargo.toml index 52fa9b5f455..09fbc5e9874 100644 --- a/yarn-project/noir-contracts/contracts/parent_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/parent_contract/Nargo.toml @@ -6,4 +6,3 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } - diff --git a/yarn-project/noir-contracts/contracts/parent_contract/src/main.nr b/noir-projects/noir-contracts/contracts/parent_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/parent_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/parent_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/pending_commitments_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/pending_commitments_contract/Nargo.toml similarity index 75% rename from yarn-project/noir-contracts/contracts/pending_commitments_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/pending_commitments_contract/Nargo.toml index 9b6cde29243..87ecd53b2cd 100644 --- a/yarn-project/noir-contracts/contracts/pending_commitments_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/pending_commitments_contract/Nargo.toml @@ -6,5 +6,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -value_note = { path = "../../../aztec-nr/value-note"} - +value_note = { path = "../../../aztec-nr/value-note" } diff --git a/yarn-project/noir-contracts/contracts/pending_commitments_contract/src/main.nr b/noir-projects/noir-contracts/contracts/pending_commitments_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/pending_commitments_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/pending_commitments_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/price_feed_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/price_feed_contract/Nargo.toml similarity index 99% rename from yarn-project/noir-contracts/contracts/price_feed_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/price_feed_contract/Nargo.toml index 8d8c331fc1c..fc21781aedb 100644 --- a/yarn-project/noir-contracts/contracts/price_feed_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/price_feed_contract/Nargo.toml @@ -6,4 +6,3 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } - diff --git a/yarn-project/noir-contracts/contracts/price_feed_contract/src/asset.nr b/noir-projects/noir-contracts/contracts/price_feed_contract/src/asset.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/price_feed_contract/src/asset.nr rename to noir-projects/noir-contracts/contracts/price_feed_contract/src/asset.nr diff --git a/yarn-project/noir-contracts/contracts/price_feed_contract/src/main.nr b/noir-projects/noir-contracts/contracts/price_feed_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/price_feed_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/price_feed_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/reader_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/reader_contract/Nargo.toml similarity index 69% rename from yarn-project/noir-contracts/contracts/reader_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/reader_contract/Nargo.toml index e6ed3649012..7d2ebe7ccfd 100644 --- a/yarn-project/noir-contracts/contracts/reader_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/reader_contract/Nargo.toml @@ -6,4 +6,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -compressed_string = {path = "../../../aztec-nr/compressed-string"} +compressed_string = { path = "../../../aztec-nr/compressed-string" } diff --git a/yarn-project/noir-contracts/contracts/reader_contract/src/main.nr b/noir-projects/noir-contracts/contracts/reader_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/reader_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/reader_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/schnorr_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml similarity index 99% rename from yarn-project/noir-contracts/contracts/schnorr_account_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml index d1830a40e99..f7aa9a57a7d 100644 --- a/yarn-project/noir-contracts/contracts/schnorr_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml @@ -7,4 +7,3 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } - diff --git a/yarn-project/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/schnorr_account_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr rename to noir-projects/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr diff --git a/yarn-project/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml similarity index 78% rename from yarn-project/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml index f8ec19a65a3..0eb10f839e5 100644 --- a/yarn-project/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml @@ -6,4 +6,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -authwit = { path = "../../../aztec-nr/authwit" } \ No newline at end of file +authwit = { path = "../../../aztec-nr/authwit" } diff --git a/yarn-project/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr rename to noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr diff --git a/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr rename to noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr diff --git a/yarn-project/noir-contracts/contracts/slow_tree_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/slow_tree_contract/Nargo.toml similarity index 79% rename from yarn-project/noir-contracts/contracts/slow_tree_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/slow_tree_contract/Nargo.toml index 6d8ba138a34..edf2d7b4717 100644 --- a/yarn-project/noir-contracts/contracts/slow_tree_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/slow_tree_contract/Nargo.toml @@ -6,5 +6,5 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -value_note = { path = "../../../aztec-nr/value-note"} -slow_updates_tree = { path = "../../../aztec-nr/slow-updates-tree"} +value_note = { path = "../../../aztec-nr/value-note" } +slow_updates_tree = { path = "../../../aztec-nr/slow-updates-tree" } diff --git a/yarn-project/noir-contracts/contracts/slow_tree_contract/src/capsule.nr b/noir-projects/noir-contracts/contracts/slow_tree_contract/src/capsule.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/slow_tree_contract/src/capsule.nr rename to noir-projects/noir-contracts/contracts/slow_tree_contract/src/capsule.nr diff --git a/yarn-project/noir-contracts/contracts/slow_tree_contract/src/main.nr b/noir-projects/noir-contracts/contracts/slow_tree_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/slow_tree_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/slow_tree_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/slow_tree_contract/src/types.nr b/noir-projects/noir-contracts/contracts/slow_tree_contract/src/types.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/slow_tree_contract/src/types.nr rename to noir-projects/noir-contracts/contracts/slow_tree_contract/src/types.nr diff --git a/yarn-project/noir-contracts/contracts/stateful_test_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/stateful_test_contract/Nargo.toml similarity index 75% rename from yarn-project/noir-contracts/contracts/stateful_test_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/stateful_test_contract/Nargo.toml index 008324701b0..e22e00a6bd6 100644 --- a/yarn-project/noir-contracts/contracts/stateful_test_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/stateful_test_contract/Nargo.toml @@ -6,4 +6,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } -value_note = { path = "../../../aztec-nr/value-note"} +value_note = { path = "../../../aztec-nr/value-note" } diff --git a/yarn-project/noir-contracts/contracts/stateful_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/stateful_test_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/test_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/test_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/test_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/test_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/test_contract/src/interface.nr b/noir-projects/noir-contracts/contracts/test_contract/src/interface.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/test_contract/src/interface.nr rename to noir-projects/noir-contracts/contracts/test_contract/src/interface.nr diff --git a/yarn-project/noir-contracts/contracts/test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/test_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/test_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/token_blacklist_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/src/interfaces.nr diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types.nr rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types.nr diff --git a/yarn-project/noir-contracts/contracts/token_contract/src/types/balances_map.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_contract/src/types/balances_map.nr rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/roles.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/roles.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/roles.nr rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/roles.nr diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr rename to noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr diff --git a/yarn-project/noir-contracts/contracts/token_bridge_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/token_bridge_contract/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/token_bridge_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/token_bridge_contract/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_bridge_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/token_bridge_contract/src/token_interface.nr b/noir-projects/noir-contracts/contracts/token_bridge_contract/src/token_interface.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_bridge_contract/src/token_interface.nr rename to noir-projects/noir-contracts/contracts/token_bridge_contract/src/token_interface.nr diff --git a/yarn-project/noir-contracts/contracts/token_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/token_contract/Nargo.toml similarity index 79% rename from yarn-project/noir-contracts/contracts/token_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/token_contract/Nargo.toml index 322c8c882ca..f8409f858b9 100644 --- a/yarn-project/noir-contracts/contracts/token_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/token_contract/Nargo.toml @@ -7,5 +7,5 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } safe_math = { path = "../../../aztec-nr/safe-math" } -compressed_string = {path = "../../../aztec-nr/compressed-string"} +compressed_string = { path = "../../../aztec-nr/compressed-string" } authwit = { path = "../../../aztec-nr/authwit" } diff --git a/yarn-project/noir-contracts/contracts/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/token_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/token_contract/src/types.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_contract/src/types.nr rename to noir-projects/noir-contracts/contracts/token_contract/src/types.nr diff --git a/yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr rename to noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr diff --git a/yarn-project/noir-contracts/contracts/token_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_contract/src/types/token_note.nr rename to noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr diff --git a/yarn-project/noir-contracts/contracts/token_contract/src/types/transparent_note.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/transparent_note.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_contract/src/types/transparent_note.nr rename to noir-projects/noir-contracts/contracts/token_contract/src/types/transparent_note.nr diff --git a/yarn-project/noir-contracts/contracts/token_portal_content_hash_lib/Nargo.toml b/noir-projects/noir-contracts/contracts/token_portal_content_hash_lib/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/contracts/token_portal_content_hash_lib/Nargo.toml rename to noir-projects/noir-contracts/contracts/token_portal_content_hash_lib/Nargo.toml diff --git a/yarn-project/noir-contracts/contracts/token_portal_content_hash_lib/src/lib.nr b/noir-projects/noir-contracts/contracts/token_portal_content_hash_lib/src/lib.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/token_portal_content_hash_lib/src/lib.nr rename to noir-projects/noir-contracts/contracts/token_portal_content_hash_lib/src/lib.nr diff --git a/yarn-project/noir-contracts/contracts/uniswap_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/uniswap_contract/Nargo.toml similarity index 99% rename from yarn-project/noir-contracts/contracts/uniswap_contract/Nargo.toml rename to noir-projects/noir-contracts/contracts/uniswap_contract/Nargo.toml index a35fa2c903d..99fad6142e4 100644 --- a/yarn-project/noir-contracts/contracts/uniswap_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/uniswap_contract/Nargo.toml @@ -7,4 +7,3 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } - diff --git a/yarn-project/noir-contracts/contracts/uniswap_contract/src/interfaces.nr b/noir-projects/noir-contracts/contracts/uniswap_contract/src/interfaces.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/uniswap_contract/src/interfaces.nr rename to noir-projects/noir-contracts/contracts/uniswap_contract/src/interfaces.nr diff --git a/yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr b/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/uniswap_contract/src/main.nr rename to noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr diff --git a/yarn-project/noir-contracts/contracts/uniswap_contract/src/util.nr b/noir-projects/noir-contracts/contracts/uniswap_contract/src/util.nr similarity index 100% rename from yarn-project/noir-contracts/contracts/uniswap_contract/src/util.nr rename to noir-projects/noir-contracts/contracts/uniswap_contract/src/util.nr diff --git a/noir-projects/noir-contracts/package.json b/noir-projects/noir-contracts/package.json new file mode 100644 index 00000000000..c62f077623b --- /dev/null +++ b/noir-projects/noir-contracts/package.json @@ -0,0 +1,35 @@ +{ + "name": "@aztec/noir-contracts", + "version": "0.1.0", + "type": "module", + "exports": { + "./target/*": "./target/*.json" + }, + "scripts": { + "build": "yarn clean && yarn build:contracts", + "clean": "rm -rf .tsbuildinfo ./target", + "formatting": "run -T prettier --check ./src && run -T eslint ./src", + "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", + "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests", + "build:contracts": "./scripts/compile.sh && ./scripts/transpile.sh" + }, + "inherits": [ + "../package.common.json", + "./package.local.json" + ], + "jest": { + "preset": "ts-jest/presets/default-esm", + "moduleNameMapper": { + "^(\\.{1,2}/.*)\\.[cm]?js$": "$1" + }, + "testRegex": "./src/.*\\.test\\.(js|mjs|ts)$", + "rootDir": "./src" + }, + "files": [ + "contracts" + ], + "types": "./dest/types/index.d.ts", + "engines": { + "node": ">=18" + } +} \ No newline at end of file diff --git a/yarn-project/noir-contracts/scripts/compile.sh b/noir-projects/noir-contracts/scripts/compile.sh similarity index 60% rename from yarn-project/noir-contracts/scripts/compile.sh rename to noir-projects/noir-contracts/scripts/compile.sh index 214e441409b..3125415bb74 100755 --- a/yarn-project/noir-contracts/scripts/compile.sh +++ b/noir-projects/noir-contracts/scripts/compile.sh @@ -1,5 +1,4 @@ #!/usr/bin/env bash -# TODO: Move this compilation phase out of yarn-project to own job, and ingest abis. set -euo pipefail echo "Compiling contracts..." diff --git a/noir-projects/noir-contracts/scripts/transpile.sh b/noir-projects/noir-contracts/scripts/transpile.sh new file mode 100755 index 00000000000..f10bb4524da --- /dev/null +++ b/noir-projects/noir-contracts/scripts/transpile.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Transpiling contracts..." +for contract_json in target/avm_test_*.json; do + echo Transpiling $contract_json... + ../../avm-transpiler/target/release/avm-transpiler $contract_json $contract_json +done diff --git a/noir-projects/noir-protocol-circuits/.gitignore b/noir-projects/noir-protocol-circuits/.gitignore new file mode 100644 index 00000000000..3f2fde943db --- /dev/null +++ b/noir-projects/noir-protocol-circuits/.gitignore @@ -0,0 +1,3 @@ +Prover.toml +Verifier.toml +src/target diff --git a/noir-projects/noir-protocol-circuits/bootstrap.sh b/noir-projects/noir-protocol-circuits/bootstrap.sh new file mode 100755 index 00000000000..c8b53c6578d --- /dev/null +++ b/noir-projects/noir-protocol-circuits/bootstrap.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -eu + +cd "$(dirname "$0")" + +CMD=${1:-} + +if [ -n "$CMD" ]; then + if [ "$CMD" = "clean" ]; then + git clean -fdx + exit 0 + else + echo "Unknown command: $CMD" + exit 1 + fi +fi + +# Build the circuits. `yarn build` handles cleaning as well +yarn build diff --git a/noir-projects/noir-protocol-circuits/package.json b/noir-projects/noir-protocol-circuits/package.json new file mode 100644 index 00000000000..e88288f6308 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/package.json @@ -0,0 +1,19 @@ +{ + "name": "@aztec/noir-protocol-circuits", + "version": "0.1.0", + "type": "module", + "exports": { + ".": "./dest/index.js", + "./types": "./dest/types/index.js" + }, + "scripts": { + "build": "yarn clean && yarn noir:build", + "clean": "rm -rf ./dest src/target", + "noir:build": "cd src && ../../../noir/target/release/nargo compile --silence-warnings", + "test": "cd src && ../../../../noir/target/release/nargo test" + }, + "files": [ + "dest", + "src" + ] +} \ No newline at end of file diff --git a/yarn-project/noir-protocol-circuits/src/Nargo.toml b/noir-projects/noir-protocol-circuits/src/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/add-is-zero.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/add-is-zero.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/add-is-zero.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/add-is-zero.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/array_len.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/array_len.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/array_len.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/array_len.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/compile-lib.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/compile-lib.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/compile-lib.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/compile-lib.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-bug-catching.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-bug-catching.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-bug-catching.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-bug-catching.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-document-to_le_bits.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-document-to_le_bits.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-document-to_le_bits.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-document-to_le_bits.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-integers.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-integers.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-integers.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-integers.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-maxim.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-maxim.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-maxim.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-maxim.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-return-pattern-match.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-return-pattern-match.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-return-pattern-match.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-return-pattern-match.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-santiago-automatic-deref.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-santiago-automatic-deref.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-santiago-automatic-deref.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-santiago-automatic-deref.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-slice-to-array.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-slice-to-array.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-slice-to-array.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-slice-to-array.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-test-ignore.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-test-ignore.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-test-ignore.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-test-ignore.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-turbo-fish.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-turbo-fish.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-turbo-fish.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-turbo-fish.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-type-alias.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-type-alias.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-type-alias.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/devex-type-alias.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/export.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/export.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/export.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/export.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/index-on-mutable-array-jake.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/index-on-mutable-array-jake.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/index-on-mutable-array-jake.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/index-on-mutable-array-jake.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/invalid-test-syntax-passing.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/invalid-test-syntax-passing.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/invalid-test-syntax-passing.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/invalid-test-syntax-passing.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/iterate-mutable-array.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/iterate-mutable-array.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/iterate-mutable-array.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/iterate-mutable-array.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/local-dep-does-not-exist b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/local-dep-does-not-exist similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/local-dep-does-not-exist rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/local-dep-does-not-exist diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/non-global-type-as-array-size.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/non-global-type-as-array-size.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/non-global-type-as-array-size.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/non-global-type-as-array-size.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/re-exports-not-working.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/re-exports-not-working.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/re-exports-not-working.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/re-exports-not-working.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/reexports.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/reexports.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/reexports.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/reexports.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/should-compile-different-namespace.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/should-compile-different-namespace.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/should-compile-different-namespace.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/should-compile-different-namespace.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/should-not-compile.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/should-not-compile.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/should-not-compile.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/should-not-compile.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/test-error-msg-format.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/test-error-msg-format.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/test-error-msg-format.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/test-error-msg-format.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/test-println.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/test-println.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/test-println.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/test-println.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/type-alias-shorthand.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/type-alias-shorthand.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/type-alias-shorthand.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/type-alias-shorthand.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/typechain-type-alias.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/typechain-type-alias.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/typechain-type-alias.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/typechain-type-alias.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/workspace.nr b/noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/workspace.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/bug-collecting-crate/workspace.nr rename to noir-projects/noir-protocol-circuits/src/crates/bug-collecting-crate/workspace.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-init-simulated/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-init-simulated/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-init-simulated/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-init-simulated/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-init-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-init-simulated/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-init-simulated/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-init-simulated/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-init/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-init/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-init/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-init/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-init/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-init/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-init/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-init/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner-simulated/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-inner/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-inner/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/common.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/common.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/common.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/common.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/lib.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/lib.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/lib.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/lib.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_init.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_init.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_init.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_init.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_inner.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_inner.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_inner.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_inner.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_tail.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_tail.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_tail.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_tail.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/private-kernel-tail/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic-simulated/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-app-logic/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-app-logic/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/common.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/common.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/common.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/common.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/hash.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/hash.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/hash.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/hash.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/lib.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/lib.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/lib.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/lib.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_app_logic.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_app_logic.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_app_logic.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_app_logic.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_setup.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_setup.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_setup.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/public_kernel_setup.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/utils.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/utils.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-lib/src/utils.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-lib/src/utils.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup-simulated/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/public-kernel-setup/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/public-kernel-setup/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/rollup-base-simulated/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/rollup-base-simulated/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-base-simulated/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-base-simulated/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-base/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/rollup-base/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-base/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/rollup-base/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-base/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-base/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-base/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-base/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis/constant_rollup_data.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis/constant_rollup_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis/constant_rollup_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis/constant_rollup_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis/previous_rollup_data.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis/previous_rollup_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/abis/previous_rollup_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/abis/previous_rollup_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/base.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/base.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/state_diff_hints.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/base/state_diff_hints.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/state_diff_hints.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/base/state_diff_hints.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/components.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/components.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/components.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/components.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/indexed_tree.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/indexed_tree.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/indexed_tree.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/indexed_tree.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/lib.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/lib.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/lib.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/lib.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/merge.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/merge.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/merge.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/merge.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/merge/merge_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/merge/merge_rollup_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/merge/merge_rollup_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/merge/merge_rollup_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/merkle_tree.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/merkle_tree.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/merkle_tree.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/merkle_tree.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/root.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/root.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/root.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/root.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_public_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_public_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_public_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/root/root_rollup_public_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merge_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merge_rollup_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merge_rollup_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merge_rollup_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merkle_tree_utils.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merkle_tree_utils.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merkle_tree_utils.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/merkle_tree_utils.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/previous_rollup_data.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/previous_rollup_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/previous_rollup_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/previous_rollup_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/root_rollup_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/tests/root_rollup_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-lib/src/tests/root_rollup_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-merge/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/rollup-merge/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-merge/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/rollup-merge/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-merge/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-merge/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-merge/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-merge/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-root/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/rollup-root/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-root/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/rollup-root/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-root/src/main.nr b/noir-projects/noir-protocol-circuits/src/crates/rollup-root/src/main.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/rollup-root/src/main.nr rename to noir-projects/noir-protocol-circuits/src/crates/rollup-root/src/main.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/Nargo.toml b/noir-projects/noir-protocol-circuits/src/crates/types/Nargo.toml similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/Nargo.toml rename to noir-projects/noir-protocol-circuits/src/crates/types/Nargo.toml diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/append_only_tree_snapshot.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/append_only_tree_snapshot.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/append_only_tree_snapshot.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/append_only_tree_snapshot.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_request.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/call_request.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_request.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/call_request.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/combined_accumulated_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/combined_accumulated_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/combined_accumulated_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/combined_accumulated_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/combined_constant_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/combined_constant_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/combined_constant_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/combined_constant_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/contract_leaf_preimage.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/contract_leaf_preimage.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/contract_leaf_preimage.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/contract_leaf_preimage.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_leaf_preimage.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/function_leaf_preimage.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_leaf_preimage.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/function_leaf_preimage.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/global_variables.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/kernel_circuit_public_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/kernel_circuit_public_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/kernel_circuit_public_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/kernel_circuit_public_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/kernel_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/kernel_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/kernel_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/kernel_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/membership_witness.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/membership_witness.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/membership_witness.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/membership_witness.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/new_contract_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/new_contract_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/new_contract_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/new_contract_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/nullifier_key_validation_request.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/nullifier_key_validation_request.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/nullifier_key_validation_request.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/nullifier_key_validation_request.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/nullifier_leaf_preimage.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/nullifier_leaf_preimage.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/nullifier_leaf_preimage.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/nullifier_leaf_preimage.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_call_stack_item.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_call_stack_item.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_call_stack_item.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_call_stack_item.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_kernel.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_kernel.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_kernel.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_kernel.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_kernel/private_call_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_kernel/private_call_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_kernel/private_call_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/private_kernel/private_call_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_call_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_call_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_call_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_call_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_call_stack_item.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_call_stack_item.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_call_stack_item.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_call_stack_item.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_data_read.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_data_read.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_data_read.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_data_read.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_data_update_request.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_data_update_request.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_data_update_request.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/public_data_update_request.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/address.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/address.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/constants.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/constants.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/contract_class.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/contract_class.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/contract_class.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/contract_class.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/grumpkin_point.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/grumpkin_point.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/grumpkin_point.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/grumpkin_point.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/grumpkin_private_key.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/grumpkin_private_key.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/grumpkin_private_key.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/grumpkin_private_key.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/hash.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/hash.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/header.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/header.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/header.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/header.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/interop_testing.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/interop_testing.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/interop_testing.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/interop_testing.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/lib.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/lib.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/lib.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/lib.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/mocked.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/mocked.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/mocked.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/mocked.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/partial_state_reference.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/partial_state_reference.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/partial_state_reference.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/partial_state_reference.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf_preimage.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf_preimage.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf_preimage.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/public_data_tree_leaf_preimage.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/state_reference.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/state_reference.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/state_reference.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/state_reference.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_functions.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_functions.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_functions.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_functions.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_tree.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_tree.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_tree.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contract_tree.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contracts.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contracts.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contracts.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/contracts.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/note_hash_tree.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/note_hash_tree.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/note_hash_tree.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/note_hash_tree.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/read_requests.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/read_requests.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/fixtures/read_requests.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/fixtures/read_requests.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/kernel_data_builder.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/kernel_data_builder.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/kernel_data_builder.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/kernel_data_builder.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/private_call_data_builder.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/private_call_data_builder.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/private_call_data_builder.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/private_call_data_builder.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/private_circuit_public_inputs_builder.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/private_circuit_public_inputs_builder.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/private_circuit_public_inputs_builder.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/private_circuit_public_inputs_builder.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/public_call_data_builder.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/public_call_data_builder.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/public_call_data_builder.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/public_call_data_builder.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/public_circuit_public_inputs_builder.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/public_circuit_public_inputs_builder.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/public_circuit_public_inputs_builder.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/public_circuit_public_inputs_builder.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/tests/testing_harness.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/tests/testing_harness.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/tests/testing_harness.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/tests/testing_harness.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/traits.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/traits.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/traits.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/traits.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/transaction.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/transaction.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/transaction.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/transaction.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/transaction/context.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/transaction/context.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/transaction/context.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/transaction/context.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/transaction/request.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/transaction/request.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/transaction/request.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/transaction/request.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/type_serialization.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/type_serialization.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/type_serialization.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/type_serialization.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/utils.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/utils.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/utils.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/utils.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/utils/arrays.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/utils/arrays.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/utils/arrays.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/utils/arrays.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/utils/field.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/utils/field.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/utils/field.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/utils/field.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/utils/reader.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/utils/reader.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/utils/reader.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/utils/reader.nr diff --git a/yarn-project/noir-protocol-circuits/src/crates/types/src/utils/uint256.nr b/noir-projects/noir-protocol-circuits/src/crates/types/src/utils/uint256.nr similarity index 100% rename from yarn-project/noir-protocol-circuits/src/crates/types/src/utils/uint256.nr rename to noir-projects/noir-protocol-circuits/src/crates/types/src/utils/uint256.nr diff --git a/noir/docs/docs/noir/modules_packages_crates/crates_and_packages.md b/noir/docs/docs/noir/modules_packages_crates/crates_and_packages.md index 760a463094c..95ee9f52ab2 100644 --- a/noir/docs/docs/noir/modules_packages_crates/crates_and_packages.md +++ b/noir/docs/docs/noir/modules_packages_crates/crates_and_packages.md @@ -24,7 +24,7 @@ _Library crates_ don't have a `main` function and they don't compile down to ACI #### Contracts -Contract crates are similar to binary crates in that they compile to ACIR which you can create proofs against. They are different in that they do not have a single `main` function, but are a collection of functions to be deployed to the [Aztec network](https://aztec.network). You can learn more about the technical details of Aztec in the [monorepo](https://github.com/AztecProtocol/aztec-packages) or contract [examples](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/contracts). +Contract crates are similar to binary crates in that they compile to ACIR which you can create proofs against. They are different in that they do not have a single `main` function, but are a collection of functions to be deployed to the [Aztec network](https://aztec.network). You can learn more about the technical details of Aztec in the [monorepo](https://github.com/AztecProtocol/aztec-packages) or contract [examples](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts). ### Crate Root diff --git a/noir/docs/docs/noir/modules_packages_crates/dependencies.md b/noir/docs/docs/noir/modules_packages_crates/dependencies.md index a37dc401b7d..04c1703d929 100644 --- a/noir/docs/docs/noir/modules_packages_crates/dependencies.md +++ b/noir/docs/docs/noir/modules_packages_crates/dependencies.md @@ -35,7 +35,7 @@ If the module is in a subdirectory, you can define a subdirectory in your git re # Nargo.toml [dependencies] -easy_private_token_contract = {tag ="v0.1.0-alpha62", git = "https://github.com/AztecProtocol/aztec-packages", directory = "yarn-project/noir-contracts/contracts/easy_private_token_contract"} +easy_private_token_contract = {tag ="v0.1.0-alpha62", git = "https://github.com/AztecProtocol/aztec-packages", directory = "noir-contracts/contracts/easy_private_token_contract"} ``` ## Specifying a local dependency diff --git a/yarn-project/.dockerignore b/yarn-project/.dockerignore index 24611d873ea..a3d11429d55 100644 --- a/yarn-project/.dockerignore +++ b/yarn-project/.dockerignore @@ -13,5 +13,5 @@ ./accounts/src/artifacts -noir-contracts/src -noir-contracts/target +noir-contracts.js/src +noir-contracts.js/target diff --git a/yarn-project/.prettierignore b/yarn-project/.prettierignore index 58e74d67672..089b52962fe 100644 --- a/yarn-project/.prettierignore +++ b/yarn-project/.prettierignore @@ -1,9 +1,8 @@ .yarn node_modules/ dest/ -noir-contracts/**/*.json +noir-contracts.js/**/*.json boxes/*/src/artifacts/*.json boxes/*/src/artifacts/*.ts boxes/*/src/contracts/target/*.json -noir-protocol-circuits/src/target/*.json *.md diff --git a/yarn-project/Dockerfile b/yarn-project/Dockerfile index dc2c7174abf..9de7d8776b8 100644 --- a/yarn-project/Dockerfile +++ b/yarn-project/Dockerfile @@ -12,11 +12,11 @@ COPY . . # This is actually our code generation tool. Needed to build contract typescript wrappers. RUN yarn workspace @aztec/noir-compiler build # Builds noir contracts (TODO: move this stage pre yarn-project). Generates typescript wrappers. -RUN yarn workspace @aztec/noir-contracts build:contracts -# We need to copy noir contracts into other packages +RUN yarn workspace @aztec/noir-contracts.js build:contracts +# We need to build accounts as it needs to copy in account contracts from noir-contracts. RUN yarn workspace @aztec/accounts build:copy-contracts RUN yarn workspace @aztec/protocol-contracts build:copy-contracts -RUN yarn workspace @aztec/noir-protocol-circuits build +RUN yarn workspace @aztec/noir-protocol-circuits-types build RUN yarn tsc -b ENTRYPOINT ["yarn"] diff --git a/yarn-project/Dockerfile.prod b/yarn-project/Dockerfile.prod index b5e324a8ad3..b935d818fd6 100644 --- a/yarn-project/Dockerfile.prod +++ b/yarn-project/Dockerfile.prod @@ -11,13 +11,7 @@ WORKDIR /usr/src/yarn-project ARG COMMIT_TAG="" RUN ./scripts/version_packages.sh # Productionify. See comment in yarn-project-base/Dockerfile. -RUN yarn workspaces focus @aztec/cli @aztec/aztec @aztec/aztec-faucet @aztec/aztec.js --production && \ - yarn cache clean && \ - rm -rf /usr/src/barretenberg/ts/src && \ - # TODO: Fix by extracting noir code out of yarn-project. - # This was just a "rm -rf ./**/src". - # Due to the mess of us needing to find noir code in noir-protocol-circuits/src/crates we have to do this... - find . -maxdepth 2 -name src -type d | grep -v "./noir-protocol-circuits" | xargs rm -rf +RUN yarn workspaces focus @aztec/cli @aztec/aztec @aztec/aztec-faucet @aztec/aztec.js --production && yarn cache clean # We no longer need nargo. RUN rm -rf /usr/src/noir/target diff --git a/yarn-project/accounts/scripts/copy-contracts.sh b/yarn-project/accounts/scripts/copy-contracts.sh index 1fb52a3f282..94c8481fab5 100755 --- a/yarn-project/accounts/scripts/copy-contracts.sh +++ b/yarn-project/accounts/scripts/copy-contracts.sh @@ -5,7 +5,7 @@ mkdir -p ./src/artifacts contracts=(schnorr_account_contract-SchnorrAccount ecdsa_account_contract-EcdsaAccount schnorr_single_key_account_contract-SchnorrSingleKeyAccount) for contract in "${contracts[@]}"; do - cp "../noir-contracts/target/$contract.json" ./src/artifacts/${contract#*-}.json + cp "../noir-contracts.js/artifacts/$contract.json" ./src/artifacts/${contract#*-}.json done -yarn run -T prettier -w ./src/artifacts \ No newline at end of file +yarn run -T prettier -w ./src/artifacts diff --git a/yarn-project/accounts/src/defaults/entrypoint_payload.ts b/yarn-project/accounts/src/defaults/entrypoint_payload.ts index 9841d8bb398..5396c0b9374 100644 --- a/yarn-project/accounts/src/defaults/entrypoint_payload.ts +++ b/yarn-project/accounts/src/defaults/entrypoint_payload.ts @@ -5,9 +5,9 @@ import { padArrayEnd } from '@aztec/foundation/collection'; import { pedersenHash } from '@aztec/foundation/crypto'; // These must match the values defined in: -// - yarn-project/aztec-nr/aztec/src/entrypoint/app.nr +// - noir-projects/aztec-nr/aztec/src/entrypoint/app.nr const ACCOUNT_MAX_CALLS = 4; -// - and yarn-project/aztec-nr/aztec/src/entrypoint/fee.nr +// - and noir-projects/aztec-nr/aztec/src/entrypoint/fee.nr const FEE_MAX_CALLS = 2; /** Encoded function call for account contract entrypoint */ diff --git a/yarn-project/aztec.js/src/utils/cheat_codes.ts b/yarn-project/aztec.js/src/utils/cheat_codes.ts index fa4f7f6a453..02ce3e56549 100644 --- a/yarn-project/aztec.js/src/utils/cheat_codes.ts +++ b/yarn-project/aztec.js/src/utils/cheat_codes.ts @@ -245,7 +245,7 @@ export class AztecCheatCodes { */ public computeSlotInMap(baseSlot: Fr | bigint, key: Fr | bigint | AztecAddress): Fr { // Based on `at` function in - // aztec3-packages/yarn-project/aztec-nr/aztec/src/state_vars/map.nr + // aztec3-packages/aztec-nr/aztec/src/state_vars/map.nr return Fr.fromBuffer(pedersenHash([new Fr(baseSlot), new Fr(key)].map(f => f.toBuffer()))); } diff --git a/yarn-project/aztec/package.json b/yarn-project/aztec/package.json index fbc0b5dcb20..eaad8fa8a3a 100644 --- a/yarn-project/aztec/package.json +++ b/yarn-project/aztec/package.json @@ -38,7 +38,7 @@ "@aztec/kv-store": "workspace:^", "@aztec/l1-artifacts": "workspace:^", "@aztec/noir-compiler": "workspace:^", - "@aztec/noir-contracts": "workspace:^", + "@aztec/noir-contracts.js": "workspace:^", "@aztec/p2p": "workspace:^", "@aztec/pxe": "workspace:^", "abitype": "^0.8.11", diff --git a/yarn-project/aztec/src/examples/token.ts b/yarn-project/aztec/src/examples/token.ts index e741df3d442..e04e04e24b9 100644 --- a/yarn-project/aztec/src/examples/token.ts +++ b/yarn-project/aztec/src/examples/token.ts @@ -2,7 +2,7 @@ import { getSingleKeyAccount } from '@aztec/accounts/single_key'; import { AccountWallet, Fr, GrumpkinScalar, Note, computeMessageSecretHash, createPXEClient } from '@aztec/aztec.js'; import { ExtendedNote } from '@aztec/circuit-types'; import { createDebugLogger } from '@aztec/foundation/log'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; const logger = createDebugLogger('aztec:http-rpc-client'); diff --git a/yarn-project/aztec/tsconfig.json b/yarn-project/aztec/tsconfig.json index a27fb82841d..46586f47cf4 100644 --- a/yarn-project/aztec/tsconfig.json +++ b/yarn-project/aztec/tsconfig.json @@ -40,7 +40,7 @@ "path": "../noir-compiler" }, { - "path": "../noir-contracts" + "path": "../noir-contracts.js" }, { "path": "../p2p" diff --git a/yarn-project/bootstrap.sh b/yarn-project/bootstrap.sh index 6df64d6c3af..cbbf1fee8ae 100755 --- a/yarn-project/bootstrap.sh +++ b/yarn-project/bootstrap.sh @@ -8,9 +8,9 @@ major=${node_version%%.*} rest=${node_version#*.} minor=${rest%%.*} -if (( major < 18 || ( major == 18 && minor < 19 ) )); then - echo "Node.js version is less than 18.19. Exiting." - exit 1 +if ((major < 18 || (major == 18 && minor < 19))); then + echo "Node.js version is less than 18.19. Exiting." + exit 1 fi cd "$(dirname "$0")" @@ -41,7 +41,7 @@ echo "Building noir compiler..." yarn workspace @aztec/noir-compiler build # Builds noir contracts (TODO: move this stage pre yarn-project). Generates typescript wrappers. echo "Building contracts from noir-contracts..." -yarn workspace @aztec/noir-contracts build:contracts +yarn workspace @aztec/noir-contracts.js build:contracts # Bundle compiled contracts into other packages echo "Copying account contracts..." yarn workspace @aztec/accounts build:copy-contracts @@ -49,7 +49,7 @@ echo "Copying protocol contracts..." yarn workspace @aztec/protocol-contracts build:copy-contracts # Build protocol circuits. TODO: move pre yarn-project. echo "Building circuits from noir-protocol-circuits..." -yarn workspace @aztec/noir-protocol-circuits build +yarn workspace @aztec/noir-protocol-circuits-types build echo -e "\033[1mBuilding all packages...\033[0m" yarn build diff --git a/yarn-project/circuits.js/fixtures/Benchmarking.test.json b/yarn-project/circuits.js/fixtures/Benchmarking.test.json index 9ee5d2c91c3..8b563075a51 100644 --- a/yarn-project/circuits.js/fixtures/Benchmarking.test.json +++ b/yarn-project/circuits.js/fixtures/Benchmarking.test.json @@ -25,7 +25,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -33,7 +40,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -41,7 +55,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -50,16 +71,42 @@ "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", "fields": [ - { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } @@ -70,13 +117,48 @@ "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -86,10 +168,30 @@ "kind": "struct", "path": "aztec::abi::PublicGlobalVariables", "fields": [ - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } }, - { "name": "block_number", "type": { "kind": "field" } }, - { "name": "timestamp", "type": { "kind": "field" } } + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + }, + { + "name": "block_number", + "type": { + "kind": "field" + } + }, + { + "name": "timestamp", + "type": { + "kind": "field" + } + } ] } } @@ -102,16 +204,44 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] }, "visibility": "private" }, - { "name": "value", "type": { "kind": "field" }, "visibility": "private" } + { + "name": "value", + "type": { + "kind": "field" + }, + "visibility": "private" + } ], "param_witnesses": { - "inputs": [{ "start": 0, "end": 19 }], - "owner": [{ "start": 19, "end": 20 }], - "value": [{ "start": 20, "end": 21 }] + "inputs": [ + { + "start": 0, + "end": 19 + } + ], + "owner": [ + { + "start": 19, + "end": 20 + } + ], + "value": [ + { + "start": 20, + "end": 21 + } + ] }, "return_type": { "abi_type": { @@ -129,7 +259,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -137,7 +274,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -145,7 +289,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -153,21 +304,63 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } + ] + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } }, - { "name": "args_hash", "type": { "kind": "field" } }, - { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, { "name": "contract_storage_update_requests", "type": { @@ -177,9 +370,24 @@ "kind": "struct", "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", "fields": [ - { "name": "storage_slot", "type": { "kind": "field" } }, - { "name": "old_value", "type": { "kind": "field" } }, - { "name": "new_value", "type": { "kind": "field" } } + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } ] } } @@ -193,15 +401,31 @@ "kind": "struct", "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", "fields": [ - { "name": "storage_slot", "type": { "kind": "field" } }, - { "name": "current_value", "type": { "kind": "field" } } + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "current_value", + "type": { + "kind": "field" + } + } ] } } }, { "name": "public_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } }, { "name": "new_commitments", @@ -212,8 +436,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -227,32 +463,104 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "note_hash", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "note_hash", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } }, - { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, { "name": "unencrypted_logs_hash", - "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } }, - { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "block_header", "type": { "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -261,7 +569,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] @@ -269,14 +584,196 @@ "visibility": "public" }, "return_witnesses": [ - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210 + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210 ] }, "bytecode": "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", @@ -293,29 +790,85 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "private" + }, + { + "name": "nonce", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "storage_slot", + "type": { + "kind": "field" }, "visibility": "private" }, - { "name": "nonce", "type": { "kind": "field" }, "visibility": "private" }, - { "name": "storage_slot", "type": { "kind": "field" }, "visibility": "private" }, { "name": "serialized_note", - "type": { "kind": "array", "length": 3, "type": { "kind": "field" } }, + "type": { + "kind": "array", + "length": 3, + "type": { + "kind": "field" + } + }, "visibility": "private" } ], "param_witnesses": { - "contract_address": [{ "start": 0, "end": 1 }], - "nonce": [{ "start": 1, "end": 2 }], - "serialized_note": [{ "start": 3, "end": 6 }], - "storage_slot": [{ "start": 2, "end": 3 }] + "contract_address": [ + { + "start": 0, + "end": 1 + } + ], + "nonce": [ + { + "start": 1, + "end": 2 + } + ], + "serialized_note": [ + { + "start": 3, + "end": 6 + } + ], + "storage_slot": [ + { + "start": 2, + "end": 3 + } + ] }, "return_type": { - "abi_type": { "kind": "array", "length": 4, "type": { "kind": "field" } }, + "abi_type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + }, "visibility": "public" }, - "return_witnesses": [6, 7, 8, 9] + "return_witnesses": [ + 6, + 7, + 8, + 9 + ] }, "bytecode": "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", "debug_symbols": "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G44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lG44lm44lm44lm44lm44lmxcmbadjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjyaZjycqxZOVYsnIsWTmWrC5M2pZjycqxZOVYsnIsWTmWrBxLVo4lK8eSlWPJyrFk5ViycixZOZasHEtWjiUrx5KVY8nKsWTlWLJyLFk5lqwcS1aOJSvHkpVjycqxZOVYsnIsWTmWrBxLVo4lK8eSlWPJyrFk5ViycixZOZasHEtWjiUrx5KVY8nKsWTlWLJyLFk5lqwcS1aOJSvHkpVjycqxZOVYsnIsWTmWrBxLVo4lK8eSlWPJyrFk5ViycixZOZasHEtWjiUrx5KVY8nKsWTlWLJyLFk5lqwcS1aOJSvHkpVjycqxZOVYsnIsWTmWrBxLVo4lK8eSlWPJyrFk5ViycixZOZasHEtWjiUrx5KVY8nKsWTlWLJyLFk5lqwcS1aOJVuOJVuOJVuOJVuOJVsXJm2XY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mWY8mW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" @@ -343,7 +896,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -351,7 +911,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -359,7 +926,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -368,16 +942,42 @@ "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", "fields": [ - { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } @@ -388,26 +988,81 @@ "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } - ] - } - }, - { - "name": "public_global_variables", - "type": { - "kind": "struct", - "path": "aztec::abi::PublicGlobalVariables", - "fields": [ - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } }, - { "name": "block_number", "type": { "kind": "field" } }, - { "name": "timestamp", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "public_global_variables", + "type": { + "kind": "struct", + "path": "aztec::abi::PublicGlobalVariables", + "fields": [ + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + }, + { + "name": "block_number", + "type": { + "kind": "field" + } + }, + { + "name": "timestamp", + "type": { + "kind": "field" + } + } ] } } @@ -420,12 +1075,32 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] }, "visibility": "private" } ], - "param_witnesses": { "inputs": [{ "start": 0, "end": 19 }], "owner": [{ "start": 19, "end": 20 }] }, + "param_witnesses": { + "inputs": [ + { + "start": 0, + "end": 19 + } + ], + "owner": [ + { + "start": 19, + "end": 20 + } + ] + }, "return_type": { "abi_type": { "kind": "struct", @@ -442,7 +1117,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -450,7 +1132,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -458,7 +1147,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -466,21 +1162,63 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } + ] + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } }, - { "name": "args_hash", "type": { "kind": "field" } }, - { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, { "name": "contract_storage_update_requests", "type": { @@ -490,9 +1228,24 @@ "kind": "struct", "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", "fields": [ - { "name": "storage_slot", "type": { "kind": "field" } }, - { "name": "old_value", "type": { "kind": "field" } }, - { "name": "new_value", "type": { "kind": "field" } } + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } ] } } @@ -506,15 +1259,31 @@ "kind": "struct", "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", "fields": [ - { "name": "storage_slot", "type": { "kind": "field" } }, - { "name": "current_value", "type": { "kind": "field" } } + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "current_value", + "type": { + "kind": "field" + } + } ] } } }, { "name": "public_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } }, { "name": "new_commitments", @@ -525,8 +1294,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -540,32 +1321,104 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "note_hash", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "note_hash", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } }, - { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, { "name": "unencrypted_logs_hash", - "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } }, - { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "block_header", "type": { "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -574,7 +1427,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] @@ -582,14 +1442,196 @@ "visibility": "public" }, "return_witnesses": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209 + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209 ] }, "bytecode": "H4sIAAAAAAAA/+2dB3gVx7XH79VFgqsrAaYJZCStKqJLAowxYITpzQ33CgZRbEAYhHHvvffee8G994J7J89+cRI/O83OS57JS14SJ3Hi5J3ZOwf9GZZr7ccM2gtnv+/P7p7dnfObM2dnd2dXl3WxWCweS08JUo/YphNvb9Tzui2b6i2WVeeSM54lnDlZwpnIEs4OWcKZmyWceVnC2TFLODtlCWcySzjzs4QzlSWcBVnCWZglnJ2zhLNLlnB2zRLOHbKEs1uWcHa3yFkMnPzM1FPPe+l5kZ731vM+es7H7qjnfXVdO+j1ElIpqYzk6W0cmHJSBamSVEWqJtWQ+pFqSf1JA0gDSYNIg0lDSEN1Gerhq4E0jDScNIK0E2kkaWfSKNIupNGkMaSxpF1J43TsxpN2I00gTSRNIk0mTSFNJU0jTSfNIM0kzSLtTtqDtKeui6frshdpb9Js0j6kfUn7kfYnHUA6kHQQ6WDSIaRDSYeRDifNIc0lHUGaR5pPaiItIC0kLSItJh1JOoq0hLSUtIzUTFpuxPxo0grSSlKLwbmKdAxpNelY0nGk40knkE4knUQ6mXQK6VTSaaTTSWeQziSdRTqbdA7pXNJ5pPNJF5AuJF1Euph0CelS0mWky0lXkK6Mbdz+V5GuJl1DupZ0Hel60g2kG0k3kW4m3UK6lXQb6XbSHaQ7SXeR7ibdQ7qXdB/pftIDpDWkB0kPkR4mPUJ6lPQY6XHSE6QnSU+RniY9Q3qW9BzpedILpBdJL5FeJr1CepX0Gmkt6XVdlxxdlzdIbxq2t0hv6+V39PxdPX9Pz9/X8w/0/EM9/0jPP9bzdaq8wvSyuhc1xzaUjc/ZONj4/M0BG5/LCbDxed0BbHyO54KNz/c8sPG53xFsffVyJ7CVwDLPS/VyPtjK9HIKbJ5eLgBbuV4uBFuFXu4Mtkq93AVsVXq5K9iq9fIOYKvRy93A1k8vd9dzjoWaGvW8bgsnVabla0adYuc86AH14TzoCTbOg15g4zwoAhvXvTfYOA/6gI3zoBhsnAc7go3zoC/YOA8wfzgPSsHGeVAGNs4DD2ycB+Vg4zyoABvnQSXYOA+qwMZ5UA02jm8N2Di+nD8qnpNhO094ruJ4Jtt4O56rCSiTbbwdz1Xejucqb8dzFbfznLfjucrb8Vzl7Xhe8nY8B7kN8XzjY7qDjdsQ85PLwVzkNsS847Ixx7gNMcfYH+YYtyHmGDNgjvE54oGNuTDH+BzBHGNWzjFV1zzgbdTzui2b6rHv5ilurDfCMvtXLH3tstSlgKUv+Cm162cYXnPaUudSYPEs1xmva21h8YCl3C6LP4ZZYbdMv0051nhusJ8SqE+l5frEwQ+Xy+vsKwU2D/gqA/iq7PI1xMEPl8vrVcDHtnJ3sarD/orLVteJw8Gn5b6nTtWfz3Me52cG9pWAfZYUtnLN07Z82F4MNj4e+23PsLk4h/CZisvl9XLg4z7F27p8DW3lKzP4HPR9fqzKDBbxa73N67B8de7w+cJ+ErD9u3jrfquBqdguU0PYazA+X9q9RtXX4bnXFpYKYHFxDbbdtzu4dvk5VQ0x8fQcr6u8vQriVW05XpmuocgnrMIqrMIqrMIqrMIqrNs3K45LeXq+uXGf9uLbWuM+PCaN4z5vg0/Pqs96f9yn2Ci/yGiLBOzzU+Di96I47oNjPMWGzcH4cT3yc7m8ju8teQwK62r5Odpn2dFg2Xb9NsxTZZZZLbO+Tr1vwnfTZUY98D1PH8OmcvL7eGt9Pats4d/PeLFWFtvjSPh+xl2f1FCH4/Y5sY37h0rwa2lMo54XlN9qI37Mwb4SsM9Xel5ol2cDV6bxQofXTz8OVeDXi7WeG/gu27yWq+NqgMuD+FVD/Hif9XquzqFL4RyyPeYddnwPc9tumzbU4buvtrBgO9t+P+Yid1SZNZbLVGX0g5iYOZWC7Zh//SzHC/sHLpfXkU9YhVVYhVVYhVVYhVVYhVVYhVVYhVVYhVVYhVVYhTVbWBWLZ3Di+L8XAT624fsh22Pb+LdaXLZ6d3EyvLuosOoz/S4M30d4sU3/XiwB+zwD32+frpfzYbun5/itgwflu3iH9UN/45If2/Tvcly878D3ilzutus3/a7c7jnQsOFdOeeTed7h3y0VGzZ8z6fa3NN2/H6jwrC1V3vgOVMBNl7GbxzsxrjexTs0//cI+0E7cN3YTwK23wB9yE3x1rYx+wu1fU3Adp7ixnojLON79v526+r3mQOg/EbwgX4H2vVbj37jWuyD7QlYfgACNLB1cUN8mVnlXW3AfrhcaRyTgu21juvcHzgaYZ19qTy5FXJqDVwvbV9vsL4YlyKIC2+vgLjYPt9UFfH+zgOGGmApMTjxvgr7wFoHfJu7r6oFPvMbD/xeEPsT/F7Q5T1QjhFLbENL14mNvgfC7y/KgYN9JWCfl3Req++BzPseD47tDWVujW+YzGszfsO0FpjlG6bgb5jMb3PxG6b3oF/7Fu5tKsAv+6oybA7qXW/WuxHW2Rfe22C9qzZTb/wtBhf9JHPlGhx4b8L7fAr5qibsY/n7U7yHM58V7d9vNPj3awOslpm+juH1k9sL7yN4++eQg1/A/RjXuQLKWR+wnadM92v9IX6D7dbVP1eHQPmN4AP9DrXrtx798v0a+2B7Apa/gQANbV3cEF9mVnk3KGA/XO5nHJOC7YMc13kwcDTCOvtSefILyKn1cL9m+z4E64tx6Q1x4e04NuYZ+6t85vPBg/jZPi/xnp7LNe/xg+698fpg/x4pzVUOXF4s+HeF2FYOXDh+ZfnvBOrwm/li8InfzEflN41wzCIn1spX4oCvbwi+EuDj4xLAZ/fvIdJ8pSH48Hf58O8imK/cAZ8Xgq8c+Pi4XOCzPb4U9hvvoN8iyoO57XtEvBdtCx/2u3xcR+CzPeaPv6/YFj58D8DHdQI+y+NLPl9tCD4ck+HjksBne0xGlT0gBN9A4OPj8oHP8v2ezzcoBB/eIw2CZeazfY+k+IaE4BsKTHxcAfDVO+Cri7Wdrx74+LhC4BvmgK8hBN8w4OPjOgPfCAd8w0PwjQA+Pq4L8I10wLdTCL6RwMfHdQW+UQ74dg7BNwr4+LgdgG+0A75dQvCNBj4+rhvwjXXANyYE31jg4+PwN4bHOeDbNQTfOODj43oA33gHfI0h+MYDH9vx+jvBAd9uIfgmAB8f1wf4Jtnl8/8ecmIIvknAMtUuy3DFMjkEy1RgmWKXxf97yGl2y/THBqdbLlOVMQNiwvFj9hRsnw7xmmE5XnHwyeXyOvIJ6/bNqlgmGpxJ2G9iBPjYNsUhS9JgUVOmvi6ID9tyll0+/7owMwTfLGDZ0yrLMH/ccPcQLHsCyx5WWdLXhb3slun34XsDP9eV/aRgO7b53pbrFgefXC6vI5+wCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquw2mdVLDMNziTsNzMCfGzbwyFL0mBRU6bvRIL4sC33scvnf1MzOwTfPsCyv1WW9P89sW8Ilv2BZT+rLOlvag6wW6b/Tc2BwM91ZT8p2I5tfqDlusXBJ5fL68gnrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMKaLayKZbbBmYT9ZkeAj237OWRJGixqyjTOHsSHbXmwXT7/ncRBIfgOBpbD7LL4v/9wSAiWw4DlULss/juJw+2W6b+TmAP8XFf2k4Lt2OZzLNctDj65XF6fA3Zh3b5ZFctBBmcS9jsoAnxsO9QhS9JgUVOmfmlOAB+25RF2+fw+fG4IviOApckqS/q98rwQLE3AMt8qS7oPX2C3TL8PXwj8XFf2k4Lt2OYLLdctDj65XF5f6M6vX/9FP1D/RQEci7Zi/ZGvrazTs4hV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbi2nVWxzDU4k7Df3AjwsW2+Q5akwaKmTGP3QXyYd0fa5fPfcywOwXcksCy1ypL+TeqjQrAsBZYlVlnS7zmW2S3TH+dvBn6uK/tJwXZs82bLdYuDTy6X15FvW2RdmEWskgNuWCUHhFVyQFglB4RVckBYJQeEVXJAWCUHhFVyQFglB4RVckBYJQeEVXJAWCUHhFVyQFjbOwcUy2KDMwn7LY4AH9uWOGRJGixqyvSdSBAf5t3Rdvn8b2qWh+A7GlhaHLCsCMHSAiwr7bL439Ssslum/03NMcDPdWU/KdiObX6M5brFwSeXy+vIly2simW5wZmE/ZZHgI9tKx2yJA0WNWU6f4L4sC2Ptcvnn9+rQ/AdCywnOGA5LgTLCcByvF0Wv6850W6Zfl9zEvBzXdlPCrZjm59kuW5x8Mnl8jryZQurYlltcCZhv9UR4GPb8Q5ZkgaLmjKdP0F82JanOOA7OQTfKcB3cgDfaQ74Tg3Bdxrw8XH5wHeGA77TQ/CdAXynwzLzneWA78wQfGcBEx9XAHznOOA7OwTfOcDHxxUC33kO+M4NwXce8PFxnYHvAgd854fguwD4+LguwHeRA74LQ/BdBHx8XFfgu8QB38Uh+C4BPj4O+7/LHPBdGoLvMuC7NIDvCgd8l4fguwL4Lg/gu8oB35Uh+K4CvisD+K5xwHd1CL5rgI+PwzGs6xzwXRuC7zpgud4uS10KWK4HPzc6qPMNsbbXmf2n4Djku9kB300h+G4GvpsC+G51wHdLCL5bgY+Pw5y+3QHfbSH4bgc+Pg77hDsd8N0Rgu9O4LsjgO9uB3x3heC7G/juCuC71wHfPSH47gW+ewL47nfAd18IvvuB774AvjUO+B4IwbcG+B4I4HvIAd+DIfgeAr4HA/geccD3cAi+R4Dv4QC+xxzwPRqC7zHgezSA7wkHfI+H4HsC+B4P4HvKAd+TIfieAr4nA/ieccD3dAi+Z4Dv6QC+5xzwPRuC7zngezaA7wUHfM+H4HsB+J4P4HvJAd+LIfheAr4XA/heccD3cgi+V4CPj8P7v9cc8L0agu814OPjMH6v2+Xz37msDcH3OrC8ZZfF/78G3gjB8hawvGmXxX//87bdMv33P+8AP9eV/aRgO7b5O5brFgefXC6vI5+wbt+simWtwZmE/dZGgI9tbzpkSRosasrULwXxYVu+Z5fP78PfDcH3HrB8aJVluP8bPO+HYPkQWD6wypLuwz+yW6bfh38M/FxX9pOC7djmH1uuWxx8crm8jnxtZV2YRawSV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4S17azKpZ3Dc4k7PduBPjY9oFDlqTBoqZM3zkH8WHe/cgun/9N+LoQfD8Clk+tsjT434T/RwiWT4HlE6ss6W/C/9NumXWqjB8DP9eV/aRgO7b5jy3XLQ4+uVxeR762si7MIlaJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4rptxlWxrDM4k7Dfugjwse0ThyxJg0VNmcbZg/gw735il89/J/FZCL6fAMvnVlmG+e8kfhqC5XNg+ZlVlvQ7if+yW6b/TuIL4Oe6sp8UbMc2/8Jy3eLgk8vldeTbFlkXZhGr5IAbVskBYZUcEFbJAWGVHBBWyQFhlRwQVskBYZUcEFbJAWGVHBBWyQFhlRwQVskBYZUcENb2zgHF8pnBmYT9PosAH9t+5pAlabCoKdN3IkF8mHc/t8vnf1PzZQi+nwPLr+yy+P9/3y9CsPwKWH5pl8X/pubXdsv0v6n5Cvi5ruwnBduxzb+yXLc4+ORyeR35hHX7ZlUsXxqcSdjvywjwse2XDlmSBouaMvVLQXzYlr+xy+f34V+H4PsNsPzOLovfh/93CJbfActv7bL4ffj/2C3T78O/AX6uK/tJwXZs828s1y0OPrlcXkc+Yd2+WRXL1wZnEvb7OgJ8bPutQ5akwaKmTP1SEB+25e/t8vl9+PoQfL8Hlj86YPnfECx/BJY/2GXx+/D/s1um34f/Cfi5ruwnBduxzf9kuW5x8Mnl8jryZQurYllvcCZhv/UR4GPbHxyyJA0WNWU6f4L4sC3/4oDvzyH4/gJ8fw7g+6sDvm9D8P0V+L4N4Pu7A76/heD7O/D9LYDvHw74vgvB9w/g+y6A73sHfP8Mwfc98P0zgO/fDvj+FYLv38D3rwC+eNw+nwmUiY/9p2BH5Otgl8+/f8gJwcf+FUvCcqxUmbl2y6xTZeZZjpkqoyMEieOXC23H2/MgXh0txysOPrlcXke+trL2jLUvqwO/DQWx9H1NjuGL37kgUye93AHsfO6p1STHTq/z/tfrfRKwz7Bkel6oY8xTDsQ46SDGODXCchL7FT31iRBLUYRYukSIpSBCLMkIseRFiCURIZZeEWLpGiGWwgix5EeIpWOEWDpEiKV3hFhy49Fh6RyhuKQixNIpQiy5EWKJtzNLMrbp82wStufCfjnGsSqO9xa2bk9pew6UU6BtiYCyU1B2vl4uiG96LMYo5SBG6KcR1tlXPjAUxNufJTdCLJ0ixJKKEEvnCLHkxqPD0jtCcekQIZaOEWLJjxBLYYRYukaIpVeEWBIRYsmLEEsyQiwFEWLpEiGWogix9IkQS85WYuH7fi4332BpT7+Fdv363+p0Br/8HFQIcWf/nYGjs12OEZt739LFQZxxaoRl9rW59y3tzVIUIRbMyfZm6RKhuBREiCUZIZa8CLEkIsTSK0IsXSPEUhghlvwIsXSMEEuHCLH0jhBL5wixpCLE0ilCLLkRYom3M8vm3rfwdnxP0tV4FlC2HYznFHwvgz64nK5g4z6Ey1Dt8njhpgz4/qZbABcfj/7YT7f4pse6jnk343m2m8GH72+6Ob6XbgtLboRYOkWIJRUhls4RYukdIZYOEWLpGCGW/AixFEaIpWuEWHpFiCURIZa8CLEkI8RSECGWLhFi4XvPKLAURSgufSLEkhPA0sMuy3B8ZuDJWN3oGagHsHS3HBdVZk+7Zfp/G9XLcpmqjCIIEseP2VOwvRfEq8hBHvWMb9xOvI58wrp9syq/va36Tf9/gz1D9Bu9HcZAldnHwTleDBXiuvaB9i0OaN9iB+3bx2hfXkc+YRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYbXPqvzuaNVvg//NBfpVk7G6wVcM/LuIgSqzr90y/W8uSqBCXNe+0L4lAe1b4qB9+xrty+vIJ6zCKqzCKqzCKqzCKqzCKqzCKqzCKqzCKqzCKqzCmi2sym+pXb/+3xejXzUZqxuNWZc6jIEqs8xumf6YtQcV4rqWQft6Ae3rOWjfMqN9eR35hHX7ZlV+y636Tb+XKgtxjpc7jIEqs8LBOV4JFeK6VkD7Vga0b6WD9q0w2pfXK9359etf9QP1rwrgqNqK9Ue+trL2yiJWiavEVeIqcZW4SlwlrhJXiavEVeIqcZW4SlwlrhJXiavEVeLadlblt9qq3/RvYqJfNRmrG42DVzuMgSqzxm6Z/jhwP6gQ17UG2rdfQC72c9C+NUb78jrybYuslRLX7Z5VckBYJQeEVXJAWCUHhFVyQFglB4RVckBYJQeEVXJAWCUHhFVyQFglB4RVckBYJQeEtb1zQPmtteu3IWn4VZOxusFXDPy7iIEqs7/dMv1vLgZAhbiu/aF9BwTk4gAH7dvfaF9eR75sYVV+BzrIxf4hcnGgwxioMgc5yMXBUCGu6yBo38EB7TvYQfsOMtqX15EvW1iTYMuJtdp4ewJsQ7StA9iGalsu2OqgTmyr17aOYGvQtk5gGwZcPB+ubX3ANkLbusD+O+nl7mAbqZd7gm1nvVwEtlHsA2y76OVisI3Wy33BNkYvl4BtrF4uA9uuetkD2zi9XAG2Rr1cBbbxxrVV2XYzrnHKNsHo95RtotH/KNskI/+UbbJezo+12qZAzrJtqrYVgG2athWCbbq2dQbbDG43sM3Utq5gmxXAx/k5CGycn5jPnJ9DwMb5ORRsnJ91YOP8rAcb52cD2Dg/MV85bsPBxnEbATaO205g47iNBBvHbWewcdxGgY3jtgvYdtC20WDrpm1jwNZd28aCrYe27Qq2nto2Dmy9tK0RbEXaNh5svbVtN7DxuTwBbMXaNhFsO2rbJLD11bbJYCvRtilgK9W2qWAr07ZpYPO0bTrYyrVtBtgqtG0m2Cq1bRb0b/nAyHXKh7owK/pmWx74btTzui2b/FRmP1wur5cDH8fL27p8DW3lKzP4/N+bsMtSj23PU9xYb4TlSmCpsMzif5ttt0z/Pqoa+Lmu7CcF23tC3aot1y0OPrlcXke+qgBW7ndUTnjGfg5ilv5tG4O1LMBv7VaIEfcrtY791hh+Sw2/6jzBdlJTpvOkBnj7Web1n33tlunfEgwA5kbwUQr2gZbrgn7jWuyD7QlYvppvHGA/NfG1hpnVuVIbsB8uVxvHpGB7reM69weORlhnX+qe7oLCVgbLOe+3d63BwOulYO8fEK9aiBdv98DG9wDYx5YYZSShHLzWWs7r+kz1xHZnWw3w9Q/gG2CXryFTLgwAPrb1AxYX/aDJwtce7Ad7GfFTuXo4cCUsc+XFWp9dbJWJz008ZerP82Cea5lFPW/xc9PKluYVcxc27d00d34csDoYiDmAhss4fMGPdjh8wY92OHzBx+NQBZfTCbapZX6kalq6uGXfZU3L5q04bnlL0/yZzQsxeLkGzeYokS4PvDXqed2WTQ340MtTpkbuBCwd7bL4SZy0W6Z/c5sP/DgApaYUbM+FffIt1y0OPrlcXs9357eO65ip/qkAjtRWrD8OJCUDOHk7nn04MMnzhFGe2t/MZWsV6gFlxjWQAlAna26s9QTpFGsdCVJgaqRH3bSokRw1cqNGatTIjOo2ukOZL+m58qOeutQVRY2kqJETNVKi7iDUHZ26+1dXX3VHop5AvFj6qUg9eaonUXWHoe4o1FVbXRnVVUpdldSVU91JDSINJg0hDVVxIdWTGkjDSMNJI0g7kUaSdiaNIu1CGk0aQxpL2pU0Tsd3PGk30gTSRNIk0mTSFNJU0jTSdNIM0kzSLNLupD1Ie5L2Iu1Nmk3ah7QvaT/S/qQDSAeSDiIdTDqEdCjpsFj6CjuHNJd0BGkeaT6pibSAtJC0iLSYdCTpKNIS0lLSMlIzaTnpaNIK0kpSC2kV6RjSatKxpONIx5NOIJ1IOol0MukU0qmk00ink84gnUk6i3Q26RzSuaTzSOeTLiBdSLqIdDHpEtKlpMtIl5OuIF1Juop0Neka0rWk60jXk24g3Ui6iXQz6RbSraTbSLeT7iDdSbqLdDfpHtK9pPtI95MeIK0hPUh6iPQw6RHSo6THSI+TniA9SXqK9DTpGdKzpOdIz5NeIL0YS+fry6RXSK+SXiOtJb1OeoP0Jukt0tukd0jvkt4jvU/6gPQh6SPSx6R1sdbOGE/gX+s5P/XPbWlpWrq8xWtp9pauWtKyePmS47zVi1sWec3HNK1YsKR5NR78YnwLDn6Nx/g3PXju/PmbP+4TvcJn9rRl85uO9ZpXtXjNC7wjmlctm78Sd2/Q3dkYvT47favjrVzS3OLVecvo37lLyEXT/CEebltJVVjZ4q1smbuixVuwonmpVz/k/wEoXzk3918CAA==", @@ -618,7 +1660,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -626,7 +1675,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -634,7 +1690,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -643,16 +1706,42 @@ "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", "fields": [ - { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } @@ -663,13 +1752,48 @@ "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -685,20 +1809,52 @@ "kind": "struct", "path": "aztec::protocol_types::grumpkin_point::GrumpkinPoint", "fields": [ - { "name": "x", "type": { "kind": "field" } }, - { "name": "y", "type": { "kind": "field" } } + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } ] } }, - { "name": "constructor_vk_hash", "type": { "kind": "field" } }, - { "name": "function_tree_root", "type": { "kind": "field" } }, - { "name": "contract_address_salt", "type": { "kind": "field" } }, + { + "name": "constructor_vk_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_address_salt", + "type": { + "kind": "field" + } + }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] @@ -710,8 +1866,18 @@ "kind": "struct", "path": "aztec::abi::PrivateGlobalVariables", "fields": [ - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } } + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + } ] } } @@ -720,7 +1886,14 @@ "visibility": "private" } ], - "param_witnesses": { "inputs": [{ "start": 0, "end": 23 }] }, + "param_witnesses": { + "inputs": [ + { + "start": 0, + "end": 23 + } + ] + }, "return_type": { "abi_type": { "kind": "struct", @@ -737,7 +1910,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -745,7 +1925,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -753,7 +1940,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -761,21 +1955,63 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } + ] + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } }, - { "name": "args_hash", "type": { "kind": "field" } }, - { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, { "name": "read_requests", "type": { @@ -785,8 +2021,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -800,8 +2048,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -815,43 +2075,148 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "note_hash", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "note_hash", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } }, { "name": "private_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } }, { "name": "public_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "end_side_effect_counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + }, + { + "name": "encrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } }, - { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, - { "name": "end_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, - { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "unencrypted_logs_hash", - "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "encrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } }, - { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } }, - { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "block_header", "type": { "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -867,40 +2232,263 @@ "kind": "struct", "path": "aztec::protocol_types::grumpkin_point::GrumpkinPoint", "fields": [ - { "name": "x", "type": { "kind": "field" } }, - { "name": "y", "type": { "kind": "field" } } + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } ] } }, - { "name": "constructor_vk_hash", "type": { "kind": "field" } }, - { "name": "function_tree_root", "type": { "kind": "field" } }, - { "name": "contract_address_salt", "type": { "kind": "field" } }, + { + "name": "constructor_vk_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_address_salt", + "type": { + "kind": "field" + } + }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] } }, - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } } + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + } ] }, "visibility": "public" }, "return_witnesses": [ - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212 + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212 ] }, "bytecode": "H4sIAAAAAAAA/+Xd5XNUVxzG8U2yu6l7CU5wh9XsXdzdqtQLWzb1lir1UupOlXopdaeutLTUvcAfxPMMm5m8gFeczHDme2eeyUxe3NnP3rtXz/n9dqdSqR2pvUuT0qy0KO3d/udlRuNv7sCWfFrrSO9jvcVcR6lUrxTq+WJ+da5QrSXlXKlc60jySb6clNcUkmKxnpSSSrVWreSq+VKxnu8sV4udjRWnw33GXE+4M1pHpgfcmYPcndU6sj3gzgZ0d+33rd32+9R+9v8D/dxtgbdX19IceLuFNPeOxNwU0NwnEnNzQHPfSMwtAc39IjGnA5r7R2LOBDQPiMScDWgeGIm5NaB5UCTmtoDmdqB5MNA8BGgeCjQPA5qHA80jgOaRQPMooHk00DwGaB4LNI8DmscDzROA5olAcw5ozgPNBaC5CDSXgOYy0NwBNFeA5gRorgLNk4DmyUDzFKB5KtA8DWieDjTPAJpnAs2zgObZQPMcoHku0DwPaJ4PNC8AmhcCzYuA5sVA8xKgeSnQvAxoXg40rwCaTwKaTwaaTwGaTwWaTwOaTweaVwLNZwDNZwLNZwHNZwPN5wDN5wLN5wHN5wPNq4Dm1UBzDWi+AGheAzTXgeZOoPlCoPkioPlioPkSoPlSoPkyoPlyoPkKoPlKoHkt0HwV0Hw10HwN0Hwt0Hwd0Hw90LwOaL4BaL4RaL4JaL4ZaL4FaL4VaL4NaL4daF4PNN8BNG8Amu8Emu8Cmu8Gmu8Bmu8Fmu8Dmu8Hmh8Amh8Emh8Cmh8Gmh8Bmh8FmjcCzY8BzY8DzU8AzU8CzU8BzU8DzZuA5meA5meB5ueA5ueB5heA5heB5peA5peB5s1A8ytA8xag+VWg+TWg+XWg+Q2g+U2g+S2g+W2g+R2g+V2g+T2g+X2g+QOg+UOgeSvQ/BHQ/DHQ/AnQ/CnQ/BnQ/DnQ/AXQ/CXQ/BXQ/DXQ/A3Q/C3QvA1o/i4Sc2tA8/fA7bwdaP4BaP4RaN4BNP8ENP8cifmQgOZfIjEfGtD8ayTmwwKaf4vEfHhA8++RmI8IaP4jEvORAc1/RmI+KqD5r0jMRwc0/x2J+ZiA5n8iMR8b0PxvJObjApr/i8R8fEDz/5GYTwho3hmJ+cSA5l2RmHsFNO8OaG7rZm5quFuUtJJRsoqfX/q+0PdJvm/wdbSvK32d5esOn4d9XvJx2sct/469X3s79+q2/m2Nv72VPkpfpZ/SXxmgDFQGKe3KYGWIMlQZpgxXRigjlVHKaGWMMlYZp4xXJigT/Z0oeaXg71opKWWlQ6koiVJVJimTlSnKVGWaMr3x3c5UZimzlTnKXGWeMl9ZoCxUFimLlSXKUmWZslxZobj/vPuxuz+5+3W7f7X7Oa9U3O/X/W/dD9b9Ud0v1P0z3U/S/RVXKe6/V1Pcn839yty/y/2s3N/J/Y7c/8f9cNwfxv1S3D/E/TTcX2Kt4v4Drsfv+vSu1+765a7nvU5xvWfXP3Y9YNfHdb1Y1091PVHX11yvuP7iBsX1+VyvzvXbXM/M9b1c78r1n1wPyfWBXC/H9WNcT8X1RTYqrj/hegyuT+D5+p6/7vncmxTP9/X8V88H9fxIzxf0/DnPJ/P8qs2K599sUTw/w/MVPH7f49k9vtvjnT3+1+NhPT7U4yU9ftDj6Ty+bKvi8Ucej+PxKR6v4fELfp/v99t+3+v3n34f6Pdjfl/kfdPvE/x8fbvi569+Hunnc35e5ec3fp7h+3vf7/r+z/dDvj/w9bKvH3095esLn299/vHx2Mcn/167lj1HMZVAULsAAA==", @@ -929,7 +2517,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -937,7 +2532,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -945,7 +2547,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -954,16 +2563,42 @@ "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", "fields": [ - { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } @@ -974,13 +2609,48 @@ "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -996,20 +2666,52 @@ "kind": "struct", "path": "aztec::protocol_types::grumpkin_point::GrumpkinPoint", "fields": [ - { "name": "x", "type": { "kind": "field" } }, - { "name": "y", "type": { "kind": "field" } } + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } ] } }, - { "name": "constructor_vk_hash", "type": { "kind": "field" } }, - { "name": "function_tree_root", "type": { "kind": "field" } }, - { "name": "contract_address_salt", "type": { "kind": "field" } }, + { + "name": "constructor_vk_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_address_salt", + "type": { + "kind": "field" + } + }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] @@ -1021,8 +2723,18 @@ "kind": "struct", "path": "aztec::abi::PrivateGlobalVariables", "fields": [ - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } } + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + } ] } } @@ -1035,16 +2747,46 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] }, "visibility": "private" }, - { "name": "index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 }, "visibility": "private" } + { + "name": "index", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + }, + "visibility": "private" + } ], "param_witnesses": { - "index": [{ "start": 24, "end": 25 }], - "inputs": [{ "start": 0, "end": 23 }], - "owner": [{ "start": 23, "end": 24 }] + "index": [ + { + "start": 24, + "end": 25 + } + ], + "inputs": [ + { + "start": 0, + "end": 23 + } + ], + "owner": [ + { + "start": 23, + "end": 24 + } + ] }, "return_type": { "abi_type": { @@ -1062,7 +2804,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1070,7 +2819,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1078,7 +2834,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1086,21 +2849,63 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } + ] + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } }, - { "name": "args_hash", "type": { "kind": "field" } }, - { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, { "name": "read_requests", "type": { @@ -1110,8 +2915,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -1125,8 +2942,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -1140,43 +2969,148 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "note_hash", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "note_hash", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } }, { "name": "private_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } }, { "name": "public_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "end_side_effect_counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + }, + { + "name": "encrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } }, - { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, - { "name": "end_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, - { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "unencrypted_logs_hash", - "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "encrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } }, - { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } }, - { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "block_header", "type": { "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -1192,43 +3126,263 @@ "kind": "struct", "path": "aztec::protocol_types::grumpkin_point::GrumpkinPoint", "fields": [ - { "name": "x", "type": { "kind": "field" } }, - { "name": "y", "type": { "kind": "field" } } + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } ] } }, - { "name": "constructor_vk_hash", "type": { "kind": "field" } }, - { "name": "function_tree_root", "type": { "kind": "field" } }, - { "name": "contract_address_salt", "type": { "kind": "field" } }, + { + "name": "constructor_vk_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_address_salt", + "type": { + "kind": "field" + } + }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] } }, - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } } + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + } ] }, "visibility": "public" }, "return_witnesses": [ - 6072, 6073, 6074, 6075, 6076, 6077, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, - 6090, 6091, 6092, 6093, 6094, 6095, 6096, 6097, 6098, 6099, 6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, - 6108, 6109, 6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, 6120, 6121, 6122, 6123, 6124, 6125, - 6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, 6134, 6135, 6136, 6137, 6138, 6139, 6140, 6141, 6142, 6143, - 6144, 6145, 6146, 6147, 6148, 6149, 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, 6158, 6159, 6160, 6161, - 6162, 6163, 6164, 6165, 6166, 6167, 6168, 6169, 6170, 6171, 6172, 6173, 6174, 6175, 6176, 6177, 6178, 6179, - 6180, 6181, 6182, 6183, 6184, 6185, 6186, 6187, 6188, 6189, 6190, 6191, 6192, 6193, 6194, 6195, 6196, 6197, - 6198, 6199, 6200, 6201, 6202, 6203, 6204, 6205, 6206, 6207, 6208, 6209, 6210, 6211, 6212, 6213, 6214, 6215, - 6216, 6217, 6218, 6219, 6220, 6221, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 6229, 6230, 6231, 6232, 6233, - 6234, 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, 6243, 6244, 6245, 6246, 6247, 6248, 6249, 6250, 6251, - 6252, 6253, 6254, 6255, 6256, 6257, 6258, 6259, 6260 + 6072, + 6073, + 6074, + 6075, + 6076, + 6077, + 6078, + 6079, + 6080, + 6081, + 6082, + 6083, + 6084, + 6085, + 6086, + 6087, + 6088, + 6089, + 6090, + 6091, + 6092, + 6093, + 6094, + 6095, + 6096, + 6097, + 6098, + 6099, + 6100, + 6101, + 6102, + 6103, + 6104, + 6105, + 6106, + 6107, + 6108, + 6109, + 6110, + 6111, + 6112, + 6113, + 6114, + 6115, + 6116, + 6117, + 6118, + 6119, + 6120, + 6121, + 6122, + 6123, + 6124, + 6125, + 6126, + 6127, + 6128, + 6129, + 6130, + 6131, + 6132, + 6133, + 6134, + 6135, + 6136, + 6137, + 6138, + 6139, + 6140, + 6141, + 6142, + 6143, + 6144, + 6145, + 6146, + 6147, + 6148, + 6149, + 6150, + 6151, + 6152, + 6153, + 6154, + 6155, + 6156, + 6157, + 6158, + 6159, + 6160, + 6161, + 6162, + 6163, + 6164, + 6165, + 6166, + 6167, + 6168, + 6169, + 6170, + 6171, + 6172, + 6173, + 6174, + 6175, + 6176, + 6177, + 6178, + 6179, + 6180, + 6181, + 6182, + 6183, + 6184, + 6185, + 6186, + 6187, + 6188, + 6189, + 6190, + 6191, + 6192, + 6193, + 6194, + 6195, + 6196, + 6197, + 6198, + 6199, + 6200, + 6201, + 6202, + 6203, + 6204, + 6205, + 6206, + 6207, + 6208, + 6209, + 6210, + 6211, + 6212, + 6213, + 6214, + 6215, + 6216, + 6217, + 6218, + 6219, + 6220, + 6221, + 6222, + 6223, + 6224, + 6225, + 6226, + 6227, + 6228, + 6229, + 6230, + 6231, + 6232, + 6233, + 6234, + 6235, + 6236, + 6237, + 6238, + 6239, + 6240, + 6241, + 6242, + 6243, + 6244, + 6245, + 6246, + 6247, + 6248, + 6249, + 6250, + 6251, + 6252, + 6253, + 6254, + 6255, + 6256, + 6257, + 6258, + 6259, + 6260 ] }, "bytecode": "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", @@ -1257,7 +3411,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1265,7 +3426,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1273,7 +3441,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1282,16 +3457,42 @@ "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", "fields": [ - { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } @@ -1302,13 +3503,48 @@ "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -1324,20 +3560,52 @@ "kind": "struct", "path": "aztec::protocol_types::grumpkin_point::GrumpkinPoint", "fields": [ - { "name": "x", "type": { "kind": "field" } }, - { "name": "y", "type": { "kind": "field" } } + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } ] } }, - { "name": "constructor_vk_hash", "type": { "kind": "field" } }, - { "name": "function_tree_root", "type": { "kind": "field" } }, - { "name": "contract_address_salt", "type": { "kind": "field" } }, + { + "name": "constructor_vk_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_address_salt", + "type": { + "kind": "field" + } + }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] @@ -1349,8 +3617,18 @@ "kind": "struct", "path": "aztec::abi::PrivateGlobalVariables", "fields": [ - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } } + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + } ] } } @@ -1363,16 +3641,44 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] }, "visibility": "private" }, - { "name": "value", "type": { "kind": "field" }, "visibility": "private" } + { + "name": "value", + "type": { + "kind": "field" + }, + "visibility": "private" + } ], "param_witnesses": { - "inputs": [{ "start": 0, "end": 23 }], - "owner": [{ "start": 23, "end": 24 }], - "value": [{ "start": 24, "end": 25 }] + "inputs": [ + { + "start": 0, + "end": 23 + } + ], + "owner": [ + { + "start": 23, + "end": 24 + } + ], + "value": [ + { + "start": 24, + "end": 25 + } + ] }, "return_type": { "abi_type": { @@ -1390,7 +3696,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1398,7 +3711,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::AztecAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1406,7 +3726,14 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } }, { @@ -1414,21 +3741,63 @@ "type": { "kind": "struct", "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } + ] + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" } }, - { "name": "is_delegate_call", "type": { "kind": "boolean" } }, - { "name": "is_static_call", "type": { "kind": "boolean" } }, - { "name": "is_contract_deployment", "type": { "kind": "boolean" } }, { "name": "start_side_effect_counter", - "type": { "kind": "integer", "sign": "unsigned", "width": 32 } + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } } ] } }, - { "name": "args_hash", "type": { "kind": "field" } }, - { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, { "name": "read_requests", "type": { @@ -1438,8 +3807,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -1453,8 +3834,20 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffect", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } @@ -1468,43 +3861,148 @@ "kind": "struct", "path": "aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [ - { "name": "value", "type": { "kind": "field" } }, - { "name": "note_hash", "type": { "kind": "field" } }, - { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } + { + "name": "value", + "type": { + "kind": "field" + } + }, + { + "name": "note_hash", + "type": { + "kind": "field" + } + }, + { + "name": "counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + } ] } } }, { "name": "private_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } }, { "name": "public_call_stack_hashes", - "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "end_side_effect_counter", + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 32 + } + }, + { + "name": "encrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } }, - { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, - { "name": "end_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, - { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "unencrypted_logs_hash", - "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "encrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } }, - { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } }, - { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "block_header", "type": { "kind": "struct", "path": "aztec::protocol_types::abis::block_header::BlockHeader", "fields": [ - { "name": "note_hash_tree_root", "type": { "kind": "field" } }, - { "name": "nullifier_tree_root", "type": { "kind": "field" } }, - { "name": "contract_tree_root", "type": { "kind": "field" } }, - { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } }, - { "name": "archive_root", "type": { "kind": "field" } }, - { "name": "public_data_tree_root", "type": { "kind": "field" } }, - { "name": "global_variables_hash", "type": { "kind": "field" } } + { + "name": "note_hash_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_message_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "archive_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } ] } }, @@ -1520,41 +4018,263 @@ "kind": "struct", "path": "aztec::protocol_types::grumpkin_point::GrumpkinPoint", "fields": [ - { "name": "x", "type": { "kind": "field" } }, - { "name": "y", "type": { "kind": "field" } } + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } ] } }, - { "name": "constructor_vk_hash", "type": { "kind": "field" } }, - { "name": "function_tree_root", "type": { "kind": "field" } }, - { "name": "contract_address_salt", "type": { "kind": "field" } }, + { + "name": "constructor_vk_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_address_salt", + "type": { + "kind": "field" + } + }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "aztec::protocol_types::address::EthAddress", - "fields": [{ "name": "inner", "type": { "kind": "field" } }] + "fields": [ + { + "name": "inner", + "type": { + "kind": "field" + } + } + ] } } ] } }, - { "name": "chain_id", "type": { "kind": "field" } }, - { "name": "version", "type": { "kind": "field" } } + { + "name": "chain_id", + "type": { + "kind": "field" + } + }, + { + "name": "version", + "type": { + "kind": "field" + } + } ] }, "visibility": "public" }, "return_witnesses": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234 + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234 ] }, "bytecode": "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", @@ -1573,127 +4293,127 @@ }, "39": { "source": "// A contract used for running benchmarks.\n// We should try to change this contract as little as possible, since any modification\n// would alter the metrics we're capturing in the benchmarks, and we want to keep the\n// subject being tested as unmodified as possible so we can detect metric changes that\n// arise from code changes.\n\ncontract Benchmarking {\n use dep::value_note::{\n utils::{increment, decrement},\n value_note::{VALUE_NOTE_LEN, ValueNote, ValueNoteMethods},\n };\n\n use dep::aztec::{\n protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n },\n context::{Context},\n note::{utils as note_utils, note_getter_options::NoteGetterOptions, note_header::NoteHeader},\n log::emit_unencrypted_log,\n state_vars::{map::Map, public_state::PublicState, set::Set},\n types::type_serialization::field_serialization::{FieldSerializationMethods, FIELD_SERIALIZED_LEN},\n };\n\n struct Storage {\n notes: Map>,\n balances: Map>,\n }\n\n impl Storage {\n fn init(context: Context) -> pub Self {\n Storage {\n notes: Map::new(context, 1, |context, slot| { Set::new(context, slot, ValueNoteMethods) }),\n balances: Map::new(context, 2, |context, slot| { PublicState::new(context, slot, FieldSerializationMethods) }),\n }\n }\n }\n\n #[aztec(private)]\n fn constructor() {}\n\n // Creates a new value note for the target owner. Use this method to seed an initial set of notes.\n #[aztec(private)]\n fn create_note(owner: AztecAddress, value: Field) {\n increment(storage.notes.at(owner), value, owner);\n }\n\n // Deletes a note at a specific index in the set and creates a new one with the same value.\n // We explicitly pass in the note index so we can ensure we consume different notes when sending\n // multiple txs that will land on the same block.\n // See https://discourse.aztec.network/t/utxo-concurrency-issues-for-private-state/635\n // by @rahul-kothari for a full explanation on why this is needed.\n #[aztec(private)]\n fn recreate_note(owner: AztecAddress, index: u32) {\n let owner_notes = storage.notes.at(owner);\n let getter_options = NoteGetterOptions::new().set_limit(1).set_offset(index);\n let notes = owner_notes.get_notes(getter_options);\n let note = notes[0].unwrap_unchecked();\n owner_notes.remove(note);\n increment(owner_notes, note.value, owner);\n }\n\n // Reads and writes to public storage and enqueues a call to another public function.\n #[aztec(public)]\n fn increment_balance(owner: AztecAddress, value: Field) {\n let current = storage.balances.at(owner).read();\n storage.balances.at(owner).write(current + value);\n let _callStackItem1 = context.call_public_function(\n context.this_address(),\n FunctionSelector::from_signature(\"broadcast((Field))\"),\n [owner.to_field()]\n );\n }\n\n // Emits a public log.\n #[aztec(public)]\n fn broadcast(owner: AztecAddress) {\n emit_unencrypted_log(&mut context, storage.balances.at(owner).read());\n }\n\n unconstrained fn compute_note_hash_and_nullifier(\n contract_address: AztecAddress,\n nonce: Field,\n storage_slot: Field,\n serialized_note: [Field; VALUE_NOTE_LEN]\n ) -> pub [Field; 4] {\n let note_header = NoteHeader::new(contract_address, nonce, storage_slot);\n note_utils::compute_note_hash_and_nullifier(ValueNoteMethods, note_header, serialized_note)\n }\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/noir-contracts/contracts/benchmarking_contract/src/main.nr" + "path": "/home/santiago/Projects/aztec3-packages/noir-contracts/contracts/benchmarking_contract/src/main.nr" }, "40": { "source": "use crate::{\n abi::{\n PrivateContextInputs,\n PublicContextInputs,\n },\n key::nullifier_key::validate_nullifier_key_against_address,\n messaging::process_l1_to_l2_message,\n oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n public_call::call_public_function_internal,\n enqueue_public_function_call::enqueue_public_function_call_internal,\n context::get_portal_address,\n get_block_header::get_block_header,\n nullifier_key::get_nullifier_key_pair,\n },\n types::vec::BoundedVec,\n utils::Reader,\n};\nuse dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_data::FunctionData,\n function_selector::FunctionSelector,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_stack_item::PrivateCallStackItem,\n call_stack_item::PublicCallStackItem,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n address::{\n AztecAddress,\n EthAddress,\n },\n constants::{\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_READ_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n },\n contrakt::{\n deployment_data::ContractDeploymentData,\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n hash::hash_args,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::{\n grumpkin_scalar::GrumpkinScalar,\n option::Option,\n};\n\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n// use dep::std::collections::vec::Vec;\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec,\n\n read_requests: BoundedVec,\n\n new_commitments: BoundedVec,\n new_nullifiers: BoundedVec,\n\n private_call_stack_hashes : BoundedVec,\n public_call_stack_hashes : BoundedVec,\n new_l2_to_l1_msgs : BoundedVec,\n // docs:end:private-context\n\n block_header: BlockHeader,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec,\n // unencrypted_logs_preimages: Vec,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n read_requests: BoundedVec::new(SideEffect::empty()),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n block_header: inputs.block_header,\n\n private_call_stack_hashes: BoundedVec::new(0),\n public_call_stack_hashes: BoundedVec::new(0),\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.private_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.private_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_block_header(self, block_number: u32) -> BlockHeader {\n get_block_header(block_number, self)\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let encrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let encrypted_log_preimages_length = 0;\n let unencrypted_log_preimages_length = 0;\n\n let priv_circuit_pub_inputs = PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n return_values: self.return_values.storage,\n read_requests: self.read_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n private_call_stack_hashes: self.private_call_stack_hashes.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n end_side_effect_counter: self.side_effect_counter,\n encrypted_logs_hash: encrypted_logs_hash,\n unencrypted_logs_hash: unencrypted_logs_hash,\n encrypted_log_preimages_length: encrypted_log_preimages_length,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.block_header,\n contract_deployment_data: self.inputs.contract_deployment_data,\n chain_id: self.inputs.private_global_variables.chain_id,\n version: self.inputs.private_global_variables.version,\n };\n priv_circuit_pub_inputs\n }\n\n pub fn push_read_request(&mut self, read_request: Field) {\n let side_effect = SideEffect {\n value: read_request,\n counter: self.side_effect_counter,\n };\n self.read_requests.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter,\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: nullified_commitment,\n counter: self.side_effect_counter,\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn request_nullifier_secret_key(&mut self, account: AztecAddress) -> GrumpkinScalar {\n let key_pair = get_nullifier_key_pair(account);\n validate_nullifier_key_against_address(account, key_pair.public_key, key_pair.secret_key);\n // TODO: Add request to context.\n // self.context.push_nullifier_key_validation_request(public_key, secret_key);\n key_pair.secret_key\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, content: Field) \n // docs:end:context_message_portal\n {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(\n &mut self,\n msg_key: Field,\n content: Field,\n secret: Field\n ) \n // docs:end:context_consume_l1_to_l2_message\n {\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, self.this_address(), self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n pub fn accumulate_encrypted_logs(&mut self, log: [Field; N]) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs(&mut self, log: T) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_private_function(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n ) -> [Field; RETURN_VALUES_LENGTH] {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let fields = call_private_function_internal(\n contract_address,\n function_selector, \n args_hash,\n self.side_effect_counter,\n );\n let mut reader = Reader::new(fields);\n\n let item = PrivateCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PrivateCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: reader.read_array([0; RETURN_VALUES_LENGTH]), // +1\n read_requests: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_READ_REQUESTS_PER_CALL]),\n new_commitments: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL]),\n new_nullifiers: reader.read_struct_array(SideEffectLinkedToNoteHash::deserialise, [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL]),\n private_call_stack_hashes: reader.read_array([0; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n new_l2_to_l1_msgs: reader.read_array([0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL]),\n end_side_effect_counter: reader.read() as u32,\n encrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n unencrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n encrypted_log_preimages_length: reader.read(),\n unencrypted_log_preimages_length: reader.read(),\n block_header: BlockHeader{\n // Must match order in `private_circuit_public_inputs.hpp`\n note_hash_tree_root : reader.read(),\n nullifier_tree_root : reader.read(),\n contract_tree_root : reader.read(),\n l1_to_l2_message_tree_root : reader.read(),\n archive_root : reader.read(),\n public_data_tree_root: reader.read(),\n global_variables_hash: reader.read(),\n },\n contract_deployment_data: ContractDeploymentData {\n deployer_public_key: GrumpkinPoint {\n x: reader.read(), \n y: reader.read()\n },\n constructor_vk_hash : reader.read(),\n function_tree_root : reader.read(),\n contract_address_salt : reader.read(),\n portal_contract_address : EthAddress::from_field(reader.read()),\n },\n chain_id: reader.read(),\n version: reader.read(),\n },\n is_execution_request: reader.read() as bool,\n };\n\n reader.finish();\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n self.side_effect_counter = item.public_inputs.end_side_effect_counter + 1;\n \n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n assert(item.is_execution_request == false);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.private_call_stack_hashes.push(item.hash());\n\n item.public_inputs.return_values\n }\n\n pub fn call_public_function(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) {\n let fields = enqueue_public_function_call_internal(\n contract_address, \n function_selector, \n args_hash,\n self.side_effect_counter\n );\n\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: [0; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs:[0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash:[0; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: 0,\n block_header: BlockHeader::empty(),\n prover_address: AztecAddress::zero(),\n },\n is_execution_request: true,\n };\n reader.finish();\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n // We increment the sideffect counter by one, to account for the call itself being a side effect.\n self.side_effect_counter = self.side_effect_counter + 1;\n \n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.public_call_stack_hashes.push(item.hash());\n }\n}\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec,\n\n contract_storage_update_requests: BoundedVec,\n contract_storage_reads: BoundedVec,\n public_call_stack_hashes: BoundedVec,\n\n new_commitments: BoundedVec,\n new_nullifiers: BoundedVec,\n\n new_l2_to_l1_msgs: BoundedVec,\n\n unencrypted_logs_hash: BoundedVec,\n unencrypted_logs_preimages_length: Field,\n\n block_header: BlockHeader,\n prover_address: AztecAddress,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs, args_hash: Field) -> PublicContext {\n let empty_storage_read = StorageRead::empty();\n let empty_storage_update = StorageUpdateRequest::empty();\n PublicContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n contract_storage_update_requests: BoundedVec::new(empty_storage_update),\n contract_storage_reads: BoundedVec::new(empty_storage_read),\n public_call_stack_hashes: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n \n unencrypted_logs_hash: BoundedVec::new(0),\n unencrypted_logs_preimages_length: 0,\n\n block_header: inputs.block_header,\n prover_address: AztecAddress::zero(),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.public_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.public_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n pub fn timestamp(self) -> Field {\n self.inputs.public_global_variables.timestamp\n }\n\n pub fn finish(self) -> PublicCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_log_preimages_length = 0;\n\n\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_reads: self.contract_storage_reads.storage,\n return_values: self.return_values.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n unencrypted_logs_hash: unencrypted_logs_hash,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.inputs.block_header,\n prover_address: self.prover_address,\n };\n pub_circuit_pub_inputs\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: 0, // cannot nullify pending notes in public context\n counter: self.side_effect_counter\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n pub fn consume_l1_to_l2_message(&mut self, msg_key: Field, content: Field, secret: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, this, self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n\n pub fn accumulate_encrypted_logs(&mut self, log: [Field; N]) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs(&mut self, log: T) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_public_function(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n call_public_function_internal(\n contract_address, \n function_selector, \n args_hash,\n )\n }\n\n pub fn call_public_function_no_args(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_internal(\n contract_address, \n function_selector, \n 0,\n )\n }\n\n}\n\nstruct Context {\n private: Option<&mut PrivateContext>,\n public: Option<&mut PublicContext>,\n}\n\nimpl Context {\n pub fn private(context: &mut PrivateContext) -> Context {\n Context {\n private: Option::some(context),\n public: Option::none()\n }\n }\n\n pub fn public(context: &mut PublicContext) -> Context {\n Context {\n public: Option::some(context),\n private: Option::none()\n }\n }\n\n pub fn none() -> Context {\n Context {\n public: Option::none(),\n private: Option::none()\n }\n }\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/context.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/context.nr" }, "43": { "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::hash_args,\n};\n\n// docs:start:private-global-variables\nstruct PrivateGlobalVariables {\n chain_id: Field,\n version: Field,\n}\n// docs:end:private-global-variables\n\nimpl PrivateGlobalVariables {\n fn serialize(self) -> [Field; 2] {\n [self.chain_id, self.version]\n }\n}\n\n// docs:start:public-global-variables\nstruct PublicGlobalVariables {\n chain_id: Field,\n version: Field,\n block_number: Field,\n timestamp: Field,\n}\n// docs:end:public-global-variables\n\nimpl PublicGlobalVariables {\n fn serialize(self) -> [Field; 4] {\n [self.chain_id, self.version, self.block_number, self.timestamp]\n }\n}\n\n// PrivateContextInputs are expected to be provided to each private function\n// docs:start:private-context-inputs\nstruct PrivateContextInputs {\n call_context : CallContext,\n block_header: BlockHeader,\n contract_deployment_data: ContractDeploymentData,\n private_global_variables: PrivateGlobalVariables,\n}\n// docs:end:private-context-inputs\n\n// PublicContextInputs are expected to be provided to each public function\n// docs:start:public-context-inputs\nstruct PublicContextInputs {\n call_context: CallContext,\n block_header: BlockHeader,\n\n public_global_variables: PublicGlobalVariables,\n}\n// docs:end:public-context-inputs\n\nstruct Hasher {\n fields: [Field],\n}\n\nimpl Hasher {\n pub fn new()-> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n\n pub fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/abi.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/abi.nr" }, "47": { "source": "use dep::std::option::Option;\nuse crate::abi::PublicContextInputs;\nuse dep::protocol_types::{\n constants::{MAX_NOTES_PER_PAGE, MAX_READ_REQUESTS_PER_CALL},\n abis::side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n};\nuse crate::context::{PrivateContext, PublicContext, Context};\nuse crate::note::{\n lifecycle::{create_note, create_note_hash_from_public, destroy_note},\n note_getter::{get_notes, view_notes},\n note_getter_options::NoteGetterOptions,\n note_header::NoteHeader,\n note_interface::NoteInterface,\n note_viewer_options::NoteViewerOptions,\n utils::compute_note_hash_for_read_or_nullify,\n};\n\n// docs:start:struct\nstruct Set {\n context: Context,\n storage_slot: Field,\n note_interface: NoteInterface,\n}\n// docs:end:struct\n\nimpl Set {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n note_interface: NoteInterface,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Set {\n context,\n storage_slot,\n note_interface,\n }\n }\n // docs:end:new\n\n // docs:start:insert\n pub fn insert(self,\n note: &mut Note,\n broadcast: bool,\n ) {\n create_note(\n self.context.private.unwrap(),\n self.storage_slot,\n note,\n self.note_interface,\n broadcast,\n );\n }\n // docs:end:insert\n\n // docs:start:insert_from_public\n pub fn insert_from_public(self, note: &mut Note) {\n create_note_hash_from_public(\n self.context.public.unwrap(),\n self.storage_slot,\n note,\n self.note_interface,\n );\n }\n // docs:end:insert_from_public\n \n // DEPRECATED\n fn assert_contains_and_remove(_self: Self, _note: &mut Note, _nonce: Field) {\n assert(false, \"`assert_contains_and_remove` has been deprecated. Please call PXE.addNote() to add a note to the database. Then use Set.get_notes() and Set.remove() in your contract to verify and remove a note.\");\n }\n\n // DEPRECATED\n fn assert_contains_and_remove_publicly_created(_self: Self, _note: &mut Note) {\n assert(false, \"`assert_contains_and_remove_publicly_created` has been deprecated. Please call PXE.addNote() to add a note to the database. Then use Set.get_notes() and Set.remove() in your contract to verify and remove a note.\");\n }\n\n // docs:start:remove\n pub fn remove(self, note: Note) {\n let context = self.context.private.unwrap();\n let note_hash = compute_note_hash_for_read_or_nullify(self.note_interface, note);\n let has_been_read = context.read_requests.any(|r: SideEffect| r.value == note_hash);\n assert(has_been_read, \"Can only remove a note that has been read from the set.\");\n\n destroy_note(\n context,\n note,\n self.note_interface,\n );\n }\n // docs:end:remove\n\n // docs:start:get_notes\n pub fn get_notes(\n self,\n options: NoteGetterOptions,\n ) -> [Option; MAX_READ_REQUESTS_PER_CALL] {\n let storage_slot = self.storage_slot;\n let opt_notes = get_notes(\n self.context.private.unwrap(),\n storage_slot,\n self.note_interface,\n options,\n );\n opt_notes\n }\n // docs:end:get_notes\n\n // docs:start:view_notes\n unconstrained pub fn view_notes(\n self,\n options: NoteViewerOptions,\n ) -> [Option; MAX_NOTES_PER_PAGE] {\n view_notes(self.storage_slot, self.note_interface, options)\n }\n // docs:end:view_notes\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/state_vars/set.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/state_vars/set.nr" }, "49": { "source": "use crate::context::{PrivateContext, PublicContext, Context};\nuse dep::std::option::Option;\nuse dep::protocol_types::{\n hash::pedersen_hash,\n traits::{ToField}\n};\n\n// docs:start:map\nstruct Map {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl Map {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map {\n context,\n storage_slot,\n state_var_constructor,\n }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V where K: ToField {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = pedersen_hash([self.storage_slot, key.to_field()],0);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/state_vars/map.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/state_vars/map.nr" }, "50": { "source": "use crate::context::{Context};\nuse crate::oracle::storage::storage_read;\nuse crate::oracle::storage::storage_write;\nuse crate::types::type_serialization::TypeSerializationInterface;\nuse dep::std::option::Option;\n\n// docs:start:public_state_struct\nstruct PublicState {\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface,\n}\n// docs:end:public_state_struct\n\nimpl PublicState {\n // docs:start:public_state_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicState {\n context,\n storage_slot,\n serialization_methods,\n }\n }\n // docs:end:public_state_struct_new\n\n // docs:start:public_state_struct_read\n pub fn read(self) -> T {\n assert(self.context.private.is_none(), \"Public state reads only supported in public functions\");\n storage_read(self.storage_slot, self.serialization_methods.deserialize)\n }\n // docs:end:public_state_struct_read\n\n // docs:start:public_state_struct_write\n pub fn write(self, value: T) {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n let serialize = self.serialization_methods.serialize;\n let fields = serialize(value);\n storage_write(self.storage_slot, fields);\n }\n // docs:end:public_state_struct_write\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/state_vars/public_state.nr" }, "56": { "source": "#[oracle(storageRead)]\nfn storage_read_oracle(_storage_slot: Field, _number_of_elements: Field) -> [Field; N] {}\n\nunconstrained fn storage_read_oracle_wrapper(_storage_slot: Field) -> [Field; N] {\n storage_read_oracle(_storage_slot, N)\n}\n\npub fn storage_read(storage_slot: Field, deserialize: fn([Field; N]) -> T) -> T {\n let fields = storage_read_oracle_wrapper(storage_slot);\n deserialize(fields)\n}\n\n#[oracle(storageWrite)]\nfn storage_write_oracle(_storage_slot: Field, _values: [Field; N]) -> [Field; N] {}\n\n// TODO: Remove return value.\nunconstrained pub fn storage_write(storage_slot: Field, fields: [Field; N]) {\n let _hash = storage_write_oracle(storage_slot, fields);\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/storage.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/storage.nr" }, "57": { "source": "use dep::protocol_types::{\n address::AztecAddress,\n constants::NUM_FIELDS_PER_SHA256,\n grumpkin_point::GrumpkinPoint,\n};\n\n// TODO: Should take encrypted data.\n#[oracle(emitEncryptedLog)]\nfn emit_encrypted_log_oracle(\n _contract_address: AztecAddress,\n _storage_slot: Field,\n _encryption_pub_key: GrumpkinPoint,\n _preimage: [Field; N]\n) -> Field {}\n\nunconstrained pub fn emit_encrypted_log(\n contract_address: AztecAddress,\n storage_slot: Field,\n encryption_pub_key: GrumpkinPoint,\n preimage: [Field; N]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n [emit_encrypted_log_oracle(contract_address, storage_slot, encryption_pub_key, preimage), 0]\n}\n\n#[oracle(emitUnencryptedLog)]\nfn emit_unencrypted_log_oracle(_contract_address: AztecAddress, _event_selector: Field, _message: T) -> Field {}\n\nunconstrained pub fn emit_unencrypted_log(\n contract_address: AztecAddress,\n event_selector: Field,\n message: T\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n // https://github.com/AztecProtocol/aztec-packages/issues/885\n [emit_unencrypted_log_oracle(contract_address, event_selector, message), 0]\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/logs.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/logs.nr" }, "59": { "source": "#[oracle(packArguments)]\nfn pack_arguments_oracle(_args: [Field; N]) -> Field {}\n\n// TODO: explain what this does.\nunconstrained pub fn pack_arguments(args: [Field; N]) -> Field {\n pack_arguments_oracle(args)\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/arguments.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/arguments.nr" }, "61": { "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n constants::RETURN_VALUES_LENGTH,\n};\n\n#[oracle(callPublicFunction)]\nfn call_public_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field\n) -> [Field; RETURN_VALUES_LENGTH] {}\n\nunconstrained pub fn call_public_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_oracle(contract_address, function_selector, args_hash)\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/public_call.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/public_call.nr" }, "65": { "source": "use dep::protocol_types::{\n address::{\n AztecAddress,\n PartialAddress,\n },\n grumpkin_point::GrumpkinPoint,\n};\n\n#[oracle(getPublicKeyAndPartialAddress)]\nfn get_public_key_and_partial_address_oracle(_address: AztecAddress) -> [Field; 3] {}\n\nunconstrained fn get_public_key_and_partial_address_internal(address: AztecAddress) -> [Field; 3] {\n get_public_key_and_partial_address_oracle(address)\n}\n\npub fn get_public_key(address: AztecAddress) -> GrumpkinPoint {\n let result = get_public_key_and_partial_address_internal(address);\n let pub_key = GrumpkinPoint::new(result[0], result[1]);\n let partial_address = PartialAddress::from_field(result[2]);\n\n let calculated_address = AztecAddress::compute(pub_key, partial_address);\n assert(calculated_address.eq(address));\n\n pub_key\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/get_public_key.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/get_public_key.nr" }, "69": { "source": "#[oracle(getRandomField)]\nfn rand_oracle() -> Field {}\n\nunconstrained pub fn rand() -> Field {\n rand_oracle()\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/rand.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/rand.nr" }, "70": { "source": "use dep::std::option::Option;\nuse crate::note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n};\nuse crate::utils::arr_copy_slice;\n\nuse dep::protocol_types::address::AztecAddress;\n\n#[oracle(notifyCreatedNote)]\nfn notify_created_note_oracle(_storage_slot: Field, _serialized_note: [Field; N], _inner_note_hash: Field) -> Field {}\n\nunconstrained pub fn notify_created_note(storage_slot: Field, serialized_note: [Field; N], inner_note_hash: Field) -> Field {\n notify_created_note_oracle(storage_slot, serialized_note, inner_note_hash)\n}\n\n#[oracle(notifyNullifiedNote)]\nfn notify_nullified_note_oracle(_nullifier: Field, _inner_note_hash: Field) -> Field {}\n\nunconstrained pub fn notify_nullified_note(nullifier: Field, inner_note_hash: Field) -> Field {\n notify_nullified_note_oracle(nullifier, inner_note_hash)\n}\n\n#[oracle(getNotes)]\nfn get_notes_oracle(\n _storage_slot: Field,\n _num_selects: u8,\n _select_by: [u8; N],\n _select_values: [Field; N],\n _sort_by: [u8; N],\n _sort_order: [u2; N],\n _limit: u32,\n _offset: u32,\n _return_size: u32,\n _placeholder_fields: [Field; S]\n) -> [Field; S] {}\n\nunconstrained fn get_notes_oracle_wrapper(\n storage_slot: Field,\n num_selects: u8,\n select_by: [u8; N],\n select_values: [Field; N],\n sort_by: [u8; N],\n sort_order: [u2; N],\n limit: u32,\n offset: u32,\n mut placeholder_fields: [Field; S]\n) -> [Field; S] {\n let return_size = placeholder_fields.len() as u32;\n get_notes_oracle(\n storage_slot,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n limit,\n offset,\n return_size,\n placeholder_fields\n )\n}\n\nunconstrained pub fn get_notes(\n storage_slot: Field,\n note_interface: NoteInterface,\n num_selects: u8,\n select_by: [u8; M],\n select_values: [Field; M],\n sort_by: [u8; M],\n sort_order: [u2; M],\n limit: u32,\n offset: u32,\n mut placeholder_opt_notes: [Option; S], // TODO: Remove it and use `limit` to initialize the note array.\n placeholder_fields: [Field; NS] // TODO: Remove it and use `limit` to initialize the note array.\n) -> [Option; S] {\n let fields = get_notes_oracle_wrapper(\n storage_slot,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n limit,\n offset,\n placeholder_fields\n );\n let num_notes = fields[0] as u32;\n let contract_address = AztecAddress::from_field(fields[1]);\n let deserialize = note_interface.deserialize;\n let set_header = note_interface.set_header;\n for i in 0..placeholder_opt_notes.len() {\n if i as u32 < num_notes {\n // lengths named as per typescript.\n let return_header_length: Field = 2; // num_notes & contract_address.\n let extra_preimage_length: Field = 2; // nonce & is_transient.\n let read_offset: Field = return_header_length + i * (N + extra_preimage_length);\n let nonce = fields[read_offset];\n let is_transient = fields[read_offset + 1] as bool;\n let header = NoteHeader { contract_address, nonce, storage_slot, is_transient };\n let serialized_note = arr_copy_slice(fields, [0; N], read_offset + 2);\n let mut note = deserialize(serialized_note);\n set_header(&mut note, header);\n placeholder_opt_notes[i] = Option::some(note);\n };\n }\n placeholder_opt_notes\n}\n\n#[oracle(checkNullifierExists)]\nfn check_nullifier_exists_oracle(_inner_nullifier: Field) -> Field {}\n\nunconstrained pub fn check_nullifier_exists(inner_nullifier: Field) -> bool {\n check_nullifier_exists_oracle(inner_nullifier) == 1\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/notes.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/notes.nr" }, "73": { "source": "use dep::protocol_types::{\n address::AztecAddress,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::grumpkin_scalar::GrumpkinScalar;\n\nstruct KeyPair {\n public_key: GrumpkinPoint,\n secret_key: GrumpkinScalar,\n}\n\n#[oracle(getNullifierKeyPair)]\nfn get_nullifier_key_pair_oracle(_account: AztecAddress) -> [Field; 4] {}\n\nunconstrained fn get_nullifier_key_pair_internal(account: AztecAddress) -> KeyPair {\n let result = get_nullifier_key_pair_oracle(account);\n KeyPair {\n public_key: GrumpkinPoint { x: result[0], y: result[1] },\n secret_key: GrumpkinScalar { high: result[2], low: result[3] }\n }\n}\n\npub fn get_nullifier_key_pair(account: AztecAddress) -> KeyPair {\n get_nullifier_key_pair_internal(account)\n}\n\npub fn get_nullifier_secret_key(account: AztecAddress) -> GrumpkinScalar {\n get_nullifier_key_pair_internal(account).secret_key\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/oracle/nullifier_key.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/oracle/nullifier_key.nr" }, "76": { - "source": "pub fn arr_copy_slice(src: [T; N], mut dst: [T; M], offset: Field) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n\n// TODO(#3470): Copied over from https://github.com/AztecProtocol/aztec-packages/blob/a07c4bd47313be6aa604a63f37857eb0136b41ba/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr#L599\n// move to a shared place?\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\nstruct Reader {\n data: [Field; N],\n offset: Field,\n}\n\nimpl Reader {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_array(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n } \n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/utils.nr" + "source": "pub fn arr_copy_slice(src: [T; N], mut dst: [T; M], offset: Field) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n\n// TODO(#3470): Copied over from https://github.com/AztecProtocol/aztec-packages/blob/a07c4bd47313be6aa604a63f37857eb0136b41ba/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr#L599\n// move to a shared place?\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\nstruct Reader {\n data: [Field; N],\n offset: Field,\n}\n\nimpl Reader {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_array(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n } \n}\n", + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/utils.nr" }, "77": { "source": "use crate::context::{PrivateContext, PublicContext};\nuse crate::oracle;\nuse dep::protocol_types::{\n address::AztecAddress,\n grumpkin_point::GrumpkinPoint,\n};\n\npub fn emit_encrypted_log(\n context: &mut PrivateContext,\n contract_address: AztecAddress,\n storage_slot: Field,\n encryption_pub_key: GrumpkinPoint,\n log: [Field; N]\n) {\n let _ = oracle::logs::emit_encrypted_log(contract_address, storage_slot, encryption_pub_key, log);\n context.accumulate_encrypted_logs(log);\n}\n\npub fn emit_unencrypted_log(context: &mut PublicContext, log: T) {\n let contract_address = context.this_address();\n let event_selector = 5; // TODO: compute actual event selector.\n let _ = oracle::logs::emit_unencrypted_log(contract_address, event_selector, log);\n // context.accumulate_unencrypted_logs(log);\n}\n\n// TODO: We might want to remove this since emitting unencrypted logs from private functions is violating privacy.\n// --> might be a better approach to force devs to make a public function call that emits the log if needed then\n// it would be less easy to accidentally leak information.\n// If we decide to keep this function around would make sense to wait for traits and then merge it with emit_unencrypted_log.\npub fn emit_unencrypted_log_from_private(context: &mut PrivateContext, log: T) {\n let contract_address = context.this_address();\n let event_selector = 5; // TODO: compute actual event selector.\n let _ = oracle::logs::emit_unencrypted_log(contract_address, event_selector, log);\n // context.accumulate_unencrypted_logs(log);\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/log.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/log.nr" }, "78": { "source": "use crate::oracle::get_public_key::get_public_key;\nuse dep::protocol_types::{\n address::AztecAddress,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::{\n grumpkin_scalar::GrumpkinScalar,\n grumpkin_scalar_mul::grumpkin_fixed_base,\n};\n\npub fn validate_nullifier_key_against_address(\n address: AztecAddress,\n nullifier_public_key: GrumpkinPoint,\n nullifier_secret_key: GrumpkinScalar\n) {\n // TODO: Nullifier public key should be part of the address.\n // Validation of the secret key should happen in the kernel circuit.\n let owner_public_key = get_public_key(address);\n assert(owner_public_key.x == nullifier_public_key.x);\n assert(owner_public_key.y == nullifier_public_key.y);\n let computed_public_key = grumpkin_fixed_base(nullifier_secret_key);\n assert(owner_public_key.x == computed_public_key[0]);\n assert(owner_public_key.y == computed_public_key[1]);\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/key/nullifier_key.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/key/nullifier_key.nr" }, "87": { "source": "use dep::std::option::Option;\nuse dep::protocol_types::constants::{\n MAX_READ_REQUESTS_PER_CALL,\n GET_NOTE_ORACLE_RETURN_LENGTH,\n GET_NOTES_ORACLE_RETURN_LENGTH,\n MAX_NOTES_PER_PAGE,\n VIEW_NOTE_ORACLE_RETURN_LENGTH,\n};\nuse crate::context::PrivateContext;\nuse crate::note::{\n note_getter_options::{NoteGetterOptions, Select, Sort, SortOrder},\n note_interface::NoteInterface,\n note_viewer_options::NoteViewerOptions,\n utils::compute_note_hash_for_read_or_nullify,\n};\nuse crate::oracle;\nuse crate::types::vec::BoundedVec;\n\nfn check_note_header(\n context: PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface,\n note: Note\n) {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n let contract_address = context.this_address();\n assert(header.contract_address.eq(contract_address));\n assert(header.storage_slot == storage_slot);\n}\n\nfn check_note_fields(fields: [Field; N], selects: BoundedVec, N>) {\n for i in 0..selects.len {\n let select = selects.get_unchecked(i).unwrap_unchecked();\n assert(fields[select.field_index] == select.value, \"Mismatch return note field.\");\n }\n}\n\nfn check_notes_order(\n fields_0: [Field; N],\n fields_1: [Field; N],\n sorts: BoundedVec, N>\n) {\n for i in 0..sorts.len {\n let sort = sorts.get_unchecked(i).unwrap_unchecked();\n let eq = fields_0[sort.field_index] == fields_1[sort.field_index];\n let lt = fields_0[sort.field_index] as u120 < fields_1[sort.field_index] as u120;\n if sort.order == SortOrder.ASC {\n assert(eq | lt, \"Return notes not sorted in ascending order.\");\n } else if !eq {\n assert(!lt, \"Return notes not sorted in descending order.\");\n }\n }\n}\n\npub fn get_note(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface\n) -> Note {\n let note = get_note_internal(storage_slot, note_interface);\n\n check_note_header(*context, storage_slot, note_interface, note);\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n\n context.push_read_request(note_hash_for_read_request);\n note\n}\n\npub fn get_notes(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface,\n options: NoteGetterOptions\n) -> [Option; MAX_READ_REQUESTS_PER_CALL] {\n let opt_notes = get_notes_internal(storage_slot, note_interface, options);\n let mut num_notes = 0;\n let mut prev_fields = [0; N];\n for i in 0..opt_notes.len() {\n let opt_note = opt_notes[i];\n if opt_note.is_some() {\n let note = opt_note.unwrap_unchecked();\n let serialize = note_interface.serialize;\n let fields = serialize(note);\n check_note_header(*context, storage_slot, note_interface, note);\n check_note_fields(fields, options.selects);\n if i != 0 {\n check_notes_order(prev_fields, fields, options.sorts);\n }\n prev_fields = fields;\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1410): test to ensure\n // failure if malicious oracle injects 0 nonce here for a \"pre-existing\" note.\n context.push_read_request(note_hash_for_read_request);\n\n num_notes += 1;\n };\n }\n if options.limit != 0 {\n assert(num_notes <= options.limit, \"Invalid number of return notes.\");\n }\n opt_notes\n}\n\nunconstrained fn get_note_internal(storage_slot: Field, note_interface: NoteInterface) -> Note {\n let placeholder_note = [Option::none()];\n let placeholder_fields = [0; GET_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n 0,\n [],\n [],\n [],\n [],\n 1, // limit\n 0, // offset\n placeholder_note,\n placeholder_fields\n )[0].unwrap() // Notice: we don't allow dummies to be returned from get_note (singular).\n}\n\nunconstrained fn get_notes_internal(\n storage_slot: Field,\n note_interface: NoteInterface,\n options: NoteGetterOptions\n) -> [Option; MAX_READ_REQUESTS_PER_CALL] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_READ_REQUESTS_PER_CALL];\n let placeholder_fields = [0; GET_NOTES_ORACLE_RETURN_LENGTH];\n let opt_notes = oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields\n );\n\n let filter = options.filter;\n let filter_args = options.filter_args;\n filter(opt_notes, filter_args)\n}\n\nunconstrained pub fn view_notes(\n storage_slot: Field,\n note_interface: NoteInterface,\n options: NoteViewerOptions\n) -> [Option; MAX_NOTES_PER_PAGE] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_NOTES_PER_PAGE];\n let placeholder_fields = [0; VIEW_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields\n )\n}\n\nunconstrained fn flatten_options(\n selects: BoundedVec, N>,\n sorts: BoundedVec, N>\n) -> (u8, [u8; N], [Field; N], [u8; N], [u2; N]) {\n let mut num_selects = 0;\n let mut select_by = [0; N];\n let mut select_values = [0; N];\n for i in 0..selects.len {\n let select = selects.get(i);\n if select.is_some() {\n select_by[num_selects] = select.unwrap_unchecked().field_index;\n select_values[num_selects] = select.unwrap_unchecked().value;\n num_selects += 1;\n };\n }\n\n let mut sort_by = [0; N];\n let mut sort_order = [0; N];\n for i in 0..sorts.len {\n let sort = sorts.get(i);\n if sort.is_some() {\n sort_by[i] = sort.unwrap_unchecked().field_index;\n sort_order[i] = sort.unwrap_unchecked().order;\n };\n }\n\n (num_selects, select_by, select_values, sort_by, sort_order)\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/note/note_getter.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/note/note_getter.nr" }, "88": { "source": "use crate::abi::PublicContextInputs;\nuse crate::context::{\n PrivateContext,\n PublicContext,\n};\nuse crate::note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n utils::compute_inner_note_hash,\n};\nuse crate::oracle::notes::{notify_created_note, notify_nullified_note};\n\npub fn create_note(\n context: &mut PrivateContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface,\n broadcast: bool\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0, is_transient: true };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n let serialize = note_interface.serialize;\n let serialized_note = serialize(*note);\n assert(notify_created_note(storage_slot, serialized_note, inner_note_hash) == 0);\n\n context.push_new_note_hash(inner_note_hash);\n\n if broadcast {\n let broadcast = note_interface.broadcast;\n broadcast(context, storage_slot, *note);\n }\n}\n\npub fn create_note_hash_from_public(\n context: &mut PublicContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0, is_transient: true };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n context.push_new_note_hash(inner_note_hash);\n}\n\npub fn destroy_note(\n context: &mut PrivateContext,\n note: Note,\n note_interface: NoteInterface\n) {\n let mut nullifier = 0;\n let mut nullified_commitment: Field = 0;\n let compute_nullifier = note_interface.compute_nullifier;\n nullifier = compute_nullifier(note, context);\n\n // We also need the note commitment corresponding to the \"nullifier\"\n let get_header = note_interface.get_header;\n let header = get_header(note);\n // `nullified_commitment` is used to inform the kernel which pending commitment\n // the nullifier corresponds to so they can be matched and both squashed/deleted.\n // nonzero nonce implies \"persistable\" nullifier (nullifies a persistent/in-tree\n // commitment) in which case `nullified_commitment` is not used since the kernel\n // just siloes and forwards the nullifier to its output.\n if (header.is_transient) {\n // TODO(1718): Can we reuse the note commitment computed in `compute_nullifier`?\n nullified_commitment = compute_inner_note_hash(note_interface, note);\n }\n assert(notify_nullified_note(nullifier, nullified_commitment) == 0);\n\n context.push_new_nullifier(nullifier, nullified_commitment)\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/note/lifecycle.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/note/lifecycle.nr" }, "91": { "source": "use dep::protocol_types::{\n address::AztecAddress,\n constants::{\n GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__SILOED_COMMITMENT,\n },\n hash::pedersen_hash,\n};\n\npub fn compute_inner_hash(storage_slot: Field, note_hash: Field) -> Field {\n // TODO(#1205) Do we need a generator index here?\n pedersen_hash([storage_slot, note_hash], 0)\n}\n\npub fn compute_siloed_hash(contract_address: AztecAddress, inner_note_hash: Field) -> Field {\n let inputs = [contract_address.to_field(), inner_note_hash];\n pedersen_hash(inputs, GENERATOR_INDEX__SILOED_COMMITMENT)\n}\n\npub fn compute_unique_hash(nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [nonce, siloed_note_hash];\n pedersen_hash(inputs, GENERATOR_INDEX__UNIQUE_COMMITMENT)\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/note/note_hash.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/note/note_hash.nr" }, "92": { "source": "use dep::protocol_types::{\n constants::GENERATOR_INDEX__OUTER_NULLIFIER,\n hash::pedersen_hash,\n};\nuse crate::{\n context::PrivateContext,\n note::{\n note_hash::{compute_inner_hash, compute_siloed_hash, compute_unique_hash},\n note_header::NoteHeader,\n note_interface::NoteInterface,\n },\n utils::arr_copy_slice,\n};\n\npub fn compute_inner_note_hash(note_interface: NoteInterface, note: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n\n compute_inner_hash(header.storage_slot, note_hash)\n}\n\npub fn compute_siloed_note_hash(note_interface: NoteInterface, note_with_header: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let inner_note_hash = compute_inner_note_hash(note_interface, note_with_header);\n\n compute_siloed_hash(header.contract_address, inner_note_hash)\n}\n\npub fn compute_unique_siloed_note_hash(note_interface: NoteInterface, note_with_header: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let siloed_note_hash = compute_siloed_note_hash(note_interface, note_with_header);\n\n compute_unique_hash(header.nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier(\n note_interface: NoteInterface,\n note_with_header: Note,\n context: &mut PrivateContext\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let compute_nullifier = note_interface.compute_nullifier;\n let inner_nullifier = compute_nullifier(note_with_header, context);\n\n let input = [header.contract_address.to_field(), inner_nullifier];\n pedersen_hash(input, GENERATOR_INDEX__OUTER_NULLIFIER)\n}\n\npub fn compute_note_hash_for_read_or_nullify(note_interface: NoteInterface, note_with_header: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386)\n if (header.is_transient) {\n // If a note is transient, we just read the inner_note_hash (kernel will silo by contract address).\n compute_inner_note_hash(note_interface, note_with_header)\n } else if (header.nonce == 0) {\n // If not transient and nonce is zero, that means we are reading a public note.\n compute_siloed_note_hash(note_interface, note_with_header)\n } else {\n // When nonce is nonzero, that means we are reading a settled note (from tree) created in a\n // previous TX. So we need the unique_siloed_note_hash which has already been hashed with\n // contract address and then nonce. This hash will match the existing leaf in the private\n // data tree, so the kernel can just perform a membership check directly on this hash/leaf.\n compute_unique_siloed_note_hash(note_interface, note_with_header)\n }\n}\n\npub fn compute_note_hash_and_nullifier(\n note_interface: NoteInterface,\n note_header: NoteHeader,\n serialized_note: [Field; S]\n) -> [Field; 4] {\n let deserialize = note_interface.deserialize;\n let set_header = note_interface.set_header;\n let mut note = deserialize(arr_copy_slice(serialized_note, [0; N], 0));\n set_header(&mut note, note_header);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n let inner_note_hash = compute_inner_hash(note_header.storage_slot, note_hash);\n\n let siloed_note_hash = compute_siloed_hash(note_header.contract_address, inner_note_hash);\n\n let unique_siloed_note_hash = compute_unique_hash(note_header.nonce, siloed_note_hash);\n\n let compute_nullifier_without_context = note_interface.compute_nullifier_without_context;\n let inner_nullifier = compute_nullifier_without_context(note);\n\n [inner_note_hash, siloed_note_hash, unique_siloed_note_hash, inner_nullifier]\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/note/utils.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/note/utils.nr" }, "94": { "source": "struct BoundedVec {\n storage: [T; MaxLen],\n len: Field,\n}\n\nimpl BoundedVec {\n pub fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0 }\n }\n\n pub fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n pub fn get_unchecked(mut self: Self, index: Field) -> T {\n self.storage[index]\n }\n\n pub fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64);\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n pub fn push_array(&mut self, array: [T; Len]) {\n let newLen = self.len + array.len();\n assert(newLen as u64 <= MaxLen as u64);\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = newLen;\n }\n\n pub fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n\n let elem = self.storage[self.len - 1];\n self.len -= 1;\n elem\n }\n\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if (!exceeded_len) {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n}\n\n#[test]\nfn test_vec_push_pop() {\n let mut vec: BoundedVec = BoundedVec::new(0);\n assert(vec.len == 0);\n vec.push(2);\n assert(vec.len == 1);\n vec.push(4);\n assert(vec.len == 2);\n vec.push(6);\n assert(vec.len == 3);\n let x = vec.pop();\n assert(x == 6);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test]\nfn test_vec_push_array() {\n let mut vec: BoundedVec = BoundedVec::new(0);\n vec.push_array([2, 4]);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test(should_fail)]\nfn test_vec_get_out_of_bound() {\n let mut vec: BoundedVec = BoundedVec::new(0);\n vec.push_array([2, 4]);\n let _x = vec.get(2);\n}\n\n#[test(should_fail)]\nfn test_vec_get_not_declared() {\n let mut vec: BoundedVec = BoundedVec::new(0);\n vec.push_array([2]);\n let _x = vec.get(1);\n}\n\n#[test(should_fail)]\nfn test_vec_get_uninitialized() {\n let mut vec: BoundedVec = BoundedVec::new(0);\n let _x = vec.get(0);\n}\n\n#[test(should_fail)]\nfn test_vec_push_overflow() {\n let mut vec: BoundedVec = BoundedVec::new(0);\n vec.push(1);\n vec.push(2);\n}\n\n#[test]\nfn test_vec_any() {\n let mut vec: BoundedVec = BoundedVec::new(0);\n vec.push_array([2, 4, 6]);\n assert(vec.any(|v| v == 2) == true);\n assert(vec.any(|v| v == 4) == true);\n assert(vec.any(|v| v == 6) == true);\n assert(vec.any(|v| v == 3) == false);\n}\n\n#[test]\nfn test_vec_any_not_default() {\n let default_value = 1;\n let mut vec: BoundedVec = BoundedVec::new(default_value);\n vec.push_array([2, 4]);\n assert(vec.any(|v| v == default_value) == false);\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/types/vec.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/types/vec.nr" }, "97": { "source": "use crate::types::type_serialization::TypeSerializationInterface;\n\n// docs:start:field_serialization\nglobal FIELD_SERIALIZED_LEN: Field = 1;\n\nfn deserializeField(fields: [Field; FIELD_SERIALIZED_LEN]) -> Field {\n fields[0]\n}\n\nfn serializeField(value: Field) -> [Field; FIELD_SERIALIZED_LEN] {\n [value]\n}\n\nglobal FieldSerializationMethods = TypeSerializationInterface {\n deserialize: deserializeField,\n serialize: serializeField,\n};\n// docs:end:field_serialization", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/aztec/src/types/type_serialization/field_serialization.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/aztec/src/types/type_serialization/field_serialization.nr" }, "105": { "source": "global ARGS_LENGTH: Field = 16;\nglobal RETURN_VALUES_LENGTH: Field = 4;\n\n/**\n * Convention for constant array lengths are mainly divided in 2 classes:\n * - FUNCTION CALL\n * - TRANSACTION\n *\n * Agreed convention is to use MAX_XXX_PER_CALL resp. MAX_XXX_PER_TX, where XXX denotes a type of element such as\n * commitment, or nullifier, e.g.,:\n * - MAX_NEW_NULLIFIERS_PER_CALL\n * - MAX_NEW_COMMITMENTS_PER_TX\n *\n * In the kernel circuits, we accumulate elements such as commitments and the nullifiers from all functions calls in a\n * transaction. Therefore, we always must have:\n * MAX_XXX_PER_TX ≥ MAX_XXX_PER_CALL\n *\n * For instance:\n * MAX_NEW_COMMITMENTS_PER_TX ≥ MAX_NEW_COMMITMENTS_PER_CALL\n * MAX_NEW_NULLIFIERS_PER_TX ≥ MAX_NEW_NULLIFIERS_PER_CALL\n *\n */\n\n// docs:start:constants\n// \"PER CALL\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_CALL: Field = 16;\nglobal MAX_NEW_NULLIFIERS_PER_CALL: Field = 16;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_CALL: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_CALL: Field = 16;\nglobal MAX_READ_REQUESTS_PER_CALL: Field = 32;\n\n// \"PER TRANSACTION\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_TX: Field = 64;\nglobal MAX_NEW_NULLIFIERS_PER_TX: Field = 64;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_TX: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_TX: Field = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: Field = 1;\nglobal MAX_OPTIONALLY_REVEALED_DATA_LENGTH_PER_TX: Field = 4;\nglobal MAX_READ_REQUESTS_PER_TX: Field = 128;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\n// docs:end:constants\n\n// ROLLUP CONTRACT CONSTANTS - constants used only in l1-contracts\nglobal NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: Field = 16;\n\n// TREES RELATED CONSTANTS\nglobal VK_TREE_HEIGHT: Field = 3;\nglobal FUNCTION_TREE_HEIGHT: Field = 5;\nglobal CONTRACT_TREE_HEIGHT: Field = 16;\nglobal NOTE_HASH_TREE_HEIGHT: Field = 32;\nglobal PUBLIC_DATA_TREE_HEIGHT: Field = 40;\nglobal NULLIFIER_TREE_HEIGHT: Field = 20;\nglobal L1_TO_L2_MSG_TREE_HEIGHT: Field = 16;\nglobal ROLLUP_VK_TREE_HEIGHT: Field = 8;\n\n// SUB-TREES RELATED CONSTANTS\nglobal CONTRACT_SUBTREE_HEIGHT: Field = 0;\nglobal CONTRACT_SUBTREE_SIBLING_PATH_LENGTH: Field = 16;\nglobal NOTE_HASH_SUBTREE_HEIGHT: Field = 6;\nglobal NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH: Field = 26;\nglobal NULLIFIER_SUBTREE_HEIGHT: Field = 6;\nglobal PUBLIC_DATA_SUBTREE_HEIGHT: Field = 4;\nglobal ARCHIVE_HEIGHT: Field = 16;\nglobal NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH: Field = 14;\nglobal PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH: Field = 36;\nglobal L1_TO_L2_MSG_SUBTREE_HEIGHT: Field = 4;\nglobal L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH: Field = 12;\n\n// MISC CONSTANTS\nglobal FUNCTION_SELECTOR_NUM_BYTES: Field = 4;\nglobal MAPPING_SLOT_PEDERSEN_SEPARATOR: Field = 4;\n// sha256 hash is stored in two fields to accommodate all 256-bits of the hash\nglobal NUM_FIELDS_PER_SHA256: Field = 2;\nglobal ARGS_HASH_CHUNK_LENGTH: u32 = 32;\nglobal ARGS_HASH_CHUNK_COUNT: u32 = 16;\n\n// NOIR CONSTANTS - constants used only in yarn-packages/noir-contracts\n// Some are defined here because Noir doesn't yet support globals referencing other globals yet.\n// Move these constants to a noir file once the issue bellow is resolved:\n// https://github.com/noir-lang/noir/issues/1734\nglobal L1_TO_L2_MESSAGE_LENGTH: Field = 8;\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: Field = 25;\nglobal MAX_NOTE_FIELDS_LENGTH: Field = 20;\n// GET_NOTE_ORACLE_RETURN_LENGT = MAX_NOTE_FIELDS_LENGTH + 1 + 2\n// The plus 1 is 1 extra field for nonce.\n// + 2 for EXTRA_DATA: [number_of_return_notes, contract_address]\nglobal GET_NOTE_ORACLE_RETURN_LENGTH: Field = 23;\nglobal MAX_NOTES_PER_PAGE: Field = 10;\n// VIEW_NOTE_ORACLE_RETURN_LENGTH = MAX_NOTES_PER_PAGE * (MAX_NOTE_FIELDS_LENGTH + 1) + 2;\nglobal VIEW_NOTE_ORACLE_RETURN_LENGTH: Field = 212;\nglobal CALL_CONTEXT_LENGTH: Field = 8;\nglobal BLOCK_HEADER_LENGTH: Field = 7;\nglobal FUNCTION_DATA_LENGTH: Field = 4;\nglobal CONTRACT_DEPLOYMENT_DATA_LENGTH: Field = 6;\n// Change this ONLY if you have changed the PrivateCircuitPublicInputs structure.\n// In other words, if the structure/size of the public inputs of a function call changes then we\n// should change this constant as well as the offsets in private_call_stack_item.nr\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 189;\nglobal CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: Field = 3;\nglobal CONTRACT_STORAGE_READ_LENGTH: Field = 2;\n// Change this ONLY if you have changed the PublicCircuitPublicInputs structure.\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 190;\nglobal GET_NOTES_ORACLE_RETURN_LENGTH: Field = 674;\nglobal CALL_PRIVATE_FUNCTION_RETURN_SIZE: Field = 195;\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 87;\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 177;\nglobal COMMITMENTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP: Field = 1024;\nglobal CONTRACTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 32;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP_UNPADDED: Field = 52;\nglobal L2_TO_L1_MSGS_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\n\n/**\n * Enumerate the hash_indices which are used for pedersen hashing.\n * We start from 1 to avoid the default generators. The generator indices are listed\n * based on the number of elements each index hashes. The following conditions must be met:\n *\n * +-----------+-------------------------------+----------------------+\n * | Hash size | Number of elements hashed (n) | Condition to use |\n * |-----------+-------------------------------+----------------------|\n * | LOW | n ≤ 8 | 0 < hash_index ≤ 32 |\n * | MID | 8 < n ≤ 16 | 32 < hash_index ≤ 40 |\n * | HIGH | 16 < n ≤ 48 | 40 < hash_index ≤ 48 |\n * +-----------+-------------------------------+----------------------+\n *\n * Note: When modifying, modify `GeneratorIndexPacker` in packer.hpp accordingly.\n */\n// Indices with size ≤ 8\nglobal GENERATOR_INDEX__COMMITMENT = 1;\nglobal GENERATOR_INDEX__COMMITMENT_NONCE = 2;\nglobal GENERATOR_INDEX__UNIQUE_COMMITMENT = 3;\nglobal GENERATOR_INDEX__SILOED_COMMITMENT = 4;\nglobal GENERATOR_INDEX__NULLIFIER = 5;\nglobal GENERATOR_INDEX__INITIALIZATION_NULLIFIER = 6;\nglobal GENERATOR_INDEX__OUTER_NULLIFIER = 7;\nglobal GENERATOR_INDEX__PUBLIC_DATA_READ = 8;\nglobal GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST = 9;\nglobal GENERATOR_INDEX__FUNCTION_DATA = 10;\nglobal GENERATOR_INDEX__FUNCTION_LEAF = 11;\nglobal GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA = 12;\nglobal GENERATOR_INDEX__CONSTRUCTOR = 13;\nglobal GENERATOR_INDEX__CONSTRUCTOR_ARGS = 14;\nglobal GENERATOR_INDEX__CONTRACT_ADDRESS = 15;\nglobal GENERATOR_INDEX__CONTRACT_LEAF = 16;\nglobal GENERATOR_INDEX__CALL_CONTEXT = 17;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM = 18;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM_2 = 19;\nglobal GENERATOR_INDEX__L1_TO_L2_MESSAGE_SECRET = 20;\nglobal GENERATOR_INDEX__L2_TO_L1_MSG = 21;\nglobal GENERATOR_INDEX__TX_CONTEXT = 22;\nglobal GENERATOR_INDEX__PUBLIC_LEAF_INDEX = 23;\nglobal GENERATOR_INDEX__PUBLIC_DATA_LEAF = 24;\nglobal GENERATOR_INDEX__SIGNED_TX_REQUEST = 25;\nglobal GENERATOR_INDEX__GLOBAL_VARIABLES = 26;\nglobal GENERATOR_INDEX__PARTIAL_ADDRESS = 27;\nglobal GENERATOR_INDEX__BLOCK_HASH = 28;\nglobal GENERATOR_INDEX__SIDE_EFFECT = 29;\n// Indices with size ≤ 16\nglobal GENERATOR_INDEX__TX_REQUEST = 33;\nglobal GENERATOR_INDEX__SIGNATURE_PAYLOAD = 34;\n// Indices with size ≤ 44\nglobal GENERATOR_INDEX__VK = 41;\nglobal GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS = 42;\nglobal GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS = 43;\nglobal GENERATOR_INDEX__FUNCTION_ARGS = 44;\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr" + "path": "/home/santiago/Projects/aztec3-packages/noir-protocol-circuits/src/crates/types/src/constants.nr" }, "111": { "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::mocked::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::function_leaf_preimage::FunctionLeafPreimage;\nuse crate::abis::new_contract_data::NewContractData as ContractLeafPreimage;\nuse crate::abis::function_data::FunctionData;\nuse crate::abis::side_effect::{SideEffect};\nuse crate::utils::uint256::U256;\nuse crate::utils::bounded_vec::BoundedVec;\nuse crate::constants::{\n ARGS_HASH_CHUNK_COUNT,\n ARGS_HASH_CHUNK_LENGTH,\n CONTRACT_TREE_HEIGHT, \n FUNCTION_TREE_HEIGHT, \n NOTE_HASH_TREE_HEIGHT,\n NUM_FIELDS_PER_SHA256,\n GENERATOR_INDEX__SILOED_COMMITMENT,\n GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK,\n GENERATOR_INDEX__CONSTRUCTOR,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__COMMITMENT_NONCE,\n GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__FUNCTION_ARGS,\n};\n\nuse dep::std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (sha256_hashed[15 - i] as Field) * v;\n low = low + (sha256_hashed[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n let hash_in_a_field = low + high * v;\n\n hash_in_a_field\n}\n\npub fn hash_args(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = pedersen_hash(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n chunks_hashes[i] = chunk_hash;\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n// Checks that `value` is a member of a merkle tree with root `root` at position `index`\n// The witness being the `sibling_path`\npub fn assert_check_membership(value: Field, index: Field, sibling_path: [Field; N], root: Field) {\n let calculated_root = root_from_sibling_path(value, index, sibling_path);\n assert(calculated_root == root, \"membership check failed\");\n}\n\n// Calculate the Merkle tree root from the sibling path and leaf.\n//\n// The leaf is hashed with its sibling, and then the result is hashed\n// with the next sibling etc in the path. The last hash is the root.\n//\n// TODO(David/Someone): The cpp code is using a uint256, whereas its\n// TODO a bit simpler in Noir to just have a bit array.\n// TODO: I'd generally like to avoid u256 for algorithms like \n// this because it means we never even need to consider cases where \n// the index is greater than p.\npub fn root_from_sibling_path(leaf: Field, leaf_index: Field, sibling_path: [Field; N]) -> Field {\n let mut node = leaf;\n let indices = leaf_index.to_le_bits(N);\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = merkle_hash(hash_left, hash_right);\n }\n node\n}\n\n// Calculate the function tree root from the sibling path and leaf preimage.\n//\n// TODO: The cpp code passes in components of the FunctionLeafPreimage and then \n// builds it up. We should build it up and then pass the leaf preimage as a parameter.\n// We can then choose to have a general method that takes in anything hashable\n// and deduplicate the logic in `contract_tree_root_from_siblings`\npub fn function_tree_root_from_siblings(\n selector: FunctionSelector,\n is_internal: bool,\n is_private: bool,\n vk_hash: Field,\n acir_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = FunctionLeafPreimage { selector, is_internal, is_private, vk_hash, acir_hash };\n\n let function_leaf = function_leaf_preimage.hash();\n\n let function_tree_root = root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path);\n\n function_tree_root\n}\n\n// Calculate the contract tree root from the sibling path and leaf preimage.\npub fn contract_tree_root_from_siblings(\n function_tree_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n contract_leaf_index: Field,\n contract_leaf_sibling_path: [Field; CONTRACT_TREE_HEIGHT]\n) -> Field {\n //TODO(Kev): if we use shorthand syntax here, we get an error as expected,\n // since variable name is `storage_contract_address` but the span is incorrect.\n let contract_leaf_preimage = ContractLeafPreimage { contract_address: storage_contract_address, portal_contract_address, function_tree_root };\n\n let contract_leaf = contract_leaf_preimage.hash();\n\n let computed_contract_tree_root = root_from_sibling_path(contract_leaf, contract_leaf_index, contract_leaf_sibling_path);\n\n computed_contract_tree_root\n}\n\npub fn read_request_root_from_siblings(\n read_request: Field,\n leaf_index: Field,\n sibling_path: [Field; NOTE_HASH_TREE_HEIGHT]\n) -> Field {\n root_from_sibling_path(read_request, leaf_index, sibling_path)\n}\n\npub fn silo_commitment(address: AztecAddress, inner_commitment: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n inner_commitment\n ],\n GENERATOR_INDEX__SILOED_COMMITMENT\n )\n}\n\npub fn silo_nullifier(address: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\nfn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\n// TODO CPP uses blake2s for this\npub fn compute_new_contract_address_hash(new_contract_address: AztecAddress) -> Field {\n dep::std::hash::pedersen_hash([new_contract_address.to_field()])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n rollup_version_id: Field,\n portal_contract_address: EthAddress,\n chain_id: Field,\n content: Field\n) -> Field {\n let mut bytes: BoundedVec = BoundedVec::new(0);\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, portal_contract_address.to_field(), chain_id, content\n ];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn compute_constructor_hash(\n function_data: FunctionData,\n args_hash: Field,\n constructor_vk_hash: Field\n) -> Field {\n let function_data_hash = function_data.hash();\n\n pedersen_hash(\n [\n function_data_hash,\n args_hash,\n constructor_vk_hash\n ],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n\n// Computes sha256 hash of 2 input hashes stored in 4 fields.\n// \n// This method is bn254 specific. Two fields is needed in order to \n// encode the sha256 output. It can be abstracted away with any 4-2 hash function.\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\n// Returning a Field would be desirable because then this can be replaced with \n// poseidon without changing the rest of the code\n//\npub fn accumulate_sha256(input: [U128; 4]) -> [Field; NUM_FIELDS_PER_SHA256] {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually \n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field \n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n //\n // Concatenate 4 u128 bit integers into a byte array.\n let mut hash_input_flattened = [0; 64];\n for offset in 0..4 {\n let input_as_bytes = input[offset].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[offset * 16 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let sha_digest = dep::std::hash::sha256(hash_input_flattened);\n\n U256::from_bytes32(sha_digest).to_u128_limbs()\n}\n\npub fn compute_logs_hash(\n previous_log_hash: [Field; 2],\n current_log_hash: [Field; 2]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n accumulate_sha256(\n [\n U128::from_integer(previous_log_hash[0]),\n U128::from_integer(previous_log_hash[1]),\n U128::from_integer(current_log_hash[0]),\n U128::from_integer(current_log_hash[1])\n ]\n )\n}\n\npub fn compute_commitment_nonce(first_nullifier: Field, commitment_index: Field) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n commitment_index\n ],\n GENERATOR_INDEX__COMMITMENT_NONCE\n )\n}\n\npub fn compute_unique_siloed_commitment(nonce: Field, siloed_commitment: Field) -> Field {\n pedersen_hash(\n [\n nonce,\n siloed_commitment\n ],\n GENERATOR_INDEX__UNIQUE_COMMITMENT\n )\n}\n\npub fn compute_unique_siloed_commitments(\n first_nullifier: Field,\n siloed_commitments: [SideEffect; N]\n) -> [SideEffect; N] {\n let mut unique_siloed_commitments = [SideEffect::empty(); N];\n for i in 0..N {\n let siloed_commitment = siloed_commitments[i];\n if siloed_commitment.value != 0 {\n let nonce = compute_commitment_nonce(first_nullifier, i);\n unique_siloed_commitments[i] = SideEffect {\n value: compute_unique_siloed_commitment(nonce, siloed_commitment.value),\n counter: siloed_commitment.counter\n };\n }\n }\n unique_siloed_commitments\n}\n\npub fn pedersen_hash(inputs: [Field; N], hash_index: u32) -> Field {\n dep::std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr" + "path": "/home/santiago/Projects/aztec3-packages/noir-protocol-circuits/src/crates/types/src/hash.nr" }, "126": { "source": "pub fn field_from_bytes(bytes: [u8; N], big_endian: bool) -> Field {\n assert(bytes.len() as u32 < 32, \"field_from_bytes: N must be less than 32\");\n let mut as_field = 0;\n let mut offset = 1;\n for i in 0..N {\n let mut index = i;\n if big_endian {\n index = N - i - 1;\n }\n as_field += (bytes[index] as Field) * offset;\n offset *= 256;\n }\n\n as_field\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/noir-protocol-circuits/src/crates/types/src/utils/field.nr" + "path": "/home/santiago/Projects/aztec3-packages/noir-protocol-circuits/src/crates/types/src/utils/field.nr" }, "150": { "source": "use crate::utils::field::field_from_bytes;\nuse dep::std::cmp::Eq;\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n\n pub fn from_u32(value: u32) -> Self {\n Self {\n inner : value,\n }\n }\n\n pub fn from_field(value : Field) -> Self {\n Self {\n inner : value as u32,\n }\n }\n\n pub fn from_signature(signature: str) -> Self {\n let bytes = signature.as_bytes();\n let hash = dep::std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr" + "path": "/home/santiago/Projects/aztec3-packages/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr" }, "160": { "source": "use crate::{\n constants::{\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n },\n hash::pedersen_hash,\n utils,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, ToField};\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(pub_key: GrumpkinPoint, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n pedersen_hash(\n [pub_key.x, pub_key.y, partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS\n )\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n \n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl EthAddress{\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(contract_address_salt : Field, function_tree_root : Field, constructor_hash : Field) -> Self {\n PartialAddress::from_field(\n pedersen_hash([\n // TODO why the zeroes?\n 0,\n 0,\n contract_address_salt,\n function_tree_root,\n constructor_hash\n ], GENERATOR_INDEX__PARTIAL_ADDRESS)\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr" + "path": "/home/santiago/Projects/aztec3-packages/noir-protocol-circuits/src/crates/types/src/address.nr" }, "163": { "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_READ_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_READ,\n },\n hash::pedersen_hash,\n};\nuse crate::traits::Empty;\n\nstruct StorageRead {\n storage_slot: Field,\n current_value: Field,\n}\n\nimpl Empty for StorageRead { \n fn empty() -> Self {\n Self {\n storage_slot: 0,\n current_value: 0,\n }\n }\n}\n\nimpl StorageRead {\n\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_READ_LENGTH] {\n [self.storage_slot, self.current_value]\n }\n\n pub fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_READ)\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr" + "path": "/home/santiago/Projects/aztec3-packages/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr" }, "167": { "source": "use dep::std::option::Option;\nuse dep::aztec::context::PrivateContext;\nuse dep::aztec::note::note_getter_options::{NoteGetterOptions, SortOrder};\nuse dep::aztec::oracle::get_public_key::get_public_key;\nuse dep::aztec::state_vars::set::Set;\nuse crate::{\n filter::filter_notes_min_sum,\n value_note::{ValueNote, VALUE_NOTE_LEN},\n};\nuse dep::aztec::protocol_types::address::AztecAddress;\n\n// Sort the note values (0th field) in descending order.\n// Pick the fewest notes whose sum is equal to or greater than `amount`.\npub fn create_note_getter_options_for_decreasing_balance(amount: Field) -> NoteGetterOptions {\n NoteGetterOptions::with_filter(filter_notes_min_sum, amount).sort(0, SortOrder.DESC)\n}\n\n// Creates a new note for the recipient.\n// Inserts it to the recipient's set of notes.\npub fn increment(balance: Set, amount: Field, recipient: AztecAddress) {\n let mut note = ValueNote::new(amount, recipient);\n // Insert the new note to the owner's set of notes and emit the log if value is non-zero.\n balance.insert(&mut note, amount != 0);\n}\n\n// Find some of the `owner`'s notes whose values add up to the `amount`.\n// Remove those notes.\n// If the value of the removed notes exceeds the requested `amount`, create a new note containing the excess value, so that exactly `amount` is removed.\n// Fail if the sum of the selected notes is less than the amount.\npub fn decrement(balance: Set, amount: Field, owner: AztecAddress) {\n let sum = decrement_by_at_most(balance, amount, owner);\n assert(sum == amount, \"Balance too low\");\n}\n\n// Similar to `decrement`, except that it doesn't fail if the decremented amount is less than max_amount.\n// The motivation behind this function is that there is an upper-bound on the number of notes a function may\n// read and nullify. The requested decrementation `amount` might be spread across too many of the `owner`'s\n// notes to 'fit' within this upper-bound, so we might have to remove an amount less than `amount`. A common\n// pattern is to repeatedly call this function across many function calls, until enough notes have been nullified to\n// equal `amount`.\n//\n// It returns the decremented amount, which should be less than or equal to max_amount.\npub fn decrement_by_at_most(\n balance: Set,\n max_amount: Field,\n owner: AztecAddress\n) -> Field {\n let options = create_note_getter_options_for_decreasing_balance(max_amount);\n let opt_notes = balance.get_notes(options);\n\n let mut decremented = 0;\n for i in 0..opt_notes.len() {\n if opt_notes[i].is_some() {\n decremented += destroy_note(balance, owner, opt_notes[i].unwrap_unchecked());\n }\n }\n\n // Add the change value back to the owner's balance.\n let mut change_value = 0;\n if decremented as u120 > max_amount as u120 {\n change_value = decremented - max_amount;\n decremented -= change_value;\n }\n increment(balance, change_value, owner);\n\n decremented\n}\n\n// Removes the note from the owner's set of notes.\n// Returns the value of the destroyed note.\npub fn destroy_note(\n balance: Set,\n owner: AztecAddress,\n note: ValueNote\n) -> Field {\n // Ensure the note is actually owned by the owner (to prevent user from generating a valid proof while\n // spending someone else's notes).\n assert(note.owner.eq(owner));\n\n balance.remove(note);\n\n note.value\n}\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/value-note/src/utils.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/value-note/src/utils.nr" }, "169": { "source": "use dep::aztec::{\n protocol_types::address::AztecAddress,\n note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n utils::compute_note_hash_for_read_or_nullify,\n },\n oracle::{\n rand::rand,\n nullifier_key::get_nullifier_secret_key,\n get_public_key::get_public_key,\n },\n log::emit_encrypted_log,\n hash::pedersen_hash,\n context::PrivateContext,\n};\n\nglobal VALUE_NOTE_LEN: Field = 3; // 3 plus a header.\n\n// docs:start:value-note-def\nstruct ValueNote {\n value: Field,\n owner: AztecAddress,\n randomness: Field,\n header: NoteHeader,\n}\n// docs:end:value-note-def\n\nimpl ValueNote {\n pub fn new(value: Field, owner: AztecAddress) -> Self {\n let randomness = rand();\n let header = NoteHeader::empty();\n ValueNote {\n value,\n owner,\n randomness,\n header,\n }\n }\n\n pub fn serialize(self) -> [Field; VALUE_NOTE_LEN] {\n [self.value, self.owner.to_field(), self.randomness]\n }\n\n pub fn deserialize(serialized_note: [Field; VALUE_NOTE_LEN]) -> Self {\n ValueNote {\n value: serialized_note[0],\n owner: AztecAddress::from_field(serialized_note[1]),\n randomness: serialized_note[2],\n header: NoteHeader::empty(),\n }\n }\n\n pub fn compute_note_hash(self) -> Field {\n // TODO(#1205) Should use a non-zero generator index.\n pedersen_hash(self.serialize(),0)\n }\n\n // docs:start:nullifier\n\n pub fn compute_nullifier(self, context: &mut PrivateContext) -> Field {\n let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(ValueNoteMethods, self);\n let secret = context.request_nullifier_secret_key(self.owner);\n // TODO(#1205) Should use a non-zero generator index.\n pedersen_hash([\n note_hash_for_nullify,\n secret.low,\n secret.high,\n ],0)\n }\n\n // docs:end:nullifier\n\n pub fn compute_nullifier_without_context(self) -> Field {\n let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(ValueNoteMethods, self);\n let secret = get_nullifier_secret_key(self.owner);\n // TODO(#1205) Should use a non-zero generator index.\n pedersen_hash([\n note_hash_for_nullify,\n secret.low,\n secret.high,\n ],0)\n }\n\n pub fn set_header(&mut self, header: NoteHeader) {\n self.header = header;\n }\n\n // Broadcasts the note as an encrypted log on L1.\n pub fn broadcast(self, context: &mut PrivateContext, slot: Field) {\n let encryption_pub_key = get_public_key(self.owner);\n emit_encrypted_log(\n context,\n (*context).this_address(),\n slot,\n encryption_pub_key,\n self.serialize(),\n );\n }\n}\n\nfn deserialize(serialized_note: [Field; VALUE_NOTE_LEN]) -> ValueNote {\n ValueNote::deserialize(serialized_note)\n}\n\nfn serialize(note: ValueNote) -> [Field; VALUE_NOTE_LEN] {\n note.serialize()\n}\n\nfn compute_note_hash(note: ValueNote) -> Field {\n note.compute_note_hash()\n}\n\nfn compute_nullifier(note: ValueNote, context: &mut PrivateContext) -> Field {\n note.compute_nullifier(context)\n}\n\nfn compute_nullifier_without_context(note: ValueNote) -> Field {\n note.compute_nullifier_without_context()\n}\n\nfn get_header(note: ValueNote) -> NoteHeader {\n note.header\n}\n\nfn set_header(note: &mut ValueNote, header: NoteHeader) {\n note.set_header(header)\n}\n\n// Broadcasts the note as an encrypted log on L1.\nfn broadcast(context: &mut PrivateContext, slot: Field, note: ValueNote) {\n note.broadcast(context, slot);\n}\n\nglobal ValueNoteMethods = NoteInterface {\n deserialize,\n serialize,\n compute_note_hash,\n compute_nullifier,\n compute_nullifier_without_context,\n get_header,\n set_header,\n broadcast,\n};\n", - "path": "/home/santiago/Projects/aztec3-packages/yarn-project/aztec-nr/value-note/src/value_note.nr" + "path": "/home/santiago/Projects/aztec3-packages/aztec-nr/value-note/src/value_note.nr" } } -} +} \ No newline at end of file diff --git a/yarn-project/circuits.js/src/scripts/constants.in.ts b/yarn-project/circuits.js/src/scripts/constants.in.ts index 6a1dcd6312a..2cf57116abf 100644 --- a/yarn-project/circuits.js/src/scripts/constants.in.ts +++ b/yarn-project/circuits.js/src/scripts/constants.in.ts @@ -3,7 +3,7 @@ import { fileURLToPath } from '@aztec/foundation/url'; import * as fs from 'fs'; import { dirname, join } from 'path'; -const NOIR_CONSTANTS_FILE = '../../../noir-protocol-circuits/src/crates/types/src/constants.nr'; +const NOIR_CONSTANTS_FILE = '../../../../noir-projects/noir-protocol-circuits/src/crates/types/src/constants.nr'; const TS_CONSTANTS_FILE = '../constants.gen.ts'; const SOLIDITY_CONSTANTS_FILE = '../../../../l1-contracts/src/core/libraries/ConstantsGen.sol'; diff --git a/yarn-project/cli/README.md b/yarn-project/cli/README.md index 15fe370f183..56bf674e842 100644 --- a/yarn-project/cli/README.md +++ b/yarn-project/cli/README.md @@ -3,7 +3,9 @@ The Aztec CLI `aztec-cli` is a command-line interface (CLI) tool for interacting with Aztec. It provides various commands for deploying contracts, creating accounts, interacting with contracts, and retrieving blockchain data. ## Installation + 1. In your terminal, download the sandbox by running + ``` bash -i <(curl -s install.aztec.network) ``` @@ -387,6 +389,7 @@ Syntax: ```shell aztec-cli get-logs --fromBlock ``` + Options: - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. @@ -420,7 +423,7 @@ This command retrieves and displays the current Aztec L2 block number. ### example-contracts -Lists the contracts available in [@aztec/noir-contracts](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts) +Lists the contracts available in [@aztec/noir-contracts](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-contracts) Syntax: diff --git a/yarn-project/cli/package.json b/yarn-project/cli/package.json index 948c527b570..24749c1a676 100644 --- a/yarn-project/cli/package.json +++ b/yarn-project/cli/package.json @@ -42,7 +42,7 @@ "@aztec/foundation": "workspace:^", "@aztec/l1-artifacts": "workspace:^", "@aztec/noir-compiler": "workspace:^", - "@aztec/noir-contracts": "workspace:^", + "@aztec/noir-contracts.js": "workspace:^", "@aztec/types": "workspace:^", "@iarna/toml": "^2.2.5", "@libp2p/peer-id-factory": "^3.0.4", diff --git a/yarn-project/cli/src/cmds/unbox.ts b/yarn-project/cli/src/cmds/unbox.ts index a04702d0e88..8f534049b04 100644 --- a/yarn-project/cli/src/cmds/unbox.ts +++ b/yarn-project/cli/src/cmds/unbox.ts @@ -63,8 +63,8 @@ export function unbox(boxName: string, directory: string | undefined, cliVersion function copyDependenciesToBox(dirName: string, destPath: string) { [ 'barretenberg/ts', - 'yarn-project/aztec-nr', - 'yarn-project/noir-protocol-circuits', + 'aztec-nr', + 'yarn-project/noir-protocol-circuits-types', 'yarn-project/accounts', 'yarn-project/aztec.js', 'yarn-project/circuits.js', diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index 72170602c88..b1e8cae8774 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -154,7 +154,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .description('Deploys a compiled Aztec.nr contract to Aztec.') .argument( '', - "A compiled Aztec.nr contract's artifact in JSON format or name of a contract artifact exported by @aztec/noir-contracts", + "A compiled Aztec.nr contract's artifact in JSON format or name of a contract artifact exported by @aztec/noir-contracts.js", ) .option('-a, --args ', 'Contract constructor arguments', []) .addOption(pxeOption) @@ -215,7 +215,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { ) .requiredOption( '-c, --contract-artifact ', - "A compiled Aztec.nr 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.js", ) .requiredOption('-ca, --contract-address
', 'Aztec address of the contract.', parseAztecAddress) .requiredOption('--init-hash ', 'Initialization hash', parseFieldFromHexString) @@ -341,7 +341,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .option('-a, --args [functionArgs...]', 'Function arguments', []) .requiredOption( '-c, --contract-artifact ', - "A compiled Aztec.nr 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.js", ) .requiredOption('-ca, --contract-address
', 'Aztec address of the contract.', parseAztecAddress) .addOption(createPrivateKeyOption("The sender's private key.", true)) @@ -371,7 +371,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .option('-a, --args [functionArgs...]', 'Function arguments', []) .requiredOption( '-c, --contract-artifact ', - "A compiled Aztec.nr 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.js", ) .requiredOption('-ca, --contract-address
', 'Aztec address of the contract.', parseAztecAddress) .option('-f, --from ', 'Aztec address of the caller. If empty, will use the first account from RPC.') @@ -421,7 +421,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .argument('', 'The encoded hex string') .requiredOption( '-c, --contract-artifact ', - "A compiled Aztec.nr 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.js", ) .requiredOption('-p, --parameter ', 'The name of the struct parameter to decode into') .action(async (encodedString, options) => { @@ -440,7 +440,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { program .command('example-contracts') - .description('Lists the example contracts available to deploy from @aztec/noir-contracts') + .description('Lists the example contracts available to deploy from @aztec/noir-contracts.js') .action(async () => { const { exampleContracts } = await import('./cmds/example_contracts.js'); await exampleContracts(log); @@ -475,7 +475,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .description('Shows list of external callable functions for a contract') .argument( '', - `A compiled Noir contract's artifact in JSON format or name of a contract artifact exported by @aztec/noir-contracts`, + `A compiled Noir contract's artifact in JSON format or name of a contract artifact exported by @aztec/noir-contracts.js`, ) .action(async (contractArtifactFile: string) => { const { inspectContract } = await import('./cmds/inspect_contract.js'); diff --git a/yarn-project/cli/src/update/noir.ts b/yarn-project/cli/src/update/noir.ts index 6391e588f19..0864293f4da 100644 --- a/yarn-project/cli/src/update/noir.ts +++ b/yarn-project/cli/src/update/noir.ts @@ -44,6 +44,7 @@ export async function updateAztecNr(contractPath: string, tag: string, log: LogF }); dep.tag = tag; + dep.directory = dep.directory?.replace('yarn-project/', 'noir-projects/'); } } diff --git a/yarn-project/cli/src/utils.ts b/yarn-project/cli/src/utils.ts index 26dfe4b9561..300a0d55a9b 100644 --- a/yarn-project/cli/src/utils.ts +++ b/yarn-project/cli/src/utils.ts @@ -96,11 +96,11 @@ export async function deployAztecContracts( } /** - * Gets all contracts available in \@aztec/noir-contracts. + * Gets all contracts available in \@aztec/noir-contracts.js. * @returns The contract ABIs. */ export async function getExampleContractArtifacts(): Promise { - const imports: any = await import('@aztec/noir-contracts'); + const imports: any = await import('@aztec/noir-contracts.js'); return Object.fromEntries(Object.entries(imports).filter(([key]) => key.endsWith('Artifact'))) as any; } diff --git a/yarn-project/cli/tsconfig.json b/yarn-project/cli/tsconfig.json index 96499cbb599..29032103ade 100644 --- a/yarn-project/cli/tsconfig.json +++ b/yarn-project/cli/tsconfig.json @@ -31,7 +31,7 @@ "path": "../noir-compiler" }, { - "path": "../noir-contracts" + "path": "../noir-contracts.js" }, { "path": "../types" diff --git a/yarn-project/deploy_npm.sh b/yarn-project/deploy_npm.sh index ddbc1226be5..87b3ac7619b 100755 --- a/yarn-project/deploy_npm.sh +++ b/yarn-project/deploy_npm.sh @@ -89,10 +89,10 @@ deploy_package accounts deploy_package l1-artifacts deploy_package ethereum deploy_package noir-compiler -deploy_package noir-contracts +deploy_package noir-contracts.js deploy_package kv-store deploy_package merkle-tree -deploy_package noir-protocol-circuits +deploy_package noir-protocol-circuits-types deploy_package simulator deploy_package key-store deploy_package pxe diff --git a/yarn-project/end-to-end/package.json b/yarn-project/end-to-end/package.json index f019bf353b4..9c2befce623 100644 --- a/yarn-project/end-to-end/package.json +++ b/yarn-project/end-to-end/package.json @@ -36,7 +36,7 @@ "@aztec/kv-store": "workspace:^", "@aztec/l1-artifacts": "workspace:^", "@aztec/merkle-tree": "workspace:^", - "@aztec/noir-contracts": "workspace:^", + "@aztec/noir-contracts.js": "workspace:^", "@aztec/p2p": "workspace:^", "@aztec/pxe": "workspace:^", "@aztec/sequencer-client": "workspace:^", diff --git a/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts b/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts index 9e2b2700ad2..8d0747cf27f 100644 --- a/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts +++ b/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts @@ -5,7 +5,7 @@ import { BENCHMARK_HISTORY_CHAIN_LENGTHS, NodeSyncedChainHistoryStats, } from '@aztec/circuit-types/stats'; -import { BenchmarkingContract } from '@aztec/noir-contracts/Benchmarking'; +import { BenchmarkingContract } from '@aztec/noir-contracts.js/Benchmarking'; import { SequencerClient } from '@aztec/sequencer-client'; import { EndToEndContext } from '../fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts b/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts index b2b2e710af5..fea4012690b 100644 --- a/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts +++ b/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts @@ -1,7 +1,7 @@ import { AztecNodeService } from '@aztec/aztec-node'; import { AztecAddress, Fr, GrumpkinScalar } from '@aztec/aztec.js'; import { BENCHMARK_BLOCK_SIZES } from '@aztec/circuit-types/stats'; -import { BenchmarkingContract } from '@aztec/noir-contracts/Benchmarking'; +import { BenchmarkingContract } from '@aztec/noir-contracts.js/Benchmarking'; import { SequencerClient } from '@aztec/sequencer-client'; import { EndToEndContext } from '../fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/benchmarks/utils.ts b/yarn-project/end-to-end/src/benchmarks/utils.ts index 348932f7b60..8ae3d6a0eb8 100644 --- a/yarn-project/end-to-end/src/benchmarks/utils.ts +++ b/yarn-project/end-to-end/src/benchmarks/utils.ts @@ -11,7 +11,7 @@ import { sleep, } from '@aztec/aztec.js'; import { times } from '@aztec/foundation/collection'; -import { BenchmarkingContract } from '@aztec/noir-contracts/Benchmarking'; +import { BenchmarkingContract } from '@aztec/noir-contracts.js/Benchmarking'; import { PXEService, createPXEService } from '@aztec/pxe'; import { mkdirpSync } from 'fs-extra'; diff --git a/yarn-project/end-to-end/src/e2e_2_pxes.test.ts b/yarn-project/end-to-end/src/e2e_2_pxes.test.ts index dff36888301..d5613bc9a41 100644 --- a/yarn-project/end-to-end/src/e2e_2_pxes.test.ts +++ b/yarn-project/end-to-end/src/e2e_2_pxes.test.ts @@ -14,7 +14,7 @@ import { computeMessageSecretHash, retryUntil, } from '@aztec/aztec.js'; -import { ChildContract, TokenContract } from '@aztec/noir-contracts'; +import { ChildContract, TokenContract } from '@aztec/noir-contracts.js'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_account_contracts.test.ts b/yarn-project/end-to-end/src/e2e_account_contracts.test.ts index 67106877c49..c9cb4dfb6ae 100644 --- a/yarn-project/end-to-end/src/e2e_account_contracts.test.ts +++ b/yarn-project/end-to-end/src/e2e_account_contracts.test.ts @@ -12,7 +12,7 @@ import { PXE, Wallet, } from '@aztec/aztec.js'; -import { ChildContract } from '@aztec/noir-contracts/Child'; +import { ChildContract } from '@aztec/noir-contracts.js/Child'; import { randomBytes } from 'crypto'; diff --git a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts index 299994d2ae7..52ba1f0b476 100644 --- a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts +++ b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts @@ -1,5 +1,5 @@ import { DebugLogger, Fr, Wallet } from '@aztec/aztec.js'; -import { AvmTestContract } from '@aztec/noir-contracts'; +import { AvmTestContract } from '@aztec/noir-contracts.js'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts b/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts index bb4eb2e3954..db68e95f98d 100644 --- a/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts @@ -16,7 +16,7 @@ import { } from '@aztec/aztec.js'; import { openTmpStore } from '@aztec/kv-store/utils'; import { Pedersen, SparseTree, newTree } from '@aztec/merkle-tree'; -import { SlowTreeContract, TokenBlacklistContract, TokenContract } from '@aztec/noir-contracts'; +import { SlowTreeContract, TokenBlacklistContract, TokenContract } from '@aztec/noir-contracts.js'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_block_building.test.ts b/yarn-project/end-to-end/src/e2e_block_building.test.ts index 9b5760759bd..20fc0d83567 100644 --- a/yarn-project/end-to-end/src/e2e_block_building.test.ts +++ b/yarn-project/end-to-end/src/e2e_block_building.test.ts @@ -14,8 +14,8 @@ import { } from '@aztec/aztec.js'; import { times } from '@aztec/foundation/collection'; import { pedersenHash } from '@aztec/foundation/crypto'; -import { TestContract, TestContractArtifact } from '@aztec/noir-contracts/Test'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TestContract, TestContractArtifact } from '@aztec/noir-contracts.js/Test'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_card_game.test.ts b/yarn-project/end-to-end/src/e2e_card_game.test.ts index 69d7bbae065..adff32ba032 100644 --- a/yarn-project/end-to-end/src/e2e_card_game.test.ts +++ b/yarn-project/end-to-end/src/e2e_card_game.test.ts @@ -12,7 +12,7 @@ import { import { computeNullifierSecretKey, computeSiloedNullifierSecretKey } from '@aztec/circuits.js'; import { toBufferLE } from '@aztec/foundation/bigint-buffer'; import { sha256 } from '@aztec/foundation/crypto'; -import { CardGameContract } from '@aztec/noir-contracts/CardGame'; +import { CardGameContract } from '@aztec/noir-contracts.js/CardGame'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts b/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts index 4efca1fbd6a..631f6ba7265 100644 --- a/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts +++ b/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts @@ -11,7 +11,7 @@ import { computeMessageSecretHash, } from '@aztec/aztec.js'; import { RollupAbi } from '@aztec/l1-artifacts'; -import { TestContract, TokenContract } from '@aztec/noir-contracts'; +import { TestContract, TokenContract } from '@aztec/noir-contracts.js'; import { Account, Chain, HttpTransport, PublicClient, WalletClient, getAddress, getContract, parseEther } from 'viem'; diff --git a/yarn-project/end-to-end/src/e2e_cross_chain_messaging.test.ts b/yarn-project/end-to-end/src/e2e_cross_chain_messaging.test.ts index f3bb23e15d8..9e5932e00d4 100644 --- a/yarn-project/end-to-end/src/e2e_cross_chain_messaging.test.ts +++ b/yarn-project/end-to-end/src/e2e_cross_chain_messaging.test.ts @@ -7,7 +7,7 @@ import { TxStatus, computeAuthWitMessageHash, } from '@aztec/aztec.js'; -import { TokenBridgeContract, TokenContract } from '@aztec/noir-contracts'; +import { TokenBridgeContract, TokenContract } from '@aztec/noir-contracts.js'; import { delay, setup } from './fixtures/utils.js'; import { CrossChainTestHarness } from './shared/cross_chain_test_harness.js'; diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract.test.ts index 6dfc3d9e208..f0413d1fcb6 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract.test.ts @@ -30,9 +30,9 @@ import { import { ContractClassIdPreimage, Point, PublicKey } from '@aztec/circuits.js'; import { siloNullifier } from '@aztec/circuits.js/abis'; import { FunctionSelector, FunctionType } from '@aztec/foundation/abi'; -import { ContractInstanceDeployerContract, StatefulTestContract } from '@aztec/noir-contracts'; -import { TestContract, TestContractArtifact } from '@aztec/noir-contracts/Test'; -import { TokenContractArtifact } from '@aztec/noir-contracts/Token'; +import { ContractInstanceDeployerContract, StatefulTestContract } from '@aztec/noir-contracts.js'; +import { TestContract, TestContractArtifact } from '@aztec/noir-contracts.js/Test'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; import { SequencerClient } from '@aztec/sequencer-client'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_escrow_contract.test.ts b/yarn-project/end-to-end/src/e2e_escrow_contract.test.ts index ed34164fccb..9df22ace061 100644 --- a/yarn-project/end-to-end/src/e2e_escrow_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_escrow_contract.test.ts @@ -18,8 +18,8 @@ import { getContractInstanceFromDeployParams, } from '@aztec/aztec.js'; import { computePartialAddress } from '@aztec/circuits.js'; -import { EscrowContract, EscrowContractArtifact } from '@aztec/noir-contracts/Escrow'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { EscrowContract, EscrowContractArtifact } from '@aztec/noir-contracts.js/Escrow'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts b/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts index 459fddef998..53adc6a61ad 100644 --- a/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts @@ -11,7 +11,7 @@ import { } from '@aztec/aztec.js'; import { NewContractData } from '@aztec/circuits.js'; import { computeContractLeaf } from '@aztec/circuits.js/abis'; -import { InclusionProofsContract } from '@aztec/noir-contracts/InclusionProofs'; +import { InclusionProofsContract } from '@aztec/noir-contracts.js/InclusionProofs'; import { jest } from '@jest/globals'; import { type MemDown, default as memdown } from 'memdown'; 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 7a7fa9d33c8..a33526523ed 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 @@ -11,7 +11,7 @@ import { computeAuthWitMessageHash, computeMessageSecretHash, } from '@aztec/aztec.js'; -import { LendingContract, PriceFeedContract, TokenContract } from '@aztec/noir-contracts'; +import { LendingContract, PriceFeedContract, TokenContract } from '@aztec/noir-contracts.js'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_multiple_accounts_1_enc_key.test.ts b/yarn-project/end-to-end/src/e2e_multiple_accounts_1_enc_key.test.ts index c4d006bb135..e8abe983d96 100644 --- a/yarn-project/end-to-end/src/e2e_multiple_accounts_1_enc_key.test.ts +++ b/yarn-project/end-to-end/src/e2e_multiple_accounts_1_enc_key.test.ts @@ -14,7 +14,7 @@ import { computeMessageSecretHash, generatePublicKey, } from '@aztec/aztec.js'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { expectsNumOfEncryptedLogsInTheLastBlockToBe, setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_nested_contract.test.ts b/yarn-project/end-to-end/src/e2e_nested_contract.test.ts index d3dec0751ea..2fec187d43d 100644 --- a/yarn-project/end-to-end/src/e2e_nested_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_nested_contract.test.ts @@ -1,6 +1,6 @@ import { AztecAddress, BatchCall, DebugLogger, Fr, PXE, Wallet, toBigIntBE } from '@aztec/aztec.js'; import { getTestData, isGenerateTestDataEnabled } from '@aztec/foundation/testing'; -import { ChildContract, ImportTestContract, ParentContract, TestContract } from '@aztec/noir-contracts'; +import { ChildContract, ImportTestContract, ParentContract, TestContract } from '@aztec/noir-contracts.js'; import { writeFileSync } from 'fs'; @@ -40,7 +40,7 @@ describe('e2e_nested_contract', () => { const privateKernelInputsInit = getTestData('private-kernel-inputs-init'); const nestedCallPrivateKernelInput = privateKernelInputsInit[0]; writeFileSync( - '../noir-protocol-circuits/src/fixtures/nested-call-private-kernel-init.hex', + '../noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-init.hex', nestedCallPrivateKernelInput.toBuffer().toString('hex'), ); } @@ -49,7 +49,7 @@ describe('e2e_nested_contract', () => { const privateKernelInputsInner = getTestData('private-kernel-inputs-inner'); const nestedCallPrivateKernelInput = privateKernelInputsInner[privateKernelInputsInner.length - 1]; writeFileSync( - '../noir-protocol-circuits/src/fixtures/nested-call-private-kernel-inner.hex', + '../noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-inner.hex', nestedCallPrivateKernelInput.toBuffer().toString('hex'), ); } @@ -58,7 +58,7 @@ describe('e2e_nested_contract', () => { const privateKernelInputsOrdering = getTestData('private-kernel-inputs-ordering'); const nestedCallPrivateKernelInput = privateKernelInputsOrdering[0]; writeFileSync( - '../noir-protocol-circuits/src/fixtures/nested-call-private-kernel-ordering.hex', + '../noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-ordering.hex', nestedCallPrivateKernelInput.toBuffer().toString('hex'), ); } diff --git a/yarn-project/end-to-end/src/e2e_non_contract_account.test.ts b/yarn-project/end-to-end/src/e2e_non_contract_account.test.ts index ea27674a3cb..964adc7d7af 100644 --- a/yarn-project/end-to-end/src/e2e_non_contract_account.test.ts +++ b/yarn-project/end-to-end/src/e2e_non_contract_account.test.ts @@ -11,7 +11,7 @@ import { toBigInt, } from '@aztec/aztec.js'; import { siloNullifier } from '@aztec/circuits.js/abis'; -import { TestContract } from '@aztec/noir-contracts/Test'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_note_getter.test.ts b/yarn-project/end-to-end/src/e2e_note_getter.test.ts index ed00016612a..6641b391149 100644 --- a/yarn-project/end-to-end/src/e2e_note_getter.test.ts +++ b/yarn-project/end-to-end/src/e2e_note_getter.test.ts @@ -1,5 +1,5 @@ import { AztecAddress, Comparator, Fr, Wallet, toBigInt } from '@aztec/aztec.js'; -import { DocsExampleContract, TestContract } from '@aztec/noir-contracts'; +import { DocsExampleContract, TestContract } from '@aztec/noir-contracts.js'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_ordering.test.ts b/yarn-project/end-to-end/src/e2e_ordering.test.ts index c7727867c76..11b1f06b5ef 100644 --- a/yarn-project/end-to-end/src/e2e_ordering.test.ts +++ b/yarn-project/end-to-end/src/e2e_ordering.test.ts @@ -1,7 +1,7 @@ // Test suite for testing proper ordering of side effects import { Fr, FunctionSelector, PXE, TxStatus, Wallet, toBigIntBE } from '@aztec/aztec.js'; -import { ChildContract } from '@aztec/noir-contracts/Child'; -import { ParentContract } from '@aztec/noir-contracts/Parent'; +import { ChildContract } from '@aztec/noir-contracts.js/Child'; +import { ParentContract } from '@aztec/noir-contracts.js/Parent'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_p2p_network.test.ts b/yarn-project/end-to-end/src/e2e_p2p_network.test.ts index 12e4dc54e05..07506db1be2 100644 --- a/yarn-project/end-to-end/src/e2e_p2p_network.test.ts +++ b/yarn-project/end-to-end/src/e2e_p2p_network.test.ts @@ -14,7 +14,7 @@ import { getContractInstanceFromDeployParams, isContractDeployed, } from '@aztec/aztec.js'; -import { TestContractArtifact } from '@aztec/noir-contracts/Test'; +import { TestContractArtifact } from '@aztec/noir-contracts.js/Test'; import { BootstrapNode, P2PConfig, createLibP2PPeerId } from '@aztec/p2p'; import { ConstantKeyPair, PXEService, createPXEService, getPXEServiceConfig as getRpcConfig } from '@aztec/pxe'; 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 cb81ff66782..8c504210bc5 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 @@ -1,5 +1,5 @@ import { AztecAddress, AztecNode, CompleteAddress, DebugLogger, Fr, TxStatus, Wallet } from '@aztec/aztec.js'; -import { PendingCommitmentsContract } from '@aztec/noir-contracts/PendingCommitments'; +import { PendingCommitmentsContract } from '@aztec/noir-contracts.js/PendingCommitments'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_persistence.test.ts b/yarn-project/end-to-end/src/e2e_persistence.test.ts index 8b6a7c95113..f52f4c42d07 100644 --- a/yarn-project/end-to-end/src/e2e_persistence.test.ts +++ b/yarn-project/end-to-end/src/e2e_persistence.test.ts @@ -11,7 +11,7 @@ import { import { Salt } from '@aztec/aztec.js/account'; import { AztecAddress, CompleteAddress, Fq, Fr } from '@aztec/circuits.js'; import { DeployL1Contracts } from '@aztec/ethereum'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; import { mkdtemp } from 'fs/promises'; diff --git a/yarn-project/end-to-end/src/e2e_public_cross_chain_messaging.test.ts b/yarn-project/end-to-end/src/e2e_public_cross_chain_messaging.test.ts index ea57f757f73..510a0263458 100644 --- a/yarn-project/end-to-end/src/e2e_public_cross_chain_messaging.test.ts +++ b/yarn-project/end-to-end/src/e2e_public_cross_chain_messaging.test.ts @@ -8,8 +8,8 @@ import { computeAuthWitMessageHash, sleep, } from '@aztec/aztec.js'; -import { TokenContract } from '@aztec/noir-contracts/Token'; -import { TokenBridgeContract } from '@aztec/noir-contracts/TokenBridge'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; +import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge'; import { setup } from './fixtures/utils.js'; import { CrossChainTestHarness } from './shared/cross_chain_test_harness.js'; diff --git a/yarn-project/end-to-end/src/e2e_sandbox_example.test.ts b/yarn-project/end-to-end/src/e2e_sandbox_example.test.ts index be75c656781..9445da155d9 100644 --- a/yarn-project/end-to-end/src/e2e_sandbox_example.test.ts +++ b/yarn-project/end-to-end/src/e2e_sandbox_example.test.ts @@ -12,7 +12,7 @@ import { createPXEClient, waitForPXE, } from '@aztec/aztec.js'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { format } from 'util'; diff --git a/yarn-project/end-to-end/src/e2e_slow_tree.test.ts b/yarn-project/end-to-end/src/e2e_slow_tree.test.ts index 32531fc15c3..748101acea7 100644 --- a/yarn-project/end-to-end/src/e2e_slow_tree.test.ts +++ b/yarn-project/end-to-end/src/e2e_slow_tree.test.ts @@ -2,7 +2,7 @@ import { CheatCodes, DebugLogger, Fr, Wallet } from '@aztec/aztec.js'; import { openTmpStore } from '@aztec/kv-store/utils'; import { Pedersen, SparseTree, newTree } from '@aztec/merkle-tree'; -import { SlowTreeContract } from '@aztec/noir-contracts/SlowTree'; +import { SlowTreeContract } from '@aztec/noir-contracts.js/SlowTree'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_state_vars.test.ts b/yarn-project/end-to-end/src/e2e_state_vars.test.ts index dcf98641561..8b545859d32 100644 --- a/yarn-project/end-to-end/src/e2e_state_vars.test.ts +++ b/yarn-project/end-to-end/src/e2e_state_vars.test.ts @@ -1,5 +1,5 @@ import { TxStatus, Wallet } from '@aztec/aztec.js'; -import { DocsExampleContract } from '@aztec/noir-contracts'; +import { DocsExampleContract } from '@aztec/noir-contracts.js'; import { setup } from './fixtures/utils.js'; 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 f2fbc8e754b..42792edbe75 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 @@ -12,8 +12,8 @@ import { computeMessageSecretHash, } from '@aztec/aztec.js'; import { decodeFunctionSignature } from '@aztec/foundation/abi'; -import { ReaderContract } from '@aztec/noir-contracts/Reader'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { ReaderContract } from '@aztec/noir-contracts.js/Reader'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/guides/dapp_testing.test.ts b/yarn-project/end-to-end/src/guides/dapp_testing.test.ts index db45440e2fe..f418ad9c50f 100644 --- a/yarn-project/end-to-end/src/guides/dapp_testing.test.ts +++ b/yarn-project/end-to-end/src/guides/dapp_testing.test.ts @@ -10,8 +10,8 @@ import { createPXEClient, waitForPXE, } from '@aztec/aztec.js'; -import { TestContract } from '@aztec/noir-contracts/Test'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; const { PXE_URL = 'http://localhost:8080', ETHEREUM_HOST = 'http://localhost:8545' } = process.env; diff --git a/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts b/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts index 42388c673d1..10618ba5dea 100644 --- a/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts +++ b/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts @@ -12,8 +12,8 @@ import { Schnorr, computeMessageSecretHash, } from '@aztec/aztec.js'; -import { SchnorrHardcodedAccountContractArtifact } from '@aztec/noir-contracts/SchnorrHardcodedAccount'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { SchnorrHardcodedAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrHardcodedAccount'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { setup } from '../fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/integration_archiver_l1_to_l2.test.ts b/yarn-project/end-to-end/src/integration_archiver_l1_to_l2.test.ts index fd673178798..c1edff0af93 100644 --- a/yarn-project/end-to-end/src/integration_archiver_l1_to_l2.test.ts +++ b/yarn-project/end-to-end/src/integration_archiver_l1_to_l2.test.ts @@ -11,7 +11,7 @@ import { computeMessageSecretHash, } from '@aztec/aztec.js'; import { initStoreForRollup, openTmpStore } from '@aztec/kv-store/utils'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { Chain, HttpTransport, PublicClient } from 'viem'; diff --git a/yarn-project/end-to-end/src/sample-dapp/contracts.mjs b/yarn-project/end-to-end/src/sample-dapp/contracts.mjs index 83dfc7d054f..06d62766d49 100644 --- a/yarn-project/end-to-end/src/sample-dapp/contracts.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/contracts.mjs @@ -1,5 +1,5 @@ import { AztecAddress, Contract, loadContractArtifact } from '@aztec/aztec.js'; -import TokenContractJson from '@aztec/noir-contracts/target/token_contract-Token' assert { type: 'json' }; +import TokenContractJson from '@aztec/noir-contracts.js/artifacts/token_contract-Token' assert { type: 'json' }; import { readFileSync } from 'fs'; diff --git a/yarn-project/end-to-end/src/sample-dapp/deploy.mjs b/yarn-project/end-to-end/src/sample-dapp/deploy.mjs index 33e739c3166..d415f1bc2e3 100644 --- a/yarn-project/end-to-end/src/sample-dapp/deploy.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/deploy.mjs @@ -1,6 +1,6 @@ import { getInitialTestAccountsWallets } from '@aztec/accounts/testing'; import { Contract, createPXEClient, loadContractArtifact } from '@aztec/aztec.js'; -import TokenContractJson from '@aztec/noir-contracts/target/token_contract-Token' assert { type: 'json' }; +import TokenContractJson from '@aztec/noir-contracts.js/artifacts/token_contract-Token' assert { type: 'json' }; import { writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; diff --git a/yarn-project/end-to-end/src/sample-dapp/index.test.mjs b/yarn-project/end-to-end/src/sample-dapp/index.test.mjs index b13e1dad951..9d22d07e7bc 100644 --- a/yarn-project/end-to-end/src/sample-dapp/index.test.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/index.test.mjs @@ -8,7 +8,7 @@ import { createPXEClient, waitForPXE, } from '@aztec/aztec.js'; -import { TokenContractArtifact } from '@aztec/noir-contracts/Token'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; const { PXE_URL = 'http://localhost:8080', ETHEREUM_HOST = 'http://localhost:8545' } = process.env; diff --git a/yarn-project/end-to-end/src/shared/browser.ts b/yarn-project/end-to-end/src/shared/browser.ts index 59db47a2207..022ab6bdd16 100644 --- a/yarn-project/end-to-end/src/shared/browser.ts +++ b/yarn-project/end-to-end/src/shared/browser.ts @@ -3,7 +3,7 @@ import * as AztecAccountsSchnorr from '@aztec/accounts/schnorr'; import * as AztecAccountsSingleKey from '@aztec/accounts/single_key'; import * as AztecAccountsTesting from '@aztec/accounts/testing'; import * as AztecJs from '@aztec/aztec.js'; -import { TokenContractArtifact } from '@aztec/noir-contracts/Token'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; import { Server } from 'http'; import Koa from 'koa'; diff --git a/yarn-project/end-to-end/src/shared/cli.ts b/yarn-project/end-to-end/src/shared/cli.ts index ee121151c0d..64aaf20b98e 100644 --- a/yarn-project/end-to-end/src/shared/cli.ts +++ b/yarn-project/end-to-end/src/shared/cli.ts @@ -120,7 +120,7 @@ export const cliTestSuite = ( it.each([ ['an example Token contract', 'TokenContractArtifact', '0'], - ['a Nargo artifact', '../noir-contracts/target/token_contract-Token.json', '1'], + ['a Nargo artifact', '../noir-contracts.js/artifacts/token_contract-Token.json', '1'], ])( 'deploys %s & sends transactions', async (_, artifact, salt) => { diff --git a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts index 70d4319ce95..80b8b467510 100644 --- a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts +++ b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts @@ -21,8 +21,8 @@ import { TokenPortalAbi, TokenPortalBytecode, } from '@aztec/l1-artifacts'; -import { TokenContract } from '@aztec/noir-contracts/Token'; -import { TokenBridgeContract } from '@aztec/noir-contracts/TokenBridge'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; +import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge'; import { Account, Chain, HttpTransport, PublicClient, WalletClient, getContract, getFunctionSelector } from 'viem'; diff --git a/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts b/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts index dc49414df4d..cbf7df99002 100644 --- a/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts +++ b/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts @@ -11,7 +11,7 @@ import { } from '@aztec/aztec.js'; import { deployL1Contract } from '@aztec/ethereum'; import { UniswapPortalAbi, UniswapPortalBytecode } from '@aztec/l1-artifacts'; -import { UniswapContract } from '@aztec/noir-contracts/Uniswap'; +import { UniswapContract } from '@aztec/noir-contracts.js/Uniswap'; import { jest } from '@jest/globals'; import { Chain, HttpTransport, PublicClient, getContract, parseEther } from 'viem'; diff --git a/yarn-project/end-to-end/src/simulators/lending_simulator.ts b/yarn-project/end-to-end/src/simulators/lending_simulator.ts index 94abe466a4b..dcc91fa28a1 100644 --- a/yarn-project/end-to-end/src/simulators/lending_simulator.ts +++ b/yarn-project/end-to-end/src/simulators/lending_simulator.ts @@ -1,7 +1,7 @@ // Convenience struct to hold an account's address and secret that can easily be passed around. import { AztecAddress, CheatCodes, Fr } from '@aztec/aztec.js'; import { pedersenHash } from '@aztec/foundation/crypto'; -import { LendingContract } from '@aztec/noir-contracts/Lending'; +import { LendingContract } from '@aztec/noir-contracts.js/Lending'; import { TokenSimulator } from './token_simulator.js'; diff --git a/yarn-project/end-to-end/src/simulators/token_simulator.ts b/yarn-project/end-to-end/src/simulators/token_simulator.ts index c1f9d81b73c..686cec91cc5 100644 --- a/yarn-project/end-to-end/src/simulators/token_simulator.ts +++ b/yarn-project/end-to-end/src/simulators/token_simulator.ts @@ -1,6 +1,6 @@ /* eslint-disable jsdoc/require-jsdoc */ import { AztecAddress, DebugLogger } from '@aztec/aztec.js'; -import { TokenContract } from '@aztec/noir-contracts/Token'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; export class TokenSimulator { private balancesPrivate: Map = new Map(); diff --git a/yarn-project/end-to-end/tsconfig.json b/yarn-project/end-to-end/tsconfig.json index e467ab65bf4..582567ec99f 100644 --- a/yarn-project/end-to-end/tsconfig.json +++ b/yarn-project/end-to-end/tsconfig.json @@ -43,7 +43,7 @@ "path": "../merkle-tree" }, { - "path": "../noir-contracts" + "path": "../noir-contracts.js" }, { "path": "../p2p" diff --git a/yarn-project/foundation/src/abi/decoder.test.ts b/yarn-project/foundation/src/abi/decoder.test.ts index ea8a853715c..7cefecf772b 100644 --- a/yarn-project/foundation/src/abi/decoder.test.ts +++ b/yarn-project/foundation/src/abi/decoder.test.ts @@ -2,7 +2,7 @@ import { ABIParameterVisibility, FunctionArtifact } from './abi.js'; import { decodeFunctionSignature, decodeFunctionSignatureWithParameterNames } from './decoder.js'; describe('abi/decoder', () => { - // Copied from yarn-project/noir-contracts/contracts/test_contract/target/Test.json + // Copied from noir-contracts/contracts/test_contract/target/Test.json const abi = { name: 'testCodeGen', parameters: [ diff --git a/yarn-project/noir-contracts/.eslintrc.cjs b/yarn-project/noir-contracts.js/.eslintrc.cjs similarity index 100% rename from yarn-project/noir-contracts/.eslintrc.cjs rename to yarn-project/noir-contracts.js/.eslintrc.cjs diff --git a/yarn-project/noir-contracts.js/.gitignore b/yarn-project/noir-contracts.js/.gitignore new file mode 100644 index 00000000000..1f61ab7482c --- /dev/null +++ b/yarn-project/noir-contracts.js/.gitignore @@ -0,0 +1,3 @@ +target/ +/src +artifacts/ diff --git a/yarn-project/noir-contracts/package.json b/yarn-project/noir-contracts.js/package.json similarity index 78% rename from yarn-project/noir-contracts/package.json rename to yarn-project/noir-contracts.js/package.json index 38bf26e463b..df827fc8e0f 100644 --- a/yarn-project/noir-contracts/package.json +++ b/yarn-project/noir-contracts.js/package.json @@ -1,20 +1,20 @@ { - "name": "@aztec/noir-contracts", + "name": "@aztec/noir-contracts.js", "version": "0.1.0", "type": "module", "exports": { ".": "./dest/src/index.js", - "./target/*": "./dest/target/*.json", + "./artifacts/*": "./dest/artifacts/*.json", "./*": "./dest/src/*.js" }, "scripts": { - "build": "yarn clean && yarn build:contracts && tsc -b", + "build": "yarn clean && yarn build:contracts", "build:dev": "tsc -b --watch", - "clean": "rm -rf ./dest .tsbuildinfo ./src ./target", + "clean": "rm -rf .tsbuildinfo ./artifacts", "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests", - "build:contracts": "./scripts/compile.sh && ./scripts/transpile.sh && ./scripts/generate-types.sh" + "build:contracts": "./scripts/generate-types.sh" }, "inherits": [ "../package.common.json", @@ -49,4 +49,4 @@ "engines": { "node": ">=18" } -} +} \ No newline at end of file diff --git a/yarn-project/noir-contracts.js/package.local.json b/yarn-project/noir-contracts.js/package.local.json new file mode 100644 index 00000000000..0e363c59c36 --- /dev/null +++ b/yarn-project/noir-contracts.js/package.local.json @@ -0,0 +1,7 @@ +{ + "scripts": { + "build": "yarn clean && yarn build:contracts", + "build:contracts": "./scripts/generate-types.sh", + "clean": "rm -rf .tsbuildinfo ./artifacts" + } +} \ No newline at end of file diff --git a/yarn-project/noir-contracts.js/scripts/generate-types.sh b/yarn-project/noir-contracts.js/scripts/generate-types.sh new file mode 100755 index 00000000000..8532ef04ca3 --- /dev/null +++ b/yarn-project/noir-contracts.js/scripts/generate-types.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -euo pipefail + +OUT_DIR="./src" +INDEX="$OUT_DIR/index.ts" + +rm -rf $OUT_DIR && mkdir -p $OUT_DIR + +# +if ! ls ../../noir-projects/noir-contracts/target/*.json >/dev/null 2>&1; then + echo "Error: No .json files found in noir-contracts/target folder." + echo "Make sure noir-contracts is built before running this script." + exit 1 +fi + +# Generate index.ts header. +echo "// Auto generated module - do not edit!" >$INDEX + +# Ensure the artifacts directory exists +mkdir -p artifacts + +for ABI in $(find ../../noir-projects/noir-contracts/target -maxdepth 1 -type f ! -name 'debug_*' -name '*.json'); do + # Extract the filename from the path + filename=$(basename "$ABI") + + # Copy the JSON file to the artifacts folder + cp "$ABI" "artifacts/$filename" + + # Generate the contract name for referencing in the codegen command and index + CONTRACT=$(jq -r .name "artifacts/$filename") + + echo "Creating types for $CONTRACT using artifacts/$filename..." + node --no-warnings ../noir-compiler/dest/cli.js codegen -o $OUT_DIR --ts "artifacts/$filename" + + # Add contract import/export to index.ts. + echo "export * from './${CONTRACT}.js';" >>$INDEX +done + +echo "Formatting..." +yarn formatting:fix diff --git a/yarn-project/noir-contracts/tsconfig.json b/yarn-project/noir-contracts.js/tsconfig.json similarity index 84% rename from yarn-project/noir-contracts/tsconfig.json rename to yarn-project/noir-contracts.js/tsconfig.json index bf3da7b0006..279682403a1 100644 --- a/yarn-project/noir-contracts/tsconfig.json +++ b/yarn-project/noir-contracts.js/tsconfig.json @@ -12,7 +12,7 @@ ], "include": [ "src", - "target", - "target/*.json", + "artifacts", + "artifacts/*.json", ], -} +} \ No newline at end of file diff --git a/yarn-project/noir-contracts/package.local.json b/yarn-project/noir-contracts/package.local.json deleted file mode 100644 index 9ea766d3f11..00000000000 --- a/yarn-project/noir-contracts/package.local.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build": "yarn clean && yarn build:contracts && tsc -b", - "build:contracts": "./scripts/compile.sh && ./scripts/transpile.sh && ./scripts/generate-types.sh", - "clean": "rm -rf ./dest .tsbuildinfo ./src ./target" - } -} diff --git a/yarn-project/noir-contracts/scripts/generate-types.sh b/yarn-project/noir-contracts/scripts/generate-types.sh deleted file mode 100755 index 8ec4b7ebc4c..00000000000 --- a/yarn-project/noir-contracts/scripts/generate-types.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -OUT_DIR="./src" -INDEX="$OUT_DIR/index.ts" - -rm -rf $OUT_DIR && mkdir -p $OUT_DIR - -# Generate index.ts header. -echo "// Auto generated module - do not edit!" > $INDEX - -for ABI in $(find target -maxdepth 1 -type f ! -name 'debug_*' -name '*.json'); do - CONTRACT=$(jq -r .name $ABI) - - echo "Creating types for $CONTRACT in $ABI..." - node --no-warnings ../noir-compiler/dest/cli.js codegen -o $OUT_DIR --ts $ABI - - # Add contract import/export to index.ts. - echo "export * from './${CONTRACT}.js';" >> $INDEX -done - -echo "Formatting..." -yarn formatting:fix - diff --git a/yarn-project/noir-contracts/scripts/transpile.sh b/yarn-project/noir-contracts/scripts/transpile.sh deleted file mode 100755 index c330ee0f654..00000000000 --- a/yarn-project/noir-contracts/scripts/transpile.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -echo "Transpiling contracts..." -for contract_json in target/avm_test_*.json; do - echo Transpiling $contract_json... - ../../avm-transpiler/target/release/avm-transpiler $contract_json $contract_json -done \ No newline at end of file diff --git a/yarn-project/noir-protocol-circuits/.eslintrc.cjs b/yarn-project/noir-protocol-circuits-types/.eslintrc.cjs similarity index 100% rename from yarn-project/noir-protocol-circuits/.eslintrc.cjs rename to yarn-project/noir-protocol-circuits-types/.eslintrc.cjs diff --git a/yarn-project/noir-protocol-circuits/.gitignore b/yarn-project/noir-protocol-circuits-types/.gitignore similarity index 100% rename from yarn-project/noir-protocol-circuits/.gitignore rename to yarn-project/noir-protocol-circuits-types/.gitignore diff --git a/yarn-project/noir-protocol-circuits/.prettierignore b/yarn-project/noir-protocol-circuits-types/.prettierignore similarity index 100% rename from yarn-project/noir-protocol-circuits/.prettierignore rename to yarn-project/noir-protocol-circuits-types/.prettierignore diff --git a/yarn-project/noir-protocol-circuits/README.md b/yarn-project/noir-protocol-circuits-types/README.md similarity index 100% rename from yarn-project/noir-protocol-circuits/README.md rename to yarn-project/noir-protocol-circuits-types/README.md diff --git a/yarn-project/noir-protocol-circuits/package.json b/yarn-project/noir-protocol-circuits-types/package.json similarity index 76% rename from yarn-project/noir-protocol-circuits/package.json rename to yarn-project/noir-protocol-circuits-types/package.json index 9d1845d8ee8..eec6ca314b6 100644 --- a/yarn-project/noir-protocol-circuits/package.json +++ b/yarn-project/noir-protocol-circuits-types/package.json @@ -1,5 +1,5 @@ { - "name": "@aztec/noir-protocol-circuits", + "name": "@aztec/noir-protocol-circuits-types", "version": "0.1.0", "type": "module", "exports": { @@ -7,16 +7,13 @@ "./types": "./dest/types/index.js" }, "scripts": { - "build": "yarn clean && yarn noir:build && yarn noir:types && tsc -b", + "build": "yarn clean && yarn noir:types && tsc -b", "clean": "rm -rf ./dest .tsbuildinfo src/types src/target", "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "NODE_OPTIONS='--max-old-space-size=8096' run -T eslint --fix ./src && run -T prettier -w ./src", "formatting:fix:types": "NODE_OPTIONS='--max-old-space-size=8096' run -T eslint --fix ./src/types && run -T prettier -w ./src/types", - "noir:build": "cd src && ../../../noir/target/release/nargo compile --silence-warnings", - "noir:types": "node --loader ts-node/esm src/scripts/generate_ts_from_abi.ts && yarn formatting:fix:types", - "noir:test": "cd src && ../../../noir/target/release/nargo test", - "test": "yarn test:js && yarn noir:test", - "test:js": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests" + "noir:types": "cp -r ../../noir-projects/noir-protocol-circuits/src/target ./src/target && node --loader ts-node/esm src/scripts/generate_ts_from_abi.ts && yarn formatting:fix:types", + "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests" }, "jest": { "preset": "ts-jest/presets/default-esm", @@ -60,4 +57,4 @@ "engines": { "node": ">=18" } -} +} \ No newline at end of file diff --git a/yarn-project/noir-protocol-circuits/src/__snapshots__/index.test.ts.snap b/yarn-project/noir-protocol-circuits-types/src/__snapshots__/index.test.ts.snap similarity index 100% rename from yarn-project/noir-protocol-circuits/src/__snapshots__/index.test.ts.snap rename to yarn-project/noir-protocol-circuits-types/src/__snapshots__/index.test.ts.snap diff --git a/yarn-project/noir-protocol-circuits/src/__snapshots__/noir_test_gen.test.ts.snap b/yarn-project/noir-protocol-circuits-types/src/__snapshots__/noir_test_gen.test.ts.snap similarity index 100% rename from yarn-project/noir-protocol-circuits/src/__snapshots__/noir_test_gen.test.ts.snap rename to yarn-project/noir-protocol-circuits-types/src/__snapshots__/noir_test_gen.test.ts.snap diff --git a/yarn-project/noir-protocol-circuits/src/fixtures/nested-call-private-kernel-init.hex b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-init.hex similarity index 100% rename from yarn-project/noir-protocol-circuits/src/fixtures/nested-call-private-kernel-init.hex rename to yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-init.hex diff --git a/yarn-project/noir-protocol-circuits/src/fixtures/nested-call-private-kernel-inner.hex b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-inner.hex similarity index 100% rename from yarn-project/noir-protocol-circuits/src/fixtures/nested-call-private-kernel-inner.hex rename to yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-inner.hex diff --git a/yarn-project/noir-protocol-circuits/src/fixtures/nested-call-private-kernel-ordering.hex b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-ordering.hex similarity index 100% rename from yarn-project/noir-protocol-circuits/src/fixtures/nested-call-private-kernel-ordering.hex rename to yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-ordering.hex diff --git a/yarn-project/noir-protocol-circuits/src/index.test.ts b/yarn-project/noir-protocol-circuits-types/src/index.test.ts similarity index 100% rename from yarn-project/noir-protocol-circuits/src/index.test.ts rename to yarn-project/noir-protocol-circuits-types/src/index.test.ts diff --git a/yarn-project/noir-protocol-circuits/src/index.ts b/yarn-project/noir-protocol-circuits-types/src/index.ts similarity index 100% rename from yarn-project/noir-protocol-circuits/src/index.ts rename to yarn-project/noir-protocol-circuits-types/src/index.ts diff --git a/yarn-project/noir-protocol-circuits/src/noir_test_gen.test.ts b/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts similarity index 100% rename from yarn-project/noir-protocol-circuits/src/noir_test_gen.test.ts rename to yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts diff --git a/yarn-project/noir-protocol-circuits/src/scripts/generate_ts_from_abi.ts b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts similarity index 100% rename from yarn-project/noir-protocol-circuits/src/scripts/generate_ts_from_abi.ts rename to yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts diff --git a/yarn-project/noir-protocol-circuits/src/type_conversion.test.ts b/yarn-project/noir-protocol-circuits-types/src/type_conversion.test.ts similarity index 100% rename from yarn-project/noir-protocol-circuits/src/type_conversion.test.ts rename to yarn-project/noir-protocol-circuits-types/src/type_conversion.test.ts diff --git a/yarn-project/noir-protocol-circuits/src/type_conversion.ts b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts similarity index 100% rename from yarn-project/noir-protocol-circuits/src/type_conversion.ts rename to yarn-project/noir-protocol-circuits-types/src/type_conversion.ts diff --git a/yarn-project/noir-protocol-circuits/tsconfig.json b/yarn-project/noir-protocol-circuits-types/tsconfig.json similarity index 100% rename from yarn-project/noir-protocol-circuits/tsconfig.json rename to yarn-project/noir-protocol-circuits-types/tsconfig.json diff --git a/yarn-project/package.json b/yarn-project/package.json index 4d68e44fc0b..c83a0292d4b 100644 --- a/yarn-project/package.json +++ b/yarn-project/package.json @@ -6,8 +6,8 @@ "prepare": "node ./yarn-project-base/scripts/update_package_jsons.mjs && yarn workspaces foreach run prepare && workspaces-to-typescript-project-references --tsconfigPath tsconfig.json && prettier -w */tsconfig.json", "prepare:check": "node ./yarn-project-base/scripts/update_package_jsons.mjs --check && workspaces-to-typescript-project-references --check --tsconfigPath tsconfig.json", "docs": "typedoc --out docs/dist && cd docs && yarn serve", - "formatting": "./run_nargo_fmt.sh --check && FORCE_COLOR=true yarn workspaces foreach -p -j unlimited -v run formatting", - "formatting:fix": "./run_nargo_fmt.sh && FORCE_COLOR=true yarn workspaces foreach -p -v run formatting:fix", + "formatting": "FORCE_COLOR=true yarn workspaces foreach -p -j unlimited -v run formatting", + "formatting:fix": ".FORCE_COLOR=true yarn workspaces foreach -p -v run formatting:fix", "lint": "yarn eslint --cache --ignore-pattern l1-artifacts .", "format": "yarn prettier --cache -w .", "test": "FORCE_COLOR=true yarn workspaces foreach --exclude @aztec/aztec3-packages --exclude @aztec/end-to-end --exclude private-token -p -j ${JOBS:-unlimited} -v run test", @@ -36,8 +36,8 @@ "l1-artifacts", "merkle-tree", "noir-compiler", - "noir-contracts", - "noir-protocol-circuits", + "noir-contracts.js", + "noir-protocol-circuits-types", "p2p", "p2p-bootstrap", "protocol-contracts", @@ -72,4 +72,4 @@ "@noir-lang/noir_wasm": "portal:../noir/packages/noir_wasm", "@noir-lang/noir_js": "portal:../noir/packages/noir_js" } -} +} \ No newline at end of file diff --git a/yarn-project/protocol-contracts/scripts/copy-contracts.sh b/yarn-project/protocol-contracts/scripts/copy-contracts.sh index 51e4f4a5e5b..5c39b4fe786 100755 --- a/yarn-project/protocol-contracts/scripts/copy-contracts.sh +++ b/yarn-project/protocol-contracts/scripts/copy-contracts.sh @@ -5,7 +5,7 @@ mkdir -p ./src/artifacts contracts=(contract_class_registerer_contract-ContractClassRegisterer contract_instance_deployer_contract-ContractInstanceDeployer) for contract in "${contracts[@]}"; do - cp "../noir-contracts/target/$contract.json" ./src/artifacts/${contract#*-}.json + cp "../noir-contracts.js/artifacts/$contract.json" ./src/artifacts/${contract#*-}.json done yarn run -T prettier -w ./src/artifacts \ No newline at end of file diff --git a/yarn-project/pxe/package.json b/yarn-project/pxe/package.json index 75ba8afa0bd..8bc84c9fdd7 100644 --- a/yarn-project/pxe/package.json +++ b/yarn-project/pxe/package.json @@ -40,7 +40,7 @@ "@aztec/key-store": "workspace:^", "@aztec/kv-store": "workspace:^", "@aztec/noir-compiler": "workspace:^", - "@aztec/noir-protocol-circuits": "workspace:^", + "@aztec/noir-protocol-circuits-types": "workspace:^", "@aztec/protocol-contracts": "workspace:^", "@aztec/simulator": "workspace:^", "@aztec/types": "workspace:^", @@ -52,7 +52,7 @@ "viem": "^1.2.5" }, "devDependencies": { - "@aztec/noir-contracts": "workspace:^", + "@aztec/noir-contracts.js": "workspace:^", "@jest/globals": "^29.5.0", "@types/jest": "^29.5.0", "@types/lodash.omit": "^4.5.7", diff --git a/yarn-project/pxe/src/database/pxe_database_test_suite.ts b/yarn-project/pxe/src/database/pxe_database_test_suite.ts index 0fceb543e42..8af50b909e0 100644 --- a/yarn-project/pxe/src/database/pxe_database_test_suite.ts +++ b/yarn-project/pxe/src/database/pxe_database_test_suite.ts @@ -2,7 +2,7 @@ import { INITIAL_L2_BLOCK_NUM, NoteFilter, NoteStatus, randomTxHash } from '@azt import { AztecAddress, CompleteAddress } from '@aztec/circuits.js'; import { makeHeader } from '@aztec/circuits.js/factories'; import { Fr, Point } from '@aztec/foundation/fields'; -import { BenchmarkingContractArtifact } from '@aztec/noir-contracts/Benchmarking'; +import { BenchmarkingContractArtifact } from '@aztec/noir-contracts.js/Benchmarking'; import { SerializableContractInstance } from '@aztec/types/contracts'; import { NoteDao } from './note_dao.js'; diff --git a/yarn-project/pxe/src/kernel_prover/proof_creator.ts b/yarn-project/pxe/src/kernel_prover/proof_creator.ts index de2f0aeddd4..2f1e24c2de8 100644 --- a/yarn-project/pxe/src/kernel_prover/proof_creator.ts +++ b/yarn-project/pxe/src/kernel_prover/proof_creator.ts @@ -13,7 +13,7 @@ import { siloCommitment } from '@aztec/circuits.js/abis'; import { Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; import { elapsed } from '@aztec/foundation/timer'; -import { executeInit, executeInner, executeTail } from '@aztec/noir-protocol-circuits'; +import { executeInit, executeInner, executeTail } from '@aztec/noir-protocol-circuits-types'; /** * Represents the output of the proof creation process for init and inner private kernel circuit. diff --git a/yarn-project/pxe/tsconfig.json b/yarn-project/pxe/tsconfig.json index 0a0b5ee4533..32d3eb3dda6 100644 --- a/yarn-project/pxe/tsconfig.json +++ b/yarn-project/pxe/tsconfig.json @@ -28,7 +28,7 @@ "path": "../noir-compiler" }, { - "path": "../noir-protocol-circuits" + "path": "../noir-protocol-circuits-types" }, { "path": "../protocol-contracts" @@ -40,7 +40,7 @@ "path": "../types" }, { - "path": "../noir-contracts" + "path": "../noir-contracts.js" } ], "include": ["src"] diff --git a/yarn-project/run_nargo_fmt.sh b/yarn-project/run_nargo_fmt.sh deleted file mode 100755 index f1cd5033a69..00000000000 --- a/yarn-project/run_nargo_fmt.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash - -# Note: This script formats the files multiple times when the given project is included in a workspace. -# Tackling this became a time sink, so I decided to leave it as is for now. - -set -e - -# We set the executable path as if we were in CI -nargo_executable="/usr/src/noir/target/release/nargo" - -# Check if nargo_executable exists and is executable -if [ ! -x "$nargo_executable" ]; then - # If not, we try to set a nargo path as if the script was run locally - nargo_executable="$(git rev-parse --show-toplevel)/noir/target/release/nargo" - - if [ ! -x "$nargo_executable" ]; then - echo "Error: nargo executable not found" - exit 1 - fi -fi - -# Find all Nargo.toml files and run 'nargo fmt' -find . -name "Nargo.toml" | while read -r file; do - # Extract the directory from the file path - dir=$(dirname "$file") - - # Change into the directory - cd "$dir" || exit - - # Run 'nargo fmt' in the directory and pass in the input param 1 - "$nargo_executable" fmt $1 - - # Change back to the original directory - cd - > /dev/null -done diff --git a/yarn-project/sequencer-client/package.json b/yarn-project/sequencer-client/package.json index db40e8dc9d5..5b1a7403a6e 100644 --- a/yarn-project/sequencer-client/package.json +++ b/yarn-project/sequencer-client/package.json @@ -27,7 +27,7 @@ "@aztec/foundation": "workspace:^", "@aztec/l1-artifacts": "workspace:^", "@aztec/merkle-tree": "workspace:^", - "@aztec/noir-protocol-circuits": "workspace:^", + "@aztec/noir-protocol-circuits-types": "workspace:^", "@aztec/p2p": "workspace:^", "@aztec/simulator": "workspace:^", "@aztec/types": "workspace:^", diff --git a/yarn-project/sequencer-client/src/simulator/public_kernel.ts b/yarn-project/sequencer-client/src/simulator/public_kernel.ts index 199b87fec7e..4ecf11d203f 100644 --- a/yarn-project/sequencer-client/src/simulator/public_kernel.ts +++ b/yarn-project/sequencer-client/src/simulator/public_kernel.ts @@ -2,7 +2,7 @@ import { CircuitSimulationStats } from '@aztec/circuit-types/stats'; import { PublicKernelCircuitPrivateInputs, PublicKernelCircuitPublicInputs } from '@aztec/circuits.js'; import { createDebugLogger } from '@aztec/foundation/log'; import { elapsed } from '@aztec/foundation/timer'; -import { executePublicKernelAppLogic, executePublicKernelSetup } from '@aztec/noir-protocol-circuits'; +import { executePublicKernelAppLogic, executePublicKernelSetup } from '@aztec/noir-protocol-circuits-types'; import { PublicKernelCircuitSimulator } from './index.js'; diff --git a/yarn-project/sequencer-client/src/simulator/rollup.ts b/yarn-project/sequencer-client/src/simulator/rollup.ts index b8003df7c5e..302d8d40be2 100644 --- a/yarn-project/sequencer-client/src/simulator/rollup.ts +++ b/yarn-project/sequencer-client/src/simulator/rollup.ts @@ -8,7 +8,7 @@ import { } from '@aztec/circuits.js'; import { createDebugLogger } from '@aztec/foundation/log'; import { elapsed } from '@aztec/foundation/timer'; -import { executeBaseRollup, executeMergeRollup, executeRootRollup } from '@aztec/noir-protocol-circuits'; +import { executeBaseRollup, executeMergeRollup, executeRootRollup } from '@aztec/noir-protocol-circuits-types'; import { RollupSimulator } from './index.js'; diff --git a/yarn-project/sequencer-client/tsconfig.json b/yarn-project/sequencer-client/tsconfig.json index 02b1b57f0dc..2d59c600fd7 100644 --- a/yarn-project/sequencer-client/tsconfig.json +++ b/yarn-project/sequencer-client/tsconfig.json @@ -25,7 +25,7 @@ "path": "../merkle-tree" }, { - "path": "../noir-protocol-circuits" + "path": "../noir-protocol-circuits-types" }, { "path": "../p2p" diff --git a/yarn-project/simulator/package.json b/yarn-project/simulator/package.json index 0a84d51627b..848277cd9aa 100644 --- a/yarn-project/simulator/package.json +++ b/yarn-project/simulator/package.json @@ -41,7 +41,7 @@ "devDependencies": { "@aztec/kv-store": "workspace:^", "@aztec/merkle-tree": "workspace:^", - "@aztec/noir-contracts": "workspace:^", + "@aztec/noir-contracts.js": "workspace:^", "@jest/globals": "^29.5.0", "@types/jest": "^29.5.0", "@types/levelup": "^5.1.3", diff --git a/yarn-project/simulator/src/avm/avm_simulator.test.ts b/yarn-project/simulator/src/avm/avm_simulator.test.ts index cee68ab2283..5133f1c5a4d 100644 --- a/yarn-project/simulator/src/avm/avm_simulator.test.ts +++ b/yarn-project/simulator/src/avm/avm_simulator.test.ts @@ -1,7 +1,7 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; -import { AvmTestContractArtifact } from '@aztec/noir-contracts'; +import { AvmTestContractArtifact } from '@aztec/noir-contracts.js'; import { jest } from '@jest/globals'; diff --git a/yarn-project/simulator/src/client/private_execution.test.ts b/yarn-project/simulator/src/client/private_execution.test.ts index 537f1230654..2ae86f45b90 100644 --- a/yarn-project/simulator/src/client/private_execution.test.ts +++ b/yarn-project/simulator/src/client/private_execution.test.ts @@ -51,7 +51,7 @@ import { StatefulTestContractArtifact, TestContractArtifact, TokenContractArtifact, -} from '@aztec/noir-contracts'; +} from '@aztec/noir-contracts.js'; import { jest } from '@jest/globals'; import { MockProxy, mock } from 'jest-mock-extended'; diff --git a/yarn-project/simulator/src/client/simulator.test.ts b/yarn-project/simulator/src/client/simulator.test.ts index 603ea6ddf76..0449969d275 100644 --- a/yarn-project/simulator/src/client/simulator.test.ts +++ b/yarn-project/simulator/src/client/simulator.test.ts @@ -5,7 +5,7 @@ import { ABIParameterVisibility, FunctionArtifactWithDebugMetadata, getFunctionA import { AztecAddress } from '@aztec/foundation/aztec-address'; import { pedersenHash } from '@aztec/foundation/crypto'; import { Fr, GrumpkinScalar, Point } from '@aztec/foundation/fields'; -import { TokenContractArtifact } from '@aztec/noir-contracts/Token'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; import { MockProxy, mock } from 'jest-mock-extended'; diff --git a/yarn-project/simulator/src/client/unconstrained_execution.test.ts b/yarn-project/simulator/src/client/unconstrained_execution.test.ts index 68b7ba6764c..384d7a07472 100644 --- a/yarn-project/simulator/src/client/unconstrained_execution.test.ts +++ b/yarn-project/simulator/src/client/unconstrained_execution.test.ts @@ -3,7 +3,7 @@ import { CompleteAddress, FunctionData, Header } from '@aztec/circuits.js'; import { FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; -import { StatefulTestContractArtifact } from '@aztec/noir-contracts/StatefulTest'; +import { StatefulTestContractArtifact } from '@aztec/noir-contracts.js/StatefulTest'; import { mock } from 'jest-mock-extended'; diff --git a/yarn-project/simulator/src/public/index.test.ts b/yarn-project/simulator/src/public/index.test.ts index 94d3a2cc287..18ad25be384 100644 --- a/yarn-project/simulator/src/public/index.test.ts +++ b/yarn-project/simulator/src/public/index.test.ts @@ -13,10 +13,10 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { pedersenHash } from '@aztec/foundation/crypto'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; -import { ChildContractArtifact } from '@aztec/noir-contracts/Child'; -import { ParentContractArtifact } from '@aztec/noir-contracts/Parent'; -import { TestContractArtifact } from '@aztec/noir-contracts/Test'; -import { TokenContractArtifact } from '@aztec/noir-contracts/Token'; +import { ChildContractArtifact } from '@aztec/noir-contracts.js/Child'; +import { ParentContractArtifact } from '@aztec/noir-contracts.js/Parent'; +import { TestContractArtifact } from '@aztec/noir-contracts.js/Test'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; import { MockProxy, mock } from 'jest-mock-extended'; import { type MemDown, default as memdown } from 'memdown'; diff --git a/yarn-project/simulator/tsconfig.json b/yarn-project/simulator/tsconfig.json index ce07b84cd9e..2a9b8bbcbe3 100644 --- a/yarn-project/simulator/tsconfig.json +++ b/yarn-project/simulator/tsconfig.json @@ -22,7 +22,7 @@ "path": "../merkle-tree" }, { - "path": "../noir-contracts" + "path": "../noir-contracts.js" } ], "include": ["src"] diff --git a/yarn-project/tsconfig.json b/yarn-project/tsconfig.json index 3f7c45f343c..8b77a73c92c 100644 --- a/yarn-project/tsconfig.json +++ b/yarn-project/tsconfig.json @@ -34,9 +34,9 @@ { "path": "key-store/tsconfig.json" }, { "path": "l1-artifacts/tsconfig.json" }, { "path": "merkle-tree/tsconfig.json" }, - { "path": "noir-contracts/tsconfig.json" }, + { "path": "noir-contracts.js/tsconfig.json" }, { "path": "noir-compiler/tsconfig.json" }, - { "path": "noir-protocol-circuits/tsconfig.json" }, + { "path": "noir-protocol-circuits-types/tsconfig.json" }, { "path": "p2p/tsconfig.json" }, { "path": "p2p-bootstrap/tsconfig.json" }, { "path": "protocol-contracts/tsconfig.json" }, diff --git a/yarn-project/typedoc.json b/yarn-project/typedoc.json index a5dee75ec5f..45c2236a4f5 100644 --- a/yarn-project/typedoc.json +++ b/yarn-project/typedoc.json @@ -10,7 +10,7 @@ "aztec", "aztec.js", "key-store", - "noir-contracts", + "noir-contracts.js", "noir-compiler", "p2p", "prover-client", @@ -20,4 +20,4 @@ "world-state", "merkle-tree" ] -} +} \ No newline at end of file diff --git a/yarn-project/yarn-project-base/Dockerfile b/yarn-project/yarn-project-base/Dockerfile index fb2b49237e6..933ec230be2 100644 --- a/yarn-project/yarn-project-base/Dockerfile +++ b/yarn-project/yarn-project-base/Dockerfile @@ -44,10 +44,9 @@ # FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/l1-contracts as contracts FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/bb.js as bb.js -FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/noir as noir +FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/noir-projects as noir-projects FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/noir-packages as noir-packages FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/boxes-files as boxes-files -FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/avm-transpiler as transpiler FROM node:18.19.0 RUN apt update && apt install -y jq curl perl && rm -rf /var/lib/apt/lists/* && apt-get clean @@ -56,14 +55,12 @@ RUN apt update && apt install -y jq curl perl && rm -rf /var/lib/apt/lists/* && COPY --from=contracts /usr/src/l1-contracts /usr/src/l1-contracts # Copy in bb.js COPY --from=bb.js /usr/src/barretenberg/ts /usr/src/barretenberg/ts -# Copy in nargo -COPY --from=noir /usr/src/noir/target/release/nargo /usr/src/noir/target/release/nargo # Copy in noir packages COPY --from=noir-packages /usr/src/noir/packages /usr/src/noir/packages +# Copy in noir projects +COPY --from=noir-projects /usr/src/noir-projects /usr/src/noir-projects # Copy in boxes COPY --from=boxes-files /usr/src/boxes /usr/src/boxes -# Copy in transpiler -COPY --from=transpiler /usr/src/avm-transpiler/target/release/avm-transpiler /usr/src/avm-transpiler/target/release/avm-transpiler # We install a symlink to yarn-project's node_modules at a location that all portalled packages can find as they # walk up the tree as part of module resolution. The supposedly idiomatic way of supporting module resolution @@ -79,17 +76,17 @@ COPY . . # List all included files and hash for debugging. RUN echo "Context files: " && find . -type f | sort && \ - echo -n "Context hash: " && find . -type f -print0 | sort -z | xargs -0 sha256sum | sha256sum + echo -n "Context hash: " && find . -type f -print0 | sort -z | xargs -0 sha256sum | sha256sum # Install packages and rebuild the global cache with hard links. # TODO: Puppeteer is adding ~300MB to this image due to chrome download (part of e2e). # Switch to using puppeteer-core then it won't download chrome. For now just erase. RUN yarn --immutable && rm -rf /root/.cache/puppeteer && /bin/bash -c '\ - rm -rf /root/.yarn/berry/cache/* && \ - cd .yarn/cache && \ - for F in *; do \ - [[ $F =~ (.*-) ]] && ln $F /root/.yarn/berry/cache/${BASH_REMATCH[1]}8.zip; \ - done' + rm -rf /root/.yarn/berry/cache/* && \ + cd .yarn/cache && \ + for F in *; do \ + [[ $F =~ (.*-) ]] && ln $F /root/.yarn/berry/cache/${BASH_REMATCH[1]}8.zip; \ + done' # If everything's worked properly, we should no longer need access to the network. RUN echo "enableNetwork: false" >> .yarnrc.yml diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 0b8a772cf03..d0dfeb8b12a 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -237,7 +237,7 @@ __metadata: "@aztec/kv-store": "workspace:^" "@aztec/l1-artifacts": "workspace:^" "@aztec/noir-compiler": "workspace:^" - "@aztec/noir-contracts": "workspace:^" + "@aztec/noir-contracts.js": "workspace:^" "@aztec/p2p": "workspace:^" "@aztec/pxe": "workspace:^" "@jest/globals": ^29.5.0 @@ -333,7 +333,7 @@ __metadata: "@aztec/foundation": "workspace:^" "@aztec/l1-artifacts": "workspace:^" "@aztec/noir-compiler": "workspace:^" - "@aztec/noir-contracts": "workspace:^" + "@aztec/noir-contracts.js": "workspace:^" "@aztec/types": "workspace:^" "@iarna/toml": ^2.2.5 "@jest/globals": ^29.5.0 @@ -385,7 +385,7 @@ __metadata: "@aztec/kv-store": "workspace:^" "@aztec/l1-artifacts": "workspace:^" "@aztec/merkle-tree": "workspace:^" - "@aztec/noir-contracts": "workspace:^" + "@aztec/noir-contracts.js": "workspace:^" "@aztec/p2p": "workspace:^" "@aztec/pxe": "workspace:^" "@aztec/sequencer-client": "workspace:^" @@ -614,9 +614,9 @@ __metadata: languageName: unknown linkType: soft -"@aztec/noir-contracts@workspace:^, @aztec/noir-contracts@workspace:noir-contracts": +"@aztec/noir-contracts.js@workspace:^, @aztec/noir-contracts.js@workspace:noir-contracts.js": version: 0.0.0-use.local - resolution: "@aztec/noir-contracts@workspace:noir-contracts" + resolution: "@aztec/noir-contracts.js@workspace:noir-contracts.js" dependencies: "@aztec/aztec.js": "workspace:^" "@jest/globals": ^29.5.0 @@ -629,9 +629,9 @@ __metadata: languageName: unknown linkType: soft -"@aztec/noir-protocol-circuits@workspace:^, @aztec/noir-protocol-circuits@workspace:noir-protocol-circuits": +"@aztec/noir-protocol-circuits-types@workspace:^, @aztec/noir-protocol-circuits-types@workspace:noir-protocol-circuits-types": version: 0.0.0-use.local - resolution: "@aztec/noir-protocol-circuits@workspace:noir-protocol-circuits" + resolution: "@aztec/noir-protocol-circuits-types@workspace:noir-protocol-circuits-types" dependencies: "@aztec/circuit-types": "workspace:^" "@aztec/circuits.js": "workspace:^" @@ -758,8 +758,8 @@ __metadata: "@aztec/key-store": "workspace:^" "@aztec/kv-store": "workspace:^" "@aztec/noir-compiler": "workspace:^" - "@aztec/noir-contracts": "workspace:^" - "@aztec/noir-protocol-circuits": "workspace:^" + "@aztec/noir-contracts.js": "workspace:^" + "@aztec/noir-protocol-circuits-types": "workspace:^" "@aztec/protocol-contracts": "workspace:^" "@aztec/simulator": "workspace:^" "@aztec/types": "workspace:^" @@ -818,7 +818,7 @@ __metadata: "@aztec/kv-store": "workspace:^" "@aztec/l1-artifacts": "workspace:^" "@aztec/merkle-tree": "workspace:^" - "@aztec/noir-protocol-circuits": "workspace:^" + "@aztec/noir-protocol-circuits-types": "workspace:^" "@aztec/p2p": "workspace:^" "@aztec/simulator": "workspace:^" "@aztec/types": "workspace:^" @@ -856,7 +856,7 @@ __metadata: "@aztec/foundation": "workspace:^" "@aztec/kv-store": "workspace:^" "@aztec/merkle-tree": "workspace:^" - "@aztec/noir-contracts": "workspace:^" + "@aztec/noir-contracts.js": "workspace:^" "@jest/globals": ^29.5.0 "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js" "@types/jest": ^29.5.0