From 29321551a8a6dd8536230430d8e1ea969171e3c8 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 11:12:28 +0000 Subject: [PATCH 01/16] refactor: renamed user facing abi names --- .../roadmap/features_initial_ldt.md | 2 +- .../concepts/advanced/contract_creation.md | 4 +- docs/docs/dev_docs/cli/main.md | 8 +- docs/docs/dev_docs/contracts/compiling.md | 10 +-- docs/docs/dev_docs/contracts/deploying.md | 8 +- .../writing_dapp/contract_deployment.md | 2 +- .../writing_dapp/contract_interaction.md | 2 +- .../tutorials/writing_dapp/testing.md | 2 +- .../dev_docs/sandbox/components.md | 6 +- .../img/sandbox_unconstrained_function.svg | 2 +- .../src/client/private_execution.test.ts | 89 ++++++++++--------- .../client/unconstrained_execution.test.ts | 4 +- .../acir-simulator/src/public/index.test.ts | 28 +++--- yarn-project/boxes/blank-react/README.md | 4 +- yarn-project/boxes/blank/README.md | 4 +- .../src/artifacts/private_token.ts | 12 +-- .../boxes/private-token/src/config.ts | 4 +- yarn-project/cli/README.md | 8 +- yarn-project/cli/src/index.ts | 4 +- yarn-project/end-to-end/src/canary/browser.ts | 22 ++--- yarn-project/end-to-end/src/canary/cli.ts | 12 +-- .../end-to-end/src/cli_docs_sandbox.test.ts | 62 ++++++------- .../end-to-end/src/e2e_block_building.test.ts | 4 +- .../src/e2e_deploy_contract.test.ts | 16 ++-- .../src/e2e_escrow_contract.test.ts | 4 +- .../end-to-end/src/e2e_p2p_network.test.ts | 7 +- .../end-to-end/src/guides/up_quick_start.sh | 16 ++-- .../writing_an_account_contract.test.ts | 4 +- .../end-to-end/src/sample-dapp/contracts.mjs | 4 +- .../end-to-end/src/sample-dapp/deploy.mjs | 4 +- .../end-to-end/src/sample-dapp/index.test.mjs | 4 +- .../src/contract-interface-gen/typescript.ts | 10 +-- yarn-project/noir-contracts/scripts/types.sh | 2 +- 33 files changed, 191 insertions(+), 183 deletions(-) diff --git a/docs/docs/about_aztec/roadmap/features_initial_ldt.md b/docs/docs/about_aztec/roadmap/features_initial_ldt.md index 34b86912cba..7b7f96d40d8 100644 --- a/docs/docs/about_aztec/roadmap/features_initial_ldt.md +++ b/docs/docs/about_aztec/roadmap/features_initial_ldt.md @@ -52,7 +52,7 @@ A typescript wrapper for making RPC calls to an Aztec Sandbox node. See the sour - Similar in purpose to `web3.js`/`ethers.js`/`viem`, but for interacting with Aztec Network nodes. The RPC interface for an Aztec node is necessarily different from that of an Ethereum node, because it deals with encrypted transactions and state variables. - A library for public/private key management. -- Construct `Contract` instances from a Aztec.nr contract's JSON ABI. +- Construct `Contract` instances from a Aztec.nr contract's JSON artifact. - Deploy new contracts to the Aztec Sandbox. - Construct tx requests, passing arguments to a function of a contract. - Sign tx requests. diff --git a/docs/docs/concepts/advanced/contract_creation.md b/docs/docs/concepts/advanced/contract_creation.md index 9e054f5eacb..882e57f0743 100644 --- a/docs/docs/concepts/advanced/contract_creation.md +++ b/docs/docs/concepts/advanced/contract_creation.md @@ -40,7 +40,7 @@ Each contract's function data is stored in a Merkle tree, where each leaf contai ### How are function signatures defined? -We can take a leaf from Ethereum and make them the first 4 bytes of a hash of the function definition (defined according to the contract ABI, TBD). +We can take a leaf from Ethereum and make them the first 4 bytes of a hash of the function definition (defined according to the contract artifact, TBD). ## Contract Representation in Aztec @@ -284,7 +284,7 @@ The set of functions of a contract is represented as a mini Merkle tree of verif - Distributing L2 contract data - Linking to an L1 Portal Contract -These topics are reflected in the layout of the contract deployment ABI: +These topics are reflected in the layout of the contract deployment artifact: ```js publicInputs = { diff --git a/docs/docs/dev_docs/cli/main.md b/docs/docs/dev_docs/cli/main.md index 8f6d0a584ce..8abcec843d5 100644 --- a/docs/docs/dev_docs/cli/main.md +++ b/docs/docs/dev_docs/cli/main.md @@ -52,7 +52,7 @@ We have shipped a number of example contracts in the `@aztec/noir-contracts` npm You can see all of our example contracts in the monorepo [here](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/noir-contracts/src/contracts). -In the following sections there will be commands that require contracts as options. You can either specify the full directory path to the contract abi, or you can use the name of one of these examples as the option value. This will become clearer later on. +In the following sections there will be commands that require contracts as options. You can either specify the full directory path to the contract artifact, or you can use the name of one of these examples as the option value. This will become clearer later on. ## Creating Accounts @@ -101,7 +101,7 @@ export CONTRACT_ADDRESS= If you use a different address in the constructor above, you will get an error when running the deployment. This is because you need to register an account in the sandbox before it can receive private notes. When you create a new account, it gets automatically registered. Alternatively, you can register an account you do not own along with its public key using the `register-recipient` command. ::: -This command takes 1 mandatory positional argument which is the path to the contract ABI file in a JSON format (e.g. `contracts/target/PrivateToken.json`). +This command takes 1 mandatory positional 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). The command takes a few optional arguments while the most important one is: @@ -121,7 +121,7 @@ When we deployed the token contract, an initial supply of tokens was minted to t The `call` command calls a read-only method on a contract, one that will not generate a transaction to be sent to the network. The arguments here are: - `--args` - The address for which we want to retrieve the balance. -- `--contract-abi` - The abi of the contract we are calling. +- `--contract-artifact` - The artifact of the contract we are calling. - `--contract-address` - The address of the deployed contract As you can see from the result, this address has a balance of 1000000, as expected. When using the Sandbox, you are able to query the balance of any account that has been created in the system, even the accounts created by default. You may wonder why this is, as you haven't provided the private keys for these accounts. The Sandbox contains a component known as the Private Execution Environment (PXE). When an account is created, this component stores the provided encryption private key and is able to read the account's private state meaning that the Sandbox can report the balance of any of it's accounts. More information about the account model can be found [here](../../concepts/foundation/accounts/main.md). @@ -135,7 +135,7 @@ We can now send a transaction to the network. We will transfer funds from the ow We called the `transfer` function of the contract and provided these arguments: - `--args` - The list of arguments to the function call. -- `--contract-abi` - The abi of the contract to call. +- `--contract-artifact` - The artifact of the contract to call. - `--contract-address` - The deployed address of the contract to call. - `--private-key` - The private key of the sender diff --git a/docs/docs/dev_docs/contracts/compiling.md b/docs/docs/dev_docs/contracts/compiling.md index a9c1a346954..95b0388e4ca 100644 --- a/docs/docs/dev_docs/contracts/compiling.md +++ b/docs/docs/dev_docs/contracts/compiling.md @@ -28,11 +28,11 @@ Then run the `compile` command with the path to your [contract project folder](. aztec-cli compile ./path/to/my_aztec_contract_project ``` -This will output a JSON [artifact](./artifacts.md) for each contract in the project to a `target` folder containing their ABI, which you can use for deploying or interacting with your contracts. +This will output a JSON [artifact](./artifacts.md) for each contract in the project to a `target` folder containing their artifact, which you can use for deploying or interacting with your contracts. ### Typescript Interfaces -You can use the compiler to autogenerate type-safe typescript classes for each of your contracts. These classes define type-safe methods for deploying and interacting with your contract based on their ABI. +You can use the compiler to autogenerate type-safe typescript classes for each of your contracts. These classes define type-safe methods for deploying and interacting with your contract based on their artifact. To generate them, include a `--typescript` option in the compile command with a path to the target folder for the typescript files: @@ -77,7 +77,7 @@ Read more about interacting with contracts using `aztec.js` [here](../getting_st An Aztec.nr contract can [call a function](./syntax/functions.md) in another contract via `context.call_private_function` or `context.call_public_function`. However, this requires manually assembling the function selector and manually serialising the arguments, which is not type-safe. -To make this easier, the compiler can generate contract interface structs that expose a convenience method for each function listed in a given contract ABI. These structs are intended to be used from another contract project that calls into the current one. For each contract, two interface structs are generated: one to be used from private functions with a `PrivateContext`, and one to be used from open functions with a `PublicContext`. +To make this easier, the compiler can generate contract interface structs that expose a convenience method for each function listed in a given contract artifact. These structs are intended to be used from another contract project that calls into the current one. For each contract, two interface structs are generated: one to be used from private functions with a `PrivateContext`, and one to be used from open functions with a `PublicContext`. To generate them, include a `--interface` option in the compile command with a path to the target folder for the generated Aztec.nr interface files: @@ -140,8 +140,8 @@ You can also programmatically access the compiler via the `@aztec/noir-compiler` The compiler exposes the following functions: - `compileUsingNargo`: Compiles an Aztec.nr project in the target folder using the `nargo` binary available on the shell `PATH` and returns the generated ABIs. -- `generateTypescriptContractInterface`: Generates a typescript class for the given contract ABI. -- `generateNoirContractInterface`: Generates a Aztec.nr interface struct for the given contract ABI. +- `generateTypescriptContractInterface`: Generates a typescript class for the given contract artifact. +- `generateNoirContractInterface`: Generates a Aztec.nr interface struct for the given contract artifact. ## Next steps diff --git a/docs/docs/dev_docs/contracts/deploying.md b/docs/docs/dev_docs/contracts/deploying.md index 0753fa10c61..2174fef658b 100644 --- a/docs/docs/dev_docs/contracts/deploying.md +++ b/docs/docs/dev_docs/contracts/deploying.md @@ -19,7 +19,7 @@ import TabItem from '@theme/TabItem'; ```bash -aztec-cli deploy /path/to/contract/abi.json +aztec-cli deploy /path/to/contract/artifact.json ``` @@ -54,7 +54,7 @@ There are several optional arguments that can be passed: -`aztec-cli deploy` takes 1 mandatory argument which is the path to the contract ABI 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` (run `aztec-cli example-contracts` to see the full list of contracts available). The command also takes the following optional arguments: - `-args ` (default: `[]`): Arguments to pass to the contract constructor. @@ -128,7 +128,7 @@ Once the recipient is registered we can deploy the contract: ```bash -aztec-cli deploy PrivateTokenContractAbi --args 1000 0x147392a39e593189902458f4303bc6e0a39128c5a1c1612f76527a162d36d529 +aztec-cli deploy PrivateTokenContractArtifact --args 1000 0x147392a39e593189902458f4303bc6e0a39128c5a1c1612f76527a162d36d529 ``` @@ -154,7 +154,7 @@ If we pass the salt as an argument: ```bash -aztec-cli deploy PrivateTokenContractAbi --args 1000 0x147392a39e593189902458f4303bc6e0a39128c5a1c1612f76527a162d36d529 --salt 0x123 +aztec-cli deploy PrivateTokenContractArtifact --args 1000 0x147392a39e593189902458f4303bc6e0a39128c5a1c1612f76527a162d36d529 --salt 0x123 ``` diff --git a/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md b/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md index d91c0b3db30..5e4557e2dc8 100644 --- a/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md +++ b/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md @@ -64,7 +64,7 @@ Create a new file `src/deploy.mjs`: // src/deploy.mjs import { writeFileSync } from 'fs'; import { Contract, ContractDeployer, createPXEClient, getSandboxAccountsWallets } from '@aztec/aztec.js'; -import TokenContractAbi from "../contracts/token/target/Token.json" assert { type: "json" }; +import TokenContractArtifact from "../contracts/token/target/Token.json" assert { type: "json" }; #include_code dapp-deploy yarn-project/end-to-end/src/sample-dapp/deploy.mjs raw diff --git a/docs/docs/dev_docs/tutorials/writing_dapp/contract_interaction.md b/docs/docs/dev_docs/tutorials/writing_dapp/contract_interaction.md index daed14e63fb..4d3d2ae0e22 100644 --- a/docs/docs/dev_docs/tutorials/writing_dapp/contract_interaction.md +++ b/docs/docs/dev_docs/tutorials/writing_dapp/contract_interaction.md @@ -18,7 +18,7 @@ To do this, let's first initialize a new `Contract` instance using `aztec.js` th // src/contracts.mjs import { Contract } from "@aztec/aztec.js"; import { readFileSync } from "fs"; -import TokenContractAbi from "../contracts/token/target/Token.json" assert { type: "json" }; +import TokenContractArtifact from "../contracts/token/target/Token.json" assert { type: "json" }; ``` And then add the following code for initialising the `Contract` instances: diff --git a/docs/docs/dev_docs/tutorials/writing_dapp/testing.md b/docs/docs/dev_docs/tutorials/writing_dapp/testing.md index ff9732be801..4c1a5e947b6 100644 --- a/docs/docs/dev_docs/tutorials/writing_dapp/testing.md +++ b/docs/docs/dev_docs/tutorials/writing_dapp/testing.md @@ -27,7 +27,7 @@ Create a new file `src/index.test.mjs` with the imports we'll be using and an em ```js import { createSandbox } from "@aztec/aztec-sandbox"; import { Contract, createAccount } from "@aztec/aztec.js"; -import TokenContractAbi from "../contracts/token/target/Token.json" assert { type: "json" }; +import TokenContractArtifact from "../contracts/token/target/Token.json" assert { type: "json" }; describe("token", () => {}); ``` diff --git a/docs/internal_notes/dev_docs/sandbox/components.md b/docs/internal_notes/dev_docs/sandbox/components.md index cc3f335c784..58ba7718f20 100644 --- a/docs/internal_notes/dev_docs/sandbox/components.md +++ b/docs/internal_notes/dev_docs/sandbox/components.md @@ -89,9 +89,9 @@ Responsibilities: These tasks are lower priority than providing a handcrafted ABI. - The ability for a dev to enclose a collection of Aztec.nr functions in a 'contract scope'. -- The ability to create an Aztec.nr contract abi from the above. +- The ability to create an Aztec.nr contract artifact from the above. -Design an Aztec.nr Contract ABI, similar to a Solidity ABI which is output by Solc (see [here](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html#json)). It might include for each function: +Design an Aztec.nr contract artifact, similar to a Solidity ABI which is output by Solc (see [here](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html#json)). It might include for each function: - ACIR opcodes (akin to Solidity bytecode). - Function name and parameter names & types. @@ -113,7 +113,7 @@ aztec.js should always be stateless. It offers the ability to interact with stat The analogous AC component would be the AztecSdk (wraps the CoreSdk which is more analogous to the private client). - Allows a user to create an Aztec keypair. Call `create_account` on Wallet. -- Create a `Contract` instance (similar to web3.js), given a path to an Aztec.nr Contract ABI. +- Create a `Contract` instance (similar to web3.js), given a path to an Aztec.nr contract artifact. - Construct `tx_request` by calling e.g. `contract.get_deployment_request(constructor_args)`. - Call wallet `sign_tx_request(tx_request)` to get signature. - Call `simulate_tx(signed_tx_request)` on the Private Client. In future this would help compute gas, for now we won't actually return gas (it's hard). Returns success or failure, so client knows if it should proceed, and computed kernel circuit public outputs. diff --git a/docs/static/img/sandbox_unconstrained_function.svg b/docs/static/img/sandbox_unconstrained_function.svg index 947e30edf8d..7eb4ef51086 100644 --- a/docs/static/img/sandbox_unconstrained_function.svg +++ b/docs/static/img/sandbox_unconstrained_function.svg @@ -1562,7 +1562,7 @@ id="path123" d="m 35.238404,-32.364863 c 0,4.677301 -1.584876,8.252478 -4.727767,10.752414 -3.169752,2.446175 -7.682621,3.655821 -13.538605,3.655821 H 11.59957 V -9.6379609e-5 H 6.227108 V -45.697856 h 11.926866 c 11.38962,0 17.08443,4.462252 17.08443,13.332993 z m -23.638834,9.892221 h 4.727767 c 4.727767,0 8.112418,-0.752669 10.207678,-2.258007 2.148985,-1.5591 3.223478,-4.032155 3.223478,-7.419165 0,-3.010676 -1.020768,-5.214921 -3.008579,-6.666497 -1.934087,-1.505338 -5.023252,-2.258007 -9.240635,-2.258007 H 11.59957 Z M 75.29011,-9.6379609e-5 H 69.165503 L 56.916289,-20.107111 44.452177,-9.6379609e-5 h -5.69481 L 54.01516,-23.870455 39.831859,-45.697856 h 5.909709 L 57.023739,-27.6338 68.520808,-45.697856 h 5.58736 l -14.075851,21.612352 z m 31.99301,0 H 81.710203 V -45.697856 h 25.572917 v 4.731062 H 87.082665 v 14.730807 h 18.911065 v 4.731063 H 87.082665 V -4.7311585 H 107.28312 Z M 161.22264,-34.192773 v 3.225724 l -6.3395,0.752669 c 0.56411,0.725788 1.07449,1.693505 1.50429,2.903152 0.48352,1.155885 0.75214,2.473055 0.75214,3.978393 0,3.306368 -1.15508,5.96759 -3.43837,7.956787 -2.31016,2.016077 -5.45305,3.010676 -9.45554,3.010676 -1.02076,0 -1.98781,-0.05376 -2.90113,-0.215049 -2.14898,1.155885 -3.22347,2.6343417 -3.22347,4.40849 0,0.9408362 0.34921,1.6128621 1.07449,2.0429586 0.77901,0.4300966 2.09526,0.6451449 3.97562,0.6451449 h 6.12461 c 3.707,0 6.5544,0.806431 8.48849,2.3655311 1.98781,1.585981 3.00858,3.870869 3.00858,6.8815449 0,3.7095829 -1.55802,6.5858535 -4.62032,8.6019315 -3.00858,1.989196 -7.414,3.010676 -13.21626,3.010676 -4.51287,0 -8.00497,-0.860193 -10.42257,-2.58058 -2.44447,-1.666624 -3.65328,-3.9783929 -3.65328,-6.9890688 0,-2.0967207 0.67156,-3.8708691 2.04154,-5.37620702 1.34311,-1.50533798 3.22347,-2.52681728 5.58736,-3.11820008 -0.8596,-0.4300965 -1.58488,-1.0214793 -2.14899,-1.8279104 -0.59097,-0.8601931 -0.85959,-1.8279103 -0.85959,-2.9031517 0,-1.2902897 0.32235,-2.3924122 0.96704,-3.333248 0.6447,-0.913956 1.66547,-1.827911 3.11603,-2.688104 -1.71919,-0.698907 -3.16975,-1.935434 -4.29797,-3.655821 -1.15508,-1.774148 -1.71919,-3.790226 -1.71919,-6.021351 0,-3.790226 1.10136,-6.693378 3.33093,-8.709456 2.2833,-1.989196 5.50677,-3.010676 9.67043,-3.010676 1.77291,0 3.38465,0.215049 4.83522,0.645145 z m -27.2921,39.891456 c 0,1.8547915 0.779,3.2526053 2.36388,4.1934415 1.55801,0.9945985 3.78758,1.5053375 6.66185,1.5053375 4.3517,0 7.57517,-0.645144 9.67043,-1.9354341 2.14899,-1.2902896 3.22348,-3.0644379 3.22348,-5.2686828 0,-1.8816725 -0.59097,-3.1719621 -1.71919,-3.87086906 -1.15508,-0.69890691 -3.33092,-1.0752414 -6.5544,-1.0752414 h -6.23206 c -2.31016,0 -4.13679,0.5376207 -5.47991,1.6128621 -1.28939,1.12900346 -1.93408,2.74186556 -1.93408,4.83858626 z m 2.79368,-28.923994 c 0,2.365531 0.67155,4.166561 2.04153,5.376207 1.34312,1.236528 3.25034,1.827911 5.69481,1.827911 4.99639,0 7.52145,-2.419293 7.52145,-7.311642 0,-5.161159 -2.55192,-7.741738 -7.6289,-7.741738 -2.44447,0 -4.35169,0.698907 -5.69481,2.042959 -1.28939,1.290289 -1.93408,3.225724 -1.93408,5.806303 z m 46.01513,23.87035946 c -5.10383,0 -9.10632,-1.532219 -12.03431,-4.62353806 -2.95485,-3.064438 -4.40542,-7.3654034 -4.40542,-12.9028964 0,-5.510613 1.34312,-9.892221 4.08307,-13.117945 2.7131,-3.225725 6.36637,-4.838587 10.95982,-4.838587 4.29797,0 7.68263,1.451576 10.20768,4.300966 2.4982,2.795627 3.76073,6.50521 3.76073,11.074986 v 3.333249 h -23.53139 c 0.0537,4.032155 1.07449,7.0697118 3.00858,9.1395515 1.93409,2.0967207 4.64718,3.1182001 8.16614,3.1182001 3.65328,0 7.30655,-0.77955 10.95983,-2.3655311 v 4.623538 c -1.88037,0.80643107 -3.62642,1.37093281 -5.26502,1.72038626 -1.66546,0.34945346 -3.62641,0.5376207 -5.90971,0.5376207 z M 181.34251,-30.536952 c -2.79368,0 -5.02325,0.913955 -6.66185,2.688103 -1.58487,1.80103 -2.52506,4.274085 -2.79368,7.419166 h 17.83658 c 0,-3.225724 -0.72529,-5.698779 -2.14899,-7.419166 -1.45056,-1.774148 -3.51896,-2.688103 -6.23206,-2.688103 z m 33.87338,26.8810349 c 0.91332,0 1.82664,-0.053762 2.68623,-0.2150483 0.85959,-0.1344052 1.53115,-0.2688104 2.04154,-0.4300966 v 3.9783932 c -0.59097,0.29569139 -1.45057,0.48385863 -2.57879,0.64514484 -1.07449,0.21504828 -2.04153,0.32257242 -2.90113,0.32257242 -6.60812,0 -9.88533,-3.49453456 -9.88533,-10.53736576 V -30.21438 h -4.94266 v -2.473055 l 4.94266,-2.150483 2.14899,-7.311641 h 3.00858 v 7.956786 h 9.99278 v 3.978393 h -9.99278 v 20.107014 c 0,2.0967212 0.45666,3.7095833 1.39684,4.8385868 0.9939,1.0752414 2.36388,1.6128621 4.08307,1.6128621 z m 33.65848,-5.6987795 c 0,3.2257242 -1.18195,5.6987795 -3.54583,7.4191657 -2.36388,1.72038624 -5.69481,2.58057936 -9.99278,2.58057936 -4.59345,0 -8.13928,-0.69890691 -10.63747,-2.15048276 v -4.8385863 c 1.6386,0.8601931 3.38465,1.5591 5.26501,2.0429586 1.8535,0.4300966 3.68013,0.6451449 5.47991,0.6451449 2.71309,0 4.78149,-0.4300966 6.23206,-1.2902897 1.4237,-0.8601931 2.14898,-2.1773639 2.14898,-3.9783932 0,-1.29029 -0.59097,-2.392412 -1.71919,-3.333248 -1.15508,-0.994599 -3.41151,-2.150483 -6.7693,-3.440773 -3.16975,-1.129003 -5.42619,-2.150483 -6.7693,-3.010676 -1.36998,-0.913955 -2.36389,-1.935434 -3.00858,-3.010676 -0.6447,-1.129003 -0.96704,-2.499936 -0.96704,-4.085917 0,-2.795628 1.10135,-4.972991 3.33092,-6.558973 2.2833,-1.639743 5.42619,-2.473055 9.45554,-2.473055 3.65327,0 7.22596,0.752669 10.74492,2.258007 l -1.82664,4.193442 c -3.43837,-1.424695 -6.5544,-2.150483 -9.34808,-2.150483 -2.44447,0 -4.29797,0.403215 -5.58736,1.182765 -1.23567,0.806431 -1.82664,1.881673 -1.82664,3.225725 0,0.860193 0.2149,1.612862 0.6447,2.258007 0.48352,0.645144 1.23566,1.290289 2.25643,1.935434 1.07449,0.591383 3.0623,1.397814 6.01716,2.473055 4.08307,1.505338 6.82303,3.010676 8.27359,4.516014 1.4237,1.451576 2.14899,3.306367 2.14899,5.5912554 z m 38.76231,9.99974506 c -5.02325,0 -8.89142,-1.50533796 -11.60452,-4.51601386 -2.73995,-3.064438 -4.08307,-7.4191656 -4.08307,-13.0104206 0,-5.725661 1.39684,-10.134151 4.19052,-13.22547 2.79368,-3.145081 6.71558,-4.731062 11.81942,-4.731062 1.6386,0 3.2772,0.188167 4.94266,0.537621 1.6386,0.376334 2.928,0.752669 3.86818,1.182765 l -1.61174,4.40849 c -1.15508,-0.430096 -2.41761,-0.77955 -3.76073,-1.075241 -1.36997,-0.349454 -2.55192,-0.537621 -3.54582,-0.537621 -6.95734,0 -10.42258,4.462252 -10.42258,13.332993 0,4.247204 0.80587,7.4998093 2.47133,9.7846972 1.71919,2.2311259 4.24425,3.3332484 7.6289,3.3332484 2.79368,0 5.69481,-0.5913828 8.70339,-1.8279104 v 4.5160139 c -2.31016,1.20964656 -5.15756,1.82791036 -8.59594,1.82791036 z M 334.00103,-17.096435 c 0,5.537494 -1.45057,9.8653402 -4.29797,13.0104213 -2.79368,3.17196213 -6.66185,4.73106216 -11.60452,4.73106216 -3.08916,0 -5.80226,-0.69890691 -8.16614,-2.15048276 -2.36388,-1.4246949 -4.24425,-3.4676536 -5.58736,-6.128876 -1.28939,-2.7149847 -1.93409,-5.8600657 -1.93409,-9.4621247 0,-5.591255 1.39684,-9.919102 4.19052,-13.010421 2.79368,-3.145081 6.68872,-4.731062 11.71197,-4.731062 4.78149,0 8.59594,1.612862 11.38962,4.838587 2.8474,3.171962 4.29797,7.472927 4.29797,12.902896 z m -26.11017,0 c 0,4.381609 0.8596,7.7148574 2.57878,9.9997454 1.71919,2.2311259 4.29797,3.3332483 7.73635,3.3332483 3.35779,0 5.90971,-1.1021224 7.6289,-3.3332483 1.77291,-2.284888 2.68623,-5.6181364 2.68623,-9.9997454 0,-4.354727 -0.91332,-7.661095 -2.68623,-9.892221 -1.71919,-2.284888 -4.29797,-3.440772 -7.73635,-3.440772 -3.38465,0 -5.90971,1.129003 -7.6289,3.333248 -1.71918,2.231126 -2.57878,5.564375 -2.57878,9.999745 z M 366.42384,-9.6379609e-5 V -22.150069 c 0,-2.795628 -0.6447,-4.865468 -1.93409,-6.2364 -1.23566,-1.344052 -3.19661,-2.042959 -5.90971,-2.042959 -3.59955,0 -6.20519,0.967717 -7.84379,2.903152 -1.66546,1.935434 -2.47133,5.134277 -2.47133,9.569648 V -9.6379609e-5 H 342.9999 V -34.192773 h 4.29797 l 0.75215,4.623538 h 0.32235 c 1.07449,-1.639743 2.52505,-2.930033 4.40541,-3.870869 1.93409,-0.913955 4.08308,-1.397814 6.44696,-1.397814 4.1368,0 7.25282,1.02148 9.34808,3.010676 2.0684,1.935435 3.11603,5.107397 3.11603,9.462124 V -9.6379609e-5 Z M 393.36674,-3.6559171 c 0.91332,0 1.82663,-0.053762 2.68623,-0.2150483 0.85959,-0.1344052 1.53115,-0.2688104 2.04153,-0.4300966 v 3.9783932 c -0.59097,0.29569139 -1.45056,0.48385863 -2.57878,0.64514484 -1.07449,0.21504828 -2.04153,0.32257242 -2.90113,0.32257242 -6.60813,0 -9.88533,-3.49453456 -9.88533,-10.53736576 V -30.21438 h -4.94266 v -2.473055 l 4.94266,-2.150483 2.14899,-7.311641 h 3.00858 v 7.956786 h 9.99278 v 3.978393 h -9.99278 v 20.107014 c 0,2.0967212 0.45666,3.7095833 1.39684,4.8385868 0.9939,1.0752414 2.36388,1.6128621 4.08307,1.6128621 z m 27.21152,-31.1820009 c 1.50429,0 2.8474,0.107524 4.08307,0.322573 l -0.75214,4.838586 c -1.45057,-0.26881 -2.68624,-0.430097 -3.76073,-0.430097 -2.73995,0 -5.10384,1.129004 -7.09165,3.333249 -1.93409,2.231126 -2.90113,5.026753 -2.90113,8.386883 V -9.6379609e-5 h -5.26501 V -34.192773 h 4.29797 l 0.64469,6.343924 h 0.2149 c 1.28939,-2.284888 2.82055,-4.005274 4.62032,-5.161158 1.77291,-1.209647 3.76072,-1.827911 5.90971,-1.827911 z M 452.06089,-9.6379609e-5 451.09384,-4.8386827 h -0.32234 c -1.66547,2.1504828 -3.33093,3.6289397 -5.05012,4.40848976 -1.71919,0.69890691 -3.84131,1.0752414 -6.3395,1.0752414 -3.43838,0 -6.12461,-0.86019312 -8.0587,-2.58057936 -1.93408,-1.7741483 -2.90113,-4.3009656 -2.90113,-7.5266898 0,-6.8815453 5.53364,-10.4836033 16.65464,-10.8599383 l 5.80226,-0.215048 v -2.150483 c 0,-2.634341 -0.59098,-4.623538 -1.71919,-5.913828 -1.15508,-1.290289 -3.00858,-1.935434 -5.58736,-1.935434 -2.87427,0 -6.09775,0.913955 -9.67044,2.688103 l -1.61173,-3.978393 c 1.71918,-0.913955 3.57268,-1.639743 5.58736,-2.150483 1.98781,-0.564501 4.00248,-0.860193 6.01715,-0.860193 4.08308,0 7.09165,0.940836 9.02574,2.795628 1.98781,1.801029 3.00858,4.704181 3.00858,8.709455 V -9.6379609e-5 Z M 440.34892,-3.6559171 c 3.22348,0 5.74853,-0.8601932 7.6289,-2.5805794 1.8535,-1.7741483 2.79368,-4.3009655 2.79368,-7.5266895 v -3.1182 l -5.15757,0.215048 c -4.16366,0.161286 -7.17223,0.806431 -9.02573,1.935434 -1.79978,1.155885 -2.68624,2.956914 -2.68624,5.3762074 0,1.8816725 0.56411,3.3063673 1.71919,4.3009656 1.12822,0.9408363 2.7131,1.3978139 4.72777,1.3978139 z m 39.99798,4.30096556 c -5.02325,0 -8.89142,-1.50533796 -11.60452,-4.51601386 -2.73995,-3.064438 -4.08307,-7.4191656 -4.08307,-13.0104206 0,-5.725661 1.39684,-10.134151 4.19052,-13.22547 2.79368,-3.145081 6.71558,-4.731062 11.81942,-4.731062 1.6386,0 3.2772,0.188167 4.94266,0.537621 1.6386,0.376334 2.928,0.752669 3.86818,1.182765 l -1.61174,4.40849 c -1.15508,-0.430096 -2.41761,-0.77955 -3.76073,-1.075241 -1.36997,-0.349454 -2.55192,-0.537621 -3.54582,-0.537621 -6.95734,0 -10.42258,4.462252 -10.42258,13.332993 0,4.247204 0.80587,7.4998093 2.47134,9.7846972 1.71918,2.2311259 4.24424,3.3332484 7.62889,3.3332484 2.79368,0 5.69481,-0.5913828 8.70339,-1.8279104 v 4.5160139 c -2.31016,1.20964656 -5.15756,1.82791036 -8.59594,1.82791036 z m 27.80249,-4.30096556 c 0.91332,0 1.82664,-0.053762 2.68623,-0.2150483 0.8596,-0.1344052 1.53116,-0.2688104 2.04154,-0.4300966 v 3.9783932 c -0.59097,0.29569139 -1.45056,0.48385863 -2.57878,0.64514484 -1.07449,0.21504828 -2.04154,0.32257242 -2.90113,0.32257242 -6.60813,0 -9.88533,-3.49453456 -9.88533,-10.53736576 V -30.21438 h -4.94267 v -2.473055 l 4.94267,-2.150483 2.14898,-7.311641 h 3.00858 v 7.956786 h 9.99278 v 3.978393 h -9.99278 v 20.107014 c 0,2.0967212 0.45666,3.7095833 1.39684,4.8385868 0.99391,1.0752414 2.36389,1.6128621 4.08307,1.6128621 z M 565.84964,-9.6379609e-5 560.15483,-14.515855 H 541.78101 L 536.19365,-9.6379609e-5 h -5.37247 L 548.87266,-45.80538 h 4.51287 L 571.32955,-9.6379609e-5 Z M 558.54309,-19.354442 553.17063,-33.440104 c -0.72529,-1.774148 -1.45057,-3.978393 -2.14899,-6.558972 -0.4298,1.935434 -1.07449,4.139679 -1.93408,6.558972 l -5.37247,14.085662 z m 18.99165,-26.343414 h 13.00136 c 6.01716,0 10.36885,0.940836 13.10881,2.795628 2.71309,1.801029 4.08307,4.623538 4.08307,8.494407 0,2.741865 -0.75214,4.999872 -2.25643,6.774021 -1.50429,1.720386 -3.73386,2.87627 -6.66186,3.440772 v 0.215048 c 6.93048,1.236528 10.42258,4.892349 10.42258,10.967463 0,4.085917 -1.39684,7.2847602 -4.19052,9.5696481 -2.73996,2.311769 -6.5544,3.440772520391 -11.49707,3.440772520391 h -16.00994 z m 5.37247,19.569394 h 8.70338 c 3.78759,0 6.50068,-0.564502 8.16615,-1.720387 1.6386,-1.209646 2.47133,-3.225724 2.47133,-6.021352 0,-2.499936 -0.94018,-4.327846 -2.79368,-5.483731 -1.79978,-1.129003 -4.70091,-1.720386 -8.70339,-1.720386 h -7.84379 z m 0,4.516013 v 17.0963387 h 9.56298 c 3.65327,0 6.39323,-0.6989069 8.27359,-2.1504828 1.8535,-1.4246948 2.79368,-3.6558209 2.79368,-6.6664969 0,-2.849389 -0.96704,-4.94611 -2.90113,-6.2364 -1.88036,-1.344052 -4.72777,-2.042959 -8.59594,-2.042959 z M 619.01015,-9.6379609e-5 V -45.697856 h 5.37246 V -9.6379609e-5 Z m 0,0" style="fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none" - aria-label="PXE gets contract ABI " + aria-label="PXE gets contract artifact " transform="matrix(0.14541749,0,0,0.14531621,604.45384,206.06642)" clip-path="url(#clipPath124)" /> { describe('empty constructor', () => { it('should run the empty constructor', async () => { - const abi = getFunctionAbi(TestContractAbi, 'constructor'); + const abi = getFunctionAbi(TestContractArtifact, 'constructor'); const contractDeploymentData = makeContractDeploymentData(100); const txContext = { isContractDeploymentTx: true, contractDeploymentData }; const result = await runSimulator({ abi, txContext }); @@ -228,7 +228,7 @@ describe('Private Execution test suite', () => { oracle.getFunctionABI.mockImplementation((_, selector) => Promise.resolve( - PrivateTokenAirdropContractAbi.functions.find(f => + PrivateTokenAirdropContractArtifact.functions.find(f => selector.equals(FunctionSelector.fromNameAndParameters(f.name, f.parameters)), )!, ), @@ -262,7 +262,7 @@ describe('Private Execution test suite', () => { }); it('should a constructor with arguments that inserts notes', async () => { - const abi = getFunctionAbi(PrivateTokenAirdropContractAbi, 'constructor'); + const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'constructor'); const result = await runSimulator({ args: [140, owner], abi }); @@ -280,7 +280,7 @@ describe('Private Execution test suite', () => { }); it('should run the mint function', async () => { - const abi = getFunctionAbi(PrivateTokenAirdropContractAbi, 'mint'); + const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'mint'); const result = await runSimulator({ args: [140, owner], abi }); @@ -299,7 +299,7 @@ describe('Private Execution test suite', () => { it('should run the transfer function', async () => { const amountToTransfer = 100n; - const abi = getFunctionAbi(PrivateTokenAirdropContractAbi, 'transfer'); + const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'transfer'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); const recipientStorageSlot = computeSlotForMapping(new Fr(1n), recipient.toField(), circuitsWasm); @@ -346,7 +346,7 @@ describe('Private Execution test suite', () => { it('should be able to transfer with dummy notes', async () => { const amountToTransfer = 100n; const balance = 160n; - const abi = getFunctionAbi(PrivateTokenAirdropContractAbi, 'transfer'); + const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'transfer'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); @@ -409,7 +409,7 @@ describe('Private Execution test suite', () => { oracle.getFunctionABI.mockImplementation((_, selector) => Promise.resolve( - StatefulTestContractAbi.functions.find(f => + StatefulTestContractArtifact.functions.find(f => selector.equals(FunctionSelector.fromNameAndParameters(f.name, f.parameters)), )!, ), @@ -443,7 +443,7 @@ describe('Private Execution test suite', () => { }); it('should a constructor with arguments that inserts notes', async () => { - const abi = getFunctionAbi(StatefulTestContractAbi, 'constructor'); + const abi = getFunctionAbi(StatefulTestContractArtifact, 'constructor'); const result = await runSimulator({ args: [owner, 140], abi }); @@ -461,7 +461,7 @@ describe('Private Execution test suite', () => { }); it('should run the create_note function', async () => { - const abi = getFunctionAbi(StatefulTestContractAbi, 'create_note'); + const abi = getFunctionAbi(StatefulTestContractArtifact, 'create_note'); const result = await runSimulator({ args: [owner, 140], abi }); @@ -480,7 +480,7 @@ describe('Private Execution test suite', () => { it('should run the destroy_and_create function', async () => { const amountToTransfer = 100n; - const abi = getFunctionAbi(StatefulTestContractAbi, 'destroy_and_create'); + const abi = getFunctionAbi(StatefulTestContractArtifact, 'destroy_and_create'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); const recipientStorageSlot = computeSlotForMapping(new Fr(1n), recipient.toField(), circuitsWasm); @@ -527,7 +527,7 @@ describe('Private Execution test suite', () => { it('should be able to destroy_and_create with dummy notes', async () => { const amountToTransfer = 100n; const balance = 160n; - const abi = getFunctionAbi(StatefulTestContractAbi, 'destroy_and_create'); + const abi = getFunctionAbi(StatefulTestContractArtifact, 'destroy_and_create'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); @@ -557,15 +557,15 @@ describe('Private Execution test suite', () => { it('child function should be callable', async () => { const initialValue = 100n; - const abi = getFunctionAbi(ChildContractAbi, 'value'); + const abi = getFunctionAbi(ChildContractArtifact, 'value'); const result = await runSimulator({ args: [initialValue], abi }); expect(result.callStackItem.publicInputs.returnValues[0]).toEqual(new Fr(initialValue + privateIncrement)); }); it('parent should call child', async () => { - const childAbi = getFunctionAbi(ChildContractAbi, 'value'); - const parentAbi = getFunctionAbi(ParentContractAbi, 'entryPoint'); + const childAbi = getFunctionAbi(ChildContractArtifact, 'value'); + const parentAbi = getFunctionAbi(ParentContractArtifact, 'entryPoint'); const parentAddress = AztecAddress.random(); const childAddress = AztecAddress.random(); const childSelector = FunctionSelector.fromNameAndParameters(childAbi.name, childAbi.parameters); @@ -602,7 +602,7 @@ describe('Private Execution test suite', () => { const dummyNote = { amount: 1, secretHash: 2 }; const deepStruct = { aField: 1, aBool: true, aNote: dummyNote, manyNotes: [dummyNote, dummyNote, dummyNote] }; args = [1, true, 1, [1, 2], dummyNote, deepStruct]; - testCodeGenAbi = TestContractAbi.functions.find(f => f.name === 'testCodeGen')!; + testCodeGenAbi = TestContractArtifact.functions.find(f => f.name === 'testCodeGen')!; const serializedArgs = encodeArguments(testCodeGenAbi, args); argsHash = await computeVarArgsHash(await CircuitsWasm.get(), serializedArgs); }); @@ -616,7 +616,7 @@ describe('Private Execution test suite', () => { it('test function should be callable through autogenerated interface', async () => { const testAddress = AztecAddress.random(); - const parentAbi = ImportTestContractAbi.functions.find(f => f.name === 'main')!; + const parentAbi = ImportTestContractArtifact.functions.find(f => f.name === 'main')!; const testCodeGenSelector = FunctionSelector.fromNameAndParameters( testCodeGenAbi.name, testCodeGenAbi.parameters, @@ -649,7 +649,7 @@ describe('Private Execution test suite', () => { it('Should be able to consume a dummy cross chain message', async () => { const bridgedAmount = 100n; - const abi = getFunctionAbi(NonNativeTokenContractAbi, 'mint'); + const abi = getFunctionAbi(NonNativeTokenContractArtifact, 'mint'); const secret = new Fr(1n); const canceller = EthAddress.random(); @@ -683,7 +683,7 @@ describe('Private Execution test suite', () => { it('Should be able to consume a dummy public to private message', async () => { const amount = 100n; - const abi = getFunctionAbi(NonNativeTokenContractAbi, 'redeemShield'); + const abi = getFunctionAbi(NonNativeTokenContractArtifact, 'redeemShield'); const wasm = await CircuitsWasm.get(); const secret = new Fr(1n); @@ -723,15 +723,18 @@ describe('Private Execution test suite', () => { describe('enqueued calls', () => { it.each([false, true])('parent should enqueue call to child (internal %p)', async isInternal => { - const parentAbi = ParentContractAbi.functions.find(f => f.name === 'enqueueCallToChild')!; - const childContractAbi = ParentContractAbi.functions[0]; + const parentAbi = ParentContractArtifact.functions.find(f => f.name === 'enqueueCallToChild')!; + const childContractArtifact = ParentContractArtifact.functions[0]; const childAddress = AztecAddress.random(); const childPortalContractAddress = EthAddress.random(); - const childSelector = FunctionSelector.fromNameAndParameters(childContractAbi.name, childContractAbi.parameters); + const childSelector = FunctionSelector.fromNameAndParameters( + childContractArtifact.name, + childContractArtifact.parameters, + ); const parentAddress = AztecAddress.random(); oracle.getPortalContractAddress.mockImplementation(() => Promise.resolve(childPortalContractAddress)); - oracle.getFunctionABI.mockImplementation(() => Promise.resolve({ ...childContractAbi, isInternal })); + oracle.getFunctionABI.mockImplementation(() => Promise.resolve({ ...childContractArtifact, isInternal })); const args = [Fr.fromBuffer(childAddress.toBuffer()), childSelector.toField(), 42n]; const result = await runSimulator({ @@ -742,7 +745,7 @@ describe('Private Execution test suite', () => { }); // Alter function data (abi) to match the manipulated oracle - const functionData = FunctionData.fromAbi(childContractAbi); + const functionData = FunctionData.fromAbi(childContractArtifact); functionData.isInternal = isInternal; const publicCallRequest = PublicCallRequest.from({ @@ -783,7 +786,7 @@ describe('Private Execution test suite', () => { beforeEach(() => { oracle.getFunctionABI.mockImplementation((_, selector) => Promise.resolve( - PendingCommitmentsContractAbi.functions.find(f => + PendingCommitmentsContractArtifact.functions.find(f => selector.equals(FunctionSelector.fromNameAndParameters(f.name, f.parameters)), )!, ), @@ -796,7 +799,7 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = AztecAddress.random(); - const abi = PendingCommitmentsContractAbi.functions.find( + const abi = PendingCommitmentsContractArtifact.functions.find( f => f.name === 'test_insert_then_get_then_nullify_flat', )!; @@ -839,12 +842,14 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = AztecAddress.random(); - const abi = PendingCommitmentsContractAbi.functions.find( + const abi = PendingCommitmentsContractArtifact.functions.find( f => f.name === 'test_insert_then_get_then_nullify_all_in_nested_calls', )!; - const insertAbi = PendingCommitmentsContractAbi.functions.find(f => f.name === 'insert_note')!; - const getThenNullifyAbi = PendingCommitmentsContractAbi.functions.find(f => f.name === 'get_then_nullify_note')!; - const getZeroAbi = PendingCommitmentsContractAbi.functions.find(f => f.name === 'get_note_zero_balance')!; + const insertAbi = PendingCommitmentsContractArtifact.functions.find(f => f.name === 'insert_note')!; + const getThenNullifyAbi = PendingCommitmentsContractArtifact.functions.find( + f => f.name === 'get_then_nullify_note', + )!; + const getZeroAbi = PendingCommitmentsContractArtifact.functions.find(f => f.name === 'get_note_zero_balance')!; const insertFnSelector = FunctionSelector.fromNameAndParameters(insertAbi.name, insertAbi.parameters); const getThenNullifyFnSelector = FunctionSelector.fromNameAndParameters( @@ -910,7 +915,7 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = AztecAddress.random(); - const abi = PendingCommitmentsContractAbi.functions.find(f => f.name === 'test_bad_get_then_insert_flat')!; + const abi = PendingCommitmentsContractArtifact.functions.find(f => f.name === 'test_bad_get_then_insert_flat')!; const args = [amountToTransfer, owner]; const result = await runSimulator({ @@ -949,7 +954,7 @@ describe('Private Execution test suite', () => { describe('get public key', () => { it('gets the public key for an address', async () => { // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractAbi, 'getPublicKey'); + const abi = getFunctionAbi(TestContractArtifact, 'getPublicKey'); abi.returnTypes = [{ kind: 'array', length: 2, type: { kind: 'field' } }]; // Generate a partial address, pubkey, and resulting address @@ -969,7 +974,7 @@ describe('Private Execution test suite', () => { const aztecAddressToQuery = AztecAddress.random(); // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractAbi, 'getPortalContractAddress'); + const abi = getFunctionAbi(TestContractArtifact, 'getPortalContractAddress'); abi.returnTypes = [{ kind: 'field' }]; const args = [aztecAddressToQuery.toField()]; @@ -984,7 +989,7 @@ describe('Private Execution test suite', () => { const contractAddress = AztecAddress.random(); // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractAbi, 'getThisAddress'); + const abi = getFunctionAbi(TestContractArtifact, 'getThisAddress'); abi.returnTypes = [{ kind: 'field' }]; // Overwrite the oracle return value @@ -996,7 +1001,7 @@ describe('Private Execution test suite', () => { const portalContractAddress = EthAddress.random(); // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractAbi, 'getThisPortalAddress'); + const abi = getFunctionAbi(TestContractArtifact, 'getThisPortalAddress'); abi.returnTypes = [{ kind: 'field' }]; // Overwrite the oracle return value diff --git a/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts b/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts index 2cb8fa654ac..c662b2887ca 100644 --- a/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts @@ -2,7 +2,7 @@ import { CompleteAddress, FunctionData, HistoricBlockData } from '@aztec/circuit import { FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; -import { StatefulTestContractAbi } from '@aztec/noir-contracts/artifacts'; +import { StatefulTestContractArtifact } from '@aztec/noir-contracts/artifacts'; import { FunctionCall } from '@aztec/types'; import { mock } from 'jest-mock-extended'; @@ -40,7 +40,7 @@ describe('Unconstrained Execution test suite', () => { it('should run the summed_values function', async () => { const contractAddress = AztecAddress.random(); - const abi = StatefulTestContractAbi.functions.find(f => f.name === 'summed_values')!; + const abi = StatefulTestContractArtifact.functions.find(f => f.name === 'summed_values')!; const preimages = [...Array(5).fill(buildNote(1n, owner)), ...Array(2).fill(buildNote(2n, owner))]; diff --git a/yarn-project/acir-simulator/src/public/index.test.ts b/yarn-project/acir-simulator/src/public/index.test.ts index 24fb47cad49..09b9f408863 100644 --- a/yarn-project/acir-simulator/src/public/index.test.ts +++ b/yarn-project/acir-simulator/src/public/index.test.ts @@ -14,11 +14,11 @@ import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { toBigInt } from '@aztec/foundation/serialize'; import { - ChildContractAbi, - NonNativeTokenContractAbi, - ParentContractAbi, - PublicTokenContractAbi, - TestContractAbi, + ChildContractArtifact, + NonNativeTokenContractArtifact, + ParentContractArtifact, + PublicTokenContractArtifact, + TestContractArtifact, } from '@aztec/noir-contracts/artifacts'; import { MockProxy, mock } from 'jest-mock-extended'; @@ -63,7 +63,7 @@ describe('ACIR public execution simulator', () => { describe('mint', () => { it('should run the mint function', async () => { const contractAddress = AztecAddress.random(); - const mintAbi = PublicTokenContractAbi.functions.find(f => f.name === 'mint')!; + const mintAbi = PublicTokenContractArtifact.functions.find(f => f.name === 'mint')!; const functionData = FunctionData.fromAbi(mintAbi); const args = encodeArguments(mintAbi, [140, recipient]); @@ -111,7 +111,7 @@ describe('ACIR public execution simulator', () => { beforeEach(() => { contractAddress = AztecAddress.random(); - abi = PublicTokenContractAbi.functions.find(f => f.name === 'transfer')!; + abi = PublicTokenContractArtifact.functions.find(f => f.name === 'transfer')!; functionData = new FunctionData(FunctionSelector.empty(), false, false, false); args = encodeArguments(abi, [140, recipient]); sender = AztecAddress.random(); @@ -202,14 +202,14 @@ describe('ACIR public execution simulator', () => { 'calls the public entry point in the parent', async isInternal => { const parentContractAddress = AztecAddress.random(); - const parentEntryPointFn = ParentContractAbi.functions.find(f => f.name === 'pubEntryPoint')!; + const parentEntryPointFn = ParentContractArtifact.functions.find(f => f.name === 'pubEntryPoint')!; const parentEntryPointFnSelector = FunctionSelector.fromNameAndParameters( parentEntryPointFn.name, parentEntryPointFn.parameters, ); const childContractAddress = AztecAddress.random(); - const childValueFn = ChildContractAbi.functions.find(f => f.name === 'pubGetValue')!; + const childValueFn = ChildContractArtifact.functions.find(f => f.name === 'pubGetValue')!; const childValueFnSelector = FunctionSelector.fromNameAndParameters(childValueFn.name, childValueFn.parameters); const initialValue = 3n; @@ -285,7 +285,7 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to create a commitment from the public context', async () => { - const shieldAbi = NonNativeTokenContractAbi.functions.find(f => f.name === 'shield')!; + const shieldAbi = NonNativeTokenContractArtifact.functions.find(f => f.name === 'shield')!; const args = encodeArguments(shieldAbi, params); const callContext = CallContext.from({ @@ -318,7 +318,9 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to create a L2 to L1 message from the public context', async () => { - const createL2ToL1MessagePublicAbi = TestContractAbi.functions.find(f => f.name === 'createL2ToL1MessagePublic')!; + const createL2ToL1MessagePublicAbi = TestContractArtifact.functions.find( + f => f.name === 'createL2ToL1MessagePublic', + )!; const args = encodeArguments(createL2ToL1MessagePublicAbi, params); const callContext = CallContext.from({ @@ -347,7 +349,7 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to consume an Ll to L2 message in the public context', async () => { - const mintPublicAbi = NonNativeTokenContractAbi.functions.find(f => f.name === 'mintPublic')!; + const mintPublicAbi = NonNativeTokenContractArtifact.functions.find(f => f.name === 'mintPublic')!; // Set up cross chain message const canceller = EthAddress.random(); @@ -403,7 +405,7 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to create a nullifier from the public context', async () => { - const createNullifierPublicAbi = TestContractAbi.functions.find(f => f.name === 'createNullifierPublic')!; + const createNullifierPublicAbi = TestContractArtifact.functions.find(f => f.name === 'createNullifierPublic')!; const args = encodeArguments(createNullifierPublicAbi, params); diff --git a/yarn-project/boxes/blank-react/README.md b/yarn-project/boxes/blank-react/README.md index f6d7be7983f..5493bf9b20b 100644 --- a/yarn-project/boxes/blank-react/README.md +++ b/yarn-project/boxes/blank-react/README.md @@ -62,9 +62,9 @@ This will generate a [Contract ABI](src/artifacts/test_contract.json) and TypeSc Note: the `compile` command seems to generate a Typescript file which needs a single change - ``` -import TestContractAbiJson from 'text_contract.json' assert { type: 'json' }; +import TestContractArtifactJson from 'text_contract.json' assert { type: 'json' }; // need to update the relative import to -import TestContractAbiJson from './test_contract.json' assert { type: 'json' }; +import TestContractArtifactJson from './test_contract.json' assert { type: 'json' }; ``` After compiling, you can re-deploy the upated noir smart contract from the web UI. The function interaction forms are generated from parsing the ContractABI, so they should update automatically after you recompile. diff --git a/yarn-project/boxes/blank/README.md b/yarn-project/boxes/blank/README.md index 95931b291cd..242f8fffe0d 100644 --- a/yarn-project/boxes/blank/README.md +++ b/yarn-project/boxes/blank/README.md @@ -58,9 +58,9 @@ This will generate a [Contract ABI](src/artifacts/test_contract.json) and TypeSc Note: the `compile` command seems to generate a Typescript file which needs a single change - ``` -import TestContractAbiJson from 'text_contract.json' assert { type: 'json' }; +import TestContractArtifactJson from 'text_contract.json' assert { type: 'json' }; // need to update the relative import to -import TestContractAbiJson from './test_contract.json' assert { type: 'json' }; +import TestContractArtifactJson from './test_contract.json' assert { type: 'json' }; ``` After compiling, you can re-deploy the upated noir smart contract from the web UI. The function interaction forms are generated from parsing the ContractABI, so they should update automatically after you recompile. diff --git a/yarn-project/boxes/private-token/src/artifacts/private_token.ts b/yarn-project/boxes/private-token/src/artifacts/private_token.ts index 4812265609d..5e196f91e8e 100644 --- a/yarn-project/boxes/private-token/src/artifacts/private_token.ts +++ b/yarn-project/boxes/private-token/src/artifacts/private_token.ts @@ -18,15 +18,15 @@ import { import { Fr, Point } from '@aztec/foundation/fields'; import { PXE, PublicKey } from '@aztec/types'; import { ContractAbi } from '@aztec/foundation/abi'; -import PrivateTokenContractAbiJson from './private_token_contract.json' assert { type: 'json' }; -export const PrivateTokenContractAbi = PrivateTokenContractAbiJson as ContractAbi; +import PrivateTokenContractArtifactJson from './private_token_contract.json' assert { type: 'json' }; +export const PrivateTokenContractArtifact = PrivateTokenContractArtifactJson as ContractAbi; /** * Type-safe interface for contract PrivateToken; */ export class PrivateTokenContract extends ContractBase { private constructor(completeAddress: CompleteAddress, wallet: Wallet, portalContract = EthAddress.ZERO) { - super(completeAddress, PrivateTokenContractAbi, wallet, portalContract); + super(completeAddress, PrivateTokenContractArtifact, wallet, portalContract); } /** @@ -46,7 +46,7 @@ export class PrivateTokenContract extends ContractBase { return new DeployMethod( Point.ZERO, pxe, - PrivateTokenContractAbi, + PrivateTokenContractArtifact, Array.from(arguments).slice(1), ); } @@ -58,7 +58,7 @@ export class PrivateTokenContract extends ContractBase { return new DeployMethod( publicKey, pxe, - PrivateTokenContractAbi, + PrivateTokenContractArtifact, Array.from(arguments).slice(2), ); } @@ -67,7 +67,7 @@ export class PrivateTokenContract extends ContractBase { * Returns this contract's ABI. */ public static get abi(): ContractAbi { - return PrivateTokenContractAbi; + return PrivateTokenContractArtifact; } /** Type-safe wrappers for the public methods exposed by the contract. */ diff --git a/yarn-project/boxes/private-token/src/config.ts b/yarn-project/boxes/private-token/src/config.ts index 14449eac122..c2181cf6867 100644 --- a/yarn-project/boxes/private-token/src/config.ts +++ b/yarn-project/boxes/private-token/src/config.ts @@ -1,10 +1,10 @@ -import { PrivateTokenContractAbi } from './artifacts/private_token.js'; +import { PrivateTokenContractArtifact } from './artifacts/private_token.js'; import { PXE, createPXEClient } from '@aztec/aztec.js'; import { ContractAbi } from '@aztec/foundation/abi'; // update this if using a different contract -export const contractAbi: ContractAbi = PrivateTokenContractAbi; +export const contractAbi: ContractAbi = PrivateTokenContractArtifact; export const PXE_URL: string = process.env.PXE_URL || 'http://localhost:8080'; export const pxe: PXE = createPXEClient(PXE_URL); diff --git a/yarn-project/cli/README.md b/yarn-project/cli/README.md index fffc25a7a4b..d1a17d4b684 100644 --- a/yarn-project/cli/README.md +++ b/yarn-project/cli/README.md @@ -145,7 +145,7 @@ aztec-cli deploy [options] Options: -- `-c, --contract-abi `: Path to the compiled Aztec.nr contract's ABI file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractAbi. You can get a full ist of the available contracts with `aztec-cli example-contracts` +- `-c, --contract-abi `: Path to the compiled Aztec.nr contract's ABI file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractArtifact. You can get a full ist of the available contracts with `aztec-cli example-contracts` - `-a, --args ` (optional): Contract constructor arguments Default: []. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. - `-k, --public-key `: Public key of the deployer. If not provided, it will check the RPC for existing ones. @@ -161,7 +161,7 @@ aztec-cli deploy -c path/to/contract.abi.json -a ...args With an Aztec example contract: ```shell -aztec-cli deploy -c PrivateTokenContractAbi -a 333 0x134567890abcdef +aztec-cli deploy -c PrivateTokenContractArtifact -a 333 0x134567890abcdef ``` ### check-deploy @@ -321,7 +321,7 @@ aztec-cli send --args [functionArgs...] --contract-abi `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractAbi. +- `-c, --contract-abi `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. - `-ca, --contract-address
`: Address of the contract. - `-k, --private-key `: The sender's private key. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. @@ -350,7 +350,7 @@ aztec-cli call -a [functionArgs...] -c -ca `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractAbi. +- `-c, --contract-abi `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. - `-ca, --contract-address
`: Address of the contract. - `-f, --from `: Address of the caller. If empty, first account in the Private eXecution Environment (PXE) will be used. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index ded8ca5fcf0..81f1b46c394 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -169,8 +169,8 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .command('deploy') .description('Deploys a compiled Aztec.nr contract to Aztec.') .argument( - '', - "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 artifact in JSON format or name of a contract artifact exported by @aztec/noir-contracts", ) .option('-a, --args ', 'Contract constructor arguments', []) .addOption(pxeOption) diff --git a/yarn-project/end-to-end/src/canary/browser.ts b/yarn-project/end-to-end/src/canary/browser.ts index 737901dc0d7..22442eac278 100644 --- a/yarn-project/end-to-end/src/canary/browser.ts +++ b/yarn-project/end-to-end/src/canary/browser.ts @@ -1,6 +1,6 @@ /* eslint-disable no-console */ import * as AztecJs from '@aztec/aztec.js'; -import { TokenContractAbi } from '@aztec/noir-contracts/artifacts'; +import { TokenContractArtifact } from '@aztec/noir-contracts/artifacts'; import { Server } from 'http'; import Koa from 'koa'; @@ -114,32 +114,32 @@ export const browserTestSuite = (setup: () => Server, pageLogger: AztecJs.DebugL it("Gets the owner's balance", async () => { const result = await page.evaluate( - async (rpcUrl, contractAddress, TokenContractAbi) => { + async (rpcUrl, contractAddress, TokenContractArtifact) => { const { Contract, AztecAddress, createPXEClient: createPXEClient } = window.AztecJs; const pxe = createPXEClient(rpcUrl!); const owner = (await pxe.getRegisteredAccounts())[0].address; const [wallet] = await AztecJs.getSandboxAccountsWallets(pxe); - const contract = await Contract.at(AztecAddress.fromString(contractAddress), TokenContractAbi, wallet); + const contract = await Contract.at(AztecAddress.fromString(contractAddress), TokenContractArtifact, wallet); const balance = await contract.methods.balance_of_private(owner).view({ from: owner }); return balance; }, PXE_URL, (await getTokenAddress()).toString(), - TokenContractAbi, + TokenContractArtifact, ); expect(result).toEqual(initialBalance); }); it('Sends a transfer TX', async () => { const result = await page.evaluate( - async (rpcUrl, contractAddress, transferAmount, TokenContractAbi) => { + async (rpcUrl, contractAddress, transferAmount, TokenContractArtifact) => { console.log(`Starting transfer tx`); const { AztecAddress, Contract, createPXEClient: createPXEClient } = window.AztecJs; const pxe = createPXEClient(rpcUrl!); const accounts = await pxe.getRegisteredAccounts(); const receiver = accounts[1].address; const [wallet] = await AztecJs.getSandboxAccountsWallets(pxe); - const contract = await Contract.at(AztecAddress.fromString(contractAddress), TokenContractAbi, wallet); + const contract = await Contract.at(AztecAddress.fromString(contractAddress), TokenContractArtifact, wallet); await contract.methods.transfer(accounts[0].address, receiver, transferAmount, 0).send().wait(); console.log(`Transferred ${transferAmount} tokens to new Account`); return await contract.methods.balance_of_private(receiver).view({ from: receiver }); @@ -147,14 +147,14 @@ export const browserTestSuite = (setup: () => Server, pageLogger: AztecJs.DebugL PXE_URL, (await getTokenAddress()).toString(), transferAmount, - TokenContractAbi, + TokenContractArtifact, ); expect(result).toEqual(transferAmount); }, 60_000); const deployTokenContract = async () => { const txHash = await page.evaluate( - async (rpcUrl, privateKeyString, initialBalance, TokenContractAbi) => { + async (rpcUrl, privateKeyString, initialBalance, TokenContractArtifact) => { const { GrumpkinScalar, DeployMethod, @@ -176,14 +176,14 @@ export const browserTestSuite = (setup: () => Server, pageLogger: AztecJs.DebugL } const [owner] = await getSandboxAccountsWallets(pxe); const ownerAddress = owner.getAddress(); - const tx = new DeployMethod(accounts[0].publicKey, pxe, TokenContractAbi, [ + const tx = new DeployMethod(accounts[0].publicKey, pxe, TokenContractArtifact, [ owner.getCompleteAddress(), ]).send(); await tx.wait(); const receipt = await tx.getReceipt(); console.log(`Contract Deployed: ${receipt.contractAddress}`); - const token = await Contract.at(receipt.contractAddress!, TokenContractAbi, owner); + const token = await Contract.at(receipt.contractAddress!, TokenContractArtifact, owner); const secret = Fr.random(); const secretHash = await computeMessageSecretHash(secret); const mintPrivateReceipt = await token.methods.mint_private(initialBalance, secretHash).send().wait(); @@ -199,7 +199,7 @@ export const browserTestSuite = (setup: () => Server, pageLogger: AztecJs.DebugL PXE_URL, privKey.toString(), initialBalance, - TokenContractAbi, + TokenContractArtifact, ); const txResult = await testClient.getTxReceipt(AztecJs.TxHash.fromString(txHash)); diff --git a/yarn-project/end-to-end/src/canary/cli.ts b/yarn-project/end-to-end/src/canary/cli.ts index 79bbbfb766b..4738b129235 100644 --- a/yarn-project/end-to-end/src/canary/cli.ts +++ b/yarn-project/end-to-end/src/canary/cli.ts @@ -117,7 +117,7 @@ export const cliTestSuite = ( const ownerAddress = AztecAddress.fromString(foundAddress!); debug('Deploy Token Contract using created account.'); - await run(`deploy TokenContractAbi --salt 0 --args ${ownerAddress}`); + await run(`deploy TokenContractArtifact --salt 0 --args ${ownerAddress}`); const loggedAddress = findInLogs(/Contract\sdeployed\sat\s+(?
0x[a-fA-F0-9]+)/)?.groups?.address; expect(loggedAddress).toBeDefined(); contractAddress = AztecAddress.fromString(loggedAddress!); @@ -135,7 +135,7 @@ export const cliTestSuite = ( debug('Mint initial tokens.'); await run( - `send mint_private --args ${INITIAL_BALANCE} ${secretHash} --contract-abi TokenContractAbi --contract-address ${contractAddress.toString()} --private-key ${privKey}`, + `send mint_private --args ${INITIAL_BALANCE} ${secretHash} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()} --private-key ${privKey}`, ); debug('Add note to the PXE.'); @@ -147,7 +147,7 @@ export const cliTestSuite = ( debug('Redeem tokens.'); await run( - `send redeem_shield --args ${ownerAddress} ${INITIAL_BALANCE} ${secret} --contract-abi TokenContractAbi --contract-address ${contractAddress.toString()} --private-key ${privKey}`, + `send redeem_shield --args ${ownerAddress} ${INITIAL_BALANCE} ${secret} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()} --private-key ${privKey}`, ); // clear logs @@ -158,7 +158,7 @@ export const cliTestSuite = ( debug("Check owner's balance"); await run( - `call balance_of_private --args ${ownerAddress} --contract-abi TokenContractAbi --contract-address ${contractAddress.toString()}`, + `call balance_of_private --args ${ownerAddress} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()}`, ); const balance = findInLogs(/View\sresult:\s+(?\S+)/)?.groups?.data; expect(balance!).toEqual(`${BigInt(INITIAL_BALANCE).toString()}n`); @@ -169,7 +169,7 @@ export const cliTestSuite = ( const receiver = existingAccounts.find(acc => acc.address.toString() !== ownerAddress.toString()); await run( - `send transfer --args ${ownerAddress.toString()} ${receiver?.address.toString()} ${TRANSFER_BALANCE} 0 --contract-address ${contractAddress.toString()} --contract-abi TokenContractAbi --private-key ${privKey}`, + `send transfer --args ${ownerAddress.toString()} ${receiver?.address.toString()} ${TRANSFER_BALANCE} 0 --contract-address ${contractAddress.toString()} --contract-abi TokenContractArtifact --private-key ${privKey}`, ); const txHash = findInLogs(/Transaction\shash:\s+(?\S+)/)?.groups?.txHash; @@ -182,7 +182,7 @@ export const cliTestSuite = ( debug("Check Receiver's balance"); clearLogs(); await run( - `call balance_of_private --args ${receiver?.address.toString()} --contract-abi TokenContractAbi --contract-address ${contractAddress.toString()}`, + `call balance_of_private --args ${receiver?.address.toString()} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()}`, ); const receiverBalance = findInLogs(/View\sresult:\s+(?\S+)/)?.groups?.data; expect(receiverBalance).toEqual(`${BigInt(TRANSFER_BALANCE).toString()}n`); diff --git a/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts b/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts index 2f2b9b21c07..44580eca122 100644 --- a/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts +++ b/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts @@ -94,32 +94,32 @@ Rollup Address: 0x0dcd1bf9a1b36ce34237eeafef220932846bcd82 const docs = ` // docs:start:example-contracts % aztec-cli example-contracts -BenchmarkingContractAbi -CardGameContractAbi -ChildContractAbi -DocsExampleContractAbi -EasyPrivateTokenContractAbi -EcdsaAccountContractAbi -EscrowContractAbi -ImportTestContractAbi -LendingContractAbi -MultiTransferContractAbi -NonNativeTokenContractAbi -ParentContractAbi -PendingCommitmentsContractAbi -PokeableTokenContractAbi -PriceFeedContractAbi -PrivateTokenAirdropContractAbi -PrivateTokenContractAbi -PublicTokenContractAbi -SchnorrAccountContractAbi -SchnorrHardcodedAccountContractAbi -SchnorrSingleKeyAccountContractAbi -StatefulTestContractAbi -TestContractAbi -TokenBridgeContractAbi -TokenContractAbi -UniswapContractAbi +BenchmarkingContractArtifact +CardGameContractArtifact +ChildContractArtifact +DocsExampleContractArtifact +EasyPrivateTokenContractArtifact +EcdsaAccountContractArtifact +EscrowContractArtifact +ImportTestContractArtifact +LendingContractArtifact +MultiTransferContractArtifact +NonNativeTokenContractArtifact +ParentContractArtifact +PendingCommitmentsContractArtifact +PokeableTokenContractArtifact +PriceFeedContractArtifact +PrivateTokenAirdropContractArtifact +PrivateTokenContractArtifact +PublicTokenContractArtifact +SchnorrAccountContractArtifact +SchnorrHardcodedAccountContractArtifact +SchnorrSingleKeyAccountContractArtifact +StatefulTestContractArtifact +TestContractArtifact +TokenBridgeContractArtifact +TokenContractArtifact +UniswapContractArtifact // docs:end:example-contracts `; @@ -256,7 +256,7 @@ Accounts found: // Test deploy docs = ` // docs:start:deploy -% aztec-cli deploy PrivateTokenContractAbi --args 1000000 $ADDRESS +% aztec-cli deploy PrivateTokenContractArtifact --args 1000000 $ADDRESS Contract deployed at 0x1ae8eea0dc265fb7f160dae62cc8912686d8a9ed78e821fbdd8bcedc54c06d0f // docs:end:deploy @@ -292,7 +292,7 @@ Contract found at 0x1ae8eea0dc265fb7f160dae62cc8912686d8a9ed78e821fbdd8bcedc54c0 // docs:start:call % aztec-cli call getBalance \ --args $ADDRESS \ - --contract-abi PrivateTokenContractAbi \ + --contract-abi PrivateTokenContractArtifact \ --contract-address $CONTRACT_ADDRESS View result: 1000000n @@ -318,7 +318,7 @@ View result: 1000000n // docs:start:send % aztec-cli send transfer \ --args 543 $ADDRESS2 \ - --contract-abi PrivateTokenContractAbi \ + --contract-abi PrivateTokenContractArtifact \ --contract-address $CONTRACT_ADDRESS \ --private-key $PRIVATE_KEY @@ -381,11 +381,11 @@ Transaction receipt: // get balance docs = ` // docs:start:calls -% aztec-cli call getBalance -a $ADDRESS -c PrivateTokenContractAbi -ca $CONTRACT_ADDRESS +% aztec-cli call getBalance -a $ADDRESS -c PrivateTokenContractArtifact -ca $CONTRACT_ADDRESS View result: 999457n -% aztec-cli call getBalance -a $ADDRESS2 -c PrivateTokenContractAbi -ca $CONTRACT_ADDRESS +% aztec-cli call getBalance -a $ADDRESS2 -c PrivateTokenContractArtifact -ca $CONTRACT_ADDRESS View result: 543n // docs:end:calls 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 9336b1fc264..19eb4199cdf 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 @@ -9,7 +9,7 @@ import { import { CircuitsWasm } from '@aztec/circuits.js'; import { pedersenPlookupCommitInputs } from '@aztec/circuits.js/barretenberg'; import { DebugLogger } from '@aztec/foundation/log'; -import { TestContractAbi } from '@aztec/noir-contracts/artifacts'; +import { TestContractArtifact } from '@aztec/noir-contracts/artifacts'; import { TestContract, TokenContract } from '@aztec/noir-contracts/types'; import { PXE, TxStatus } from '@aztec/types'; @@ -25,7 +25,7 @@ describe('e2e_block_building', () => { let teardown: () => Promise; describe('multi-txs block', () => { - const abi = TestContractAbi; + const abi = TestContractArtifact; beforeAll(async () => { ({ 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 f23e0cf52de..8304e87dc33 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 @@ -1,7 +1,7 @@ import { AztecAddress, Contract, ContractDeployer, EthAddress, Fr, Wallet, isContractDeployed } from '@aztec/aztec.js'; import { CompleteAddress, getContractDeploymentInfo } from '@aztec/circuits.js'; import { DebugLogger } from '@aztec/foundation/log'; -import { TestContractAbi } from '@aztec/noir-contracts/artifacts'; +import { TestContractArtifact } from '@aztec/noir-contracts/artifacts'; import { PXE, TxStatus } from '@aztec/types'; import { setup } from './fixtures/utils.js'; @@ -26,8 +26,8 @@ describe('e2e_deploy_contract', () => { it('should deploy a contract', async () => { const publicKey = accounts[0].publicKey; const salt = Fr.random(); - const deploymentData = await getContractDeploymentInfo(TestContractAbi, [], salt, publicKey); - const deployer = new ContractDeployer(TestContractAbi, pxe, publicKey); + const deploymentData = await getContractDeploymentInfo(TestContractArtifact, [], salt, publicKey); + const deployer = new ContractDeployer(TestContractArtifact, pxe, publicKey); const tx = deployer.deploy().send({ contractAddressSalt: salt }); logger(`Tx sent with hash ${await tx.getTxHash()}`); const receipt = await tx.getReceipt(); @@ -58,7 +58,7 @@ describe('e2e_deploy_contract', () => { * Verify that we can produce multiple rollups. */ it('should deploy one contract after another in consecutive rollups', async () => { - const deployer = new ContractDeployer(TestContractAbi, pxe); + const deployer = new ContractDeployer(TestContractArtifact, pxe); for (let index = 0; index < 2; index++) { logger(`Deploying contract ${index + 1}...`); @@ -74,13 +74,13 @@ describe('e2e_deploy_contract', () => { * Verify that we can deploy multiple contracts and interact with all of them. */ it('should deploy multiple contracts and interact with them', async () => { - const deployer = new ContractDeployer(TestContractAbi, pxe); + const deployer = new ContractDeployer(TestContractArtifact, pxe); for (let index = 0; index < 2; index++) { logger(`Deploying contract ${index + 1}...`); const receipt = await deployer.deploy().send({ contractAddressSalt: Fr.random() }).wait({ wallet }); - const contract = await Contract.at(receipt.contractAddress!, TestContractAbi, wallet); + const contract = await Contract.at(receipt.contractAddress!, TestContractArtifact, wallet); logger(`Sending TX to contract ${index + 1}...`); await contract.methods.getPublicKey(accounts[0].address).send().wait(); } @@ -92,7 +92,7 @@ describe('e2e_deploy_contract', () => { */ it('should not deploy a contract with the same salt twice', async () => { const contractAddressSalt = Fr.random(); - const deployer = new ContractDeployer(TestContractAbi, pxe); + const deployer = new ContractDeployer(TestContractArtifact, pxe); { const tx = deployer.deploy().send({ contractAddressSalt }); @@ -113,7 +113,7 @@ describe('e2e_deploy_contract', () => { }, 30_000); it('should deploy a contract connected to a portal contract', async () => { - const deployer = new ContractDeployer(TestContractAbi, wallet); + const deployer = new ContractDeployer(TestContractArtifact, wallet); const portalContract = EthAddress.random(); const txReceipt = await deployer.deploy().send({ portalContract }).wait(); 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 77d9db582d2..111f82b08d8 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 @@ -8,7 +8,7 @@ import { } from '@aztec/aztec.js'; import { CompleteAddress, Fr, GrumpkinPrivateKey, GrumpkinScalar, getContractDeploymentInfo } from '@aztec/circuits.js'; import { DebugLogger } from '@aztec/foundation/log'; -import { EscrowContractAbi } from '@aztec/noir-contracts/artifacts'; +import { EscrowContractArtifact } from '@aztec/noir-contracts/artifacts'; import { EscrowContract, TokenContract } from '@aztec/noir-contracts/types'; import { PXE, PublicKey, TxStatus } from '@aztec/types'; @@ -48,7 +48,7 @@ describe('e2e_escrow_contract', () => { escrowPrivateKey = GrumpkinScalar.random(); escrowPublicKey = await generatePublicKey(escrowPrivateKey); const salt = Fr.random(); - const deployInfo = await getContractDeploymentInfo(EscrowContractAbi, [owner], salt, escrowPublicKey); + const deployInfo = await getContractDeploymentInfo(EscrowContractArtifact, [owner], salt, escrowPublicKey); await pxe.registerAccount(escrowPrivateKey, deployInfo.completeAddress.partialAddress); escrowContract = await EscrowContract.deployWithPublicKey(wallet, escrowPublicKey, owner) 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 02f19d353da..b4a5d8ba3f6 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 @@ -3,7 +3,7 @@ import { ContractDeployer, SentTx, isContractDeployed } from '@aztec/aztec.js'; import { AztecAddress, CompleteAddress, Fr, PublicKey, getContractDeploymentInfo } from '@aztec/circuits.js'; import { Grumpkin } from '@aztec/circuits.js/barretenberg'; import { DebugLogger } from '@aztec/foundation/log'; -import { TestContractAbi } from '@aztec/noir-contracts/artifacts'; +import { TestContractArtifact } from '@aztec/noir-contracts/artifacts'; import { BootstrapNode, P2PConfig, createLibP2PPeerId } from '@aztec/p2p'; import { ConstantKeyPair, PXEService, createPXEService, getPXEServiceConfig as getRpcConfig } from '@aztec/pxe'; import { TxStatus } from '@aztec/types'; @@ -117,8 +117,9 @@ describe('e2e_p2p_network', () => { const txs: SentTx[] = []; for (let i = 0; i < numTxs; i++) { const salt = Fr.random(); - const origin = (await getContractDeploymentInfo(TestContractAbi, [], salt, publicKey)).completeAddress.address; - const deployer = new ContractDeployer(TestContractAbi, pxe, publicKey); + const origin = (await getContractDeploymentInfo(TestContractArtifact, [], salt, publicKey)).completeAddress + .address; + const deployer = new ContractDeployer(TestContractArtifact, pxe, publicKey); const tx = deployer.deploy().send({ contractAddressSalt: salt }); logger(`Tx sent with hash ${await tx.getTxHash()}`); const receipt = await tx.getReceipt(); diff --git a/yarn-project/end-to-end/src/guides/up_quick_start.sh b/yarn-project/end-to-end/src/guides/up_quick_start.sh index c97dd0d5e29..7307c854fc6 100755 --- a/yarn-project/end-to-end/src/guides/up_quick_start.sh +++ b/yarn-project/end-to-end/src/guides/up_quick_start.sh @@ -11,7 +11,7 @@ ALICE_PRIVATE_KEY="0x2153536ff6628eee01cf4024889ff977a18d9fa61d0e414422f7681cf08 # docs:start:deploy aztec-cli deploy \ - TokenContractAbi \ + TokenContractArtifact \ --salt 0 \ --args $ALICE @@ -26,7 +26,7 @@ SECRET_HASH="0x0a42b1fe22b652cc8610e33bb1128040ce2d2862e7041ff235aa871739822b74" MINT_PRIVATE_OUTPUT=$(aztec-cli send mint_private \ --args 1000 $SECRET_HASH \ - --contract-abi TokenContractAbi \ + --contract-abi TokenContractArtifact \ --contract-address $CONTRACT \ --private-key $ALICE_PRIVATE_KEY) @@ -38,7 +38,7 @@ aztec-cli add-note \ aztec-cli send redeem_shield \ --args $ALICE 1000 $SECRET \ - --contract-abi TokenContractAbi \ + --contract-abi TokenContractArtifact \ --contract-address $CONTRACT \ --private-key $ALICE_PRIVATE_KEY # docs:end:mint-private @@ -46,32 +46,32 @@ aztec-cli send redeem_shield \ # docs:start:get-balance aztec-cli call balance_of_private \ --args $ALICE \ - --contract-abi TokenContractAbi \ + --contract-abi TokenContractArtifact \ --contract-address $CONTRACT # docs:end:get-balance # docs:start:transfer aztec-cli send transfer \ --args $ALICE $BOB 500 0 \ - --contract-abi TokenContractAbi \ + --contract-abi TokenContractArtifact \ --contract-address $CONTRACT \ --private-key $ALICE_PRIVATE_KEY aztec-cli call balance_of_private \ --args $ALICE \ - --contract-abi TokenContractAbi \ + --contract-abi TokenContractArtifact \ --contract-address $CONTRACT aztec-cli call balance_of_private \ --args $BOB \ - --contract-abi TokenContractAbi \ + --contract-abi TokenContractArtifact \ --contract-address $CONTRACT # docs:end:transfer aztec-cli get-logs # Test end result -BOB_BALANCE=$(aztec-cli call balance_of_private --args $BOB --contract-abi TokenContractAbi --contract-address $CONTRACT) +BOB_BALANCE=$(aztec-cli call balance_of_private --args $BOB --contract-abi TokenContractArtifact --contract-address $CONTRACT) if ! echo $BOB_BALANCE | grep -q 500; then echo "Incorrect Bob balance after transaction (expected 500 but got $BOB_BALANCE)" exit 1 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 f61e3c4c881..f7c7c2a7ca1 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 @@ -9,7 +9,7 @@ import { } from '@aztec/aztec.js'; import { GrumpkinPrivateKey, GrumpkinScalar } from '@aztec/circuits.js'; import { Schnorr } from '@aztec/circuits.js/barretenberg'; -import { SchnorrHardcodedAccountContractAbi, TokenContract } from '@aztec/noir-contracts/types'; +import { SchnorrHardcodedAccountContractArtifact, TokenContract } from '@aztec/noir-contracts/types'; import { AuthWitness } from '@aztec/types'; import { setup } from '../fixtures/utils.js'; @@ -20,7 +20,7 @@ const PRIVATE_KEY = GrumpkinScalar.fromString('0xd35d743ac0dfe3d6dbe6be8c877cb52 /** Account contract implementation that authenticates txs using Schnorr signatures. */ class SchnorrHardcodedKeyAccountContract extends BaseAccountContract { constructor(private privateKey: GrumpkinPrivateKey = PRIVATE_KEY) { - super(SchnorrHardcodedAccountContractAbi); + super(SchnorrHardcodedAccountContractArtifact); } getDeploymentArgs(): Promise { 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 b0892378b01..aa4e08b1004 100644 --- a/yarn-project/end-to-end/src/sample-dapp/contracts.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/contracts.mjs @@ -1,11 +1,11 @@ import { Contract } from '@aztec/aztec.js'; -import { TokenContractAbi } from '@aztec/noir-contracts/artifacts'; +import { TokenContractArtifact } from '@aztec/noir-contracts/artifacts'; import { readFileSync } from 'fs'; // docs:start:get-tokens export async function getToken(client) { const addresses = JSON.parse(readFileSync('addresses.json')); - return Contract.at(addresses.token, TokenContractAbi, client); + return Contract.at(addresses.token, TokenContractArtifact, client); } // docs:end:get-tokens 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 bebf5e72399..bc97a7b022e 100644 --- a/yarn-project/end-to-end/src/sample-dapp/deploy.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/deploy.mjs @@ -1,5 +1,5 @@ import { Contract, ContractDeployer, createPXEClient, getSandboxAccountsWallets } from '@aztec/aztec.js'; -import { TokenContractAbi } from '@aztec/noir-contracts/artifacts'; +import { TokenContractArtifact } from '@aztec/noir-contracts/artifacts'; import { writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; @@ -11,7 +11,7 @@ async function main() { const pxe = createPXEClient(PXE_URL); const [owner] = await getSandboxAccountsWallets(pxe); - const token = await Contract.deploy(pxe, TokenContractAbi, [owner.getCompleteAddress()]).send().deployed(); + const token = await Contract.deploy(pxe, TokenContractArtifact, [owner.getCompleteAddress()]).send().deployed(); console.log(`Token deployed at ${token.address.toString()}`); 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 19d49926e45..76b8f3019de 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 @@ -1,6 +1,6 @@ import { createSandbox } from '@aztec/aztec-sandbox'; import { Contract, Fr, NotePreimage, computeMessageSecretHash, createAccount } from '@aztec/aztec.js'; -import { TokenContractAbi } from '@aztec/noir-contracts/artifacts'; +import { TokenContractArtifact } from '@aztec/noir-contracts/artifacts'; describe('token', () => { // docs:start:setup @@ -10,7 +10,7 @@ describe('token', () => { owner = await createAccount(pxe); recipient = await createAccount(pxe); - token = await Contract.deploy(owner, TokenContractAbi, [owner.getCompleteAddress()]).send().deployed(); + token = await Contract.deploy(owner, TokenContractArtifact, [owner.getCompleteAddress()]).send().deployed(); const initialBalance = 20n; const secret = Fr.random(); diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts b/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts index 210776234ba..f63e3fccac8 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts @@ -63,7 +63,7 @@ function generateMethod(entry: FunctionAbi) { function generateDeploy(input: ContractAbi) { const ctor = input.functions.find(f => f.name === 'constructor'); const args = (ctor?.parameters ?? []).map(generateParameter).join(', '); - const abiName = `${input.name}ContractAbi`; + const abiName = `${input.name}ContractArtifact`; return ` /** @@ -95,7 +95,7 @@ function generateConstructor(name: string) { wallet: Wallet, portalContract = EthAddress.ZERO ) { - super(completeAddress, ${name}ContractAbi, wallet, portalContract); + super(completeAddress, ${name}ContractArtifact, wallet, portalContract); } `; } @@ -127,7 +127,7 @@ function generateAt(name: string) { * @param name - Name of the contract used to derive name of the ABI import. */ function generateAbiGetter(name: string) { - const abiName = `${name}ContractAbi`; + const abiName = `${name}ContractArtifact`; return ` /** * Returns this contract's ABI. @@ -146,8 +146,8 @@ function generateAbiGetter(name: string) { */ function generateAbiStatement(name: string, abiImportPath: string) { const stmts = [ - `import ${name}ContractAbiJson from '${abiImportPath}' assert { type: 'json' };`, - `export const ${name}ContractAbi = ${name}ContractAbiJson as ContractAbi;`, + `import ${name}ContractArtifactJson from '${abiImportPath}' assert { type: 'json' };`, + `export const ${name}ContractArtifact = ${name}ContractArtifactJson as ContractAbi;`, ]; return stmts.join('\n'); } diff --git a/yarn-project/noir-contracts/scripts/types.sh b/yarn-project/noir-contracts/scripts/types.sh index 883e5af2b44..6666bc6135e 100755 --- a/yarn-project/noir-contracts/scripts/types.sh +++ b/yarn-project/noir-contracts/scripts/types.sh @@ -32,7 +32,7 @@ write_export() { NAME=$(echo $CONTRACT_NAME | perl -pe 's/(^|_)(\w)/\U$2/g') # artifacts - echo "export const ${NAME}ContractAbi = ${NAME}Json as ContractAbi;" >> "$artifacts_dir/index.ts"; + echo "export const ${NAME}ContractArtifact = ${NAME}Json as ContractAbi;" >> "$artifacts_dir/index.ts"; echo "Written typescript for $NAME" # types From fb5ec6dd3a1027dfb61236925d3452db72eb4d51 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 11:23:45 +0000 Subject: [PATCH 02/16] WIP --- .../client/unconstrained_execution.test.ts | 6 +-- .../acir-simulator/src/public/index.test.ts | 42 ++++++++++--------- yarn-project/cli/README.md | 8 ++-- yarn-project/cli/src/index.ts | 6 +-- yarn-project/end-to-end/src/canary/cli.ts | 10 ++--- .../end-to-end/src/cli_docs_sandbox.test.ts | 4 +- .../end-to-end/src/guides/up_quick_start.sh | 14 +++---- 7 files changed, 46 insertions(+), 44 deletions(-) diff --git a/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts b/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts index c662b2887ca..34a4a9ced6e 100644 --- a/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/unconstrained_execution.test.ts @@ -40,7 +40,7 @@ describe('Unconstrained Execution test suite', () => { it('should run the summed_values function', async () => { const contractAddress = AztecAddress.random(); - const abi = StatefulTestContractArtifact.functions.find(f => f.name === 'summed_values')!; + const artifact = StatefulTestContractArtifact.functions.find(f => f.name === 'summed_values')!; const preimages = [...Array(5).fill(buildNote(1n, owner)), ...Array(2).fill(buildNote(2n, owner))]; @@ -61,10 +61,10 @@ describe('Unconstrained Execution test suite', () => { const execRequest: FunctionCall = { to: contractAddress, functionData: new FunctionData(FunctionSelector.empty(), false, true, true), - args: encodeArguments(abi, [owner]), + args: encodeArguments(artifact, [owner]), }; - const result = await acirSimulator.runUnconstrained(execRequest, abi, AztecAddress.random()); + const result = await acirSimulator.runUnconstrained(execRequest, artifact, AztecAddress.random()); expect(result).toEqual(9n); }, 30_000); diff --git a/yarn-project/acir-simulator/src/public/index.test.ts b/yarn-project/acir-simulator/src/public/index.test.ts index 09b9f408863..aef9a076fd9 100644 --- a/yarn-project/acir-simulator/src/public/index.test.ts +++ b/yarn-project/acir-simulator/src/public/index.test.ts @@ -63,9 +63,9 @@ describe('ACIR public execution simulator', () => { describe('mint', () => { it('should run the mint function', async () => { const contractAddress = AztecAddress.random(); - const mintAbi = PublicTokenContractArtifact.functions.find(f => f.name === 'mint')!; - const functionData = FunctionData.fromAbi(mintAbi); - const args = encodeArguments(mintAbi, [140, recipient]); + const mintArtifact = PublicTokenContractArtifact.functions.find(f => f.name === 'mint')!; + const functionData = FunctionData.fromAbi(mintArtifact); + const args = encodeArguments(mintArtifact, [140, recipient]); const callContext = CallContext.from({ msgSender: AztecAddress.random(), @@ -77,7 +77,7 @@ describe('ACIR public execution simulator', () => { isStaticCall: false, }); - publicContracts.getBytecode.mockResolvedValue(Buffer.from(mintAbi.bytecode, 'base64')); + publicContracts.getBytecode.mockResolvedValue(Buffer.from(mintArtifact.bytecode, 'base64')); // Mock the old value for the recipient balance to be 20 const previousBalance = new Fr(20n); @@ -100,7 +100,7 @@ describe('ACIR public execution simulator', () => { describe('transfer', () => { let contractAddress: AztecAddress; - let abi: FunctionAbi; + let artifact: FunctionAbi; let functionData: FunctionData; let args: Fr[]; let sender: AztecAddress; @@ -111,9 +111,9 @@ describe('ACIR public execution simulator', () => { beforeEach(() => { contractAddress = AztecAddress.random(); - abi = PublicTokenContractArtifact.functions.find(f => f.name === 'transfer')!; + artifact = PublicTokenContractArtifact.functions.find(f => f.name === 'transfer')!; functionData = new FunctionData(FunctionSelector.empty(), false, false, false); - args = encodeArguments(abi, [140, recipient]); + args = encodeArguments(artifact, [140, recipient]); sender = AztecAddress.random(); callContext = CallContext.from({ @@ -129,7 +129,7 @@ describe('ACIR public execution simulator', () => { recipientStorageSlot = computeSlotForMapping(new Fr(1n), recipient.toField(), circuitsWasm); senderStorageSlot = computeSlotForMapping(new Fr(1n), Fr.fromBuffer(sender.toBuffer()), circuitsWasm); - publicContracts.getBytecode.mockResolvedValue(Buffer.from(abi.bytecode, 'base64')); + publicContracts.getBytecode.mockResolvedValue(Buffer.from(artifact.bytecode, 'base64')); execution = { contractAddress, functionData, args, callContext }; }); @@ -285,8 +285,8 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to create a commitment from the public context', async () => { - const shieldAbi = NonNativeTokenContractArtifact.functions.find(f => f.name === 'shield')!; - const args = encodeArguments(shieldAbi, params); + const shieldArtifact = NonNativeTokenContractArtifact.functions.find(f => f.name === 'shield')!; + const args = encodeArguments(shieldArtifact, params); const callContext = CallContext.from({ msgSender: AztecAddress.random(), @@ -298,7 +298,7 @@ describe('ACIR public execution simulator', () => { isStaticCall: false, }); - publicContracts.getBytecode.mockResolvedValue(Buffer.from(shieldAbi.bytecode, 'base64')); + publicContracts.getBytecode.mockResolvedValue(Buffer.from(shieldArtifact.bytecode, 'base64')); // mock initial balance to be greater than the amount being sent publicState.storageRead.mockResolvedValue(amount); @@ -318,10 +318,10 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to create a L2 to L1 message from the public context', async () => { - const createL2ToL1MessagePublicAbi = TestContractArtifact.functions.find( + const createL2ToL1MessagePublicArtifact = TestContractArtifact.functions.find( f => f.name === 'createL2ToL1MessagePublic', )!; - const args = encodeArguments(createL2ToL1MessagePublicAbi, params); + const args = encodeArguments(createL2ToL1MessagePublicArtifact, params); const callContext = CallContext.from({ msgSender: AztecAddress.random(), @@ -333,7 +333,7 @@ describe('ACIR public execution simulator', () => { isStaticCall: false, }); - publicContracts.getBytecode.mockResolvedValue(Buffer.from(createL2ToL1MessagePublicAbi.bytecode, 'base64')); + publicContracts.getBytecode.mockResolvedValue(Buffer.from(createL2ToL1MessagePublicArtifact.bytecode, 'base64')); const execution: PublicExecution = { contractAddress, functionData, args, callContext }; const result = await executor.simulate(execution, GlobalVariables.empty()); @@ -349,7 +349,7 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to consume an Ll to L2 message in the public context', async () => { - const mintPublicAbi = NonNativeTokenContractArtifact.functions.find(f => f.name === 'mintPublic')!; + const mintPublicArtifact = NonNativeTokenContractArtifact.functions.find(f => f.name === 'mintPublic')!; // Set up cross chain message const canceller = EthAddress.random(); @@ -368,7 +368,7 @@ describe('ACIR public execution simulator', () => { // Stub message key const messageKey = Fr.random(); - const args = encodeArguments(mintPublicAbi, [ + const args = encodeArguments(mintPublicArtifact, [ bridgedAmount, recipient.toField(), messageKey, @@ -386,7 +386,7 @@ describe('ACIR public execution simulator', () => { isStaticCall: false, }); - publicContracts.getBytecode.mockResolvedValue(Buffer.from(mintPublicAbi.bytecode, 'base64')); + publicContracts.getBytecode.mockResolvedValue(Buffer.from(mintPublicArtifact.bytecode, 'base64')); publicState.storageRead.mockResolvedValue(Fr.ZERO); // Mock response @@ -405,9 +405,11 @@ describe('ACIR public execution simulator', () => { }); it('Should be able to create a nullifier from the public context', async () => { - const createNullifierPublicAbi = TestContractArtifact.functions.find(f => f.name === 'createNullifierPublic')!; + const createNullifierPublicArtifact = TestContractArtifact.functions.find( + f => f.name === 'createNullifierPublic', + )!; - const args = encodeArguments(createNullifierPublicAbi, params); + const args = encodeArguments(createNullifierPublicArtifact, params); const callContext = CallContext.from({ msgSender: AztecAddress.random(), @@ -419,7 +421,7 @@ describe('ACIR public execution simulator', () => { isStaticCall: false, }); - publicContracts.getBytecode.mockResolvedValue(Buffer.from(createNullifierPublicAbi.bytecode, 'base64')); + publicContracts.getBytecode.mockResolvedValue(Buffer.from(createNullifierPublicArtifact.bytecode, 'base64')); const execution: PublicExecution = { contractAddress, functionData, args, callContext }; const result = await executor.simulate(execution, GlobalVariables.empty()); diff --git a/yarn-project/cli/README.md b/yarn-project/cli/README.md index d1a17d4b684..652a748afea 100644 --- a/yarn-project/cli/README.md +++ b/yarn-project/cli/README.md @@ -145,7 +145,7 @@ aztec-cli deploy [options] Options: -- `-c, --contract-abi `: Path to the compiled Aztec.nr contract's ABI file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractArtifact. You can get a full ist of the available contracts with `aztec-cli example-contracts` +- `-c, --contract-artifact `: Path to the compiled Aztec.nr contract's ABI file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractArtifact. You can get a full ist of the available contracts with `aztec-cli example-contracts` - `-a, --args ` (optional): Contract constructor arguments Default: []. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. - `-k, --public-key `: Public key of the deployer. If not provided, it will check the RPC for existing ones. @@ -313,7 +313,7 @@ Sends a transaction invoking a function on an Aztec contract. Syntax: ```shell -aztec-cli send --args [functionArgs...] --contract-abi --contract-address --private-key +aztec-cli send --args [functionArgs...] --contract-artifact --contract-address --private-key ``` - `functionName`: Name of the function to call. @@ -321,7 +321,7 @@ aztec-cli send --args [functionArgs...] --contract-abi `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. +- `-c, --contract-artifact `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. - `-ca, --contract-address
`: Address of the contract. - `-k, --private-key `: The sender's private key. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. @@ -350,7 +350,7 @@ aztec-cli call -a [functionArgs...] -c -ca `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. +- `-c, --contract-artifact `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. - `-ca, --contract-address
`: Address of the contract. - `-f, --from `: Address of the caller. If empty, first account in the Private eXecution Environment (PXE) will be used. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index 81f1b46c394..42e05d7e26b 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -385,7 +385,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .argument('', 'Name of function to execute') .option('-a, --args [functionArgs...]', 'Function arguments', []) .requiredOption( - '-c, --contract-abi ', + '-c, --contract-artifact ', "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", ) .requiredOption('-ca, --contract-address
', 'Aztec address of the contract.', parseAztecAddress) @@ -423,7 +423,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .argument('', 'Name of function to call') .option('-a, --args [functionArgs...]', 'Function arguments', []) .requiredOption( - '-c, --contract-abi ', + '-c, --contract-artifact ', "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", ) .requiredOption('-ca, --contract-address
', 'Aztec address of the contract.', parseAztecAddress) @@ -465,7 +465,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .description("Helper for parsing an encoded string into a contract's parameter struct.") .argument('', 'The encoded hex string') .requiredOption( - '-c, --contract-abi ', + '-c, --contract-artifact ', "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts", ) .requiredOption('-p, --parameter ', 'The name of the struct parameter to decode into') diff --git a/yarn-project/end-to-end/src/canary/cli.ts b/yarn-project/end-to-end/src/canary/cli.ts index 4738b129235..529cb8130b2 100644 --- a/yarn-project/end-to-end/src/canary/cli.ts +++ b/yarn-project/end-to-end/src/canary/cli.ts @@ -135,7 +135,7 @@ export const cliTestSuite = ( debug('Mint initial tokens.'); await run( - `send mint_private --args ${INITIAL_BALANCE} ${secretHash} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()} --private-key ${privKey}`, + `send mint_private --args ${INITIAL_BALANCE} ${secretHash} --contract-artifact TokenContractArtifact --contract-address ${contractAddress.toString()} --private-key ${privKey}`, ); debug('Add note to the PXE.'); @@ -147,7 +147,7 @@ export const cliTestSuite = ( debug('Redeem tokens.'); await run( - `send redeem_shield --args ${ownerAddress} ${INITIAL_BALANCE} ${secret} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()} --private-key ${privKey}`, + `send redeem_shield --args ${ownerAddress} ${INITIAL_BALANCE} ${secret} --contract-artifact TokenContractArtifact --contract-address ${contractAddress.toString()} --private-key ${privKey}`, ); // clear logs @@ -158,7 +158,7 @@ export const cliTestSuite = ( debug("Check owner's balance"); await run( - `call balance_of_private --args ${ownerAddress} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()}`, + `call balance_of_private --args ${ownerAddress} --contract-artifact TokenContractArtifact --contract-address ${contractAddress.toString()}`, ); const balance = findInLogs(/View\sresult:\s+(?\S+)/)?.groups?.data; expect(balance!).toEqual(`${BigInt(INITIAL_BALANCE).toString()}n`); @@ -169,7 +169,7 @@ export const cliTestSuite = ( const receiver = existingAccounts.find(acc => acc.address.toString() !== ownerAddress.toString()); await run( - `send transfer --args ${ownerAddress.toString()} ${receiver?.address.toString()} ${TRANSFER_BALANCE} 0 --contract-address ${contractAddress.toString()} --contract-abi TokenContractArtifact --private-key ${privKey}`, + `send transfer --args ${ownerAddress.toString()} ${receiver?.address.toString()} ${TRANSFER_BALANCE} 0 --contract-address ${contractAddress.toString()} --contract-artifact TokenContractArtifact --private-key ${privKey}`, ); const txHash = findInLogs(/Transaction\shash:\s+(?\S+)/)?.groups?.txHash; @@ -182,7 +182,7 @@ export const cliTestSuite = ( debug("Check Receiver's balance"); clearLogs(); await run( - `call balance_of_private --args ${receiver?.address.toString()} --contract-abi TokenContractArtifact --contract-address ${contractAddress.toString()}`, + `call balance_of_private --args ${receiver?.address.toString()} --contract-artifact TokenContractArtifact --contract-address ${contractAddress.toString()}`, ); const receiverBalance = findInLogs(/View\sresult:\s+(?\S+)/)?.groups?.data; expect(receiverBalance).toEqual(`${BigInt(TRANSFER_BALANCE).toString()}n`); diff --git a/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts b/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts index 44580eca122..1b95d120272 100644 --- a/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts +++ b/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts @@ -292,7 +292,7 @@ Contract found at 0x1ae8eea0dc265fb7f160dae62cc8912686d8a9ed78e821fbdd8bcedc54c0 // docs:start:call % aztec-cli call getBalance \ --args $ADDRESS \ - --contract-abi PrivateTokenContractArtifact \ + --contract-artifact PrivateTokenContractArtifact \ --contract-address $CONTRACT_ADDRESS View result: 1000000n @@ -318,7 +318,7 @@ View result: 1000000n // docs:start:send % aztec-cli send transfer \ --args 543 $ADDRESS2 \ - --contract-abi PrivateTokenContractArtifact \ + --contract-artifact PrivateTokenContractArtifact \ --contract-address $CONTRACT_ADDRESS \ --private-key $PRIVATE_KEY diff --git a/yarn-project/end-to-end/src/guides/up_quick_start.sh b/yarn-project/end-to-end/src/guides/up_quick_start.sh index 7307c854fc6..de6f6074107 100755 --- a/yarn-project/end-to-end/src/guides/up_quick_start.sh +++ b/yarn-project/end-to-end/src/guides/up_quick_start.sh @@ -26,7 +26,7 @@ SECRET_HASH="0x0a42b1fe22b652cc8610e33bb1128040ce2d2862e7041ff235aa871739822b74" MINT_PRIVATE_OUTPUT=$(aztec-cli send mint_private \ --args 1000 $SECRET_HASH \ - --contract-abi TokenContractArtifact \ + --contract-artifact TokenContractArtifact \ --contract-address $CONTRACT \ --private-key $ALICE_PRIVATE_KEY) @@ -38,7 +38,7 @@ aztec-cli add-note \ aztec-cli send redeem_shield \ --args $ALICE 1000 $SECRET \ - --contract-abi TokenContractArtifact \ + --contract-artifact TokenContractArtifact \ --contract-address $CONTRACT \ --private-key $ALICE_PRIVATE_KEY # docs:end:mint-private @@ -46,32 +46,32 @@ aztec-cli send redeem_shield \ # docs:start:get-balance aztec-cli call balance_of_private \ --args $ALICE \ - --contract-abi TokenContractArtifact \ + --contract-artifact TokenContractArtifact \ --contract-address $CONTRACT # docs:end:get-balance # docs:start:transfer aztec-cli send transfer \ --args $ALICE $BOB 500 0 \ - --contract-abi TokenContractArtifact \ + --contract-artifact TokenContractArtifact \ --contract-address $CONTRACT \ --private-key $ALICE_PRIVATE_KEY aztec-cli call balance_of_private \ --args $ALICE \ - --contract-abi TokenContractArtifact \ + --contract-artifact TokenContractArtifact \ --contract-address $CONTRACT aztec-cli call balance_of_private \ --args $BOB \ - --contract-abi TokenContractArtifact \ + --contract-artifact TokenContractArtifact \ --contract-address $CONTRACT # docs:end:transfer aztec-cli get-logs # Test end result -BOB_BALANCE=$(aztec-cli call balance_of_private --args $BOB --contract-abi TokenContractArtifact --contract-address $CONTRACT) +BOB_BALANCE=$(aztec-cli call balance_of_private --args $BOB --contract-artifact TokenContractArtifact --contract-address $CONTRACT) if ! echo $BOB_BALANCE | grep -q 500; then echo "Incorrect Bob balance after transaction (expected 500 but got $BOB_BALANCE)" exit 1 From ae55ac7d85b143643846225d9b73ed4544a5b288 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 11:54:43 +0000 Subject: [PATCH 03/16] WIP --- docs/docs/dev_docs/contracts/deploying.md | 2 +- .../src/client/client_execution_context.ts | 4 +- .../acir-simulator/src/client/db_oracle.ts | 4 +- .../src/client/private_execution.test.ts | 6 +- .../acir-simulator/src/public/index.test.ts | 4 +- yarn-project/acir-simulator/src/test/utils.ts | 4 +- yarn-project/aztec.js/README.md | 6 +- .../account/contract/base_account_contract.ts | 8 +-- .../contract/ecdsa_account_contract.ts | 6 +- .../aztec.js/src/account/contract/index.ts | 4 +- .../contract/schnorr_account_contract.ts | 6 +- .../contract/single_key_account_contract.ts | 6 +- .../aztec.js/src/account/manager/index.ts | 4 +- yarn-project/aztec.js/src/contract/checker.ts | 8 +-- .../aztec.js/src/contract/contract.test.ts | 4 +- .../aztec.js/src/contract/contract.ts | 8 +-- .../aztec.js/src/contract/contract_base.ts | 8 +-- yarn-project/aztec.js/src/contract/index.ts | 4 +- .../contract_deployer.test.ts | 4 +- .../contract_deployer/contract_deployer.ts | 4 +- .../src/contract_deployer/deploy_method.ts | 15 +++-- .../src/contract_deployer/deploy_sent_tx.ts | 4 +- yarn-project/aztec.js/src/sandbox/index.ts | 4 +- .../app/components/contract_function_form.tsx | 10 ++-- .../boxes/blank-react/src/app/contract.tsx | 4 +- .../boxes/blank-react/src/artifacts/blank.ts | 16 ++--- yarn-project/boxes/blank-react/src/config.ts | 6 +- .../src/scripts/call_contract_function.ts | 4 +- .../src/scripts/deploy_contract.ts | 4 +- .../boxes/blank-react/src/scripts/util.ts | 4 +- .../src/scripts/view_contract_function.ts | 4 +- .../src/tests/blank.contract.test.ts | 2 +- .../boxes/blank/src/artifacts/blank.ts | 18 +++--- yarn-project/boxes/blank/src/index.ts | 16 ++--- .../blank/src/tests/blank.contract.test.ts | 4 +- .../app/components/contract_function_form.tsx | 10 ++-- .../boxes/private-token/src/app/contract.tsx | 4 +- .../src/artifacts/private_token.ts | 6 +- .../boxes/private-token/src/config.ts | 4 +- .../src/scripts/call_contract_function.ts | 4 +- .../src/scripts/deploy_contract.ts | 4 +- .../boxes/private-token/src/scripts/util.ts | 4 +- .../src/scripts/view_contract_function.ts | 4 +- .../src/tests/privatetoken.sandbox.test.ts | 6 +- .../src/contract/contract_deployment_info.ts | 4 +- .../src/types/contract_function_dao.ts | 4 +- yarn-project/cli/src/index.ts | 8 +-- yarn-project/cli/src/test/mocks.ts | 4 +- yarn-project/cli/src/test/utils.test.ts | 16 ++--- yarn-project/cli/src/utils.ts | 16 ++--- .../end-to-end/src/e2e_2_pxes.test.ts | 6 +- .../end-to-end/src/e2e_block_building.test.ts | 2 +- .../end-to-end/src/e2e_token_contract.test.ts | 2 +- yarn-project/foundation/src/abi/abi.ts | 13 ++-- .../foundation/src/abi/decoder.test.ts | 4 +- yarn-project/foundation/src/abi/decoder.ts | 6 +- .../foundation/src/abi/encoder.test.ts | 8 +-- .../src/__snapshots__/index.test.ts.snap | 16 ++--- .../noir-compiler/src/cli/noir-interface.ts | 4 +- .../noir-compiler/src/cli/typescript.ts | 4 +- .../src/contract-interface-gen/abi.ts | 6 +- .../src/contract-interface-gen/noir.ts | 12 ++-- .../src/contract-interface-gen/typescript.ts | 60 +++++++++---------- yarn-project/noir-compiler/src/index.test.ts | 4 +- yarn-project/noir-compiler/src/index.ts | 4 +- yarn-project/noir-compiler/src/utils.ts | 16 ++--- yarn-project/noir-contracts/README.md | 2 +- yarn-project/noir-contracts/scripts/types.sh | 4 +- .../noir-contracts/src/scripts/copy_output.ts | 6 +- yarn-project/pxe/src/contract_tree/index.ts | 4 +- .../pxe/src/pxe_service/pxe_service.ts | 2 +- yarn-project/types/src/contract_dao.ts | 14 ++--- .../types/src/interfaces/deployed-contract.ts | 8 +-- yarn-project/types/src/mocks.ts | 6 +- 74 files changed, 269 insertions(+), 261 deletions(-) diff --git a/docs/docs/dev_docs/contracts/deploying.md b/docs/docs/dev_docs/contracts/deploying.md index 2174fef658b..303196229e1 100644 --- a/docs/docs/dev_docs/contracts/deploying.md +++ b/docs/docs/dev_docs/contracts/deploying.md @@ -31,7 +31,7 @@ Pre-requisite - Generate type-safe typescript classes for your contract when com import { readFileSync, writeFileSync } from 'fs'; import { compileUsingNargo, generateTypescriptContractInterface} from '@aztec/noir-compiler'; -const compiled: ContractAbi[] = await compileUsingNargo(projectPathToContractFolder); +const compiled: ContractArtifact[] = await compileUsingNargo(projectPathToContractFolder); const abiImportPath = "../target/Example.json"; writeFileSync(tsInterfaceDestFilePath, generateTypescriptContractInterface(compiled[0], abiImportPath)); ``` diff --git a/yarn-project/acir-simulator/src/client/client_execution_context.ts b/yarn-project/acir-simulator/src/client/client_execution_context.ts index 2627802ef89..4c615c1070c 100644 --- a/yarn-project/acir-simulator/src/client/client_execution_context.ts +++ b/yarn-project/acir-simulator/src/client/client_execution_context.ts @@ -11,7 +11,7 @@ import { } from '@aztec/circuits.js'; import { computeUniqueCommitment, siloCommitment } from '@aztec/circuits.js/abis'; import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { FunctionAbi } from '@aztec/foundation/abi'; +import { FunctionArtifact } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr, Point } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -395,7 +395,7 @@ export class ClientExecutionContext extends ViewDataOracle { */ private async deriveCallContext( targetContractAddress: AztecAddress, - targetAbi: FunctionAbi, + targetAbi: FunctionArtifact, isDelegateCall = false, isStaticCall = false, ) { diff --git a/yarn-project/acir-simulator/src/client/db_oracle.ts b/yarn-project/acir-simulator/src/client/db_oracle.ts index 3a259db8693..c76be2a7bdb 100644 --- a/yarn-project/acir-simulator/src/client/db_oracle.ts +++ b/yarn-project/acir-simulator/src/client/db_oracle.ts @@ -1,5 +1,5 @@ import { CompleteAddress, GrumpkinPrivateKey, HistoricBlockData, PublicKey } from '@aztec/circuits.js'; -import { FunctionAbi, FunctionDebugMetadata, FunctionSelector } from '@aztec/foundation/abi'; +import { FunctionArtifact, FunctionDebugMetadata, FunctionSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; @@ -10,7 +10,7 @@ import { CommitmentsDB } from '../public/index.js'; /** * A function ABI with optional debug metadata */ -export interface FunctionAbiWithDebugMetadata extends FunctionAbi { +export interface FunctionAbiWithDebugMetadata extends FunctionArtifact { /** * Debug metadata for the function. */ diff --git a/yarn-project/acir-simulator/src/client/private_execution.test.ts b/yarn-project/acir-simulator/src/client/private_execution.test.ts index 3408b315ac1..da663051509 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.test.ts @@ -24,7 +24,7 @@ import { } from '@aztec/circuits.js/abis'; import { pedersenPlookupCommitInputs } from '@aztec/circuits.js/barretenberg'; import { makeContractDeploymentData } from '@aztec/circuits.js/factories'; -import { FunctionAbi, FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; +import { FunctionArtifact, FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; import { asyncMap } from '@aztec/foundation/async-map'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { toBufferBE } from '@aztec/foundation/bigint-buffer'; @@ -97,7 +97,7 @@ describe('Private Execution test suite', () => { portalContractAddress = EthAddress.ZERO, txContext = {}, }: { - abi: FunctionAbi; + abi: FunctionArtifact; msgSender?: AztecAddress; contractAddress?: AztecAddress; portalContractAddress?: EthAddress; @@ -595,7 +595,7 @@ describe('Private Execution test suite', () => { describe('nested calls through autogenerated interface', () => { let args: any[]; let argsHash: Fr; - let testCodeGenAbi: FunctionAbi; + let testCodeGenAbi: FunctionArtifact; beforeAll(async () => { // These args should match the ones hardcoded in importer contract diff --git a/yarn-project/acir-simulator/src/public/index.test.ts b/yarn-project/acir-simulator/src/public/index.test.ts index aef9a076fd9..c8bb5c90924 100644 --- a/yarn-project/acir-simulator/src/public/index.test.ts +++ b/yarn-project/acir-simulator/src/public/index.test.ts @@ -8,7 +8,7 @@ import { L1_TO_L2_MSG_TREE_HEIGHT, } from '@aztec/circuits.js'; import { pedersenPlookupCommitInputs } from '@aztec/circuits.js/barretenberg'; -import { FunctionAbi, FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; +import { FunctionArtifact, FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; @@ -100,7 +100,7 @@ describe('ACIR public execution simulator', () => { describe('transfer', () => { let contractAddress: AztecAddress; - let artifact: FunctionAbi; + let artifact: FunctionArtifact; let functionData: FunctionData; let args: Fr[]; let sender: AztecAddress; diff --git a/yarn-project/acir-simulator/src/test/utils.ts b/yarn-project/acir-simulator/src/test/utils.ts index 7b0baafe2ae..660410af108 100644 --- a/yarn-project/acir-simulator/src/test/utils.ts +++ b/yarn-project/acir-simulator/src/test/utils.ts @@ -1,6 +1,6 @@ import { AztecAddress, CircuitsWasm, EthAddress, Fr } from '@aztec/circuits.js'; import { computeSecretMessageHash } from '@aztec/circuits.js/abis'; -import { ContractAbi, getFunctionDebugMetadata } from '@aztec/foundation/abi'; +import { ContractArtifact, getFunctionDebugMetadata } from '@aztec/foundation/abi'; import { sha256ToField } from '@aztec/foundation/crypto'; import { L1Actor, L1ToL2Message, L2Actor } from '@aztec/types'; @@ -42,7 +42,7 @@ export const buildL1ToL2Message = async ( ); }; -export const getFunctionAbi = (abi: ContractAbi, functionName: string): FunctionAbiWithDebugMetadata => { +export const getFunctionAbi = (abi: ContractArtifact, functionName: string): FunctionAbiWithDebugMetadata => { const functionIndex = abi.functions.findIndex(f => f.name === functionName); if (functionIndex < 0) { throw new Error(`Unknown function ${functionName}`); diff --git a/yarn-project/aztec.js/README.md b/yarn-project/aztec.js/README.md index d031fb53bb0..e1041cab73f 100644 --- a/yarn-project/aztec.js/README.md +++ b/yarn-project/aztec.js/README.md @@ -21,7 +21,7 @@ console.log(`New account deployed at ${wallet.getAddress()}`); ```typescript import { Contract } from '@aztec/aztec.js'; -const contract = await Contract.deploy(wallet, MyContractAbi, [...constructorArgs]).send().deployed(); +const contract = await Contract.deploy(wallet, MyContractArtifact, [...constructorArgs]).send().deployed(); console.log(`Contract deployed at ${contract.address}`); ``` @@ -30,7 +30,7 @@ console.log(`Contract deployed at ${contract.address}`); ```typescript import { Contract } from '@aztec/aztec.js'; -const contract = await Contract.at(contractAddress, MyContractAbi, wallet); +const contract = await Contract.at(contractAddress, MyContractArtifact, wallet); const tx = await contract.methods.transfer(amount, recipientAddress).send().wait(); console.log(`Transferred ${amount} to ${recipientAddress} on block ${tx.blockNumber}`); ``` @@ -40,7 +40,7 @@ console.log(`Transferred ${amount} to ${recipientAddress} on block ${tx.blockNum ```typescript import { Contract } from '@aztec/aztec.js'; -const contract = await Contract.at(contractAddress, MyContractAbi, wallet); +const contract = await Contract.at(contractAddress, MyContractArtifact, wallet); const balance = await contract.methods.getBalance(wallet.getAddress()).view(); console.log(`Account balance is ${balance}`); ``` diff --git a/yarn-project/aztec.js/src/account/contract/base_account_contract.ts b/yarn-project/aztec.js/src/account/contract/base_account_contract.ts index 42c76f1380a..d749a767fe8 100644 --- a/yarn-project/aztec.js/src/account/contract/base_account_contract.ts +++ b/yarn-project/aztec.js/src/account/contract/base_account_contract.ts @@ -1,4 +1,4 @@ -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { CompleteAddress, NodeInfo } from '@aztec/types'; import { DefaultAccountInterface } from '../defaults/default_interface.js'; @@ -13,10 +13,10 @@ export abstract class BaseAccountContract implements AccountContract { abstract getAuthWitnessProvider(address: CompleteAddress): AuthWitnessProvider; abstract getDeploymentArgs(): Promise; - constructor(private abi: ContractAbi) {} + constructor(private artifact: ContractArtifact) {} - getContractAbi(): ContractAbi { - return this.abi; + getContractArtifact(): ContractArtifact { + return this.artifact; } getInterface(address: CompleteAddress, nodeInfo: NodeInfo): Promise { diff --git a/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts b/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts index 3d057db434f..8ec7c388366 100644 --- a/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts +++ b/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts @@ -1,9 +1,9 @@ import { Ecdsa } from '@aztec/circuits.js/barretenberg'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress } from '@aztec/types'; -import EcdsaAccountContractAbi from '../../abis/ecdsa_account_contract.json' assert { type: 'json' }; +import EcdsaAccountContractArtifact from '../../abis/ecdsa_account_contract.json' assert { type: 'json' }; import { AuthWitnessProvider } from '../interface.js'; import { BaseAccountContract } from './base_account_contract.js'; @@ -13,7 +13,7 @@ import { BaseAccountContract } from './base_account_contract.js'; */ export class EcdsaAccountContract extends BaseAccountContract { constructor(private signingPrivateKey: Buffer) { - super(EcdsaAccountContractAbi as ContractAbi); + super(EcdsaAccountContractArtifact as ContractArtifact); } async getDeploymentArgs() { diff --git a/yarn-project/aztec.js/src/account/contract/index.ts b/yarn-project/aztec.js/src/account/contract/index.ts index 730acfda80b..d8da7305576 100644 --- a/yarn-project/aztec.js/src/account/contract/index.ts +++ b/yarn-project/aztec.js/src/account/contract/index.ts @@ -1,4 +1,4 @@ -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { CompleteAddress, NodeInfo } from '@aztec/types'; import { AccountInterface } from '../interface.js'; @@ -17,7 +17,7 @@ export interface AccountContract { /** * Returns the ABI of this account contract. */ - getContractAbi(): ContractAbi; + getContractArtifact(): ContractArtifact; /** * Returns the deployment arguments for this instance. diff --git a/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts b/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts index d185a5a70c4..7d02c99e555 100644 --- a/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts +++ b/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts @@ -1,9 +1,9 @@ import { Schnorr } from '@aztec/circuits.js/barretenberg'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress, GrumpkinPrivateKey } from '@aztec/types'; -import SchnorrAccountContractAbi from '../../abis/schnorr_account_contract.json' assert { type: 'json' }; +import SchnorrAccountContractArtifact from '../../abis/schnorr_account_contract.json' assert { type: 'json' }; import { AuthWitnessProvider } from '../interface.js'; import { BaseAccountContract } from './base_account_contract.js'; @@ -13,7 +13,7 @@ import { BaseAccountContract } from './base_account_contract.js'; */ export class SchnorrAccountContract extends BaseAccountContract { constructor(private signingPrivateKey: GrumpkinPrivateKey) { - super(SchnorrAccountContractAbi as ContractAbi); + super(SchnorrAccountContractArtifact as ContractArtifact); } async getDeploymentArgs() { diff --git a/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts b/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts index 5b8f8c9c199..6c0c9f8ec0b 100644 --- a/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts +++ b/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts @@ -1,10 +1,10 @@ import { PartialAddress } from '@aztec/circuits.js'; import { Schnorr } from '@aztec/circuits.js/barretenberg'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress, GrumpkinPrivateKey } from '@aztec/types'; -import SchnorrSingleKeyAccountContractAbi from '../../abis/schnorr_single_key_account_contract.json' assert { type: 'json' }; +import SchnorrSingleKeyAccountContractArtifact from '../../abis/schnorr_single_key_account_contract.json' assert { type: 'json' }; import { generatePublicKey } from '../../index.js'; import { AuthWitnessProvider } from '../interface.js'; import { BaseAccountContract } from './base_account_contract.js'; @@ -15,7 +15,7 @@ import { BaseAccountContract } from './base_account_contract.js'; */ export class SingleKeyAccountContract extends BaseAccountContract { constructor(private encryptionPrivateKey: GrumpkinPrivateKey) { - super(SchnorrSingleKeyAccountContractAbi as ContractAbi); + super(SchnorrSingleKeyAccountContractArtifact as ContractArtifact); } getDeploymentArgs(): Promise { diff --git a/yarn-project/aztec.js/src/account/manager/index.ts b/yarn-project/aztec.js/src/account/manager/index.ts index 3e8248d935b..69f73ebea8d 100644 --- a/yarn-project/aztec.js/src/account/manager/index.ts +++ b/yarn-project/aztec.js/src/account/manager/index.ts @@ -64,7 +64,7 @@ export class AccountManager { if (!this.completeAddress) { const encryptionPublicKey = await generatePublicKey(this.encryptionPrivateKey); const contractDeploymentInfo = await getContractDeploymentInfo( - this.accountContract.getContractAbi(), + this.accountContract.getContractArtifact(), await this.accountContract.getDeploymentArgs(), this.salt!, encryptionPublicKey, @@ -107,7 +107,7 @@ export class AccountManager { if (!this.salt) throw new Error(`Cannot deploy account contract without known salt.`); await this.register(); const encryptionPublicKey = await this.getEncryptionPublicKey(); - const deployer = new ContractDeployer(this.accountContract.getContractAbi(), this.pxe, encryptionPublicKey); + const deployer = new ContractDeployer(this.accountContract.getContractArtifact(), this.pxe, encryptionPublicKey); const args = await this.accountContract.getDeploymentArgs(); this.deployMethod = deployer.deploy(...args); } diff --git a/yarn-project/aztec.js/src/contract/checker.ts b/yarn-project/aztec.js/src/contract/checker.ts index b90c3845845..4be22b43a8c 100644 --- a/yarn-project/aztec.js/src/contract/checker.ts +++ b/yarn-project/aztec.js/src/contract/checker.ts @@ -1,4 +1,4 @@ -import { ABIType, BasicType, ContractAbi, StructType } from '@aztec/foundation/abi'; +import { ABIType, BasicType, ContractArtifact, StructType } from '@aztec/foundation/abi'; /** * Represents a type derived from input type T with the 'kind' property removed. @@ -7,14 +7,14 @@ import { ABIType, BasicType, ContractAbi, StructType } from '@aztec/foundation/a type TypeWithoutKind = Omit<{ [key in keyof T]: any }, 'kind'>; /** - * Validates the given ContractAbi object by checking its functions and their parameters. + * Validates the given ContractArtifact object by checking its functions and their parameters. * Ensures that the ABI has at least one function, a constructor, valid bytecode, and correct parameter types. * Throws an error if any inconsistency is detected during the validation process. * - * @param abi - The ContractAbi object to be validated. + * @param abi - The ContractArtifact object to be validated. * @returns A boolean value indicating whether the ABI is valid or not. */ -export function abiChecker(abi: ContractAbi) { +export function abiChecker(abi: ContractArtifact) { if (!abi.functions || abi.functions.length === 0) { throw new Error('ABI has no functions'); } diff --git a/yarn-project/aztec.js/src/contract/contract.test.ts b/yarn-project/aztec.js/src/contract/contract.test.ts index 541a9c588b7..7f81a4a7b7c 100644 --- a/yarn-project/aztec.js/src/contract/contract.test.ts +++ b/yarn-project/aztec.js/src/contract/contract.test.ts @@ -1,6 +1,6 @@ import { AztecAddress, CompleteAddress, EthAddress } from '@aztec/circuits.js'; import { L1ContractAddresses } from '@aztec/ethereum'; -import { ABIParameterVisibility, ContractAbi, FunctionType } from '@aztec/foundation/abi'; +import { ABIParameterVisibility, ContractArtifact, FunctionType } from '@aztec/foundation/abi'; import { ExtendedContractData, NodeInfo, Tx, TxExecutionRequest, TxHash, TxReceipt } from '@aztec/types'; import { MockProxy, mock } from 'jest-mock-extended'; @@ -35,7 +35,7 @@ describe('Contract Class', () => { l1ContractAddresses: l1Addresses, }; - const defaultAbi: ContractAbi = { + const defaultAbi: ContractArtifact = { name: 'FooContract', functions: [ { diff --git a/yarn-project/aztec.js/src/contract/contract.ts b/yarn-project/aztec.js/src/contract/contract.ts index 9249184c491..b64bbf9a066 100644 --- a/yarn-project/aztec.js/src/contract/contract.ts +++ b/yarn-project/aztec.js/src/contract/contract.ts @@ -1,4 +1,4 @@ -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { PublicKey } from '@aztec/types'; @@ -22,7 +22,7 @@ export class Contract extends ContractBase { * @param portalContract - The portal contract address on L1, if any. * @returns A promise that resolves to a new Contract instance. */ - public static async at(address: AztecAddress, abi: ContractAbi, wallet: Wallet): Promise { + public static async at(address: AztecAddress, abi: ContractArtifact, wallet: Wallet): Promise { const extendedContractData = await wallet.getExtendedContractData(address); if (extendedContractData === undefined) { throw new Error('Contract ' + address.toString() + ' is not deployed'); @@ -41,7 +41,7 @@ export class Contract extends ContractBase { * @param abi - ABI of the contract to deploy. * @param args - Arguments for the constructor. */ - public static deploy(wallet: Wallet, abi: ContractAbi, args: any[]) { + public static deploy(wallet: Wallet, abi: ContractArtifact, args: any[]) { return new DeployMethod(Point.ZERO, wallet, abi, args); } @@ -52,7 +52,7 @@ export class Contract extends ContractBase { * @param abi - ABI of the contract to deploy. * @param args - Arguments for the constructor. */ - public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, abi: ContractAbi, args: any[]) { + public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, abi: ContractArtifact, args: any[]) { return new DeployMethod(publicKey, wallet, abi, args); } } diff --git a/yarn-project/aztec.js/src/contract/contract_base.ts b/yarn-project/aztec.js/src/contract/contract_base.ts index 4ac143fc47a..584529573d8 100644 --- a/yarn-project/aztec.js/src/contract/contract_base.ts +++ b/yarn-project/aztec.js/src/contract/contract_base.ts @@ -1,4 +1,4 @@ -import { ContractAbi, FunctionAbi, FunctionSelector } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionArtifact, FunctionSelector } from '@aztec/foundation/abi'; import { EthAddress } from '@aztec/foundation/eth-address'; import { CompleteAddress, DeployedContract } from '@aztec/types'; @@ -29,13 +29,13 @@ export class ContractBase implements DeployedContract { /** The deployed contract's complete address. */ public readonly completeAddress: CompleteAddress, /** The Application Binary Interface for the contract. */ - public readonly abi: ContractAbi, + public readonly artifact: ContractArtifact, /** The wallet used for interacting with this contract. */ protected wallet: Wallet, /** The portal contract address on L1, if any. */ public readonly portalContract: EthAddress, ) { - abi.functions.forEach((f: FunctionAbi) => { + artifact.functions.forEach((f: FunctionArtifact) => { const interactionFunction = (...args: any[]) => { return new ContractFunctionInteraction(this.wallet, this.completeAddress.address!, f, args); }; @@ -65,6 +65,6 @@ export class ContractBase implements DeployedContract { * @returns A new contract instance. */ public withWallet(wallet: Wallet): this { - return new ContractBase(this.completeAddress, this.abi, wallet, this.portalContract) as this; + return new ContractBase(this.completeAddress, this.artifact, wallet, this.portalContract) as this; } } diff --git a/yarn-project/aztec.js/src/contract/index.ts b/yarn-project/aztec.js/src/contract/index.ts index 620c4d1e968..55c7329a978 100644 --- a/yarn-project/aztec.js/src/contract/index.ts +++ b/yarn-project/aztec.js/src/contract/index.ts @@ -10,12 +10,12 @@ * or can be queried via `view()`. * * ```ts - * const contract = await Contract.deploy(wallet, MyContractAbi, [...constructorArgs]).send().deployed(); + * const contract = await Contract.deploy(wallet, MyContractArtifact, [...constructorArgs]).send().deployed(); * console.log(`Contract deployed at ${contract.address}`); * ``` * * ```ts - * const contract = await Contract.at(address, MyContractAbi, wallet); + * const contract = await Contract.at(address, MyContractArtifact, wallet); * await contract.methods.mint(1000, owner).send().wait(); * console.log(`Total supply is now ${await contract.methods.totalSupply().view()}`); * ``` diff --git a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts index a95e6c45b97..4a9facc7493 100644 --- a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts +++ b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts @@ -1,5 +1,5 @@ import { EthAddress, Fr, Point } from '@aztec/circuits.js'; -import { ContractAbi, FunctionType } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionType } from '@aztec/foundation/abi'; import { PXE, PublicKey, Tx, TxHash, TxReceipt } from '@aztec/types'; import { MockProxy, mock } from 'jest-mock-extended'; @@ -9,7 +9,7 @@ import { ContractDeployer } from './contract_deployer.js'; describe.skip('Contract Deployer', () => { let pxe: MockProxy; - const abi: ContractAbi = { + const abi: ContractArtifact = { name: 'MyContract', functions: [ { diff --git a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts index 92ed8e23fc6..74ef5e4bf21 100644 --- a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts +++ b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts @@ -1,5 +1,5 @@ import { Point } from '@aztec/circuits.js'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { PXE, PublicKey } from '@aztec/types'; import { DeployMethod } from './deploy_method.js'; @@ -9,7 +9,7 @@ import { DeployMethod } from './deploy_method.js'; * @remarks Keeping this around even though we have Aztec.nr contract types because it can be useful for non-TS users. */ export class ContractDeployer { - constructor(private abi: ContractAbi, private pxe: PXE, private publicKey?: PublicKey) {} + constructor(private abi: ContractArtifact, private pxe: PXE, private publicKey?: PublicKey) {} /** * Deploy a contract using the provided ABI and constructor arguments. diff --git a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts b/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts index 2cf6dbd9ad6..398b689748b 100644 --- a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts +++ b/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts @@ -5,7 +5,7 @@ import { TxContext, getContractDeploymentInfo, } from '@aztec/circuits.js'; -import { ContractAbi, FunctionAbi, encodeArguments } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionArtifact, encodeArguments } from '@aztec/foundation/abi'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { PXE, PackedArguments, PublicKey, Tx, TxExecutionRequest } from '@aztec/types'; @@ -38,9 +38,14 @@ export class DeployMethod extends Bas public completeAddress?: CompleteAddress = undefined; /** Constructor function to call. */ - private constructorAbi: FunctionAbi; - - constructor(private publicKey: PublicKey, protected pxe: PXE, private abi: ContractAbi, private args: any[] = []) { + private constructorAbi: FunctionArtifact; + + constructor( + private publicKey: PublicKey, + protected pxe: PXE, + private abi: ContractArtifact, + private args: any[] = [], + ) { super(pxe); const constructorAbi = abi.functions.find(f => f.name === 'constructor'); if (!constructorAbi) throw new Error('Cannot find constructor in the ABI.'); @@ -103,7 +108,7 @@ export class DeployMethod extends Bas this.completeAddress = completeAddress; // TODO: Should we add the contracts to the DB here, or once the tx has been sent or mined? - await this.pxe.addContracts([{ abi: this.abi, completeAddress, portalContract }]); + await this.pxe.addContracts([{ artifact: this.abi, completeAddress, portalContract }]); return this.txRequest; } diff --git a/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts b/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts index 8b0fc0a2a0f..bd5e0c4d9fb 100644 --- a/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts +++ b/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts @@ -1,5 +1,5 @@ import { FieldsOf } from '@aztec/circuits.js'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { TxHash, TxReceipt } from '@aztec/types'; import { AztecAddress, Contract, ContractBase, PXE, SentTx, WaitOpts, Wallet } from '../index.js'; @@ -20,7 +20,7 @@ export type DeployTxReceipt = FieldsO * A contract deployment transaction sent to the network, extending SentTx with methods to create a contract instance. */ export class DeploySentTx extends SentTx { - constructor(private abi: ContractAbi, wallet: PXE | Wallet, txHashPromise: Promise) { + constructor(private abi: ContractArtifact, wallet: PXE | Wallet, txHashPromise: Promise) { super(wallet, txHashPromise); } diff --git a/yarn-project/aztec.js/src/sandbox/index.ts b/yarn-project/aztec.js/src/sandbox/index.ts index 89470f7ea96..910b435347a 100644 --- a/yarn-project/aztec.js/src/sandbox/index.ts +++ b/yarn-project/aztec.js/src/sandbox/index.ts @@ -3,7 +3,7 @@ import { sleep } from '@aztec/foundation/sleep'; import zip from 'lodash.zip'; -import SchnorrAccountContractAbi from '../abis/schnorr_account_contract.json' assert { type: 'json' }; +import SchnorrAccountContractArtifact from '../abis/schnorr_account_contract.json' assert { type: 'json' }; import { AccountWalletWithPrivateKey, PXE, createPXEClient, getSchnorrAccount } from '../index.js'; export const INITIAL_SANDBOX_ENCRYPTION_KEYS = [ @@ -16,7 +16,7 @@ export const INITIAL_SANDBOX_SIGNING_KEYS = INITIAL_SANDBOX_ENCRYPTION_KEYS; export const INITIAL_SANDBOX_SALTS = [Fr.ZERO, Fr.ZERO, Fr.ZERO]; -export const INITIAL_SANDBOX_ACCOUNT_CONTRACT_ABI = SchnorrAccountContractAbi; +export const INITIAL_SANDBOX_ACCOUNT_CONTRACT_ABI = SchnorrAccountContractArtifact; export const { PXE_URL = 'http://localhost:8080' } = process.env; diff --git a/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx b/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx index 6c4e6b1d5ff..4005936a072 100644 --- a/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx +++ b/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx @@ -1,6 +1,6 @@ import { Button, Loader } from '@aztec/aztec-ui'; import { AztecAddress, CompleteAddress, Fr } from '@aztec/aztec.js'; -import { ContractAbi, FunctionAbi } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionArtifact } from '@aztec/foundation/abi'; import { useFormik } from 'formik'; import * as Yup from 'yup'; import { CONTRACT_ADDRESS_PARAM_NAMES, pxe } from '../../config.js'; @@ -18,7 +18,7 @@ type NoirFunctionFormValues = { [key: string]: string | number | number[] | boolean; }; -function generateYupSchema(functionAbi: FunctionAbi, defaultAddress: string) { +function generateYupSchema(functionAbi: FunctionArtifact, defaultAddress: string) { const parameterSchema: NoirFunctionYupSchema = {}; const initialValues: NoirFunctionFormValues = {}; for (const param of functionAbi.parameters) { @@ -62,7 +62,7 @@ function generateYupSchema(functionAbi: FunctionAbi, defaultAddress: string) { async function handleFunctionCall( contractAddress: AztecAddress | undefined, - contractAbi: ContractAbi, + contractAbi: ContractArtifact, functionName: string, args: any, wallet: CompleteAddress, @@ -94,8 +94,8 @@ async function handleFunctionCall( interface ContractFunctionFormProps { wallet: CompleteAddress; contractAddress?: AztecAddress; - contractAbi: ContractAbi; - functionAbi: FunctionAbi; + contractAbi: ContractArtifact; + functionAbi: FunctionArtifact; defaultAddress: string; title?: string; buttonText?: string; diff --git a/yarn-project/boxes/blank-react/src/app/contract.tsx b/yarn-project/boxes/blank-react/src/app/contract.tsx index 04003d01c40..2f10739e8f8 100644 --- a/yarn-project/boxes/blank-react/src/app/contract.tsx +++ b/yarn-project/boxes/blank-react/src/app/contract.tsx @@ -1,6 +1,6 @@ import { Button, ButtonSize, ButtonTheme, Card, CardTheme, ImageButton, ImageButtonIcon } from '@aztec/aztec-ui'; import { AztecAddress, CompleteAddress } from '@aztec/aztec.js'; -import { FunctionAbi } from '@aztec/foundation/abi'; +import { FunctionArtifact } from '@aztec/foundation/abi'; import { ReactNode, useState } from 'react'; import { contractAbi } from '../config.js'; import { Copy } from './components/copy.js'; @@ -64,7 +64,7 @@ export function Contract({ wallet }: Props) { )}
- {functions.map((functionAbi: FunctionAbi, index: number) => ( + {functions.map((functionAbi: FunctionArtifact, index: number) => ( (Point.ZERO, pxe, BlankContractAbi, Array.from(arguments).slice(1)); + return new DeployMethod(Point.ZERO, pxe, BlankContractArtifact, Array.from(arguments).slice(1)); } /** * Creates a tx to deploy a new instance of this contract using the specified public key to derive the address. */ public static deployWithPublicKey(pxe: PXE, publicKey: PublicKey) { - return new DeployMethod(publicKey, pxe, BlankContractAbi, Array.from(arguments).slice(2)); + return new DeployMethod(publicKey, pxe, BlankContractArtifact, Array.from(arguments).slice(2)); } /** * Returns this contract's ABI. */ - public static get abi(): ContractAbi { - return BlankContractAbi; + public static get abi(): ContractArtifact { + return BlankContractArtifact; } /** Type-safe wrappers for the public methods exposed by the contract. */ diff --git a/yarn-project/boxes/blank-react/src/config.ts b/yarn-project/boxes/blank-react/src/config.ts index b2405997b7d..578b342b4b8 100644 --- a/yarn-project/boxes/blank-react/src/config.ts +++ b/yarn-project/boxes/blank-react/src/config.ts @@ -1,10 +1,10 @@ import { PXE, createPXEClient } from '@aztec/aztec.js'; -import { ContractAbi } from '@aztec/foundation/abi'; -import { BlankContractAbi } from './artifacts/blank.js'; +import { ContractArtifact } from '@aztec/foundation/abi'; +import { BlankContractArtifact } from './artifacts/blank.js'; // update this if using a different contract -export const contractAbi: ContractAbi = BlankContractAbi; +export const contractAbi: ContractArtifact = BlankContractArtifact; export const PXE_URL: string = process.env.PXE_URL || 'http://localhost:8080'; export const pxe: PXE = createPXEClient(PXE_URL); diff --git a/yarn-project/boxes/blank-react/src/scripts/call_contract_function.ts b/yarn-project/boxes/blank-react/src/scripts/call_contract_function.ts index eee3953023a..54f89da92d7 100644 --- a/yarn-project/boxes/blank-react/src/scripts/call_contract_function.ts +++ b/yarn-project/boxes/blank-react/src/scripts/call_contract_function.ts @@ -1,11 +1,11 @@ import { AztecAddress, PXE, CompleteAddress, Contract, TxReceipt } from '@aztec/aztec.js'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { FieldsOf } from '@aztec/foundation/types'; import { getWallet } from './util.js'; export async function callContractFunction( address: AztecAddress, - abi: ContractAbi, + abi: ContractArtifact, functionName: string, typedArgs: any[], // for the exposed functions, this is an array of field elements Fr[] pxe: PXE, diff --git a/yarn-project/boxes/blank-react/src/scripts/deploy_contract.ts b/yarn-project/boxes/blank-react/src/scripts/deploy_contract.ts index 7a0dc7d4d76..0053296bcef 100644 --- a/yarn-project/boxes/blank-react/src/scripts/deploy_contract.ts +++ b/yarn-project/boxes/blank-react/src/scripts/deploy_contract.ts @@ -1,10 +1,10 @@ import { AztecAddress, CompleteAddress, DeployMethod, Fr } from '@aztec/aztec.js'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { PXE } from '@aztec/types'; export async function deployContract( activeWallet: CompleteAddress, - contractAbi: ContractAbi, + contractAbi: ContractArtifact, typedArgs: Fr[], // encode prior to passing in salt: Fr, pxe: PXE, diff --git a/yarn-project/boxes/blank-react/src/scripts/util.ts b/yarn-project/boxes/blank-react/src/scripts/util.ts index cac4d8afddc..bea2bcba47f 100644 --- a/yarn-project/boxes/blank-react/src/scripts/util.ts +++ b/yarn-project/boxes/blank-react/src/scripts/util.ts @@ -1,8 +1,8 @@ import { AccountWallet, Fr, getSandboxAccountsWallets } from '@aztec/aztec.js'; -import { FunctionAbi, encodeArguments } from '@aztec/foundation/abi'; +import { FunctionArtifact, encodeArguments } from '@aztec/foundation/abi'; import { PXE, CompleteAddress } from '@aztec/types'; -export function convertArgs(functionAbi: FunctionAbi, args: any): Fr[] { +export function convertArgs(functionAbi: FunctionArtifact, args: any): Fr[] { const untypedArgs = functionAbi.parameters.map(param => { switch (param.type.kind) { case 'field': diff --git a/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts b/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts index 79bd9b16f92..e647f3b9572 100644 --- a/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts +++ b/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts @@ -1,10 +1,10 @@ import { getWallet } from './util.js'; import { AztecAddress, PXE, CompleteAddress, Contract } from '@aztec/aztec.js'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; export async function viewContractFunction( address: AztecAddress, - abi: ContractAbi, + abi: ContractArtifact, functionName: string, typedArgs: any[], pxe: PXE, diff --git a/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts b/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts index 035deced39c..d2e93285ad0 100644 --- a/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts +++ b/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts @@ -57,7 +57,7 @@ describe('ZK Contract Tests', () => { test('call succeeds after deploy', async () => { const callTxReceipt = await callContractFunction( contractAddress, - contract.abi, + contract.artifact, 'getPublicKey', [owner.address.toField()], pxe, diff --git a/yarn-project/boxes/blank/src/artifacts/blank.ts b/yarn-project/boxes/blank/src/artifacts/blank.ts index 672d4ba566a..c2694be3161 100644 --- a/yarn-project/boxes/blank/src/artifacts/blank.ts +++ b/yarn-project/boxes/blank/src/artifacts/blank.ts @@ -17,16 +17,16 @@ import { } from '@aztec/aztec.js'; import { Fr, Point } from '@aztec/foundation/fields'; import { PXE, PublicKey } from '@aztec/types'; -import { ContractAbi } from '@aztec/foundation/abi'; -import BlankContractAbiJson from './blank_contract.json' assert { type: 'json' }; -export const BlankContractAbi = BlankContractAbiJson as ContractAbi; +import { ContractArtifact } from '@aztec/foundation/abi'; +import BlankContractArtifactJson from './blank_contract.json' assert { type: 'json' }; +export const BlankContractArtifact = BlankContractArtifactJson as ContractArtifact; /** * Type-safe interface for contract Blank; */ export class BlankContract extends ContractBase { private constructor(completeAddress: CompleteAddress, wallet: Wallet, portalContract = EthAddress.ZERO) { - super(completeAddress, BlankContractAbi, wallet, portalContract); + super(completeAddress, BlankContractArtifact, wallet, portalContract); } /** @@ -36,28 +36,28 @@ export class BlankContract extends ContractBase { * @returns A promise that resolves to a new Contract instance. */ public static async at(address: AztecAddress, wallet: Wallet) { - return Contract.at(address, BlankContract.abi, wallet) as Promise; + return Contract.at(address, BlankContract.artifact, wallet) as Promise; } /** * Creates a tx to deploy a new instance of this contract. */ public static deploy(pxe: PXE) { - return new DeployMethod(Point.ZERO, pxe, BlankContractAbi, Array.from(arguments).slice(1)); + return new DeployMethod(Point.ZERO, pxe, BlankContractArtifact, Array.from(arguments).slice(1)); } /** * Creates a tx to deploy a new instance of this contract using the specified public key to derive the address. */ public static deployWithPublicKey(pxe: PXE, publicKey: PublicKey) { - return new DeployMethod(publicKey, pxe, BlankContractAbi, Array.from(arguments).slice(2)); + return new DeployMethod(publicKey, pxe, BlankContractArtifact, Array.from(arguments).slice(2)); } /** * Returns this contract's ABI. */ - public static get abi(): ContractAbi { - return BlankContractAbi; + public static get artifact(): ContractArtifact { + return BlankContractArtifact; } /** Type-safe wrappers for the public methods exposed by the contract. */ diff --git a/yarn-project/boxes/blank/src/index.ts b/yarn-project/boxes/blank/src/index.ts index a273bcabf70..c34de1d997b 100644 --- a/yarn-project/boxes/blank/src/index.ts +++ b/yarn-project/boxes/blank/src/index.ts @@ -10,10 +10,10 @@ import { createPXEClient, getSandboxAccountsWallets, } from '@aztec/aztec.js'; -import { ContractAbi, FunctionAbi, encodeArguments } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionArtifact, encodeArguments } from '@aztec/foundation/abi'; import { FieldsOf } from '@aztec/foundation/types'; -import { BlankContractAbi } from './artifacts/blank.js'; -export const contractAbi: ContractAbi = BlankContractAbi; +import { BlankContractArtifact } from './artifacts/blank.js'; +export const contractAbi: ContractArtifact = BlankContractArtifact; export const PXE_URL: string = process.env.PXE_URL || 'http://localhost:8080'; export const pxe: PXE = createPXEClient(PXE_URL); @@ -48,7 +48,7 @@ export async function handleDeployClick(): Promise { export async function handleInteractClick(contractAddress: string) { const [wallet, ..._rest] = await getSandboxAccountsWallets(pxe); const callArgs = { address: wallet.getCompleteAddress().address }; - const getPkAbi = getFunctionAbi(BlankContractAbi, 'getPublicKey'); + const getPkAbi = getFunctionAbi(BlankContractArtifact, 'getPublicKey'); const typedArgs = convertArgs(getPkAbi, callArgs); // eslint-disable-next-line no-console @@ -65,14 +65,14 @@ export async function handleInteractClick(contractAddress: string) { } export const getFunctionAbi = (contractAbi: any, functionName: string) => { - const functionAbi = contractAbi.functions.find((f: FunctionAbi) => f.name === functionName); + const functionAbi = contractAbi.functions.find((f: FunctionArtifact) => f.name === functionName); if (!functionAbi) throw new Error(`Function ${functionName} not found in abi`); return functionAbi; }; export async function callContractFunction( address: AztecAddress, - abi: ContractAbi, + abi: ContractArtifact, functionName: string, typedArgs: any[], // for the exposed functions, this is an array of field elements Fr[] pxe: PXE, @@ -111,7 +111,7 @@ export async function getWallet(account: CompleteAddress, pxe: PXE): Promise { switch (param.type.kind) { case 'field': diff --git a/yarn-project/boxes/blank/src/tests/blank.contract.test.ts b/yarn-project/boxes/blank/src/tests/blank.contract.test.ts index ac9cff71b87..afbc50e06f8 100644 --- a/yarn-project/boxes/blank/src/tests/blank.contract.test.ts +++ b/yarn-project/boxes/blank/src/tests/blank.contract.test.ts @@ -26,7 +26,7 @@ const setupSandbox = async () => { async function deployZKContract(owner: CompleteAddress, wallet: Wallet, pxe: PXE) { logger('Deploying Blank contract...'); - const contractAddress = await deployContract(owner, BlankContract.abi, [], Fr.random(), pxe); + const contractAddress = await deployContract(owner, BlankContract.artifact, [], Fr.random(), pxe); logger(`L2 contract deployed at ${contractAddress}`); return BlankContract.at(contractAddress, wallet); @@ -55,7 +55,7 @@ describe('ZK Contract Tests', () => { test('call succeeds after deploy', async () => { const callTxReceipt = await callContractFunction( contractAddress, - contract.abi, + contract.artifact, 'getPublicKey', [owner.address.toField()], pxe, diff --git a/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx b/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx index 860c99e45b0..8e172f02619 100644 --- a/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx +++ b/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx @@ -4,7 +4,7 @@ import { convertArgs } from '../../scripts/util.js'; import styles from './contract_function_form.module.scss'; import { Button, Loader } from '@aztec/aztec-ui'; import { AztecAddress, CompleteAddress, Fr } from '@aztec/aztec.js'; -import { ContractAbi, FunctionAbi } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionArtifact } from '@aztec/foundation/abi'; import { useFormik } from 'formik'; import * as Yup from 'yup'; @@ -18,7 +18,7 @@ type NoirFunctionFormValues = { [key: string]: string | number | number[] | boolean; }; -function generateYupSchema(functionAbi: FunctionAbi, defaultAddress: string) { +function generateYupSchema(functionAbi: FunctionArtifact, defaultAddress: string) { const parameterSchema: NoirFunctionYupSchema = {}; const initialValues: NoirFunctionFormValues = {}; for (const param of functionAbi.parameters) { @@ -62,7 +62,7 @@ function generateYupSchema(functionAbi: FunctionAbi, defaultAddress: string) { async function handleFunctionCall( contractAddress: AztecAddress | undefined, - contractAbi: ContractAbi, + contractAbi: ContractArtifact, functionName: string, args: any, wallet: CompleteAddress, @@ -94,8 +94,8 @@ async function handleFunctionCall( interface ContractFunctionFormProps { wallet: CompleteAddress; contractAddress?: AztecAddress; - contractAbi: ContractAbi; - functionAbi: FunctionAbi; + contractAbi: ContractArtifact; + functionAbi: FunctionArtifact; defaultAddress: string; title?: string; buttonText?: string; diff --git a/yarn-project/boxes/private-token/src/app/contract.tsx b/yarn-project/boxes/private-token/src/app/contract.tsx index 3b9e3c3c80b..c1a192a16b8 100644 --- a/yarn-project/boxes/private-token/src/app/contract.tsx +++ b/yarn-project/boxes/private-token/src/app/contract.tsx @@ -4,7 +4,7 @@ import { ContractFunctionForm, Popup } from './components/index.js'; import styles from './contract.module.scss'; import { Button, ButtonSize, ButtonTheme, Card, CardTheme, ImageButton, ImageButtonIcon } from '@aztec/aztec-ui'; import { AztecAddress, CompleteAddress } from '@aztec/aztec.js'; -import { FunctionAbi } from '@aztec/foundation/abi'; +import { FunctionArtifact } from '@aztec/foundation/abi'; import { ReactNode, useState } from 'react'; const functionTypeSortOrder = { @@ -64,7 +64,7 @@ export function Contract({ wallet }: Props) { )}
- {functions.map((functionAbi: FunctionAbi, index: number) => ( + {functions.map((functionAbi: FunctionArtifact, index: number) => ( { switch (param.type.kind) { case 'field': diff --git a/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts b/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts index 79bd9b16f92..e647f3b9572 100644 --- a/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts +++ b/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts @@ -1,10 +1,10 @@ import { getWallet } from './util.js'; import { AztecAddress, PXE, CompleteAddress, Contract } from '@aztec/aztec.js'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; export async function viewContractFunction( address: AztecAddress, - abi: ContractAbi, + abi: ContractArtifact, functionName: string, typedArgs: any[], pxe: PXE, diff --git a/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts b/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts index 367e0fb60f4..3f845c3268e 100644 --- a/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts +++ b/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts @@ -42,7 +42,7 @@ async function deployZKContract(owner: CompleteAddress, wallet: Wallet, pxe: PXE async function getBalance(contractAddress: AztecAddress, privateTokenContract: Contract, owner: CompleteAddress) { const typedArgs = [owner.address.toField()]; - return await viewContractFunction(contractAddress, privateTokenContract.abi, 'getBalance', typedArgs, pxe, owner); + return await viewContractFunction(contractAddress, privateTokenContract.artifact, 'getBalance', typedArgs, pxe, owner); } async function mint( @@ -54,7 +54,7 @@ async function mint( ) { const typedArgs = [new Fr(amount), to.address.toField()]; - return await callContractFunction(contractAddress, privateTokenContract.abi, 'mint', typedArgs, pxe, from); + return await callContractFunction(contractAddress, privateTokenContract.artifact, 'mint', typedArgs, pxe, from); } async function transfer( @@ -66,7 +66,7 @@ async function transfer( ) { const typedArgs = [new Fr(amount), to.address.toField()]; - return await callContractFunction(contractAddress, privateTokenContract.abi, 'transfer', typedArgs, pxe, from); + return await callContractFunction(contractAddress, privateTokenContract.artifact, 'transfer', typedArgs, pxe, from); } describe('ZK Contract Tests', () => { diff --git a/yarn-project/circuits.js/src/contract/contract_deployment_info.ts b/yarn-project/circuits.js/src/contract/contract_deployment_info.ts index dc6914eaf10..fb7d1bc5ff9 100644 --- a/yarn-project/circuits.js/src/contract/contract_deployment_info.ts +++ b/yarn-project/circuits.js/src/contract/contract_deployment_info.ts @@ -4,7 +4,7 @@ import { computeVarArgsHash, hashConstructor, } from '@aztec/circuits.js/abis'; -import { ContractAbi, FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionSelector, encodeArguments } from '@aztec/foundation/abi'; import { CircuitsWasm, DeploymentInfo, Fr, FunctionData, PublicKey } from '../index.js'; import { generateFunctionLeaves, hashVKStr, isConstructor } from './contract_tree/contract_tree.js'; @@ -18,7 +18,7 @@ import { generateFunctionLeaves, hashVKStr, isConstructor } from './contract_tre * @returns - The contract deployment info */ export async function getContractDeploymentInfo( - abi: ContractAbi, + abi: ContractArtifact, args: any[], contractAddressSalt: Fr, publicKey: PublicKey, diff --git a/yarn-project/circuits.js/src/types/contract_function_dao.ts b/yarn-project/circuits.js/src/types/contract_function_dao.ts index 597d2f525cf..cec233464e7 100644 --- a/yarn-project/circuits.js/src/types/contract_function_dao.ts +++ b/yarn-project/circuits.js/src/types/contract_function_dao.ts @@ -1,4 +1,4 @@ -import { FunctionAbi } from '@aztec/foundation/abi'; +import { FunctionArtifact } from '@aztec/foundation/abi'; import { FunctionSelector } from '../index.js'; @@ -7,7 +7,7 @@ import { FunctionSelector } from '../index.js'; * Extends the FunctionAbi interface, adding a 'selector' property. * The 'selector' is a unique identifier for the function within the contract. */ -export interface ContractFunctionDao extends FunctionAbi { +export interface ContractFunctionDao extends FunctionArtifact { /** * Unique identifier for a contract function. */ diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index 42e05d7e26b..3655f91eebf 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -28,7 +28,7 @@ import { unboxContract } from './unbox.js'; import { deployAztecContracts, getAbiFunction, - getContractAbi, + getContractArtifact, getExampleContractArtifacts, getTxSender, parseAztecAddress, @@ -188,7 +188,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { // https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue .option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction') .action(async (abiPath, { rpcUrl, publicKey, args: rawArgs, salt, wait }) => { - const contractAbi = await getContractAbi(abiPath, log); + const contractAbi = await getContractArtifact(abiPath, log); const constructorAbi = contractAbi.functions.find(({ name }) => name === 'constructor'); const client = await createCompatibleClient(rpcUrl, debugLogger); @@ -470,7 +470,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { ) .requiredOption('-p, --parameter ', 'The name of the struct parameter to decode into') .action(async (encodedString, options) => { - const contractAbi = await getContractAbi(options.contractAbi, log); + const contractAbi = await getContractArtifact(options.contractAbi, log); const parameterAbitype = contractAbi.functions .map(({ parameters }) => parameters) .flat() @@ -537,7 +537,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { `A compiled Noir contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts`, ) .action(async (contractAbiFile: string) => { - const contractAbi = await getContractAbi(contractAbiFile, debugLogger); + const contractAbi = await getContractArtifact(contractAbiFile, debugLogger); const contractFns = contractAbi.functions.filter( f => !f.isInternal && f.name !== 'compute_note_hash_and_nullifier', ); diff --git a/yarn-project/cli/src/test/mocks.ts b/yarn-project/cli/src/test/mocks.ts index 9ba23a077f5..ef59bb7330c 100644 --- a/yarn-project/cli/src/test/mocks.ts +++ b/yarn-project/cli/src/test/mocks.ts @@ -1,6 +1,6 @@ -import { ABIParameterVisibility, ContractAbi, FunctionType } from '@aztec/foundation/abi'; +import { ABIParameterVisibility, ContractArtifact, FunctionType } from '@aztec/foundation/abi'; -export const mockContractAbi: ContractAbi = { +export const mockContractArtifact: ContractArtifact = { name: 'MockContract', functions: [ { diff --git a/yarn-project/cli/src/test/utils.test.ts b/yarn-project/cli/src/test/utils.test.ts index 17619dc8f8c..aea7a8bbfc6 100644 --- a/yarn-project/cli/src/test/utils.test.ts +++ b/yarn-project/cli/src/test/utils.test.ts @@ -6,7 +6,7 @@ import { MockProxy, mock } from 'jest-mock-extended'; import { encodeArgs } from '../encoding.js'; import { getTxSender, parseSaltFromHexString, stripLeadingHex } from '../utils.js'; -import { mockContractAbi } from './mocks.js'; +import { mockContractArtifact } from './mocks.js'; describe('CLI Utils', () => { let client: MockProxy; @@ -58,7 +58,7 @@ describe('CLI Utils', () => { it('Encodes args correctly', () => { const args = [addr1.toString(), 'false', num.toString(), `${JSON.stringify(fieldArray)}`, JSON.stringify(struct)]; - const result = encodeArgs(args, mockContractAbi.functions[1].parameters); + const result = encodeArgs(args, mockContractArtifact.functions[1].parameters); const exp = [ addr1.toBigInt(), false, @@ -75,7 +75,7 @@ describe('CLI Utils', () => { it('Errors on invalid inputs', () => { // invalid number of args const args1 = [field.toString(), 'false']; - expect(() => encodeArgs(args1, mockContractAbi.functions[1].parameters)).toThrow('Invalid args provided'); + expect(() => encodeArgs(args1, mockContractArtifact.functions[1].parameters)).toThrow('Invalid args provided'); // invalid array length const invalidArray = fieldArray.concat([Fr.random().toString()]); @@ -86,7 +86,7 @@ describe('CLI Utils', () => { `${JSON.stringify(invalidArray)}`, JSON.stringify(struct), ]; - expect(() => encodeArgs(args2, mockContractAbi.functions[1].parameters)).toThrow( + expect(() => encodeArgs(args2, mockContractArtifact.functions[1].parameters)).toThrow( 'Invalid array length passed for arrayParam. Expected 3, received 4.', ); @@ -101,7 +101,7 @@ describe('CLI Utils', () => { `${JSON.stringify(fieldArray)}`, JSON.stringify(invalidStruct), ]; - expect(() => encodeArgs(args3, mockContractAbi.functions[1].parameters)).toThrow( + expect(() => encodeArgs(args3, mockContractArtifact.functions[1].parameters)).toThrow( 'Expected field subField2 not found in struct structParam.', ); @@ -113,19 +113,19 @@ describe('CLI Utils', () => { `${JSON.stringify(fieldArray)}`, JSON.stringify(invalidStruct), ]; - expect(() => encodeArgs(args4, mockContractAbi.functions[1].parameters)).toThrow( + expect(() => encodeArgs(args4, mockContractArtifact.functions[1].parameters)).toThrow( 'Invalid boolean value passed for boolParam: foo.', ); // invalid field const args5 = ['foo', 'false', num.toString(), `${JSON.stringify(fieldArray)}`, JSON.stringify(invalidStruct)]; - expect(() => encodeArgs(args5, mockContractAbi.functions[1].parameters)).toThrow( + expect(() => encodeArgs(args5, mockContractArtifact.functions[1].parameters)).toThrow( 'Invalid value passed for fieldParam. Could not parse foo as a field.', ); // invalid int const args6 = [addr1.toString(), 'false', 'foo', `${JSON.stringify(fieldArray)}`, JSON.stringify(invalidStruct)]; - expect(() => encodeArgs(args6, mockContractAbi.functions[1].parameters)).toThrow( + expect(() => encodeArgs(args6, mockContractArtifact.functions[1].parameters)).toThrow( 'Invalid value passed for integerParam. Could not parse foo as an integer.', ); }); diff --git a/yarn-project/cli/src/utils.ts b/yarn-project/cli/src/utils.ts index 8e6f527f9ca..387a781075c 100644 --- a/yarn-project/cli/src/utils.ts +++ b/yarn-project/cli/src/utils.ts @@ -1,6 +1,6 @@ import { AztecAddress, Fr, GrumpkinScalar, PXE, Point, TxHash } from '@aztec/aztec.js'; import { L1ContractArtifactsForDeployment, createEthereumChain, deployL1Contracts } from '@aztec/ethereum'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { DebugLogger, LogFn } from '@aztec/foundation/log'; import { ContractDeploymentEmitterAbi, @@ -25,7 +25,7 @@ import { encodeArgs } from './encoding.js'; * Helper type to dynamically import contracts. */ interface ArtifactsType { - [key: string]: ContractAbi; + [key: string]: ContractArtifact; } /** @@ -34,7 +34,7 @@ interface ArtifactsType { * @param fnName - Function name to be found. * @returns The function's ABI. */ -export function getAbiFunction(abi: ContractAbi, fnName: string) { +export function getAbiFunction(abi: ContractArtifact, fnName: string) { const fn = abi.functions.find(({ name }) => name === fnName); if (!fn) { throw Error(`Function ${fnName} not found in contract ABI.`); @@ -97,12 +97,12 @@ export async function getExampleContractArtifacts() { * @param fileDir - The directory of the compiled contract ABI. * @returns The parsed ContractABI. */ -export async function getContractAbi(fileDir: string, log: LogFn) { +export async function getContractArtifact(fileDir: string, log: LogFn) { // first check if it's a noir-contracts example let contents: string; const artifacts = await getExampleContractArtifacts(); if (artifacts[fileDir]) { - return artifacts[fileDir] as ContractAbi; + return artifacts[fileDir] as ContractArtifact; } try { @@ -112,9 +112,9 @@ export async function getContractAbi(fileDir: string, log: LogFn) { } // if not found, try reading as path directly - let contractAbi: ContractAbi; + let contractAbi: ContractArtifact; try { - contractAbi = JSON.parse(contents) as ContractAbi; + contractAbi = JSON.parse(contents) as ContractArtifact; } catch (err) { log('Invalid file used. Please try again.'); throw err; @@ -157,7 +157,7 @@ export async function getTxSender(pxe: PXE, _from?: string) { * @returns Formatted contract address, function arguments and caller's aztec address. */ export async function prepTx(contractFile: string, functionName: string, _functionArgs: string[], log: LogFn) { - const contractAbi = await getContractAbi(contractFile, log); + const contractAbi = await getContractArtifact(contractFile, log); const functionAbi = getAbiFunction(contractAbi, functionName); const functionArgs = encodeArgs(_functionArgs, functionAbi.parameters); 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 d470d060595..ae644c66170 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 @@ -121,7 +121,7 @@ describe('e2e_2_pxes', () => { // Add token to PXE B (PXE A already has it because it was deployed through it) await pxeB.addContracts([ { - abi: TokenContract.abi, + artifact: TokenContract.artifact, completeAddress: completeTokenAddress, portalContract: EthAddress.ZERO, }, @@ -184,7 +184,7 @@ describe('e2e_2_pxes', () => { // Add Child to PXE B await pxeB.addContracts([ { - abi: ChildContract.abi, + artifact: ChildContract.artifact, completeAddress: childCompleteAddress, portalContract: EthAddress.ZERO, }, @@ -216,7 +216,7 @@ describe('e2e_2_pxes', () => { // Add token to PXE B (PXE A already has it because it was deployed through it) await pxeB.addContracts([ { - abi: TokenContract.abi, + artifact: TokenContract.artifact, completeAddress: completeTokenAddress, portalContract: EthAddress.ZERO, }, 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 19eb4199cdf..a85a191eb41 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 @@ -76,7 +76,7 @@ describe('e2e_block_building', () => { const callInteraction = new ContractFunctionInteraction( owner, deployer.completeAddress!.address, - TokenContract.abi.functions.find(x => x.name === 'set_minter')!, + TokenContract.artifact.functions.find(x => x.name === 'set_minter')!, [minter.getCompleteAddress(), true], ); 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 eed45f17ff4..bdda6e4cbbc 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 @@ -48,7 +48,7 @@ describe('e2e_token_contract', () => { expect(await asset.methods.admin().view()).toBe(accounts[0].address.toBigInt()); - asset.abi.functions.forEach(fn => { + asset.artifact.functions.forEach(fn => { logger( `Function ${fn.name} has ${fn.bytecode.length} bytes and the selector: ${FunctionSelector.fromNameAndParameters( fn.name, diff --git a/yarn-project/foundation/src/abi/abi.ts b/yarn-project/foundation/src/abi/abi.ts index 19acd281f60..68fdeff8be0 100644 --- a/yarn-project/foundation/src/abi/abi.ts +++ b/yarn-project/foundation/src/abi/abi.ts @@ -137,7 +137,7 @@ export interface FunctionAbiHeader { /** * The ABI entry of a function. */ -export interface FunctionAbi extends FunctionAbiHeader { +export interface FunctionArtifact extends FunctionAbiHeader { /** * The ACIR bytecode of the function. */ @@ -224,9 +224,9 @@ export interface DebugMetadata { } /** - * Defines ABI of a contract. + * Defines artifact of a contract. */ -export interface ContractAbi { +export interface ContractArtifact { /** * The name of the contract. */ @@ -234,7 +234,7 @@ export interface ContractAbi { /** * The functions of the contract. */ - functions: FunctionAbi[]; + functions: FunctionArtifact[]; /** * The debug metadata of the contract. @@ -263,7 +263,10 @@ export interface FunctionDebugMetadata { * @param functionName - The name of the function * @returns The debug metadata of the function */ -export function getFunctionDebugMetadata(abi: ContractAbi, functionName: string): FunctionDebugMetadata | undefined { +export function getFunctionDebugMetadata( + abi: ContractArtifact, + functionName: string, +): FunctionDebugMetadata | undefined { const functionIndex = abi.functions.findIndex(f => f.name === functionName); if (abi.debug && functionIndex !== -1) { const debugSymbols = JSON.parse( diff --git a/yarn-project/foundation/src/abi/decoder.test.ts b/yarn-project/foundation/src/abi/decoder.test.ts index 206b0aa9954..827a2d94b93 100644 --- a/yarn-project/foundation/src/abi/decoder.test.ts +++ b/yarn-project/foundation/src/abi/decoder.test.ts @@ -1,4 +1,4 @@ -import { ABIParameterVisibility, FunctionAbi } from './abi.js'; +import { ABIParameterVisibility, FunctionArtifact } from './abi.js'; import { decodeFunctionSignature, decodeFunctionSignatureWithParameterNames } from './decoder.js'; describe('abi/decoder', () => { @@ -61,7 +61,7 @@ describe('abi/decoder', () => { visibility: 'private' as ABIParameterVisibility, }, ], - } as Pick; + } as Pick; it('decodes function signature', () => { expect(decodeFunctionSignature(abi.name, abi.parameters)).toMatchInlineSnapshot( diff --git a/yarn-project/foundation/src/abi/decoder.ts b/yarn-project/foundation/src/abi/decoder.ts index cece6e9d949..2fa6e3f1455 100644 --- a/yarn-project/foundation/src/abi/decoder.ts +++ b/yarn-project/foundation/src/abi/decoder.ts @@ -1,4 +1,4 @@ -import { ABIParameter, ABIType, ABIVariable, FunctionAbi } from '@aztec/foundation/abi'; +import { ABIParameter, ABIType, ABIVariable, FunctionArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; /** @@ -11,7 +11,7 @@ export type DecodedReturn = bigint | boolean | DecodedReturn[] | { [key: string] * Missing support for integer and string. */ class ReturnValuesDecoder { - constructor(private abi: FunctionAbi, private flattened: Fr[]) {} + constructor(private abi: FunctionArtifact, private flattened: Fr[]) {} /** * Decodes a single return value from field to the given type. @@ -83,7 +83,7 @@ class ReturnValuesDecoder { * @param returnValues - The decoded return values. * @returns */ -export function decodeReturnValues(abi: FunctionAbi, returnValues: Fr[]) { +export function decodeReturnValues(abi: FunctionArtifact, returnValues: Fr[]) { return new ReturnValuesDecoder(abi, returnValues.slice()).decode(); } diff --git a/yarn-project/foundation/src/abi/encoder.test.ts b/yarn-project/foundation/src/abi/encoder.test.ts index 67cb6223c42..8c48f4c2ca0 100644 --- a/yarn-project/foundation/src/abi/encoder.test.ts +++ b/yarn-project/foundation/src/abi/encoder.test.ts @@ -1,6 +1,6 @@ import { AztecAddress } from '../aztec-address/index.js'; import { Fr } from '../fields/fields.js'; -import { ABIParameterVisibility, FunctionAbi, FunctionAbiHeader, FunctionType } from './abi.js'; +import { ABIParameterVisibility, FunctionAbiHeader, FunctionArtifact, FunctionType } from './abi.js'; import { encodeArguments } from './encoder.js'; describe('abi/encoder', () => { @@ -57,7 +57,7 @@ describe('abi/encoder', () => { }); it('throws when passing string argument as field', () => { - const testFunctionAbi: FunctionAbi = { + const testFunctionAbi: FunctionArtifact = { name: 'constructor', functionType: FunctionType.SECRET, isInternal: false, @@ -80,7 +80,7 @@ describe('abi/encoder', () => { }); it('throws when passing string argument as integer', () => { - const testFunctionAbi: FunctionAbi = { + const testFunctionAbi: FunctionArtifact = { name: 'constructor', functionType: FunctionType.SECRET, isInternal: false, @@ -104,7 +104,7 @@ describe('abi/encoder', () => { }); it('throws when passing object argument as field', () => { - const testFunctionAbi: FunctionAbi = { + const testFunctionAbi: FunctionArtifact = { name: 'constructor', functionType: FunctionType.SECRET, isInternal: false, diff --git a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap index be3f887a294..e18bb9adbc8 100644 --- a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap +++ b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap @@ -268,9 +268,9 @@ exports[`noir-compiler using nargo binary generates typescript interface 1`] = ` import { AztecAddress, CompleteAddress, ContractBase, ContractFunctionInteraction, ContractMethod, DeployMethod, FieldLike, AztecAddressLike, EthAddressLike, Wallet } from '@aztec/aztec.js'; import { Fr, Point } from '@aztec/foundation/fields'; import { PXE, PublicKey } from '@aztec/types'; -import { ContractAbi } from '@aztec/foundation/abi'; -import TestContractContractAbiJson from '../target/test.json' assert { type: 'json' }; -export const TestContractContractAbi = TestContractContractAbiJson as ContractAbi; +import { ContractArtifact } from '@aztec/foundation/abi'; +import TestContractContractArtifactJson from '../target/test.json' assert { type: 'json' }; +export const TestContractContractArtifact = TestContractContractArtifactJson as ContractArtifact; /** * Type-safe interface for contract TestContract; @@ -283,7 +283,7 @@ export class TestContractContract extends ContractBase { /** The wallet. */ wallet: Wallet, ) { - super(completeAddress, TestContractContractAbi, wallet); + super(completeAddress, TestContractContractArtifact, wallet); } @@ -312,14 +312,14 @@ export class TestContractContract extends ContractBase { * Creates a tx to deploy a new instance of this contract. */ public static deploy(pxe: PXE, pub_param: FieldLike) { - return new DeployMethod(Point.ZERO, pxe, TestContractContractAbi, Array.from(arguments).slice(1)); + return new DeployMethod(Point.ZERO, pxe, TestContractContractArtifact, Array.from(arguments).slice(1)); } /** * Creates a tx to deploy a new instance of this contract using the specified public key to derive the address. */ public static deployWithPublicKey(pxe: PXE, publicKey: PublicKey, pub_param: FieldLike) { - return new DeployMethod(publicKey, pxe, TestContractContractAbi, Array.from(arguments).slice(2)); + return new DeployMethod(publicKey, pxe, TestContractContractArtifact, Array.from(arguments).slice(2)); } @@ -327,8 +327,8 @@ export class TestContractContract extends ContractBase { /** * Returns this contract's ABI. */ - public static get abi(): ContractAbi { - return TestContractContractAbi; + public static get abi(): ContractArtifact { + return TestContractContractArtifact; } diff --git a/yarn-project/noir-compiler/src/cli/noir-interface.ts b/yarn-project/noir-compiler/src/cli/noir-interface.ts index 63afee9633e..badb3831b7a 100644 --- a/yarn-project/noir-compiler/src/cli/noir-interface.ts +++ b/yarn-project/noir-compiler/src/cli/noir-interface.ts @@ -6,7 +6,7 @@ import { mkdirpSync } from 'fs-extra'; import path, { resolve } from 'path'; import { generateNoirContractInterface } from '../index.js'; -import { isContractAbi } from '../utils.js'; +import { isContractArtifact } from '../utils.js'; /** * Registers a 'interface' command on the given commander program that generates a Noir interface out of an ABI. @@ -45,7 +45,7 @@ export function generateNoirInterface(program: Command, name = 'interface', log: const artifactPath = resolve(artifactsDir, artifactsDirItem); if (statSync(artifactPath).isFile() && artifactPath.endsWith('.json')) { const contract = JSON.parse(readFileSync(artifactPath).toString()); - if (!isContractAbi(contract)) continue; + if (!isContractArtifact(contract)) continue; const interfacePath = resolve(projectPath, outdir, `${contract.name}_interface.nr`); log(`Writing ${contract.name} Noir external interface to ${path.relative(currentDir, interfacePath)}`); try { diff --git a/yarn-project/noir-compiler/src/cli/typescript.ts b/yarn-project/noir-compiler/src/cli/typescript.ts index 8a4142ddc09..c3a517ed2c7 100644 --- a/yarn-project/noir-compiler/src/cli/typescript.ts +++ b/yarn-project/noir-compiler/src/cli/typescript.ts @@ -6,7 +6,7 @@ import { mkdirpSync } from 'fs-extra'; import path, { resolve } from 'path'; import { generateTypescriptContractInterface } from '../index.js'; -import { isContractAbi } from '../utils.js'; +import { isContractArtifact } from '../utils.js'; /** * Registers a 'typescript' command on the given commander program that generates typescript interface out of an ABI. @@ -45,7 +45,7 @@ export function generateTypescriptInterface(program: Command, name = 'typescript const artifactPath = resolve(artifactsDir, artifactsDirItem); if (statSync(artifactPath).isFile() && artifactPath.endsWith('.json')) { const contract = JSON.parse(readFileSync(artifactPath).toString()); - if (!isContractAbi(contract)) continue; + if (!isContractArtifact(contract)) continue; const tsPath = resolve(projectPath, outdir, `${contract.name}.ts`); log(`Writing ${contract.name} typescript interface to ${path.relative(currentDir, tsPath)}`); const relativeArtifactPath = path.relative(path.dirname(tsPath), artifactPath); diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts index ba3f02d48d3..6d90b0eadf8 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts @@ -1,4 +1,4 @@ -import { ContractAbi, DebugMetadata, FunctionAbi, FunctionType } from '@aztec/foundation/abi'; +import { ContractArtifact, DebugMetadata, FunctionArtifact, FunctionType } from '@aztec/foundation/abi'; import { deflate } from 'pako'; @@ -10,7 +10,7 @@ import { NoirCompilationArtifacts, NoirFunctionEntry } from '../noir_artifact.js * @param fn - Noir function entry. * @returns Aztec ABI function entry. */ -function generateAbiFunction(fn: NoirFunctionEntry): FunctionAbi { +function generateAbiFunction(fn: NoirFunctionEntry): FunctionArtifact { const functionType = fn.function_type.toLowerCase() as FunctionType; const isInternal = fn.is_internal; @@ -37,7 +37,7 @@ function generateAbiFunction(fn: NoirFunctionEntry): FunctionAbi { * @param compiled - Noir build output. * @returns An Aztec valid ABI. */ -export function generateAztecAbi({ contract, debug }: NoirCompilationArtifacts): ContractAbi { +export function generateAztecAbi({ contract, debug }: NoirCompilationArtifacts): ContractArtifact { const originalFunctions = contract.functions; // TODO why sort? we should have idempotent compilation so this should not be needed. const sortedFunctions = [...contract.functions].sort((fnA, fnB) => fnA.name.localeCompare(fnB.name)); diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts index 0e47951fe38..1c23469bf54 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts @@ -1,8 +1,8 @@ import { ABIParameter, ABIVariable, - ContractAbi, - FunctionAbi, + ContractArtifact, + FunctionArtifact, FunctionSelector, FunctionType, StructType, @@ -85,7 +85,7 @@ function getTypeName(param: ABIVariable, ...parentNames: string[]): string { * @param functionData - Parent function. * @returns A Noir string with the param name and type to be used in a function call. */ -function generateParameter(param: ABIParameter, functionData: FunctionAbi) { +function generateParameter(param: ABIParameter, functionData: FunctionArtifact) { const typename = getTypeName(param, functionData.name); return `${param.name}: ${typename}`; } @@ -139,7 +139,7 @@ function generateSerialization(parameters: ABIParameter[]) { * @param kind - Whether this interface will be used from private or public functions. * @returns A code string. */ -function generateFunctionInterface(functionData: FunctionAbi, kind: 'private' | 'public') { +function generateFunctionInterface(functionData: FunctionArtifact, kind: 'private' | 'public') { const { name, parameters } = functionData; const selector = FunctionSelector.fromNameAndParameters(name, parameters); const serialization = generateSerialization(parameters); @@ -258,7 +258,7 @@ function collectStructs(params: ABIVariable[], parentNames: string[]): StructInf * @param methods - Contract methods to generate (private ones will be excluded if kind is public) * @returns Code. */ -function generateContractStruct(abiName: string, kind: 'private' | 'public', methods: FunctionAbi[]) { +function generateContractStruct(abiName: string, kind: 'private' | 'public', methods: FunctionArtifact[]) { const contractStruct: string = generateContractInterfaceStruct(abiName, kind); const applicableMethods = methods.filter(m => kind === 'private' || !isPrivateCall(m.functionType)); const functionInterfaces = applicableMethods.map(m => generateFunctionInterface(m, kind)); @@ -275,7 +275,7 @@ ${contractImpl} * @param abi - The compiled Aztec.nr artifact. * @returns The corresponding ts code. */ -export function generateNoirContractInterface(abi: ContractAbi) { +export function generateNoirContractInterface(abi: ContractArtifact) { // We don't allow calling a constructor, internal fns, or unconstrained fns from other contracts const methods = compact( abi.functions.filter( diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts b/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts index f63e3fccac8..92b07417a48 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/typescript.ts @@ -1,7 +1,7 @@ import { ABIParameter, - ContractAbi, - FunctionAbi, + ContractArtifact, + FunctionArtifact, isAztecAddressStruct, isEthereumAddressStruct, } from '@aztec/foundation/abi'; @@ -48,7 +48,7 @@ function generateParameter(param: ABIParameter) { * @param param - A Noir function. * @returns The corresponding ts code. */ -function generateMethod(entry: FunctionAbi) { +function generateMethod(entry: FunctionArtifact) { const args = entry.parameters.map(generateParameter).join(', '); return ` /** ${entry.name}(${entry.parameters.map(p => `${p.name}: ${p.type.kind}`).join(', ')}) */ @@ -60,24 +60,24 @@ function generateMethod(entry: FunctionAbi) { * @param input - ABI of the contract. * @returns A type-safe deploy method in ts. */ -function generateDeploy(input: ContractAbi) { +function generateDeploy(input: ContractArtifact) { const ctor = input.functions.find(f => f.name === 'constructor'); const args = (ctor?.parameters ?? []).map(generateParameter).join(', '); - const abiName = `${input.name}ContractArtifact`; + const artifactName = `${input.name}ContractArtifact`; return ` /** * Creates a tx to deploy a new instance of this contract. */ public static deploy(pxe: PXE, ${args}) { - return new DeployMethod<${input.name}Contract>(Point.ZERO, pxe, ${abiName}, Array.from(arguments).slice(1)); + return new DeployMethod<${input.name}Contract>(Point.ZERO, pxe, ${artifactName}, Array.from(arguments).slice(1)); } /** * Creates a tx to deploy a new instance of this contract using the specified public key to derive the address. */ public static deployWithPublicKey(pxe: PXE, publicKey: PublicKey, ${args}) { - return new DeployMethod<${input.name}Contract>(publicKey, pxe, ${abiName}, Array.from(arguments).slice(2)); + return new DeployMethod<${input.name}Contract>(publicKey, pxe, ${artifactName}, Array.from(arguments).slice(2)); } `; } @@ -118,36 +118,36 @@ function generateAt(name: string) { address: AztecAddress, wallet: Wallet, ) { - return Contract.at(address, ${name}Contract.abi, wallet) as Promise<${name}Contract>; + return Contract.at(address, ${name}Contract.artifact, wallet) as Promise<${name}Contract>; }`; } /** - * Generates a static getter for the contract's ABI. - * @param name - Name of the contract used to derive name of the ABI import. + * Generates a static getter for the contract's artifact. + * @param name - Name of the contract used to derive name of the artifact import. */ -function generateAbiGetter(name: string) { - const abiName = `${name}ContractArtifact`; +function generateArtifactGetter(name: string) { + const artifactName = `${name}ContractArtifact`; return ` /** - * Returns this contract's ABI. + * Returns this contract's artifact. */ - public static get abi(): ContractAbi { - return ${abiName}; + public static get artifact(): ContractArtifact { + return ${artifactName}; } `; } /** - * Generates statements for importing the abi from a json artifact and re-exporting it. + * Generates statements for importing the artifact from json and re-exporting it. * @param name - Name of the contract. - * @param abiImportPath - Path to load the ABI from. + * @param artifactImportPath - Path to load the ABI from. * @returns Code. */ -function generateAbiStatement(name: string, abiImportPath: string) { +function generateAbiStatement(name: string, artifactImportPath: string) { const stmts = [ - `import ${name}ContractArtifactJson from '${abiImportPath}' assert { type: 'json' };`, - `export const ${name}ContractArtifact = ${name}ContractArtifactJson as ContractAbi;`, + `import ${name}ContractArtifactJson from '${artifactImportPath}' assert { type: 'json' };`, + `export const ${name}ContractArtifact = ${name}ContractArtifactJson as ContractArtifact;`, ]; return stmts.join('\n'); } @@ -155,17 +155,17 @@ function generateAbiStatement(name: string, abiImportPath: string) { /** * Generates the typescript code to represent a contract. * @param input - The compiled Noir artifact. - * @param abiImportPath - Optional path to import the ABI (if not set, will be required in the constructor). + * @param artifactImportPath - Optional path to import the ABI (if not set, will be required in the constructor). * @returns The corresponding ts code. */ -export function generateTypescriptContractInterface(input: ContractAbi, abiImportPath?: string) { +export function generateTypescriptContractInterface(input: ContractArtifact, artifactImportPath?: string) { // `compact` removes all falsey values from an array const methods = compact(input.functions.filter(f => f.name !== 'constructor').map(generateMethod)); - const deploy = abiImportPath && generateDeploy(input); - const ctor = abiImportPath && generateConstructor(input.name); - const at = abiImportPath && generateAt(input.name); - const abiStatement = abiImportPath && generateAbiStatement(input.name, abiImportPath); - const abiGetter = abiImportPath && generateAbiGetter(input.name); + const deploy = artifactImportPath && generateDeploy(input); + const ctor = artifactImportPath && generateConstructor(input.name); + const at = artifactImportPath && generateAt(input.name); + const artifactStatement = artifactImportPath && generateAbiStatement(input.name, artifactImportPath); + const artifactGetter = artifactImportPath && generateArtifactGetter(input.name); return ` /* Autogenerated file, do not edit! */ @@ -174,8 +174,8 @@ export function generateTypescriptContractInterface(input: ContractAbi, abiImpor import { AztecAddress, CompleteAddress, Contract, ContractBase, ContractFunctionInteraction, ContractMethod, DeployMethod, EthAddress, FieldLike, AztecAddressLike, EthAddressLike, Wallet } from '@aztec/aztec.js'; import { Fr, Point } from '@aztec/foundation/fields'; import { PXE, PublicKey } from '@aztec/types'; -import { ContractAbi } from '@aztec/foundation/abi'; -${abiStatement} +import { ContractArtifact } from '@aztec/foundation/abi'; +${artifactStatement} /** * Type-safe interface for contract ${input.name}; @@ -187,7 +187,7 @@ export class ${input.name}Contract extends ContractBase { ${deploy} - ${abiGetter} + ${artifactGetter} /** Type-safe wrappers for the public methods exposed by the contract. */ public methods!: { diff --git a/yarn-project/noir-compiler/src/index.test.ts b/yarn-project/noir-compiler/src/index.test.ts index 804dc88da31..974757ca761 100644 --- a/yarn-project/noir-compiler/src/index.test.ts +++ b/yarn-project/noir-compiler/src/index.test.ts @@ -1,4 +1,4 @@ -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { fileURLToPath } from '@aztec/foundation/url'; import { execSync } from 'child_process'; @@ -25,7 +25,7 @@ describe('noir-compiler', () => { }); describeIf(isNargoAvailable)('using nargo binary', () => { - let compiled: ContractAbi[]; + let compiled: ContractArtifact[]; beforeAll(async () => { compiled = await compileUsingNargo(projectPath); }); diff --git a/yarn-project/noir-compiler/src/index.ts b/yarn-project/noir-compiler/src/index.ts index 85b52ffe7bd..1adde25cb2c 100644 --- a/yarn-project/noir-compiler/src/index.ts +++ b/yarn-project/noir-compiler/src/index.ts @@ -1,4 +1,4 @@ -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { CompileOpts, NargoContractCompiler } from './compile/nargo.js'; import { generateAztecAbi } from './contract-interface-gen/abi.js'; @@ -17,6 +17,6 @@ export { generateAztecAbi }; * @param opts - Compiler options. * @returns Compiled artifacts. */ -export async function compileUsingNargo(projectPath: string, opts: CompileOpts = {}): Promise { +export async function compileUsingNargo(projectPath: string, opts: CompileOpts = {}): Promise { return (await new NargoContractCompiler(projectPath, opts).compile()).map(generateAztecAbi); } diff --git a/yarn-project/noir-compiler/src/utils.ts b/yarn-project/noir-compiler/src/utils.ts index c1cbb83a4c7..544a7b24630 100644 --- a/yarn-project/noir-compiler/src/utils.ts +++ b/yarn-project/noir-compiler/src/utils.ts @@ -1,18 +1,18 @@ -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; /** - * Checks if the given input looks like a valid ContractAbi. The check is not exhaustive, + * Checks if the given input looks like a valid ContractArtifact. The check is not exhaustive, * and it's just meant to differentiate between nargo raw build artifacts and the ones * produced by this compiler. * @param input - Input object. - * @returns True if it looks like a ContractAbi. + * @returns True if it looks like a ContractArtifact. */ -export function isContractAbi(input: any): input is ContractAbi { +export function isContractArtifact(input: any): input is ContractArtifact { if (typeof input !== 'object') return false; - const maybeContractAbi = input as ContractAbi; - if (typeof maybeContractAbi.name !== 'string') return false; - if (!Array.isArray(maybeContractAbi.functions)) return false; - for (const fn of maybeContractAbi.functions) { + const maybeContractArtifact = input as ContractArtifact; + if (typeof maybeContractArtifact.name !== 'string') return false; + if (!Array.isArray(maybeContractArtifact.functions)) return false; + for (const fn of maybeContractArtifact.functions) { if (typeof fn.name !== 'string') return false; if (typeof fn.functionType !== 'string') return false; if (typeof fn.isInternal !== 'boolean') return false; diff --git a/yarn-project/noir-contracts/README.md b/yarn-project/noir-contracts/README.md index 2ad77cb638f..31e8bc0960e 100644 --- a/yarn-project/noir-contracts/README.md +++ b/yarn-project/noir-contracts/README.md @@ -137,7 +137,7 @@ It has prebuilt binaries and is super easy to install using `noirup` 6. Export the abi in `src/artifacts/index.ts` to be able to use the contract in the rest of the project: ``` import ExampleContractJson from './example_contract.json' assert { type: 'json' }; - export const ExampleContractAbi = ExampleContractJson as ContractAbi; + export const ExampleContractArtifact = ExampleContractJson as ContractArtifact; ``` 7. ??? 8. Profit. diff --git a/yarn-project/noir-contracts/scripts/types.sh b/yarn-project/noir-contracts/scripts/types.sh index 6666bc6135e..5072896d341 100755 --- a/yarn-project/noir-contracts/scripts/types.sh +++ b/yarn-project/noir-contracts/scripts/types.sh @@ -32,7 +32,7 @@ write_export() { NAME=$(echo $CONTRACT_NAME | perl -pe 's/(^|_)(\w)/\U$2/g') # artifacts - echo "export const ${NAME}ContractArtifact = ${NAME}Json as ContractAbi;" >> "$artifacts_dir/index.ts"; + echo "export const ${NAME}ContractArtifact = ${NAME}Json as ContractArtifact;" >> "$artifacts_dir/index.ts"; echo "Written typescript for $NAME" # types @@ -68,7 +68,7 @@ rm -f $artifacts_dir/index.ts || true # Generate artifacts package index.ts echo "// Auto generated module\n" > "$artifacts_dir/index.ts"; -echo "import { ContractAbi } from '@aztec/foundation/abi';" >> "$artifacts_dir/index.ts"; +echo "import { ContractArtifact } from '@aztec/foundation/abi';" >> "$artifacts_dir/index.ts"; # Generate types package index.ts echo "// Auto generated module\n" > "$types_dir/index.ts"; diff --git a/yarn-project/noir-contracts/src/scripts/copy_output.ts b/yarn-project/noir-contracts/src/scripts/copy_output.ts index 15b5dede446..75266805632 100644 --- a/yarn-project/noir-contracts/src/scripts/copy_output.ts +++ b/yarn-project/noir-contracts/src/scripts/copy_output.ts @@ -1,4 +1,4 @@ -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { createConsoleLogger } from '@aztec/foundation/log'; import { generateAztecAbi, @@ -35,7 +35,7 @@ function writeToProject(abi: any) { const toWrite = { ...abi, functions: abi.functions.map((f: any) => omit(f, projectContract.exclude)), - // If we maintain debug symbols they will get commited to git. + // If we maintain debug symbols they will get committed to git. debug: undefined, }; const targetFilename = pathJoin(projectContract.target, `${snakeCase(abi.name)}_contract.json`); @@ -71,7 +71,7 @@ const main = () => { } // Remove extraneous information from the buildJson (which was output by Nargo) to hone in on the function data we actually care about: - const artifactJson: ContractAbi = generateAztecAbi({ contract: buildJson, debug }); + const artifactJson: ContractArtifact = generateAztecAbi({ contract: buildJson, debug }); // Write the artifact: const artifactsDir = 'src/artifacts'; diff --git a/yarn-project/pxe/src/contract_tree/index.ts b/yarn-project/pxe/src/contract_tree/index.ts index e187e87f7c3..834b28c2f60 100644 --- a/yarn-project/pxe/src/contract_tree/index.ts +++ b/yarn-project/pxe/src/contract_tree/index.ts @@ -22,7 +22,7 @@ import { computeVarArgsHash, hashConstructor, } from '@aztec/circuits.js/abis'; -import { ContractAbi, FunctionSelector } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionSelector } from '@aztec/foundation/abi'; import { assertLength } from '@aztec/foundation/serialize'; import { AztecNode, ContractDao, MerkleTreeId, PublicKey, StateInfoProvider } from '@aztec/types'; @@ -67,7 +67,7 @@ export class ContractTree { * @returns A new ContractTree instance containing the contract data and computed values. */ public static async new( - abi: ContractAbi, + abi: ContractArtifact, args: Fr[], portalContract: EthAddress, contractAddressSalt: Fr, diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index 9aeb1c38bb8..4df5e4043f9 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -168,7 +168,7 @@ export class PXEService implements PXE { } public async addContracts(contracts: DeployedContract[]) { - const contractDaos = contracts.map(c => toContractDao(c.abi, c.completeAddress, c.portalContract)); + const contractDaos = contracts.map(c => toContractDao(c.artifact, c.completeAddress, c.portalContract)); await Promise.all(contractDaos.map(c => this.db.addContract(c))); for (const contract of contractDaos) { const portalInfo = diff --git a/yarn-project/types/src/contract_dao.ts b/yarn-project/types/src/contract_dao.ts index 46379390981..d07e2d66a58 100644 --- a/yarn-project/types/src/contract_dao.ts +++ b/yarn-project/types/src/contract_dao.ts @@ -1,5 +1,5 @@ import { CompleteAddress, ContractFunctionDao } from '@aztec/circuits.js'; -import { ContractAbi, FunctionSelector, FunctionType } from '@aztec/foundation/abi'; +import { ContractArtifact, FunctionSelector, FunctionType } from '@aztec/foundation/abi'; import { EthAddress } from '@aztec/foundation/eth-address'; import { EncodedContractFunction } from './contract_data.js'; @@ -9,7 +9,7 @@ import { EncodedContractFunction } from './contract_data.js'; * Contains the contract's address, portal contract address, and an array of ContractFunctionDao objects. * Each ContractFunctionDao object includes FunctionAbi data and the function selector buffer. */ -export interface ContractDao extends ContractAbi { +export interface ContractDao extends ContractArtifact { /** * The complete address representing the contract on L2. */ @@ -25,25 +25,25 @@ export interface ContractDao extends ContractAbi { } /** - * Converts the given contract ABI into a ContractDao object that includes additional properties + * Converts the given contract artifact into a ContractDao object that includes additional properties * such as the address, portal contract, and function selectors. * - * @param abi - The contract ABI. + * @param artifact - The contract artifact. * @param completeAddress - The AztecAddress representing the contract's address. * @param portalContract - The EthAddress representing the address of the associated portal contract. * @returns A ContractDao object containing the provided information along with generated function selectors. */ export function toContractDao( - abi: ContractAbi, + artifact: ContractArtifact, completeAddress: CompleteAddress, portalContract: EthAddress, ): ContractDao { - const functions = abi.functions.map(f => ({ + const functions = artifact.functions.map(f => ({ ...f, selector: FunctionSelector.fromNameAndParameters(f.name, f.parameters), })); return { - ...abi, + ...artifact, completeAddress, functions, portalContract, diff --git a/yarn-project/types/src/interfaces/deployed-contract.ts b/yarn-project/types/src/interfaces/deployed-contract.ts index 6afa2d285e4..1e5fd058197 100644 --- a/yarn-project/types/src/interfaces/deployed-contract.ts +++ b/yarn-project/types/src/interfaces/deployed-contract.ts @@ -1,16 +1,16 @@ import { EthAddress } from '@aztec/circuits.js'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { CompleteAddress } from '@aztec/types'; /** * Represents a deployed contract on the Aztec network. - * Contains the contract ABI, address, and associated portal contract address. + * Contains the contract artifact, address, and associated portal contract address. */ export interface DeployedContract { /** - * The Application Binary Interface of the deployed contract. + * The artifact of the deployed contract. */ - abi: ContractAbi; + artifact: ContractArtifact; /** * The complete address representing the contract on L2. */ diff --git a/yarn-project/types/src/mocks.ts b/yarn-project/types/src/mocks.ts index f98dee06d6c..a38c1e6195c 100644 --- a/yarn-project/types/src/mocks.ts +++ b/yarn-project/types/src/mocks.ts @@ -6,7 +6,7 @@ import { Proof, } from '@aztec/circuits.js'; import { makePrivateKernelPublicInputsFinal, makePublicCallRequest } from '@aztec/circuits.js/factories'; -import { ContractAbi } from '@aztec/foundation/abi'; +import { ContractArtifact } from '@aztec/foundation/abi'; import { randomBytes } from '@aztec/foundation/crypto'; import { Tuple } from '@aztec/foundation/serialize'; @@ -37,13 +37,13 @@ export const mockTx = (seed = 1) => { ); }; -export const randomContractAbi = (): ContractAbi => ({ +export const randomContractArtifact = (): ContractArtifact => ({ name: randomBytes(4).toString('hex'), functions: [], }); export const randomDeployedContract = async (): Promise => ({ - abi: randomContractAbi(), + artifact: randomContractArtifact(), completeAddress: await CompleteAddress.random(), portalContract: EthAddress.random(), }); From b68551061d27d896d87382e16556953be58be15c Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 12:58:14 +0000 Subject: [PATCH 04/16] WIP --- yarn-project/Dockerfile | 2 +- .../src/client/client_execution_context.ts | 20 +- .../acir-simulator/src/client/db_oracle.ts | 13 +- .../src/client/private_execution.test.ts | 171 +++++++++--------- .../src/client/private_execution.ts | 12 +- .../acir-simulator/src/client/simulator.ts | 42 ++--- .../src/client/unconstrained_execution.ts | 10 +- yarn-project/acir-simulator/src/test/utils.ts | 15 +- .../account/defaults/default_entrypoint.ts | 4 +- yarn-project/aztec.js/src/contract/checker.ts | 20 +- .../aztec.js/src/contract/contract.test.ts | 10 +- .../aztec.js/src/contract/contract.ts | 18 +- .../contract/contract_function_interaction.ts | 4 +- .../contract_deployer.test.ts | 4 +- .../contract_deployer/contract_deployer.ts | 4 +- .../src/contract_deployer/deploy_method.ts | 14 +- .../src/contract_deployer/deploy_sent_tx.ts | 4 +- .../aztec.js/src/wallet/account_wallet.ts | 4 +- .../app/components/contract_function_form.tsx | 18 +- .../boxes/blank-react/src/app/contract.tsx | 18 +- yarn-project/boxes/blank-react/src/config.ts | 2 +- .../src/scripts/call_contract_function.ts | 4 +- .../src/scripts/deploy_contract.ts | 4 +- .../src/scripts/view_contract_function.ts | 4 +- yarn-project/boxes/blank/src/index.ts | 20 +- .../app/components/contract_function_form.tsx | 14 +- .../boxes/private-token/src/app/contract.tsx | 14 +- .../boxes/private-token/src/app/index.html | 2 +- .../boxes/private-token/src/config.ts | 2 +- .../src/scripts/call_contract_function.ts | 4 +- .../src/scripts/deploy_contract.ts | 4 +- .../src/scripts/view_contract_function.ts | 4 +- .../src/tests/privatetoken.sandbox.test.ts | 9 +- .../src/contract/contract_deployment_info.ts | 20 +- .../circuits.js/src/structs/function_data.ts | 4 +- .../src/types/contract_function_dao.ts | 2 +- yarn-project/cli/src/index.ts | 6 +- yarn-project/cli/src/utils.ts | 14 +- yarn-project/foundation/src/abi/abi.ts | 22 +-- .../foundation/src/abi/encoder.test.ts | 6 +- yarn-project/foundation/src/abi/encoder.ts | 6 +- .../src/contract-interface-gen/noir.ts | 10 +- .../pxe/src/contract_data_oracle/index.ts | 2 +- yarn-project/pxe/src/contract_tree/index.ts | 40 ++-- .../pxe/src/simulator_oracle/index.ts | 6 +- 45 files changed, 324 insertions(+), 308 deletions(-) diff --git a/yarn-project/Dockerfile b/yarn-project/Dockerfile index 57e3ba2bca3..331795d6dc0 100644 --- a/yarn-project/Dockerfile +++ b/yarn-project/Dockerfile @@ -8,7 +8,7 @@ COPY . . # Generate Noir contract TypeScript artifacts. COPY --from=noir /usr/src/yarn-project/noir-contracts/target /usr/src/yarn-project/noir-contracts/target -# Run yarn build to have the json ABIs available for the types generator, generate types, build again. +# Run yarn build to have the json artifacts available for the types generator, generate types, build again. RUN apk add perl RUN cd /usr/src/yarn-project/noir-contracts && yarn build && ./scripts/types_all.sh && yarn build # Cleanup to reduce final image size. diff --git a/yarn-project/acir-simulator/src/client/client_execution_context.ts b/yarn-project/acir-simulator/src/client/client_execution_context.ts index 4c615c1070c..6e21f43e9d7 100644 --- a/yarn-project/acir-simulator/src/client/client_execution_context.ts +++ b/yarn-project/acir-simulator/src/client/client_execution_context.ts @@ -306,8 +306,8 @@ export class ClientExecutionContext extends ViewDataOracle { `Calling private function ${this.contractAddress}:${functionSelector} from ${this.callContext.storageContractAddress}`, ); - const targetAbi = await this.db.getFunctionABI(targetContractAddress, functionSelector); - const targetFunctionData = FunctionData.fromAbi(targetAbi); + const targetArtifact = await this.db.getFunctionArtifact(targetContractAddress, functionSelector); + const targetFunctionData = FunctionData.fromAbi(targetArtifact); const derivedTxContext = new TxContext( false, @@ -318,7 +318,7 @@ export class ClientExecutionContext extends ViewDataOracle { this.txContext.version, ); - const derivedCallContext = await this.deriveCallContext(targetContractAddress, targetAbi, false, false); + const derivedCallContext = await this.deriveCallContext(targetContractAddress, targetArtifact, false, false); const context = new ClientExecutionContext( targetContractAddress, @@ -336,7 +336,7 @@ export class ClientExecutionContext extends ViewDataOracle { const childExecutionResult = await executePrivateFunction( context, - targetAbi, + targetArtifact, targetContractAddress, targetFunctionData, ); @@ -360,14 +360,14 @@ export class ClientExecutionContext extends ViewDataOracle { functionSelector: FunctionSelector, argsHash: Fr, ): Promise { - const targetAbi = await this.db.getFunctionABI(targetContractAddress, functionSelector); - const derivedCallContext = await this.deriveCallContext(targetContractAddress, targetAbi, false, false); + const targetArtifact = await this.db.getFunctionArtifact(targetContractAddress, functionSelector); + const derivedCallContext = await this.deriveCallContext(targetContractAddress, targetArtifact, false, false); const args = this.packedArgsCache.unpack(argsHash); const sideEffectCounter = this.sideEffectCounter.count(); const enqueuedRequest = PublicCallRequest.from({ args, callContext: derivedCallContext, - functionData: FunctionData.fromAbi(targetAbi), + functionData: FunctionData.fromAbi(targetArtifact), contractAddress: targetContractAddress, sideEffectCounter, }); @@ -388,14 +388,14 @@ export class ClientExecutionContext extends ViewDataOracle { /** * Derives the call context for a nested execution. * @param targetContractAddress - The address of the contract being called. - * @param targetAbi - The ABI of the function being called. + * @param targetArtifact - The artifact of the function being called. * @param isDelegateCall - Whether the call is a delegate call. * @param isStaticCall - Whether the call is a static call. * @returns The derived call context. */ private async deriveCallContext( targetContractAddress: AztecAddress, - targetAbi: FunctionArtifact, + targetArtifact: FunctionArtifact, isDelegateCall = false, isStaticCall = false, ) { @@ -404,7 +404,7 @@ export class ClientExecutionContext extends ViewDataOracle { this.contractAddress, targetContractAddress, portalContractAddress, - FunctionSelector.fromNameAndParameters(targetAbi.name, targetAbi.parameters), + FunctionSelector.fromNameAndParameters(targetArtifact.name, targetArtifact.parameters), isDelegateCall, isStaticCall, false, diff --git a/yarn-project/acir-simulator/src/client/db_oracle.ts b/yarn-project/acir-simulator/src/client/db_oracle.ts index c76be2a7bdb..da4ca13d3de 100644 --- a/yarn-project/acir-simulator/src/client/db_oracle.ts +++ b/yarn-project/acir-simulator/src/client/db_oracle.ts @@ -8,9 +8,9 @@ import { NoteData } from '../acvm/index.js'; import { CommitmentsDB } from '../public/index.js'; /** - * A function ABI with optional debug metadata + * A function artifact with optional debug metadata */ -export interface FunctionAbiWithDebugMetadata extends FunctionArtifact { +export interface FunctionArtifactWithDebugMetadata extends FunctionArtifact { /** * Debug metadata for the function. */ @@ -59,14 +59,17 @@ export interface DBOracle extends CommitmentsDB { getNotes(contractAddress: AztecAddress, storageSlot: Fr): Promise; /** - * Retrieve the ABI information of a specific function within a contract. + * Retrieve the artifact information of a specific function within a contract. * The function is identified by its selector, which is a unique identifier generated from the function signature. * * @param contractAddress - The contract address. * @param selector - The corresponding function selector. - * @returns A Promise that resolves to a FunctionAbi object containing the ABI information of the target function. + * @returns A Promise that resolves to a FunctionArtifact object containing the ARTIFACT information of the target function. */ - getFunctionABI(contractAddress: AztecAddress, selector: FunctionSelector): Promise; + getFunctionArtifact( + contractAddress: AztecAddress, + selector: FunctionSelector, + ): Promise; /** * Retrieves the portal contract address associated with the given contract address. diff --git a/yarn-project/acir-simulator/src/client/private_execution.test.ts b/yarn-project/acir-simulator/src/client/private_execution.test.ts index da663051509..8a23a36d4cf 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.test.ts @@ -49,7 +49,7 @@ import { MockProxy, mock } from 'jest-mock-extended'; import { default as levelup } from 'levelup'; import { type MemDown, default as memdown } from 'memdown'; -import { buildL1ToL2Message, getFunctionAbi } from '../test/utils.js'; +import { buildL1ToL2Message, getFunctionArtifact } from '../test/utils.js'; import { computeSlotForMapping } from '../utils.js'; import { DBOracle } from './db_oracle.js'; import { AcirSimulator } from './simulator.js'; @@ -90,22 +90,22 @@ describe('Private Execution test suite', () => { }; const runSimulator = async ({ - abi, + artifact, args = [], msgSender = AztecAddress.ZERO, contractAddress = defaultContractAddress, portalContractAddress = EthAddress.ZERO, txContext = {}, }: { - abi: FunctionArtifact; + artifact: FunctionArtifact; msgSender?: AztecAddress; contractAddress?: AztecAddress; portalContractAddress?: EthAddress; args?: any[]; txContext?: Partial>; }) => { - const packedArguments = await PackedArguments.fromArgs(encodeArguments(abi, args), circuitsWasm); - const functionData = FunctionData.fromAbi(abi); + const packedArguments = await PackedArguments.fromArgs(encodeArguments(artifact, args), circuitsWasm); + const functionData = FunctionData.fromAbi(artifact); const txRequest = TxExecutionRequest.from({ origin: contractAddress, argsHash: packedArguments.hash, @@ -117,7 +117,7 @@ describe('Private Execution test suite', () => { return acirSimulator.run( txRequest, - abi, + artifact, functionData.isConstructor ? AztecAddress.ZERO : contractAddress, portalContractAddress, msgSender, @@ -179,10 +179,10 @@ describe('Private Execution test suite', () => { describe('empty constructor', () => { it('should run the empty constructor', async () => { - const abi = getFunctionAbi(TestContractArtifact, 'constructor'); + const artifact = getFunctionArtifact(TestContractArtifact, 'constructor'); const contractDeploymentData = makeContractDeploymentData(100); const txContext = { isContractDeploymentTx: true, contractDeploymentData }; - const result = await runSimulator({ abi, txContext }); + const result = await runSimulator({ artifact, txContext }); const emptyCommitments = new Array(MAX_NEW_COMMITMENTS_PER_CALL).fill(Fr.ZERO); expect(result.callStackItem.publicInputs.newCommitments).toEqual(emptyCommitments); @@ -226,7 +226,7 @@ describe('Private Execution test suite', () => { throw new Error(`Unknown address ${address}`); }); - oracle.getFunctionABI.mockImplementation((_, selector) => + oracle.getFunctionArtifact.mockImplementation((_, selector) => Promise.resolve( PrivateTokenAirdropContractArtifact.functions.find(f => selector.equals(FunctionSelector.fromNameAndParameters(f.name, f.parameters)), @@ -262,9 +262,9 @@ describe('Private Execution test suite', () => { }); it('should a constructor with arguments that inserts notes', async () => { - const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'constructor'); + const artifact = getFunctionArtifact(PrivateTokenAirdropContractArtifact, 'constructor'); - const result = await runSimulator({ args: [140, owner], abi }); + const result = await runSimulator({ args: [140, owner], artifact }); expect(result.newNotes).toHaveLength(1); const newNote = result.newNotes[0]; @@ -280,9 +280,9 @@ describe('Private Execution test suite', () => { }); it('should run the mint function', async () => { - const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'mint'); + const artifact = getFunctionArtifact(PrivateTokenAirdropContractArtifact, 'mint'); - const result = await runSimulator({ args: [140, owner], abi }); + const result = await runSimulator({ args: [140, owner], artifact }); expect(result.newNotes).toHaveLength(1); const newNote = result.newNotes[0]; @@ -299,7 +299,7 @@ describe('Private Execution test suite', () => { it('should run the transfer function', async () => { const amountToTransfer = 100n; - const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'transfer'); + const artifact = getFunctionArtifact(PrivateTokenAirdropContractArtifact, 'transfer'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); const recipientStorageSlot = computeSlotForMapping(new Fr(1n), recipient.toField(), circuitsWasm); @@ -313,7 +313,7 @@ describe('Private Execution test suite', () => { await insertLeaves(consumedNotes.map(n => n.siloedNoteHash)); const args = [amountToTransfer, recipient]; - const result = await runSimulator({ args, abi, msgSender: owner }); + const result = await runSimulator({ args, artifact, msgSender: owner }); // The two notes were nullified const newNullifiers = result.callStackItem.publicInputs.newNullifiers.filter(field => !field.equals(Fr.ZERO)); @@ -346,7 +346,7 @@ describe('Private Execution test suite', () => { it('should be able to transfer with dummy notes', async () => { const amountToTransfer = 100n; const balance = 160n; - const abi = getFunctionAbi(PrivateTokenAirdropContractArtifact, 'transfer'); + const artifact = getFunctionArtifact(PrivateTokenAirdropContractArtifact, 'transfer'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); @@ -359,7 +359,7 @@ describe('Private Execution test suite', () => { await insertLeaves(consumedNotes.map(n => n.siloedNoteHash)); const args = [amountToTransfer, recipient]; - const result = await runSimulator({ args, abi, msgSender: owner }); + const result = await runSimulator({ args, artifact, msgSender: owner }); const newNullifiers = result.callStackItem.publicInputs.newNullifiers.filter(field => !field.equals(Fr.ZERO)); expect(newNullifiers).toEqual(consumedNotes.map(n => n.innerNullifier)); @@ -407,7 +407,7 @@ describe('Private Execution test suite', () => { throw new Error(`Unknown address ${address}`); }); - oracle.getFunctionABI.mockImplementation((_, selector) => + oracle.getFunctionArtifact.mockImplementation((_, selector) => Promise.resolve( StatefulTestContractArtifact.functions.find(f => selector.equals(FunctionSelector.fromNameAndParameters(f.name, f.parameters)), @@ -443,9 +443,9 @@ describe('Private Execution test suite', () => { }); it('should a constructor with arguments that inserts notes', async () => { - const abi = getFunctionAbi(StatefulTestContractArtifact, 'constructor'); + const artifact = getFunctionArtifact(StatefulTestContractArtifact, 'constructor'); - const result = await runSimulator({ args: [owner, 140], abi }); + const result = await runSimulator({ args: [owner, 140], artifact }); expect(result.newNotes).toHaveLength(1); const newNote = result.newNotes[0]; @@ -461,9 +461,9 @@ describe('Private Execution test suite', () => { }); it('should run the create_note function', async () => { - const abi = getFunctionAbi(StatefulTestContractArtifact, 'create_note'); + const artifact = getFunctionArtifact(StatefulTestContractArtifact, 'create_note'); - const result = await runSimulator({ args: [owner, 140], abi }); + const result = await runSimulator({ args: [owner, 140], artifact }); expect(result.newNotes).toHaveLength(1); const newNote = result.newNotes[0]; @@ -480,7 +480,7 @@ describe('Private Execution test suite', () => { it('should run the destroy_and_create function', async () => { const amountToTransfer = 100n; - const abi = getFunctionAbi(StatefulTestContractArtifact, 'destroy_and_create'); + const artifact = getFunctionArtifact(StatefulTestContractArtifact, 'destroy_and_create'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); const recipientStorageSlot = computeSlotForMapping(new Fr(1n), recipient.toField(), circuitsWasm); @@ -494,7 +494,7 @@ describe('Private Execution test suite', () => { await insertLeaves(consumedNotes.map(n => n.siloedNoteHash)); const args = [recipient, amountToTransfer]; - const result = await runSimulator({ args, abi, msgSender: owner }); + const result = await runSimulator({ args, artifact, msgSender: owner }); // The two notes were nullified const newNullifiers = result.callStackItem.publicInputs.newNullifiers.filter(field => !field.equals(Fr.ZERO)); @@ -527,7 +527,7 @@ describe('Private Execution test suite', () => { it('should be able to destroy_and_create with dummy notes', async () => { const amountToTransfer = 100n; const balance = 160n; - const abi = getFunctionAbi(StatefulTestContractArtifact, 'destroy_and_create'); + const artifact = getFunctionArtifact(StatefulTestContractArtifact, 'destroy_and_create'); const storageSlot = computeSlotForMapping(new Fr(1n), owner.toField(), circuitsWasm); @@ -540,7 +540,7 @@ describe('Private Execution test suite', () => { await insertLeaves(consumedNotes.map(n => n.siloedNoteHash)); const args = [recipient, amountToTransfer]; - const result = await runSimulator({ args, abi, msgSender: owner }); + const result = await runSimulator({ args, artifact, msgSender: owner }); const newNullifiers = result.callStackItem.publicInputs.newNullifiers.filter(field => !field.equals(Fr.ZERO)); expect(newNullifiers).toEqual(consumedNotes.map(n => n.innerNullifier)); @@ -557,30 +557,30 @@ describe('Private Execution test suite', () => { it('child function should be callable', async () => { const initialValue = 100n; - const abi = getFunctionAbi(ChildContractArtifact, 'value'); - const result = await runSimulator({ args: [initialValue], abi }); + const artifact = getFunctionArtifact(ChildContractArtifact, 'value'); + const result = await runSimulator({ args: [initialValue], artifact }); expect(result.callStackItem.publicInputs.returnValues[0]).toEqual(new Fr(initialValue + privateIncrement)); }); it('parent should call child', async () => { - const childAbi = getFunctionAbi(ChildContractArtifact, 'value'); - const parentAbi = getFunctionAbi(ParentContractArtifact, 'entryPoint'); + const childArtifact = getFunctionArtifact(ChildContractArtifact, 'value'); + const parentArtifact = getFunctionArtifact(ParentContractArtifact, 'entryPoint'); const parentAddress = AztecAddress.random(); const childAddress = AztecAddress.random(); - const childSelector = FunctionSelector.fromNameAndParameters(childAbi.name, childAbi.parameters); + const childSelector = FunctionSelector.fromNameAndParameters(childArtifact.name, childArtifact.parameters); - oracle.getFunctionABI.mockImplementation(() => Promise.resolve(childAbi)); + oracle.getFunctionArtifact.mockImplementation(() => Promise.resolve(childArtifact)); oracle.getPortalContractAddress.mockImplementation(() => Promise.resolve(EthAddress.ZERO)); logger(`Parent deployed at ${parentAddress.toShortString()}`); logger(`Calling child function ${childSelector.toString()} at ${childAddress.toShortString()}`); const args = [Fr.fromBuffer(childAddress.toBuffer()), Fr.fromBuffer(childSelector.toBuffer())]; - const result = await runSimulator({ args, abi: parentAbi }); + const result = await runSimulator({ args, artifact: parentArtifact }); expect(result.callStackItem.publicInputs.returnValues[0]).toEqual(new Fr(privateIncrement)); - expect(oracle.getFunctionABI.mock.calls[0]).toEqual([childAddress, childSelector]); + expect(oracle.getFunctionArtifact.mock.calls[0]).toEqual([childAddress, childSelector]); expect(oracle.getPortalContractAddress.mock.calls[0]).toEqual([childAddress]); expect(result.nestedExecutions).toHaveLength(1); expect(result.nestedExecutions[0].callStackItem.publicInputs.returnValues[0]).toEqual(new Fr(privateIncrement)); @@ -595,42 +595,42 @@ describe('Private Execution test suite', () => { describe('nested calls through autogenerated interface', () => { let args: any[]; let argsHash: Fr; - let testCodeGenAbi: FunctionArtifact; + let testCodeGenArtifact: FunctionArtifact; beforeAll(async () => { // These args should match the ones hardcoded in importer contract const dummyNote = { amount: 1, secretHash: 2 }; const deepStruct = { aField: 1, aBool: true, aNote: dummyNote, manyNotes: [dummyNote, dummyNote, dummyNote] }; args = [1, true, 1, [1, 2], dummyNote, deepStruct]; - testCodeGenAbi = TestContractArtifact.functions.find(f => f.name === 'testCodeGen')!; - const serializedArgs = encodeArguments(testCodeGenAbi, args); + testCodeGenArtifact = TestContractArtifact.functions.find(f => f.name === 'testCodeGen')!; + const serializedArgs = encodeArguments(testCodeGenArtifact, args); argsHash = await computeVarArgsHash(await CircuitsWasm.get(), serializedArgs); }); it('test function should be directly callable', async () => { logger(`Calling testCodeGen function`); - const result = await runSimulator({ args, abi: testCodeGenAbi }); + const result = await runSimulator({ args, artifact: testCodeGenArtifact }); expect(result.callStackItem.publicInputs.returnValues[0]).toEqual(argsHash); }); it('test function should be callable through autogenerated interface', async () => { const testAddress = AztecAddress.random(); - const parentAbi = ImportTestContractArtifact.functions.find(f => f.name === 'main')!; + const parentArtifact = ImportTestContractArtifact.functions.find(f => f.name === 'main')!; const testCodeGenSelector = FunctionSelector.fromNameAndParameters( - testCodeGenAbi.name, - testCodeGenAbi.parameters, + testCodeGenArtifact.name, + testCodeGenArtifact.parameters, ); - oracle.getFunctionABI.mockResolvedValue(testCodeGenAbi); + oracle.getFunctionArtifact.mockResolvedValue(testCodeGenArtifact); oracle.getPortalContractAddress.mockResolvedValue(EthAddress.ZERO); logger(`Calling importer main function`); const args = [testAddress]; - const result = await runSimulator({ args, abi: parentAbi }); + const result = await runSimulator({ args, artifact: parentArtifact }); expect(result.callStackItem.publicInputs.returnValues[0]).toEqual(argsHash); - expect(oracle.getFunctionABI.mock.calls[0]).toEqual([testAddress, testCodeGenSelector]); + expect(oracle.getFunctionArtifact.mock.calls[0]).toEqual([testAddress, testCodeGenSelector]); expect(oracle.getPortalContractAddress.mock.calls[0]).toEqual([testAddress]); expect(result.nestedExecutions).toHaveLength(1); expect(result.nestedExecutions[0].callStackItem.publicInputs.returnValues[0]).toEqual(argsHash); @@ -649,7 +649,7 @@ describe('Private Execution test suite', () => { it('Should be able to consume a dummy cross chain message', async () => { const bridgedAmount = 100n; - const abi = getFunctionAbi(NonNativeTokenContractArtifact, 'mint'); + const artifact = getFunctionArtifact(NonNativeTokenContractArtifact, 'mint'); const secret = new Fr(1n); const canceller = EthAddress.random(); @@ -674,7 +674,7 @@ describe('Private Execution test suite', () => { }); const args = [bridgedAmount, recipient, messageKey, secret, canceller.toField()]; - const result = await runSimulator({ contractAddress, abi, args }); + const result = await runSimulator({ contractAddress, artifact, args }); // Check a nullifier has been inserted const newNullifiers = result.callStackItem.publicInputs.newNullifiers.filter(field => !field.equals(Fr.ZERO)); @@ -683,7 +683,7 @@ describe('Private Execution test suite', () => { it('Should be able to consume a dummy public to private message', async () => { const amount = 100n; - const abi = getFunctionAbi(NonNativeTokenContractArtifact, 'redeemShield'); + const artifact = getFunctionArtifact(NonNativeTokenContractArtifact, 'redeemShield'); const wasm = await CircuitsWasm.get(); const secret = new Fr(1n); @@ -706,7 +706,7 @@ describe('Private Execution test suite', () => { ]); const result = await runSimulator({ - abi, + artifact, args: [amount, secret, recipient], }); @@ -723,7 +723,7 @@ describe('Private Execution test suite', () => { describe('enqueued calls', () => { it.each([false, true])('parent should enqueue call to child (internal %p)', async isInternal => { - const parentAbi = ParentContractArtifact.functions.find(f => f.name === 'enqueueCallToChild')!; + const parentArtifact = ParentContractArtifact.functions.find(f => f.name === 'enqueueCallToChild')!; const childContractArtifact = ParentContractArtifact.functions[0]; const childAddress = AztecAddress.random(); const childPortalContractAddress = EthAddress.random(); @@ -734,17 +734,17 @@ describe('Private Execution test suite', () => { const parentAddress = AztecAddress.random(); oracle.getPortalContractAddress.mockImplementation(() => Promise.resolve(childPortalContractAddress)); - oracle.getFunctionABI.mockImplementation(() => Promise.resolve({ ...childContractArtifact, isInternal })); + oracle.getFunctionArtifact.mockImplementation(() => Promise.resolve({ ...childContractArtifact, isInternal })); const args = [Fr.fromBuffer(childAddress.toBuffer()), childSelector.toField(), 42n]; const result = await runSimulator({ msgSender: parentAddress, contractAddress: parentAddress, - abi: parentAbi, + artifact: parentArtifact, args, }); - // Alter function data (abi) to match the manipulated oracle + // Alter function data to match the manipulated oracle const functionData = FunctionData.fromAbi(childContractArtifact); functionData.isInternal = isInternal; @@ -784,7 +784,7 @@ describe('Private Execution test suite', () => { }); beforeEach(() => { - oracle.getFunctionABI.mockImplementation((_, selector) => + oracle.getFunctionArtifact.mockImplementation((_, selector) => Promise.resolve( PendingCommitmentsContractArtifact.functions.find(f => selector.equals(FunctionSelector.fromNameAndParameters(f.name, f.parameters)), @@ -799,14 +799,14 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = AztecAddress.random(); - const abi = PendingCommitmentsContractArtifact.functions.find( + const artifact = PendingCommitmentsContractArtifact.functions.find( f => f.name === 'test_insert_then_get_then_nullify_flat', )!; const args = [amountToTransfer, owner]; const result = await runSimulator({ args: args, - abi: abi, + artifact: artifact, contractAddress, }); @@ -842,21 +842,26 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = AztecAddress.random(); - const abi = PendingCommitmentsContractArtifact.functions.find( + const artifact = PendingCommitmentsContractArtifact.functions.find( f => f.name === 'test_insert_then_get_then_nullify_all_in_nested_calls', )!; - const insertAbi = PendingCommitmentsContractArtifact.functions.find(f => f.name === 'insert_note')!; - const getThenNullifyAbi = PendingCommitmentsContractArtifact.functions.find( + const insertArtifact = PendingCommitmentsContractArtifact.functions.find(f => f.name === 'insert_note')!; + const getThenNullifyArtifact = PendingCommitmentsContractArtifact.functions.find( f => f.name === 'get_then_nullify_note', )!; - const getZeroAbi = PendingCommitmentsContractArtifact.functions.find(f => f.name === 'get_note_zero_balance')!; + const getZeroArtifact = PendingCommitmentsContractArtifact.functions.find( + f => f.name === 'get_note_zero_balance', + )!; - const insertFnSelector = FunctionSelector.fromNameAndParameters(insertAbi.name, insertAbi.parameters); + const insertFnSelector = FunctionSelector.fromNameAndParameters(insertArtifact.name, insertArtifact.parameters); const getThenNullifyFnSelector = FunctionSelector.fromNameAndParameters( - getThenNullifyAbi.name, - getThenNullifyAbi.parameters, + getThenNullifyArtifact.name, + getThenNullifyArtifact.parameters, + ); + const getZeroFnSelector = FunctionSelector.fromNameAndParameters( + getZeroArtifact.name, + getZeroArtifact.parameters, ); - const getZeroFnSelector = FunctionSelector.fromNameAndParameters(getZeroAbi.name, getZeroAbi.parameters); oracle.getPortalContractAddress.mockImplementation(() => Promise.resolve(EthAddress.ZERO)); @@ -869,7 +874,7 @@ describe('Private Execution test suite', () => { ]; const result = await runSimulator({ args: args, - abi: abi, + artifact: artifact, contractAddress: contractAddress, }); @@ -915,12 +920,14 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = AztecAddress.random(); - const abi = PendingCommitmentsContractArtifact.functions.find(f => f.name === 'test_bad_get_then_insert_flat')!; + const artifact = PendingCommitmentsContractArtifact.functions.find( + f => f.name === 'test_bad_get_then_insert_flat', + )!; const args = [amountToTransfer, owner]; const result = await runSimulator({ args: args, - abi: abi, + artifact: artifact, contractAddress, }); @@ -953,9 +960,9 @@ describe('Private Execution test suite', () => { describe('get public key', () => { it('gets the public key for an address', async () => { - // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractArtifact, 'getPublicKey'); - abi.returnTypes = [{ kind: 'array', length: 2, type: { kind: 'field' } }]; + // Tweak the contract ARTIFACT so we can extract return values + const artifact = getFunctionArtifact(TestContractArtifact, 'getPublicKey'); + artifact.returnTypes = [{ kind: 'array', length: 2, type: { kind: 'field' } }]; // Generate a partial address, pubkey, and resulting address const completeAddress = await CompleteAddress.random(); @@ -963,7 +970,7 @@ describe('Private Execution test suite', () => { const pubKey = completeAddress.publicKey; oracle.getCompleteAddress.mockResolvedValue(completeAddress); - const result = await runSimulator({ abi, args }); + const result = await runSimulator({ artifact, args }); expect(result.returnValues).toEqual([pubKey.x.value, pubKey.y.value]); }); }); @@ -973,39 +980,39 @@ describe('Private Execution test suite', () => { const portalContractAddress = EthAddress.random(); const aztecAddressToQuery = AztecAddress.random(); - // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractArtifact, 'getPortalContractAddress'); - abi.returnTypes = [{ kind: 'field' }]; + // Tweak the contract ARTIFACT so we can extract return values + const artifact = getFunctionArtifact(TestContractArtifact, 'getPortalContractAddress'); + artifact.returnTypes = [{ kind: 'field' }]; const args = [aztecAddressToQuery.toField()]; // Overwrite the oracle return value oracle.getPortalContractAddress.mockResolvedValue(portalContractAddress); - const result = await runSimulator({ abi, args }); + const result = await runSimulator({ artifact, args }); expect(result.returnValues).toEqual(portalContractAddress.toField().value); }); it('this_address should return the current context address', async () => { const contractAddress = AztecAddress.random(); - // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractArtifact, 'getThisAddress'); - abi.returnTypes = [{ kind: 'field' }]; + // Tweak the contract ARTIFACT so we can extract return values + const artifact = getFunctionArtifact(TestContractArtifact, 'getThisAddress'); + artifact.returnTypes = [{ kind: 'field' }]; // Overwrite the oracle return value - const result = await runSimulator({ abi, args: [], contractAddress }); + const result = await runSimulator({ artifact, args: [], contractAddress }); expect(result.returnValues).toEqual(contractAddress.toField().value); }); it("this_portal_address should return the current context's portal address", async () => { const portalContractAddress = EthAddress.random(); - // Tweak the contract ABI so we can extract return values - const abi = getFunctionAbi(TestContractArtifact, 'getThisPortalAddress'); - abi.returnTypes = [{ kind: 'field' }]; + // Tweak the contract ARTIFACT so we can extract return values + const artifact = getFunctionArtifact(TestContractArtifact, 'getThisPortalAddress'); + artifact.returnTypes = [{ kind: 'field' }]; // Overwrite the oracle return value - const result = await runSimulator({ abi, args: [], portalContractAddress }); + const result = await runSimulator({ artifact, args: [], portalContractAddress }); expect(result.returnValues).toEqual(portalContractAddress.toField().value); }); }); diff --git a/yarn-project/acir-simulator/src/client/private_execution.ts b/yarn-project/acir-simulator/src/client/private_execution.ts index 3de7e625b5f..c6e8483641a 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.ts @@ -9,7 +9,7 @@ import { extractPrivateCircuitPublicInputs } from '../acvm/deserialize.js'; import { Oracle, acvm, extractCallStack } from '../acvm/index.js'; import { ExecutionError } from '../common/errors.js'; import { ClientExecutionContext } from './client_execution_context.js'; -import { FunctionAbiWithDebugMetadata } from './db_oracle.js'; +import { FunctionArtifactWithDebugMetadata } from './db_oracle.js'; import { ExecutionResult } from './execution_result.js'; import { AcirSimulator } from './simulator.js'; @@ -18,7 +18,7 @@ import { AcirSimulator } from './simulator.js'; */ export async function executePrivateFunction( context: ClientExecutionContext, - abi: FunctionAbiWithDebugMetadata, + artifact: FunctionArtifactWithDebugMetadata, contractAddress: AztecAddress, functionData: FunctionData, log = createDebugLogger('aztec:simulator:secret_execution'), @@ -26,7 +26,7 @@ export async function executePrivateFunction( const functionSelector = functionData.selector; log(`Executing external function ${contractAddress}:${functionSelector}`); - const acir = Buffer.from(abi.bytecode, 'base64'); + const acir = Buffer.from(artifact.bytecode, 'base64'); const initialWitness = context.getInitialWitness(); const acvmCallback = new Oracle(context); const { partialWitness } = await acvm(await AcirSimulator.getSolver(), acir, initialWitness, acvmCallback).catch( @@ -37,7 +37,7 @@ export async function executePrivateFunction( contractAddress, functionSelector, }, - extractCallStack(err, abi.debug), + extractCallStack(err, artifact.debug), { cause: err }, ); }, @@ -54,7 +54,7 @@ export async function executePrivateFunction( publicInputs.unencryptedLogPreimagesLength = new Fr(unencryptedLogs.getSerializedLength()); const callStackItem = new PrivateCallStackItem(contractAddress, functionData, publicInputs, false); - const returnValues = decodeReturnValues(abi, publicInputs.returnValues); + const returnValues = decodeReturnValues(artifact, publicInputs.returnValues); const readRequestPartialWitnesses = context.getReadRequestPartialWitnesses(publicInputs.readRequests); const newNotes = context.getNewNotes(); const nestedExecutions = context.getNestedExecutions(); @@ -69,7 +69,7 @@ export async function executePrivateFunction( returnValues, readRequestPartialWitnesses, newNotes, - vk: Buffer.from(abi.verificationKey!, 'hex'), + vk: Buffer.from(artifact.verificationKey!, 'hex'), nestedExecutions, enqueuedPublicFunctionCalls, encryptedLogs, diff --git a/yarn-project/acir-simulator/src/client/simulator.ts b/yarn-project/acir-simulator/src/client/simulator.ts index 2679f15e02a..46521e35c60 100644 --- a/yarn-project/acir-simulator/src/client/simulator.ts +++ b/yarn-project/acir-simulator/src/client/simulator.ts @@ -13,7 +13,7 @@ import { createSimulationError } from '../common/errors.js'; import { SideEffectCounter } from '../common/index.js'; import { PackedArgsCache } from '../common/packed_args_cache.js'; import { ClientExecutionContext } from './client_execution_context.js'; -import { DBOracle, FunctionAbiWithDebugMetadata } from './db_oracle.js'; +import { DBOracle, FunctionArtifactWithDebugMetadata } from './db_oracle.js'; import { ExecutionNoteCache } from './execution_note_cache.js'; import { ExecutionResult } from './execution_result.js'; import { executePrivateFunction } from './private_execution.js'; @@ -52,7 +52,7 @@ export class AcirSimulator { /** * Runs a private function. * @param request - The transaction request. - * @param entryPointABI - The ABI of the entry point function. + * @param entryPointArtifact - The artifact of the entry point function. * @param contractAddress - The address of the contract (should match request.origin) * @param portalContractAddress - The address of the portal contract. * @param msgSender - The address calling the function. This can be replaced to simulate a call from another contract or a specific account. @@ -60,13 +60,13 @@ export class AcirSimulator { */ public async run( request: TxExecutionRequest, - entryPointABI: FunctionAbiWithDebugMetadata, + entryPointArtifact: FunctionArtifactWithDebugMetadata, contractAddress: AztecAddress, portalContractAddress: EthAddress, msgSender = AztecAddress.ZERO, ): Promise { - if (entryPointABI.functionType !== FunctionType.SECRET) { - throw new Error(`Cannot run ${entryPointABI.functionType} function as secret`); + if (entryPointArtifact.functionType !== FunctionType.SECRET) { + throw new Error(`Cannot run ${entryPointArtifact.functionType} function as secret`); } if (request.origin !== contractAddress) { @@ -82,7 +82,7 @@ export class AcirSimulator { msgSender, contractAddress, portalContractAddress, - FunctionSelector.fromNameAndParameters(entryPointABI.name, entryPointABI.parameters), + FunctionSelector.fromNameAndParameters(entryPointArtifact.name, entryPointArtifact.parameters), false, false, request.functionData.isConstructor, @@ -104,7 +104,7 @@ export class AcirSimulator { try { const executionResult = await executePrivateFunction( context, - entryPointABI, + entryPointArtifact, contractAddress, request.functionData, ); @@ -117,18 +117,18 @@ export class AcirSimulator { /** * Runs an unconstrained function. * @param request - The transaction request. - * @param entryPointABI - The ABI of the entry point function. + * @param entryPointArtifact - The artifact of the entry point function. * @param contractAddress - The address of the contract. * @param aztecNode - The AztecNode instance. */ public async runUnconstrained( request: FunctionCall, - entryPointABI: FunctionAbiWithDebugMetadata, + entryPointArtifact: FunctionArtifactWithDebugMetadata, contractAddress: AztecAddress, aztecNode?: AztecNode, ) { - if (entryPointABI.functionType !== FunctionType.UNCONSTRAINED) { - throw new Error(`Cannot run ${entryPointABI.functionType} function as constrained`); + if (entryPointArtifact.functionType !== FunctionType.UNCONSTRAINED) { + throw new Error(`Cannot run ${entryPointArtifact.functionType} function as constrained`); } const historicBlockData = await this.db.getHistoricBlockData(); @@ -137,7 +137,7 @@ export class AcirSimulator { try { return await executeUnconstrainedFunction( context, - entryPointABI, + entryPointArtifact, contractAddress, request.functionData, request.args, @@ -161,38 +161,38 @@ export class AcirSimulator { storageSlot: Fr, notePreimage: Fr[], ) { - let abi: FunctionAbiWithDebugMetadata | undefined = undefined; + let artifact: FunctionArtifactWithDebugMetadata | undefined = undefined; // Brute force for (let i = notePreimage.length; i < MAX_NOTE_FIELDS_LENGTH; i++) { const signature = `compute_note_hash_and_nullifier(Field,Field,Field,[Field;${i}])`; const selector = FunctionSelector.fromSignature(signature); try { - abi = await this.db.getFunctionABI(contractAddress, selector); - if (abi !== undefined) break; + artifact = await this.db.getFunctionArtifact(contractAddress, selector); + if (artifact !== undefined) break; } catch (e) { // ignore } } - if (abi == undefined) { + if (artifact == undefined) { throw new Error( `Mandatory implementation of "compute_note_hash_and_nullifier" missing in noir contract ${contractAddress.toString()}.`, ); } - const preimageLen = (abi.parameters[3].type as ArrayType).length; + const preimageLen = (artifact.parameters[3].type as ArrayType).length; const extendedPreimage = notePreimage.concat(Array(preimageLen - notePreimage.length).fill(Fr.ZERO)); const execRequest: FunctionCall = { to: AztecAddress.ZERO, functionData: FunctionData.empty(), - args: encodeArguments(abi, [contractAddress, nonce, storageSlot, extendedPreimage]), + args: encodeArguments(artifact, [contractAddress, nonce, storageSlot, extendedPreimage]), }; const [innerNoteHash, siloedNoteHash, uniqueSiloedNoteHash, innerNullifier] = (await this.runUnconstrained( execRequest, - abi, + artifact, AztecAddress.ZERO, )) as bigint[]; @@ -209,7 +209,6 @@ export class AcirSimulator { * @param contractAddress - The address of the contract. * @param storageSlot - The storage slot. * @param notePreimage - The note preimage. - * @param abi - The ABI of the function `compute_note_hash`. * @returns The note hash. */ public async computeInnerNoteHash(contractAddress: AztecAddress, storageSlot: Fr, notePreimage: Fr[]) { @@ -228,7 +227,6 @@ export class AcirSimulator { * @param nonce - The nonce of the note hash. * @param storageSlot - The storage slot. * @param notePreimage - The note preimage. - * @param abi - The ABI of the function `compute_note_hash`. * @returns The note hash. */ public async computeUniqueSiloedNoteHash( @@ -252,7 +250,6 @@ export class AcirSimulator { * @param nonce - The nonce of the note hash. * @param storageSlot - The storage slot. * @param notePreimage - The note preimage. - * @param abi - The ABI of the function `compute_note_hash`. * @returns The note hash. */ public async computeSiloedNoteHash(contractAddress: AztecAddress, nonce: Fr, storageSlot: Fr, notePreimage: Fr[]) { @@ -271,7 +268,6 @@ export class AcirSimulator { * @param nonce - The nonce of the unique note hash. * @param storageSlot - The storage slot. * @param notePreimage - The note preimage. - * @param abi - The ABI of the function `compute_note_hash`. * @returns The note hash. */ public async computeInnerNullifier(contractAddress: AztecAddress, nonce: Fr, storageSlot: Fr, notePreimage: Fr[]) { diff --git a/yarn-project/acir-simulator/src/client/unconstrained_execution.ts b/yarn-project/acir-simulator/src/client/unconstrained_execution.ts index 85504664c83..d197ec386fb 100644 --- a/yarn-project/acir-simulator/src/client/unconstrained_execution.ts +++ b/yarn-project/acir-simulator/src/client/unconstrained_execution.ts @@ -8,7 +8,7 @@ import { extractReturnWitness } from '../acvm/deserialize.js'; import { ACVMField, Oracle, acvm, extractCallStack, fromACVMField, toACVMWitness } from '../acvm/index.js'; import { ExecutionError } from '../common/errors.js'; import { AcirSimulator } from '../index.js'; -import { FunctionAbiWithDebugMetadata } from './db_oracle.js'; +import { FunctionArtifactWithDebugMetadata } from './db_oracle.js'; import { ViewDataOracle } from './view_data_oracle.js'; /** @@ -16,7 +16,7 @@ import { ViewDataOracle } from './view_data_oracle.js'; */ export async function executeUnconstrainedFunction( oracle: ViewDataOracle, - abi: FunctionAbiWithDebugMetadata, + artifact: FunctionArtifactWithDebugMetadata, contractAddress: AztecAddress, functionData: FunctionData, args: Fr[], @@ -25,7 +25,7 @@ export async function executeUnconstrainedFunction( const functionSelector = functionData.selector; log(`Executing unconstrained function ${contractAddress}:${functionSelector}`); - const acir = Buffer.from(abi.bytecode, 'base64'); + const acir = Buffer.from(artifact.bytecode, 'base64'); const initialWitness = toACVMWitness(1, args); const { partialWitness } = await acvm( await AcirSimulator.getSolver(), @@ -39,11 +39,11 @@ export async function executeUnconstrainedFunction( contractAddress, functionSelector, }, - extractCallStack(err, abi.debug), + extractCallStack(err, artifact.debug), { cause: err }, ); }); const returnValues: ACVMField[] = extractReturnWitness(acir, partialWitness); - return decodeReturnValues(abi, returnValues.map(fromACVMField)); + return decodeReturnValues(artifact, returnValues.map(fromACVMField)); } diff --git a/yarn-project/acir-simulator/src/test/utils.ts b/yarn-project/acir-simulator/src/test/utils.ts index 660410af108..6ba0b9d013e 100644 --- a/yarn-project/acir-simulator/src/test/utils.ts +++ b/yarn-project/acir-simulator/src/test/utils.ts @@ -4,7 +4,7 @@ import { ContractArtifact, getFunctionDebugMetadata } from '@aztec/foundation/ab import { sha256ToField } from '@aztec/foundation/crypto'; import { L1Actor, L1ToL2Message, L2Actor } from '@aztec/types'; -import { FunctionAbiWithDebugMetadata } from '../index.js'; +import { FunctionArtifactWithDebugMetadata } from '../index.js'; /** * Test utility function to craft an L1 to L2 message. @@ -42,14 +42,17 @@ export const buildL1ToL2Message = async ( ); }; -export const getFunctionAbi = (abi: ContractArtifact, functionName: string): FunctionAbiWithDebugMetadata => { - const functionIndex = abi.functions.findIndex(f => f.name === functionName); +export const getFunctionArtifact = ( + artifact: ContractArtifact, + functionName: string, +): FunctionArtifactWithDebugMetadata => { + const functionIndex = artifact.functions.findIndex(f => f.name === functionName); if (functionIndex < 0) { throw new Error(`Unknown function ${functionName}`); } - const functionAbi = abi.functions[functionIndex]; + const functionArtifact = artifact.functions[functionIndex]; - const debug = getFunctionDebugMetadata(abi, functionName); + const debug = getFunctionDebugMetadata(artifact, functionName); - return { ...functionAbi, debug }; + return { ...functionArtifact, debug }; }; diff --git a/yarn-project/aztec.js/src/account/defaults/default_entrypoint.ts b/yarn-project/aztec.js/src/account/defaults/default_entrypoint.ts index d036f1fbade..974d0fa6bde 100644 --- a/yarn-project/aztec.js/src/account/defaults/default_entrypoint.ts +++ b/yarn-project/aztec.js/src/account/defaults/default_entrypoint.ts @@ -1,5 +1,5 @@ import { AztecAddress, Fr, FunctionData, TxContext } from '@aztec/circuits.js'; -import { FunctionAbiHeader, encodeArguments } from '@aztec/foundation/abi'; +import { FunctionAbi, encodeArguments } from '@aztec/foundation/abi'; import { FunctionCall, PackedArguments, TxExecutionRequest } from '@aztec/types'; import { DEFAULT_CHAIN_ID, DEFAULT_VERSION } from '../../utils/defaults.js'; @@ -97,6 +97,6 @@ export class DefaultAccountEntrypoint implements EntrypointInterface { }, ], returnTypes: [], - } as FunctionAbiHeader; + } as FunctionAbi; } } diff --git a/yarn-project/aztec.js/src/contract/checker.ts b/yarn-project/aztec.js/src/contract/checker.ts index 4be22b43a8c..6e06591675e 100644 --- a/yarn-project/aztec.js/src/contract/checker.ts +++ b/yarn-project/aztec.js/src/contract/checker.ts @@ -11,27 +11,27 @@ type TypeWithoutKind = Omit<{ [key in keyof T]: any }, 'kind'>; * Ensures that the ABI has at least one function, a constructor, valid bytecode, and correct parameter types. * Throws an error if any inconsistency is detected during the validation process. * - * @param abi - The ContractArtifact object to be validated. - * @returns A boolean value indicating whether the ABI is valid or not. + * @param artifact - The ContractArtifact object to be validated. + * @returns A boolean value indicating whether the artifact is valid or not. */ -export function abiChecker(abi: ContractArtifact) { - if (!abi.functions || abi.functions.length === 0) { - throw new Error('ABI has no functions'); +export function abiChecker(artifact: ContractArtifact) { + if (!artifact.functions || artifact.functions.length === 0) { + throw new Error('artifact has no functions'); } - abi.functions.forEach(func => { + artifact.functions.forEach(func => { if (!('name' in func && typeof func.name === 'string' && func.name.length > 0)) { - throw new Error('ABI function has no name'); + throw new Error('artifact function has no name'); } // TODO: implement a better check for bytecode (right now only checks if it's > 0) if (!('bytecode' in func && typeof func.bytecode === 'string' && func.bytecode.length > 0)) { - throw new Error('ABI function parameter has incorrect bytecode'); + throw new Error('artifact function parameter has incorrect bytecode'); } func.parameters.forEach(param => { if (!param.type) { - throw new Error('ABI function parameter has no type'); + throw new Error('artifact function parameter has no type'); } abiParameterTypeChecker(param.type); @@ -39,7 +39,7 @@ export function abiChecker(abi: ContractArtifact) { }); // TODO: implement a better check for constructor (right now only checks if it has it or not) - if (!abi.functions.find(func => func.name === 'constructor')) { + if (!artifact.functions.find(func => func.name === 'constructor')) { throw new Error('ABI has no constructor'); } diff --git a/yarn-project/aztec.js/src/contract/contract.test.ts b/yarn-project/aztec.js/src/contract/contract.test.ts index 7f81a4a7b7c..4434afb1e74 100644 --- a/yarn-project/aztec.js/src/contract/contract.test.ts +++ b/yarn-project/aztec.js/src/contract/contract.test.ts @@ -35,7 +35,7 @@ describe('Contract Class', () => { l1ContractAddresses: l1Addresses, }; - const defaultAbi: ContractArtifact = { + const defaultArtifact: ContractArtifact = { name: 'FooContract', functions: [ { @@ -111,7 +111,7 @@ describe('Contract Class', () => { }); it('should create and send a contract method tx', async () => { - const fooContract = await Contract.at(contractAddress, defaultAbi, wallet); + const fooContract = await Contract.at(contractAddress, defaultArtifact, wallet); const param0 = 12; const param1 = 345n; const sentTx = fooContract.methods.bar(param0, param1).send(); @@ -126,7 +126,7 @@ describe('Contract Class', () => { }); it('should call view on an unconstrained function', async () => { - const fooContract = await Contract.at(contractAddress, defaultAbi, wallet); + const fooContract = await Contract.at(contractAddress, defaultArtifact, wallet); const result = await fooContract.methods.qux(123n).view({ from: account.address, }); @@ -136,12 +136,12 @@ describe('Contract Class', () => { }); it('should not call create on an unconstrained function', async () => { - const fooContract = await Contract.at(contractAddress, defaultAbi, wallet); + const fooContract = await Contract.at(contractAddress, defaultArtifact, wallet); await expect(fooContract.methods.qux().create()).rejects.toThrow(); }); it('should not call view on a secret or open function', async () => { - const fooContract = await Contract.at(contractAddress, defaultAbi, wallet); + const fooContract = await Contract.at(contractAddress, defaultArtifact, wallet); expect(() => fooContract.methods.bar().view()).toThrow(); expect(() => fooContract.methods.baz().view()).toThrow(); }); diff --git a/yarn-project/aztec.js/src/contract/contract.ts b/yarn-project/aztec.js/src/contract/contract.ts index b64bbf9a066..47dc389c7eb 100644 --- a/yarn-project/aztec.js/src/contract/contract.ts +++ b/yarn-project/aztec.js/src/contract/contract.ts @@ -17,19 +17,19 @@ export class Contract extends ContractBase { /** * Creates a contract instance. * @param address - The deployed contract's address. - * @param abi - The Application Binary Interface for the contract. + * @param artifact - Build artifact of the contract. * @param wallet - The wallet to use when interacting with the contract. * @param portalContract - The portal contract address on L1, if any. * @returns A promise that resolves to a new Contract instance. */ - public static async at(address: AztecAddress, abi: ContractArtifact, wallet: Wallet): Promise { + public static async at(address: AztecAddress, artifact: ContractArtifact, wallet: Wallet): Promise { const extendedContractData = await wallet.getExtendedContractData(address); if (extendedContractData === undefined) { throw new Error('Contract ' + address.toString() + ' is not deployed'); } return new Contract( extendedContractData.getCompleteAddress(), - abi, + artifact, wallet, extendedContractData.contractData.portalContractAddress, ); @@ -38,21 +38,21 @@ export class Contract extends ContractBase { /** * Creates a tx to deploy a new instance of a contract. * @param wallet - The wallet for executing the deployment. - * @param abi - ABI of the contract to deploy. + * @param artifact - Build artifact of the contract to deploy * @param args - Arguments for the constructor. */ - public static deploy(wallet: Wallet, abi: ContractArtifact, args: any[]) { - return new DeployMethod(Point.ZERO, wallet, abi, args); + public static deploy(wallet: Wallet, artifact: ContractArtifact, args: any[]) { + return new DeployMethod(Point.ZERO, wallet, artifact, args); } /** * Creates a tx to deploy a new instance of a contract using the specified public key to derive the address. * @param publicKey - Public key for deriving the address. * @param wallet - The wallet for executing the deployment. - * @param abi - ABI of the contract to deploy. + * @param artifact - Build artifact of the contract. * @param args - Arguments for the constructor. */ - public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, abi: ContractArtifact, args: any[]) { - return new DeployMethod(publicKey, wallet, abi, args); + public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, artifact: ContractArtifact, args: any[]) { + return new DeployMethod(publicKey, wallet, artifact, args); } } diff --git a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts index e8a58728fe4..da6932b1b91 100644 --- a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts +++ b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts @@ -1,5 +1,5 @@ import { AztecAddress, FunctionData } from '@aztec/circuits.js'; -import { FunctionAbiHeader, FunctionType, encodeArguments } from '@aztec/foundation/abi'; +import { FunctionAbi, FunctionType, encodeArguments } from '@aztec/foundation/abi'; import { FunctionCall, TxExecutionRequest } from '@aztec/types'; import { Wallet } from '../wallet/index.js'; @@ -26,7 +26,7 @@ export class ContractFunctionInteraction extends BaseContractInteraction { constructor( protected wallet: Wallet, protected contractAddress: AztecAddress, - protected functionDao: FunctionAbiHeader, + protected functionDao: FunctionAbi, protected args: any[], ) { super(wallet); diff --git a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts index 4a9facc7493..e657b01ca58 100644 --- a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts +++ b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.test.ts @@ -9,7 +9,7 @@ import { ContractDeployer } from './contract_deployer.js'; describe.skip('Contract Deployer', () => { let pxe: MockProxy; - const abi: ContractArtifact = { + const artifact: ContractArtifact = { name: 'MyContract', functions: [ { @@ -39,7 +39,7 @@ describe.skip('Contract Deployer', () => { }); it('should create and send a contract deployment tx', async () => { - const deployer = new ContractDeployer(abi, pxe, publicKey); + const deployer = new ContractDeployer(artifact, pxe, publicKey); const sentTx = deployer.deploy(args[0], args[1]).send({ portalContract, contractAddressSalt, diff --git a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts index 74ef5e4bf21..eebb0b2719c 100644 --- a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts +++ b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts @@ -9,7 +9,7 @@ import { DeployMethod } from './deploy_method.js'; * @remarks Keeping this around even though we have Aztec.nr contract types because it can be useful for non-TS users. */ export class ContractDeployer { - constructor(private abi: ContractArtifact, private pxe: PXE, private publicKey?: PublicKey) {} + constructor(private artifact: ContractArtifact, private pxe: PXE, private publicKey?: PublicKey) {} /** * Deploy a contract using the provided ABI and constructor arguments. @@ -21,6 +21,6 @@ export class ContractDeployer { * @returns A DeployMethod instance configured with the ABI, PXE, and constructor arguments. */ public deploy(...args: any[]) { - return new DeployMethod(this.publicKey ?? Point.ZERO, this.pxe, this.abi, args); + return new DeployMethod(this.publicKey ?? Point.ZERO, this.pxe, this.artifact, args); } } diff --git a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts b/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts index 398b689748b..9477061e11a 100644 --- a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts +++ b/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts @@ -43,13 +43,13 @@ export class DeployMethod extends Bas constructor( private publicKey: PublicKey, protected pxe: PXE, - private abi: ContractArtifact, + private artifact: ContractArtifact, private args: any[] = [], ) { super(pxe); - const constructorAbi = abi.functions.find(f => f.name === 'constructor'); - if (!constructorAbi) throw new Error('Cannot find constructor in the ABI.'); - this.constructorAbi = constructorAbi; + const constructorArtifact = artifact.functions.find(f => f.name === 'constructor'); + if (!constructorArtifact) throw new Error('Cannot find constructor in the artifact.'); + this.constructorAbi = constructorArtifact; } /** @@ -68,7 +68,7 @@ export class DeployMethod extends Bas const { chainId, protocolVersion } = await this.pxe.getNodeInfo(); const { completeAddress, constructorHash, functionTreeRoot } = await getContractDeploymentInfo( - this.abi, + this.artifact, this.args, contractAddressSalt, this.publicKey, @@ -108,7 +108,7 @@ export class DeployMethod extends Bas this.completeAddress = completeAddress; // TODO: Should we add the contracts to the DB here, or once the tx has been sent or mined? - await this.pxe.addContracts([{ artifact: this.abi, completeAddress, portalContract }]); + await this.pxe.addContracts([{ artifact: this.artifact, completeAddress, portalContract }]); return this.txRequest; } @@ -123,7 +123,7 @@ export class DeployMethod extends Bas */ public send(options: DeployOptions = {}): DeploySentTx { const txHashPromise = super.send(options).getTxHash(); - return new DeploySentTx(this.abi, this.pxe, txHashPromise); + return new DeploySentTx(this.artifact, this.pxe, txHashPromise); } /** diff --git a/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts b/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts index bd5e0c4d9fb..4441c831bed 100644 --- a/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts +++ b/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts @@ -20,7 +20,7 @@ export type DeployTxReceipt = FieldsO * A contract deployment transaction sent to the network, extending SentTx with methods to create a contract instance. */ export class DeploySentTx extends SentTx { - constructor(private abi: ContractArtifact, wallet: PXE | Wallet, txHashPromise: Promise) { + constructor(private artifact: ContractArtifact, wallet: PXE | Wallet, txHashPromise: Promise) { super(wallet, txHashPromise); } @@ -50,6 +50,6 @@ export class DeploySentTx extends SentTx const contractWallet = wallet ?? (isWallet(this.pxe) && this.pxe); if (!contractWallet) throw new Error(`A wallet is required for creating a contract instance`); if (!address) throw new Error(`Contract address is missing from transaction receipt`); - return Contract.at(address, this.abi, contractWallet) as Promise; + return Contract.at(address, this.artifact, contractWallet) as Promise; } } diff --git a/yarn-project/aztec.js/src/wallet/account_wallet.ts b/yarn-project/aztec.js/src/wallet/account_wallet.ts index 829f7e16bc4..9df782b76df 100644 --- a/yarn-project/aztec.js/src/wallet/account_wallet.ts +++ b/yarn-project/aztec.js/src/wallet/account_wallet.ts @@ -1,5 +1,5 @@ import { Fr, GrumpkinPrivateKey } from '@aztec/circuits.js'; -import { ABIParameterVisibility, FunctionAbiHeader, FunctionType } from '@aztec/foundation/abi'; +import { ABIParameterVisibility, FunctionAbi, FunctionType } from '@aztec/foundation/abi'; import { AuthWitness, FunctionCall, PXE, TxExecutionRequest } from '@aztec/types'; import { AccountInterface } from '../account/interface.js'; @@ -47,7 +47,7 @@ export class AccountWallet extends BaseWallet { return this.getCompleteAddress().address; } - private getSetIsValidStorageAbi(): FunctionAbiHeader { + private getSetIsValidStorageAbi(): FunctionAbi { return { name: 'set_is_valid_storage', functionType: 'open' as FunctionType, diff --git a/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx b/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx index 4005936a072..ec394d7a424 100644 --- a/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx +++ b/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx @@ -62,12 +62,12 @@ function generateYupSchema(functionAbi: FunctionArtifact, defaultAddress: string async function handleFunctionCall( contractAddress: AztecAddress | undefined, - contractAbi: ContractArtifact, + contractArtifact: ContractArtifact, functionName: string, args: any, wallet: CompleteAddress, ) { - const functionAbi = contractAbi.functions.find(f => f.name === functionName)!; + const functionAbi = contractArtifact.functions.find(f => f.name === functionName)!; const typedArgs: any[] = convertArgs(functionAbi, args); if (functionName === 'constructor' && !!wallet) { @@ -80,13 +80,13 @@ async function handleFunctionCall( // for now, dont let user change the salt. requires some change to the form generation if we want to let user choose one // since everything is currently based on parsing the contractABI, and the salt parameter is not present there const salt = Fr.random(); - return await deployContract(wallet, contractAbi, typedArgs, salt, pxe); + return await deployContract(wallet, contractArtifact, typedArgs, salt, pxe); } if (functionAbi.functionType === 'unconstrained') { - return await viewContractFunction(contractAddress!, contractAbi, functionName, typedArgs, pxe, wallet); + return await viewContractFunction(contractAddress!, contractArtifact, functionName, typedArgs, pxe, wallet); } else { - const txnReceipt = await callContractFunction(contractAddress!, contractAbi, functionName, typedArgs, pxe, wallet); + const txnReceipt = await callContractFunction(contractAddress!, contractArtifact, functionName, typedArgs, pxe, wallet); return `Transaction ${txnReceipt.status} on block number ${txnReceipt.blockNumber}`; } } @@ -94,8 +94,8 @@ async function handleFunctionCall( interface ContractFunctionFormProps { wallet: CompleteAddress; contractAddress?: AztecAddress; - contractAbi: ContractArtifact; - functionAbi: FunctionArtifact; + contractArtifact: ContractArtifact; + functionArtifact: FunctionArtifact; defaultAddress: string; title?: string; buttonText?: string; @@ -109,8 +109,8 @@ interface ContractFunctionFormProps { export function ContractFunctionForm({ wallet, contractAddress, - contractAbi, - functionAbi, + contractArtifact: contractAbi, + functionArtifact: functionAbi, defaultAddress, buttonText = 'Submit', isLoading, diff --git a/yarn-project/boxes/blank-react/src/app/contract.tsx b/yarn-project/boxes/blank-react/src/app/contract.tsx index 2f10739e8f8..0c933a97082 100644 --- a/yarn-project/boxes/blank-react/src/app/contract.tsx +++ b/yarn-project/boxes/blank-react/src/app/contract.tsx @@ -2,7 +2,7 @@ import { Button, ButtonSize, ButtonTheme, Card, CardTheme, ImageButton, ImageBut import { AztecAddress, CompleteAddress } from '@aztec/aztec.js'; import { FunctionArtifact } from '@aztec/foundation/abi'; import { ReactNode, useState } from 'react'; -import { contractAbi } from '../config.js'; +import { contractArtifact } from '../config.js'; import { Copy } from './components/copy.js'; import { ContractFunctionForm, Popup } from './components/index.js'; import styles from './contract.module.scss'; @@ -40,12 +40,12 @@ export function Contract({ wallet }: Props) { setProcessingFunction(''); }; - const constructorAbi = contractAbi.functions.find(f => f.name === 'constructor')!; + const constructorAbi = contractArtifact.functions.find(f => f.name === 'constructor')!; const hasResult = !!(result || errorMsg); function renderCardContent(contractAddress?: AztecAddress): { content: ReactNode; header: string } { if (contractAddress) { - const functions = contractAbi.functions + const functions = contractArtifact.functions .filter(f => f.name !== 'constructor' && !f.isInternal) .sort((a, b) => functionTypeSortOrder[a.functionType] - functionTypeSortOrder[b.functionType]); @@ -55,7 +55,7 @@ export function Contract({ wallet }: Props) { content: (
-
{`${contractAbi.name}`}
+
{`${contractArtifact.name}`}
{!!contractAddress && (
{`${contractAddress.toShortString()}`} @@ -96,8 +96,8 @@ export function Contract({ wallet }: Props) { key={selectedFunctionAbi.name} wallet={wallet} contractAddress={contractAddress} - contractAbi={contractAbi} - functionAbi={selectedFunctionAbi} + contractArtifact={contractArtifact} + functionArtifact={selectedFunctionAbi} defaultAddress={wallet.address.toString()} isLoading={processingFunction === selectedFunctionAbi.name && !hasResult} disabled={processingFunction === selectedFunctionAbi.name && hasResult} @@ -111,12 +111,12 @@ export function Contract({ wallet }: Props) { } return { - header: `Deploy Contract (${contractAbi.name})`, + header: `Deploy Contract (${contractArtifact.name})`, content: ( { - const tx = new DeployMethod(activeWallet.publicKey, pxe, contractAbi, typedArgs).send({ + const tx = new DeployMethod(activeWallet.publicKey, pxe, contractArtifact, typedArgs).send({ contractAddressSalt: salt, }); await tx.wait(); diff --git a/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts b/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts index e647f3b9572..8b3bfd8e901 100644 --- a/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts +++ b/yarn-project/boxes/blank-react/src/scripts/view_contract_function.ts @@ -4,7 +4,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; export async function viewContractFunction( address: AztecAddress, - abi: ContractArtifact, + artifact: ContractArtifact, functionName: string, typedArgs: any[], pxe: PXE, @@ -12,7 +12,7 @@ export async function viewContractFunction( ) { // we specify the account that is calling the view function by passing in the wallet to the Contract const selectedWallet = await getWallet(wallet, pxe); - const contract = await Contract.at(address, abi, selectedWallet); + const contract = await Contract.at(address, artifact, selectedWallet); return await contract.methods[functionName](...typedArgs).view({ from: wallet.address }); } diff --git a/yarn-project/boxes/blank/src/index.ts b/yarn-project/boxes/blank/src/index.ts index c34de1d997b..c753c00cfdb 100644 --- a/yarn-project/boxes/blank/src/index.ts +++ b/yarn-project/boxes/blank/src/index.ts @@ -13,7 +13,7 @@ import { import { ContractArtifact, FunctionArtifact, encodeArguments } from '@aztec/foundation/abi'; import { FieldsOf } from '@aztec/foundation/types'; import { BlankContractArtifact } from './artifacts/blank.js'; -export const contractAbi: ContractArtifact = BlankContractArtifact; +export const contractArtifact: ContractArtifact = BlankContractArtifact; export const PXE_URL: string = process.env.PXE_URL || 'http://localhost:8080'; export const pxe: PXE = createPXEClient(PXE_URL); @@ -40,7 +40,7 @@ export async function handleDeployClick(): Promise { console.log('Deploying Contract'); const [wallet, ..._rest] = await getSandboxAccountsWallets(pxe); - const contractAztecAddress = await deployContract(wallet.getCompleteAddress(), contractAbi, [], Fr.random(), pxe); + const contractAztecAddress = await deployContract(wallet.getCompleteAddress(), contractArtifact, [], Fr.random(), pxe); return contractAztecAddress.toString(); } @@ -56,7 +56,7 @@ export async function handleInteractClick(contractAddress: string) { return await callContractFunction( AztecAddress.fromString(contractAddress), - contractAbi, + contractArtifact, 'getPublicKey', typedArgs, pxe, @@ -72,7 +72,7 @@ export const getFunctionAbi = (contractAbi: any, functionName: string) => { export async function callContractFunction( address: AztecAddress, - abi: ContractArtifact, + artifact: ContractArtifact, functionName: string, typedArgs: any[], // for the exposed functions, this is an array of field elements Fr[] pxe: PXE, @@ -85,7 +85,7 @@ export async function callContractFunction( // to use the typescript class for your contract generated by the `yarn compile` command, // which provides an object with methods corresponding to the noir contract functions // that are named and typed and can be called directly. - const contract = await Contract.at(address, abi, selectedWallet); + const contract = await Contract.at(address, artifact, selectedWallet); return contract.methods[functionName](...typedArgs) .send() @@ -111,12 +111,12 @@ export async function getWallet(account: CompleteAddress, pxe: PXE): Promise { - const tx = new DeployMethod(activeWallet.publicKey, client, contractAbi, typedArgs).send({ + const tx = new DeployMethod(activeWallet.publicKey, client, artifact, typedArgs).send({ contractAddressSalt: salt, }); await tx.wait(); @@ -128,8 +128,8 @@ export async function deployContract( } } -export function convertArgs(functionAbi: FunctionArtifact, args: any): Fr[] { - const untypedArgs = functionAbi.parameters.map(param => { +export function convertArgs(functionArtifact: FunctionArtifact, args: any): Fr[] { + const untypedArgs = functionArtifact.parameters.map(param => { switch (param.type.kind) { case 'field': // hack: addresses are stored as string in the form to avoid bigint compatibility issues with formik @@ -141,5 +141,5 @@ export function convertArgs(functionAbi: FunctionArtifact, args: any): Fr[] { } }); - return encodeArguments(functionAbi, untypedArgs); + return encodeArguments(functionArtifact, untypedArgs); } diff --git a/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx b/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx index 8e172f02619..ee61350d338 100644 --- a/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx +++ b/yarn-project/boxes/private-token/src/app/components/contract_function_form.tsx @@ -62,12 +62,12 @@ function generateYupSchema(functionAbi: FunctionArtifact, defaultAddress: string async function handleFunctionCall( contractAddress: AztecAddress | undefined, - contractAbi: ContractArtifact, + artifact: ContractArtifact, functionName: string, args: any, wallet: CompleteAddress, ) { - const functionAbi = contractAbi.functions.find(f => f.name === functionName)!; + const functionAbi = artifact.functions.find(f => f.name === functionName)!; const typedArgs: any[] = convertArgs(functionAbi, args); if (functionName === 'constructor' && !!wallet) { @@ -80,13 +80,13 @@ async function handleFunctionCall( // for now, dont let user change the salt. requires some change to the form generation if we want to let user choose one // since everything is currently based on parsing the contractABI, and the salt parameter is not present there const salt = Fr.random(); - return await deployContract(wallet, contractAbi, typedArgs, salt, pxe); + return await deployContract(wallet, artifact, typedArgs, salt, pxe); } if (functionAbi.functionType === 'unconstrained') { - return await viewContractFunction(contractAddress!, contractAbi, functionName, typedArgs, pxe, wallet); + return await viewContractFunction(contractAddress!, artifact, functionName, typedArgs, pxe, wallet); } else { - const txnReceipt = await callContractFunction(contractAddress!, contractAbi, functionName, typedArgs, pxe, wallet); + const txnReceipt = await callContractFunction(contractAddress!, artifact, functionName, typedArgs, pxe, wallet); return `Transaction ${txnReceipt.status} on block number ${txnReceipt.blockNumber}`; } } @@ -94,7 +94,7 @@ async function handleFunctionCall( interface ContractFunctionFormProps { wallet: CompleteAddress; contractAddress?: AztecAddress; - contractAbi: ContractArtifact; + artifact: ContractArtifact; functionAbi: FunctionArtifact; defaultAddress: string; title?: string; @@ -109,7 +109,7 @@ interface ContractFunctionFormProps { export function ContractFunctionForm({ wallet, contractAddress, - contractAbi, + artifact: contractAbi, functionAbi, defaultAddress, buttonText = 'Submit', diff --git a/yarn-project/boxes/private-token/src/app/contract.tsx b/yarn-project/boxes/private-token/src/app/contract.tsx index c1a192a16b8..3bf292a5b4b 100644 --- a/yarn-project/boxes/private-token/src/app/contract.tsx +++ b/yarn-project/boxes/private-token/src/app/contract.tsx @@ -1,4 +1,4 @@ -import { FILTERED_FUNCTION_NAMES, contractAbi } from '../config.js'; +import { FILTERED_FUNCTION_NAMES, contractArtifact } from '../config.js'; import { Copy } from './components/copy.js'; import { ContractFunctionForm, Popup } from './components/index.js'; import styles from './contract.module.scss'; @@ -40,12 +40,12 @@ export function Contract({ wallet }: Props) { setProcessingFunction(''); }; - const constructorAbi = contractAbi.functions.find(f => f.name === 'constructor')!; + const constructorAbi = contractArtifact.functions.find(f => f.name === 'constructor')!; const hasResult = !!(result || errorMsg); function renderCardContent(contractAddress?: AztecAddress): { content: ReactNode; header: string } { if (contractAddress) { - const functions = contractAbi.functions + const functions = contractArtifact.functions .filter(f => f.name !== 'constructor' && !f.isInternal && !FILTERED_FUNCTION_NAMES.includes(f.name)) .sort((a, b) => functionTypeSortOrder[a.functionType] - functionTypeSortOrder[b.functionType]); @@ -55,7 +55,7 @@ export function Contract({ wallet }: Props) { content: (
-
{`${contractAbi.name}`}
+
{`${contractArtifact.name}`}
{!!contractAddress && (
{`${contractAddress.toShortString()}`} @@ -96,7 +96,7 @@ export function Contract({ wallet }: Props) { key={selectedFunctionAbi.name} wallet={wallet} contractAddress={contractAddress} - contractAbi={contractAbi} + artifact={contractArtifact} functionAbi={selectedFunctionAbi} defaultAddress={wallet.address.toString()} isLoading={processingFunction === selectedFunctionAbi.name && !hasResult} @@ -111,11 +111,11 @@ export function Contract({ wallet }: Props) { } return { - header: `Deploy Contract (${contractAbi.name})`, + header: `Deploy Contract (${contractArtifact.name})`, content: ( + diff --git a/yarn-project/boxes/private-token/src/config.ts b/yarn-project/boxes/private-token/src/config.ts index 2f041404b04..82bca67af78 100644 --- a/yarn-project/boxes/private-token/src/config.ts +++ b/yarn-project/boxes/private-token/src/config.ts @@ -4,7 +4,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; // update this if using a different contract -export const contractAbi: ContractArtifact = PrivateTokenContractArtifact; +export const contractArtifact: ContractArtifact = PrivateTokenContractArtifact; export const PXE_URL: string = process.env.PXE_URL || 'http://localhost:8080'; export const pxe: PXE = createPXEClient(PXE_URL); diff --git a/yarn-project/boxes/private-token/src/scripts/call_contract_function.ts b/yarn-project/boxes/private-token/src/scripts/call_contract_function.ts index 854803eaa42..4d5519814c6 100644 --- a/yarn-project/boxes/private-token/src/scripts/call_contract_function.ts +++ b/yarn-project/boxes/private-token/src/scripts/call_contract_function.ts @@ -1,10 +1,10 @@ import { getWallet } from './util.js'; import { AztecAddress, PXE, CompleteAddress, Contract } from '@aztec/aztec.js'; -import { ContractArtifact } from '@aztec/foundation/abi'; +import { ContractArtifact as artifact } from '@aztec/foundation/abi'; export async function callContractFunction( address: AztecAddress, - abi: ContractArtifact, + abi: artifact, functionName: string, typedArgs: any[], // for the exposed functions, this is an array of field elements Fr[] pxe: PXE, diff --git a/yarn-project/boxes/private-token/src/scripts/deploy_contract.ts b/yarn-project/boxes/private-token/src/scripts/deploy_contract.ts index 0053296bcef..84c28cf6318 100644 --- a/yarn-project/boxes/private-token/src/scripts/deploy_contract.ts +++ b/yarn-project/boxes/private-token/src/scripts/deploy_contract.ts @@ -4,12 +4,12 @@ import { PXE } from '@aztec/types'; export async function deployContract( activeWallet: CompleteAddress, - contractAbi: ContractArtifact, + artifact: ContractArtifact, typedArgs: Fr[], // encode prior to passing in salt: Fr, pxe: PXE, ): Promise { - const tx = new DeployMethod(activeWallet.publicKey, pxe, contractAbi, typedArgs).send({ + const tx = new DeployMethod(activeWallet.publicKey, pxe, artifact, typedArgs).send({ contractAddressSalt: salt, }); await tx.wait(); diff --git a/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts b/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts index e647f3b9572..8b3bfd8e901 100644 --- a/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts +++ b/yarn-project/boxes/private-token/src/scripts/view_contract_function.ts @@ -4,7 +4,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; export async function viewContractFunction( address: AztecAddress, - abi: ContractArtifact, + artifact: ContractArtifact, functionName: string, typedArgs: any[], pxe: PXE, @@ -12,7 +12,7 @@ export async function viewContractFunction( ) { // we specify the account that is calling the view function by passing in the wallet to the Contract const selectedWallet = await getWallet(wallet, pxe); - const contract = await Contract.at(address, abi, selectedWallet); + const contract = await Contract.at(address, artifact, selectedWallet); return await contract.methods[functionName](...typedArgs).view({ from: wallet.address }); } diff --git a/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts b/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts index 3f845c3268e..4f3da34e3a7 100644 --- a/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts +++ b/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts @@ -42,7 +42,14 @@ async function deployZKContract(owner: CompleteAddress, wallet: Wallet, pxe: PXE async function getBalance(contractAddress: AztecAddress, privateTokenContract: Contract, owner: CompleteAddress) { const typedArgs = [owner.address.toField()]; - return await viewContractFunction(contractAddress, privateTokenContract.artifact, 'getBalance', typedArgs, pxe, owner); + return await viewContractFunction( + contractAddress, + privateTokenContract.artifact, + 'getBalance', + typedArgs, + pxe, + owner, + ); } async function mint( diff --git a/yarn-project/circuits.js/src/contract/contract_deployment_info.ts b/yarn-project/circuits.js/src/contract/contract_deployment_info.ts index fb7d1bc5ff9..df1d8efade5 100644 --- a/yarn-project/circuits.js/src/contract/contract_deployment_info.ts +++ b/yarn-project/circuits.js/src/contract/contract_deployment_info.ts @@ -11,37 +11,37 @@ import { generateFunctionLeaves, hashVKStr, isConstructor } from './contract_tre /** * Generates the deployment info for a contract - * @param abi - The account contract abi + * @param artifact - The account contract build artifact. * @param args - The args to the account contract constructor * @param contractAddressSalt - The salt to be used in the contract address derivation * @param publicKey - The account public key * @returns - The contract deployment info */ export async function getContractDeploymentInfo( - abi: ContractArtifact, + artifact: ContractArtifact, args: any[], contractAddressSalt: Fr, publicKey: PublicKey, ): Promise { - const constructorAbi = abi.functions.find(isConstructor); - if (!constructorAbi) { - throw new Error('Cannot find constructor in the ABI.'); + const constructorArtifact = artifact.functions.find(isConstructor); + if (!constructorArtifact) { + throw new Error('Cannot find constructor in the artifact.'); } - if (!constructorAbi.verificationKey) { + if (!constructorArtifact.verificationKey) { throw new Error('Missing verification key for the constructor.'); } const wasm = await CircuitsWasm.get(); - const vkHash = hashVKStr(constructorAbi.verificationKey, wasm); + const vkHash = hashVKStr(constructorArtifact.verificationKey, wasm); const constructorVkHash = Fr.fromBuffer(vkHash); - const functions = abi.functions.map(f => ({ + const functions = artifact.functions.map(f => ({ ...f, selector: FunctionSelector.fromNameAndParameters(f.name, f.parameters), })); const leaves = generateFunctionLeaves(functions, wasm); const functionTreeRoot = computeFunctionTreeRoot(wasm, leaves); - const functionData = FunctionData.fromAbi(constructorAbi); - const flatArgs = encodeArguments(constructorAbi, args); + const functionData = FunctionData.fromAbi(constructorArtifact); + const flatArgs = encodeArguments(constructorArtifact, args); const argsHash = await computeVarArgsHash(wasm, flatArgs); const constructorHash = hashConstructor(wasm, functionData, argsHash, constructorVkHash.toBuffer()); diff --git a/yarn-project/circuits.js/src/structs/function_data.ts b/yarn-project/circuits.js/src/structs/function_data.ts index a2fffc173de..9838417a13b 100644 --- a/yarn-project/circuits.js/src/structs/function_data.ts +++ b/yarn-project/circuits.js/src/structs/function_data.ts @@ -1,4 +1,4 @@ -import { FunctionAbiHeader, FunctionSelector, FunctionType } from '@aztec/foundation/abi'; +import { FunctionAbi, FunctionSelector, FunctionType } from '@aztec/foundation/abi'; import { BufferReader } from '@aztec/foundation/serialize'; import { ContractFunctionDao } from '../index.js'; @@ -28,7 +28,7 @@ export class FunctionData { public isConstructor: boolean, ) {} - static fromAbi(abi: FunctionAbiHeader | ContractFunctionDao): FunctionData { + static fromAbi(abi: FunctionAbi | ContractFunctionDao): FunctionData { return new FunctionData( FunctionSelector.fromNameAndParameters(abi.name, abi.parameters), abi.isInternal, diff --git a/yarn-project/circuits.js/src/types/contract_function_dao.ts b/yarn-project/circuits.js/src/types/contract_function_dao.ts index cec233464e7..84675ecb65e 100644 --- a/yarn-project/circuits.js/src/types/contract_function_dao.ts +++ b/yarn-project/circuits.js/src/types/contract_function_dao.ts @@ -4,7 +4,7 @@ import { FunctionSelector } from '../index.js'; /** * A contract function Data Access Object (DAO). - * Extends the FunctionAbi interface, adding a 'selector' property. + * Extends the FunctionArtifact interface, adding a 'selector' property. * The 'selector' is a unique identifier for the function within the contract. */ export interface ContractFunctionDao extends FunctionArtifact { diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index 3655f91eebf..14af57dc8cd 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -27,9 +27,9 @@ import { encodeArgs, parseStructString } from './encoding.js'; import { unboxContract } from './unbox.js'; import { deployAztecContracts, - getAbiFunction, getContractArtifact, getExampleContractArtifacts, + getFunctionArtifact, getTxSender, parseAztecAddress, parseField, @@ -194,7 +194,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { const client = await createCompatibleClient(rpcUrl, debugLogger); const deployer = new ContractDeployer(contractAbi, client, publicKey); - const constructor = getAbiFunction(contractAbi, 'constructor'); + const constructor = getFunctionArtifact(contractAbi, 'constructor'); if (!constructor) throw new Error(`Constructor not found in contract ABI`); debugLogger(`Input arguments: ${rawArgs.map((x: any) => `"${x}"`).join(', ')}`); @@ -432,7 +432,7 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .action(async (functionName, options) => { const { functionArgs, contractAbi } = await prepTx(options.contractAbi, functionName, options.args, log); - const fnAbi = getAbiFunction(contractAbi, functionName); + const fnAbi = getFunctionArtifact(contractAbi, functionName); if (fnAbi.parameters.length !== options.args.length) { throw Error( `Invalid number of args passed. Expected ${fnAbi.parameters.length}; Received: ${options.args.length}`, diff --git a/yarn-project/cli/src/utils.ts b/yarn-project/cli/src/utils.ts index 387a781075c..b159c23176b 100644 --- a/yarn-project/cli/src/utils.ts +++ b/yarn-project/cli/src/utils.ts @@ -30,12 +30,12 @@ interface ArtifactsType { /** * Helper to get an ABI function or throw error if it doesn't exist. - * @param abi - Contract's ABI in JSON format. + * @param artifact - Contract's build artifact in JSON format. * @param fnName - Function name to be found. * @returns The function's ABI. */ -export function getAbiFunction(abi: ContractArtifact, fnName: string) { - const fn = abi.functions.find(({ name }) => name === fnName); +export function getFunctionArtifact(artifact: ContractArtifact, fnName: string) { + const fn = artifact.functions.find(({ name }) => name === fnName); if (!fn) { throw Error(`Function ${fnName} not found in contract ABI.`); } @@ -112,14 +112,14 @@ export async function getContractArtifact(fileDir: string, log: LogFn) { } // if not found, try reading as path directly - let contractAbi: ContractArtifact; + let contractArtifact: ContractArtifact; try { - contractAbi = JSON.parse(contents) as ContractArtifact; + contractArtifact = JSON.parse(contents) as ContractArtifact; } catch (err) { log('Invalid file used. Please try again.'); throw err; } - return contractAbi; + return contractArtifact; } /** @@ -158,7 +158,7 @@ export async function getTxSender(pxe: PXE, _from?: string) { */ export async function prepTx(contractFile: string, functionName: string, _functionArgs: string[], log: LogFn) { const contractAbi = await getContractArtifact(contractFile, log); - const functionAbi = getAbiFunction(contractAbi, functionName); + const functionAbi = getFunctionArtifact(contractAbi, functionName); const functionArgs = encodeArgs(_functionArgs, functionAbi.parameters); return { functionArgs, contractAbi }; diff --git a/yarn-project/foundation/src/abi/abi.ts b/yarn-project/foundation/src/abi/abi.ts index 68fdeff8be0..4cdaed34511 100644 --- a/yarn-project/foundation/src/abi/abi.ts +++ b/yarn-project/foundation/src/abi/abi.ts @@ -109,9 +109,9 @@ export enum FunctionType { } /** - * The ABI entry of a function without including bytecode and verification key. + * The abi entry of a function. */ -export interface FunctionAbiHeader { +export interface FunctionAbi { /** * The name of the function. */ @@ -135,9 +135,9 @@ export interface FunctionAbiHeader { } /** - * The ABI entry of a function. + * The artifact entry of a function. */ -export interface FunctionArtifact extends FunctionAbiHeader { +export interface FunctionArtifact extends FunctionAbi { /** * The ACIR bytecode of the function. */ @@ -258,21 +258,21 @@ export interface FunctionDebugMetadata { } /** - * Gets the debug metadata of a given function from the contract abi - * @param abi - The contract abi + * Gets the debug metadata of a given function from the contract artifact + * @param artifact - The contract build artifact * @param functionName - The name of the function * @returns The debug metadata of the function */ export function getFunctionDebugMetadata( - abi: ContractArtifact, + artifact: ContractArtifact, functionName: string, ): FunctionDebugMetadata | undefined { - const functionIndex = abi.functions.findIndex(f => f.name === functionName); - if (abi.debug && functionIndex !== -1) { + const functionIndex = artifact.functions.findIndex(f => f.name === functionName); + if (artifact.debug && functionIndex !== -1) { const debugSymbols = JSON.parse( - inflate(Buffer.from(abi.debug.debugSymbols[functionIndex], 'base64'), { to: 'string' }), + inflate(Buffer.from(artifact.debug.debugSymbols[functionIndex], 'base64'), { to: 'string' }), ); - const files = abi.debug.fileMap; + const files = artifact.debug.fileMap; return { debugSymbols, files, diff --git a/yarn-project/foundation/src/abi/encoder.test.ts b/yarn-project/foundation/src/abi/encoder.test.ts index 8c48f4c2ca0..14316f9652a 100644 --- a/yarn-project/foundation/src/abi/encoder.test.ts +++ b/yarn-project/foundation/src/abi/encoder.test.ts @@ -1,11 +1,11 @@ import { AztecAddress } from '../aztec-address/index.js'; import { Fr } from '../fields/fields.js'; -import { ABIParameterVisibility, FunctionAbiHeader, FunctionArtifact, FunctionType } from './abi.js'; +import { ABIParameterVisibility, FunctionAbi, FunctionArtifact, FunctionType } from './abi.js'; import { encodeArguments } from './encoder.js'; describe('abi/encoder', () => { it('serializes fields as fields', () => { - const abi: FunctionAbiHeader = { + const abi: FunctionAbi = { name: 'constructor', functionType: FunctionType.SECRET, isInternal: false, @@ -26,7 +26,7 @@ describe('abi/encoder', () => { }); it.each(['AztecAddress', 'EthereumAddress'])('accepts address instance for %s structs', (structType: string) => { - const abi: FunctionAbiHeader = { + const abi: FunctionAbi = { name: 'constructor', functionType: FunctionType.SECRET, isInternal: false, diff --git a/yarn-project/foundation/src/abi/encoder.ts b/yarn-project/foundation/src/abi/encoder.ts index 5f0c903b8b3..8fccb8b3838 100644 --- a/yarn-project/foundation/src/abi/encoder.ts +++ b/yarn-project/foundation/src/abi/encoder.ts @@ -1,4 +1,4 @@ -import { ABIType, FunctionAbiHeader, isAddressStruct } from '@aztec/foundation/abi'; +import { ABIType, FunctionAbi, isAddressStruct } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; /** @@ -8,7 +8,7 @@ import { Fr } from '@aztec/foundation/fields'; class ArgumentEncoder { private flattened: Fr[] = []; - constructor(private abi: FunctionAbiHeader, private args: any[]) {} + constructor(private abi: FunctionAbi, private args: any[]) {} /** * Encodes a single argument from the given type to field. @@ -86,6 +86,6 @@ class ArgumentEncoder { * @param args - The arguments to encode. * @returns The encoded arguments. */ -export function encodeArguments(abi: FunctionAbiHeader, args: any[]) { +export function encodeArguments(abi: FunctionAbi, args: any[]) { return new ArgumentEncoder(abi, args).encode(); } diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts index 1c23469bf54..0900cfbcecf 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts @@ -272,19 +272,19 @@ ${contractImpl} /** * Generates the Noir code to represent an interface for calling a contract. - * @param abi - The compiled Aztec.nr artifact. + * @param artifact - The compiled Aztec.nr artifact. * @returns The corresponding ts code. */ -export function generateNoirContractInterface(abi: ContractArtifact) { +export function generateNoirContractInterface(artifact: ContractArtifact) { // We don't allow calling a constructor, internal fns, or unconstrained fns from other contracts const methods = compact( - abi.functions.filter( + artifact.functions.filter( f => f.name !== 'constructor' && !f.isInternal && f.functionType !== FunctionType.UNCONSTRAINED, ), ); const paramStructs = methods.flatMap(m => collectStructs(m.parameters, [m.name])).map(generateStruct); - const privateContractStruct = generateContractStruct(abi.name, 'private', methods); - const publicContractStruct = generateContractStruct(abi.name, 'public', methods); + const privateContractStruct = generateContractStruct(artifact.name, 'private', methods); + const publicContractStruct = generateContractStruct(artifact.name, 'public', methods); return `/* Autogenerated file, do not edit! */ diff --git a/yarn-project/pxe/src/contract_data_oracle/index.ts b/yarn-project/pxe/src/contract_data_oracle/index.ts index 419fce0319f..c24bab6496f 100644 --- a/yarn-project/pxe/src/contract_data_oracle/index.ts +++ b/yarn-project/pxe/src/contract_data_oracle/index.ts @@ -41,7 +41,7 @@ export class ContractDataOracle { */ public async getFunctionAbi(contractAddress: AztecAddress, selector: FunctionSelector) { const tree = await this.getTree(contractAddress); - return tree.getFunctionAbi(selector); + return tree.getFunctionArtifact(selector); } /** diff --git a/yarn-project/pxe/src/contract_tree/index.ts b/yarn-project/pxe/src/contract_tree/index.ts index 834b28c2f60..4fd6a61cd91 100644 --- a/yarn-project/pxe/src/contract_tree/index.ts +++ b/yarn-project/pxe/src/contract_tree/index.ts @@ -29,7 +29,7 @@ import { AztecNode, ContractDao, MerkleTreeId, PublicKey, StateInfoProvider } fr /** * The ContractTree class represents a Merkle tree of functions for a particular contract. * It manages the construction of the function tree, computes its root, and generates membership witnesses - * for constrained functions. This class also enables lookup of specific function ABI and bytecode using selectors. + * for constrained functions. This class also enables lookup of specific function artifact using selectors. * It is used in combination with the AztecNode to compute various data for executing private transactions. */ export class ContractTree { @@ -40,7 +40,7 @@ export class ContractTree { constructor( /** - * The contract data object containing the ABI and contract address. + * The contract data object containing the artifact and contract address. */ public readonly contract: ContractDao, private stateInfoProvider: StateInfoProvider, @@ -52,13 +52,13 @@ export class ContractTree { ) {} /** - * Create a new ContractTree instance from the provided contract ABI, constructor arguments, and related data. + * Create a new ContractTree instance from the provided contract artifact, constructor arguments, and related data. * The function generates function leaves for constrained functions, computes the function tree root, * and hashes the constructor's verification key. It then computes the contract address using the contract * and portal contract addresses, contract address salt, and generated data. Finally, it returns a new * ContractTree instance containing the contract data and computed values. * - * @param abi - The contract's ABI containing the functions and their metadata. + * @param artifact - The contract's build artifact containing the functions and their metadata. * @param args - An array of Fr elements representing the constructor's arguments. * @param portalContract - The Ethereum address of the portal smart contract. * @param contractAddressSalt - An Fr element representing the salt used to compute the contract address. @@ -67,7 +67,7 @@ export class ContractTree { * @returns A new ContractTree instance containing the contract data and computed values. */ public static async new( - abi: ContractArtifact, + artifact: ContractArtifact, args: Fr[], portalContract: EthAddress, contractAddressSalt: Fr, @@ -75,29 +75,29 @@ export class ContractTree { node: AztecNode, ) { const wasm = await CircuitsWasm.get(); - const constructorAbi = abi.functions.find(isConstructor); - if (!constructorAbi) { + const constructorArtifact = artifact.functions.find(isConstructor); + if (!constructorArtifact) { throw new Error('Constructor not found.'); } - if (!constructorAbi.verificationKey) { + if (!constructorArtifact.verificationKey) { throw new Error('Missing verification key for the constructor.'); } - const functions = abi.functions.map(f => ({ + const functions = artifact.functions.map(f => ({ ...f, selector: FunctionSelector.fromNameAndParameters(f.name, f.parameters), })); const leaves = generateFunctionLeaves(functions, wasm); const root = computeFunctionTreeRoot(wasm, leaves); - const functionData = FunctionData.fromAbi(constructorAbi); - const vkHash = hashVKStr(constructorAbi.verificationKey, wasm); + const functionData = FunctionData.fromAbi(constructorArtifact); + const vkHash = hashVKStr(constructorArtifact.verificationKey, wasm); const argsHash = await computeVarArgsHash(wasm, args); const constructorHash = hashConstructor(wasm, functionData, argsHash, vkHash); const completeAddress = computeCompleteAddress(wasm, from, contractAddressSalt, root, constructorHash); const contractDao: ContractDao = { - ...abi, + ...artifact, completeAddress, functions, portalContract, @@ -110,23 +110,23 @@ export class ContractTree { } /** - * Retrieve the ABI of a given function. + * Retrieve the artifact of a given function. * The function is identified by its selector, which represents a unique identifier for the function's signature. * Throws an error if the function with the provided selector is not found in the contract. * * @param selector - The function selector. - * @returns The ABI object containing relevant information about the targeted function. + * @returns The artifact object containing relevant information about the targeted function. */ - public getFunctionAbi(selector: FunctionSelector) { - const abi = this.contract.functions.find(f => f.selector.equals(selector)); - if (!abi) { + public getFunctionArtifact(selector: FunctionSelector) { + const artifact = this.contract.functions.find(f => f.selector.equals(selector)); + if (!artifact) { throw new Error( - `Unknown function. Selector ${selector.toString()} not found in the ABI of contract ${this.contract.completeAddress.address.toString()}. Expected one of: ${this.contract.functions + `Unknown function. Selector ${selector.toString()} not found in the artifact of contract ${this.contract.completeAddress.address.toString()}. Expected one of: ${this.contract.functions .map(f => f.selector.toString()) .join(', ')}`, ); } - return abi; + return artifact; } /** @@ -138,7 +138,7 @@ export class ContractTree { * @returns The bytecode of the function as a string. */ public getBytecode(selector: FunctionSelector) { - return this.getFunctionAbi(selector).bytecode; + return this.getFunctionArtifact(selector).bytecode; } /** diff --git a/yarn-project/pxe/src/simulator_oracle/index.ts b/yarn-project/pxe/src/simulator_oracle/index.ts index a5d1ae03e43..0ba47fc9366 100644 --- a/yarn-project/pxe/src/simulator_oracle/index.ts +++ b/yarn-project/pxe/src/simulator_oracle/index.ts @@ -1,4 +1,4 @@ -import { DBOracle, FunctionAbiWithDebugMetadata, MessageLoadOracleInputs } from '@aztec/acir-simulator'; +import { DBOracle, FunctionArtifactWithDebugMetadata, MessageLoadOracleInputs } from '@aztec/acir-simulator'; import { AztecAddress, CompleteAddress, @@ -60,10 +60,10 @@ export class SimulatorOracle implements DBOracle { ); } - async getFunctionABI( + async getFunctionArtifact( contractAddress: AztecAddress, selector: FunctionSelector, - ): Promise { + ): Promise { const abi = await this.contractDataOracle.getFunctionAbi(contractAddress, selector); const debug = await this.contractDataOracle.getFunctionDebugMetadata(contractAddress, selector); return { From 863ba9496ac15e36d7c606abe5892b78eb3a4ed0 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 13:26:10 +0000 Subject: [PATCH 05/16] WIP --- .../src/client/private_execution.test.ts | 4 +- .../src/examples/private_token_contract.ts | 2 +- .../contract/ecdsa_account_contract.ts | 2 +- .../aztec.js/src/account/contract/index.ts | 4 +- .../contract/schnorr_account_contract.ts | 2 +- .../contract/single_key_account_contract.ts | 2 +- .../src/artifacts/ecdsa_account_contract.json | 698 ++++++++++++++++++ .../artifacts/schnorr_account_contract.json | 686 +++++++++++++++++ .../schnorr_single_key_account_contract.json | 621 ++++++++++++++++ yarn-project/aztec.js/src/contract/checker.ts | 6 +- .../src/contract_deployer/deploy_method.ts | 8 +- yarn-project/aztec.js/src/sandbox/index.ts | 2 +- .../boxes/blank-react/src/artifacts/blank.ts | 6 +- .../src/tests/blank.contract.test.ts | 2 +- yarn-project/boxes/blank/README.md | 4 +- yarn-project/boxes/private-token/README.md | 4 +- .../src/artifacts/private_token.ts | 6 +- .../src/tests/privatetoken.sandbox.test.ts | 2 +- yarn-project/cli/README.md | 32 +- yarn-project/cli/src/utils.ts | 8 +- .../src/contract-interface-gen/abi.ts | 14 +- yarn-project/noir-compiler/src/index.ts | 6 +- .../pxe/src/contract_data_oracle/index.ts | 14 +- .../pxe/src/pxe_service/pxe_service.ts | 26 +- .../pxe/src/simulator_oracle/index.ts | 4 +- yarn-project/types/src/contract_data.ts | 2 +- 26 files changed, 2086 insertions(+), 81 deletions(-) create mode 100644 yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json create mode 100644 yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json create mode 100644 yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json diff --git a/yarn-project/acir-simulator/src/client/private_execution.test.ts b/yarn-project/acir-simulator/src/client/private_execution.test.ts index 8a23a36d4cf..ad4b8843ccc 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.test.ts @@ -235,7 +235,7 @@ describe('Private Execution test suite', () => { ); }); - it('should have an abi for computing note hash and nullifier', async () => { + it('should have an artifact for computing note hash and nullifier', async () => { const storageSlot = Fr.random(); const note = buildNote(60n, owner, storageSlot); @@ -416,7 +416,7 @@ describe('Private Execution test suite', () => { ); }); - it('should have an abi for computing note hash and nullifier', async () => { + it('should have an artifact for computing note hash and nullifier', async () => { const storageSlot = Fr.random(); const note = buildNote(60n, owner, storageSlot); diff --git a/yarn-project/aztec-sandbox/src/examples/private_token_contract.ts b/yarn-project/aztec-sandbox/src/examples/private_token_contract.ts index 1617c170a08..8b71aa22f99 100644 --- a/yarn-project/aztec-sandbox/src/examples/private_token_contract.ts +++ b/yarn-project/aztec-sandbox/src/examples/private_token_contract.ts @@ -25,7 +25,7 @@ const SECONDARY_AMOUNT = 33n; /** * Deploys the Private Token contract. * @param owner - The address that the initial balance will belong to. - * @returns An Aztec Contract object with the private token's ABI. + * @returns An Aztec Contract object with the private token's artifact. */ async function deployZKContract(owner: AztecAddress) { logger('Deploying L2 contract...'); diff --git a/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts b/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts index 8ec7c388366..d238b8c417f 100644 --- a/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts +++ b/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts @@ -3,7 +3,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress } from '@aztec/types'; -import EcdsaAccountContractArtifact from '../../abis/ecdsa_account_contract.json' assert { type: 'json' }; +import EcdsaAccountContractArtifact from '../../artifacts/ecdsa_account_contract.json' assert { type: 'json' }; import { AuthWitnessProvider } from '../interface.js'; import { BaseAccountContract } from './base_account_contract.js'; diff --git a/yarn-project/aztec.js/src/account/contract/index.ts b/yarn-project/aztec.js/src/account/contract/index.ts index d8da7305576..611721b64c8 100644 --- a/yarn-project/aztec.js/src/account/contract/index.ts +++ b/yarn-project/aztec.js/src/account/contract/index.ts @@ -10,12 +10,12 @@ export * from './base_account_contract.js'; // docs:start:account-contract-interface /** - * An account contract instance. Knows its ABI, deployment arguments, how to create + * An account contract instance. Knows its artifact, deployment arguments, how to create * transaction execution requests out of function calls, and how to authorize actions. */ export interface AccountContract { /** - * Returns the ABI of this account contract. + * Returns the artifact of this account contract. */ getContractArtifact(): ContractArtifact; diff --git a/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts b/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts index 7d02c99e555..2f963a468de 100644 --- a/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts +++ b/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts @@ -3,7 +3,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress, GrumpkinPrivateKey } from '@aztec/types'; -import SchnorrAccountContractArtifact from '../../abis/schnorr_account_contract.json' assert { type: 'json' }; +import SchnorrAccountContractArtifact from '../../artifacts/schnorr_account_contract.json' assert { type: 'json' }; import { AuthWitnessProvider } from '../interface.js'; import { BaseAccountContract } from './base_account_contract.js'; diff --git a/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts b/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts index 6c0c9f8ec0b..63cfc44524e 100644 --- a/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts +++ b/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts @@ -4,7 +4,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress, GrumpkinPrivateKey } from '@aztec/types'; -import SchnorrSingleKeyAccountContractArtifact from '../../abis/schnorr_single_key_account_contract.json' assert { type: 'json' }; +import SchnorrSingleKeyAccountContractArtifact from '../../artifacts/schnorr_single_key_account_contract.json' assert { type: 'json' }; import { generatePublicKey } from '../../index.js'; import { AuthWitnessProvider } from '../interface.js'; import { BaseAccountContract } from './base_account_contract.js'; diff --git a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json new file mode 100644 index 00000000000..f8617f768f2 --- /dev/null +++ b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json @@ -0,0 +1,698 @@ +{ + "name": "EcdsaAccount", + "functions": [ + { + "name": "compute_note_hash_and_nullifier", + "functionType": "unconstrained", + "isInternal": false, + "parameters": [ + { + "name": "contract_address", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "nonce", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "storage_slot", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "preimage", + "type": { + "kind": "array", + "length": 5, + "type": { + "kind": "field" + } + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "signing_pub_key_x", + "type": { + "kind": "array", + "length": 32, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + }, + { + "name": "signing_pub_key_y", + "type": { + "kind": "array", + "length": 32, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "H4sIAAAAAAAA/+2dB5QUxRaGa3fZJaoYyTnn7s1LXHLOQX2KyMIsroCLsIg8nznniIiIiIjkZM45B8w5PPXl7MvZ9+pCjRTlLDu980/4j1Pn3HP37syp+b9/Znq6u6qr92QodaYOaZIydWSbv8N1jlPXdeomOupZdVOnbubUzZ26hVO3dOpWTt3aqds4dVunbufU7Z26g1N3dOpOTt3Zqbs4dVen7ubU3Z26h1P3dOpeTt3bqfs4tefUvlPnOnWeU+c7dYFTFzp1kVMXO3WJU/d16n5O3d+pBzj1QKce5NSlTj3YqYc49VCnHubUw516hFOPdOpRTj3aqcc49VinHufU4516glNPdOpJTj3Zqac49VSnnubU0516hlXLtqGt2tdkO/CN2vf9l9zM5OYmtzC5pcmtTG5tchuT25rczuT2JncwuaPJnUzubHIXk7ua3M3k7ib3MLmnyb1M7m1yH5M9k32Tc03OMznf5AKTC61+j9VxXARvisxzik0uMbmvyf1M7m/yAJMHmjzI5FKTB5s8xOShJg8zebjJI0weafIok0ebPMbksSaPM3m8yRNMnmjyJJMnmzzF5KkmTzN5uskzLG+O1/EDdWAzPz17uaTleYX5+aGi3JCf58/2ckvKigu8/IKywmK/2C8oLpibW5yXFyrOLy4qKSsp8kr8/LyQX15Qklfu7WsnWH15MbZ46jyRROdMEp0nkeicRaLzZBKds0l0lpHonEOicy6JzhCJznISnfNIdJ4C1Bnel2xs+pN9TNmnOt7kE0w+0eSZJp9k8iyTTzZ5tsllJs8xea7JIZPLTZ5n8ilq/75chY5T1YEN7eF8nId+2MOwxvmGRf63QMdChyXLYZE+vBhaE5clht6aAj0+ISM+36cI/nmxUDdTEXTWsrfmQP9OTKx/Xm2pW6hqdNait5ZA/2Ym3j+vNtSt1EF0BuytNdC/k5LjnxeUuo2qQWeA3toC/ZuVPP+8INTtVBQ6o+ytPdC/k5PrnxctdQcVpc4oeusI9G928v3zoqHupALorKG3zkD/ylLDP68m6i4qoM6D9NYV6N+c1PHPOxh1N1ULndX01h3o39zU8s+rjrqHqqXOCL31BPoXSj3/vEjUvVQMOp3eegP9K09N/zyXuo+KUafdG9C/eanrn2dT+wqg0/SWC/TvlNT2zwtT5ymQTt1bPtC/itT3T5pfAOzLPucUq3+nkvgHPE/kzwT6N5/EP+B5Dn8W0L8FJP4Bj9P92UD/FpL4BzzO9OcA/TuNxD/gcZIfAvpXSeIfcD/fnwf0bxGJf8D9VL8C6N/pJP4B97P8+UD/FpP4B9xP8BcC/VtC4h/wd86vBPpXReIfcDvtnw70bymJf8DtjL8E6N8ZJP4Bvyf+UqB/yxLkX8z7+cD3AviZ8Zcl7vMX0/yrIoWbf1UMfF9XkMy/KlG4+Vd9gf7dTDL/qp/Czb/qD/RvJcn8qwEKN/9qINC/W0jmXw1SuPlXpUD/VpHMvxqsotAZZW9DgP7dSjL/aqiKUmcUvQ0D+reaZP7VcBVAZw29jQD6dxvJ/KuRKqDOg/Q2CujfGpL5V6NVLXRW09sYoH+3k8y/GqtqqTNCb+OA/q0lmX81XsWg0+ltAtC/O0jmX01UMeq0epsE9G8dyfyryQqg0/Q2BejfnSTzr6YqkE7d2zSgf+tJzp9OB/a1Anj+9C4S/4DnifyVQP82kPgHPM/hrwL6dzeJf8DjdH810L+NJP4BjzP9NUD/NpH4BzxO8tcC/dtM4h9wP99fB/RvC4l/wP1Ufz3Qv60k/gH3s/wNQP+2kfgH3E/wNwL9207iH/B3zt8M9G8HiX/A7bS/FejfThL/gNsZfzvQv10k/gG/J/5OoH+7SeZfVQLfC+Bnxkf6F14jK9v0J3PO7PVtK9WBa7pmmixtkY7T1YENvR7YYuB7EGbNNP0tNiyLLKYlOqrMZylLVd9KgZqynb7bfPc1UnIdMvOvlFvfy/p3Sq2b5TyUMutRRXg4JdZ5quYpSV8/6SBPS+q6RDU8NWnr/Xg1t6Sso+NF1xK+Po0XfUvoui9esJaw9VS84C0h65R4tWtxX//Dq32L67oaXmwNuV7Ft8cV7v6sF1vzC+OgEb2/GK/rJsy/Uu56BOvfKTXP33koZebPR3g4JealV/OUpM/3PsjTkjqPuoanJm1+sldzS8q8Xy+6lvD5tF70LaHzVL1gLWHzP73gLSHzKr3atbjPV/Rq3+I6D9CLrSHn18Vtf3EGgcbMOGiMh84lQJ0Zls6l1t+NTK6vo475O9P6X5bDVt96PNxyrL9LMXoLcvB+enLeup7FoRzeQ83jh5v6tMqqivLlQxeHZleF5k6orArZJoZPgmdF6CjD+r99sryO9eI5zuO2seHHwjcxPaCVKogbvt0n+pO7FNeXlxXJBJXaW4UMS2P4g3CGjmU6zrQYDlHfffPDLQ7fKi9e36ociyPc7G+VPF4H+7p59tZJWX6rCL4p6/XlGx7e6s0LVU1aWragYs7Y0PJI71lWhH7traO7EbDfx/Bjcf0Sh4cI7Q+ZDA0uM/lMkw/TsVzHDx0dmY6eWIc/gV8if7nCbkTcYUuleHYt0J+beHpwRpw8QOtcprAb/PSweHpYPJqWHhYP1lt6WDxYb+lh8WC9pYfFg/WWHhYP1lt6WDxYb+lh8W/7TQ+L19DSw+JeoJYeFg/WW3pYPFhv6WHxYL2lh8WD9ZYeFg/WW3pYPFgz3aSHxWNs9mBKpvn7LB0/UvtbC5Pt0VB7hDTS4Mr3YYi6gcWhHN7wEHVjU4cWVlQNP23O4uWL9BD1uMp59kBTXZOzI/Rj+yqtjvV3tuWnO0qdY+kqxTDn1lf7h+WV9dp2K7X+rm9paYDVsve71dB6rbCu8Os0tB6va+loiNWxd1yvgcNva4jT6+7lb1QDf6MIOholkN+estLA0Wl/98OPJW0WRayDqWcr/I9GPHSeQ6LzXBKd55HoPJ9E5wUkOi8k0XkRic6LSXReQqLzUhKdl5HovJxE5xUkOq8k0XkVic6rSXReQ6LzWhKd15HovJ5E5w0kOm8k0XkTic4VJDpvJtG5kkTnLSQ6V5HovJVE52oSnbeR6FxDovN2Ep1rSXTeQaJzHYnOO0l0rifReReJzg0kOu8m0bmRROcmEp2bSXRuIdG5lUTnNhKd20l07iDRuZNE5y4SnbtJdN5DovNeEp33kei8n0TnAyQ6HyTR+RCJzodJdD5CovNREp2Pkeh8nETnEyQ6n8ToLM/PzY+rzqdI/HyaROczJDqfJdH5HInO50l0vkCi80USnS+R6HyZROcrJDpfJdH5GonO10l07iHR+QaJzjdJdL5FovNtEp3vkOh8l0TneyQ63yfR+QGJzg9JdH5EovNjEp2fkOj8lETnZyQ6P4+TzkxHpxdb27uoAor5xyTMmUDmL0iYs4DMX5Iw1wEyf0XCnA1k/gkJcw6Q+ackzHWBzD8jYa4AMv+chPlsIPMvSJjPATL/koT5XCDzr0iYzwMy/5qE+Xwg829ImC8AMv+WhPlCIPPvSJgvAjL/noT5YiDzH0iYLwEyf03CfCmQ+Y8kzJcBmf9Ewnw5kPnPJMxXAJn/QsJ8JZD5ryTMVwGZ/0bCfDWQ+e8kzNcAmf9BwnwtkPmfJMzXAZn/RcJ8PZD53yTMNwCZ/0PCfCOQ+b8kzDcBmb8hYV4BZP4fCfPNQGaZuMDAvBLInEHCfAuQOZOEeRWQOYuE+VYgcx0S5tVA5mwS5tuAzDkkzGuAzHVJmG8HMtcjYV4LZK5PwnyHwjE3IGFeAmRuSMK8DsjciIT5TiDzISTM64HMh5Iw3wVkPoyEeQOQuTEJ891A5sNJmDcCmY8gYd4EZD6ShHkzkPkoEuYtQOajSZi3ApmPIWHeBmRuQsK8HcjclIR5B5C5GQnzTiBzcxLmBUDmFiTMu4DMLUmYdwOZW5Ew3wNkbk3CfC+QuQ0J831A5rYkzPcDmduRMD8AZG5PwvwgkLkDCfNDQOaOJMwPA5k7kTA/AmTuTML8KJC5CwnzY0DmriTMjwOZu5EwPwFk7k7C/CSQuQcJ81NA5p4kzE8DmXuRMD8DZO5NwvwskLkPCfNzQGaPhPl5ILNPwvwCkDmXhPlFIHMeCfNLQOZ8EuaXgcwFJMyvAJkLSZhfBTIXkTC/BmQuJmF+HchcQsK8B8jcl4T5DSBzPxLmN4HM/UmY3wIyDyBhfhvIPJCE+R0g8yAS5neBzKUkzO8BmQeTML8PZB5CwvwBkHkoCfOHQOZhJMwfAZmHkzB/DGQeQcL8CZB5JAnzp0DmUSTMnwGZR5Mwfw5kHkPCXA/IPJaEuT6QeRwJcwMg83gS5oZA5gkkzI2AzBNJmA8BMk8iYT4UyDyZhPkwIPMUEubGQOapJMyHA5mnkTAfAWSeTsJ8JJB5BgnzUUDmY0mYjwYyH0fCfAyQ+Xgg8zGmnwzDLPfBlPtCyn0S5b6Bch89OSaUYyQ5ZpB9aNmnlH0s2eeQ32D5TZJttGyz5Dssn2l5j23mJjqa6mimo7mOFjpa6milo7WONjra6mino72ODjo66uiko7OOLjq66uimo7uOHjp66uilo7eOPuKFDl9HrnisI19HgY5CHUU6inWU6Oiro5+O/joG6BioY5DROljHEB1DdQzTMVzHCB0jdYzSMVrHGB1jdYzTMV7HBB0TdUzSMVnHFB1TdUzTMV3HDB1nGR/kHrBf6PhSx1c65B6Sck9Fuceg3HNP7kEn92STe5TJPbvkHlZyTye5x5Hc80fugfO1DrlHitwzRO6hIfeUkHssyD0HZA1+WZNe1miXNctlDW9Z01rWeJY1j2UNYHmzZY1YWTNV1hCVNTVljUlZc1HWIJQ1+WSNOlmzTdYwkzW9ZI0rWfNJ1kCSNYFkjRxZM0bWUJE1RWSNDVlzQtZgkDUJ5Bp9uWZdruGWa5rlGl+55lWuAZVrIuUaQblmTq4hk2uq5BojueZGrkGRazLkGgWZsy9z2GVOt8xxljm/MgdW5oTKHEmZMyhz6GROmcyxkjlHMgdH5qTIHA2ZsyBj+DKmLWO8Mua5dwxQh4wRyZiJjCHIOXU5xyznXOUcpJyTk3NUcs5GzmHIMb0c48oxnxwDyTGB7CPLPqPsQ8k+hfzGym+ObINlmyTf0XD7P+maRAuMTwEA", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "authwit::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "function_calls", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "struct", + "path": "authwit::entrypoint::FunctionCall", + "fields": [ + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "target_address", + "type": { + "kind": "field" + } + }, + { + "name": "is_public", + "type": { + "kind": "boolean" + } + } + ] + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid_public", + "functionType": "open", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "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" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "set_is_valid_storage", + "functionType": "open", + "isInternal": true, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "value", + "type": { + "kind": "boolean" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "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" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ] +} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json new file mode 100644 index 00000000000..a050dcc129c --- /dev/null +++ b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json @@ -0,0 +1,686 @@ +{ + "name": "SchnorrAccount", + "functions": [ + { + "name": "compute_note_hash_and_nullifier", + "functionType": "unconstrained", + "isInternal": false, + "parameters": [ + { + "name": "contract_address", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "nonce", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "storage_slot", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "preimage", + "type": { + "kind": "array", + "length": 3, + "type": { + "kind": "field" + } + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "signing_pub_key_x", + "type": { + "kind": "field" + }, + "visibility": "public" + }, + { + "name": "signing_pub_key_y", + "type": { + "kind": "field" + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "H4sIAAAAAAAA/+2dZ3QUVRiGh91kQwrNQu+9s5vdNGsUsWFBxV4JbDAKBDGoEXvvvfde6L1aAHvH3hWwd+wdnBe/OVyW9fAj76LvwXvOPd9uJmf2eWZ37tyZufPdknqe19KvKAghv2bb6+B9JOV9jr12S/C+3GI8WpxIJEsKk7F4bEi0sKyitCiaKKooLo2VxopKi4YVlsbjydJEaUlZRVlJtCyWiCdjlUVl8cro36WFs65oHUsmOVuKcLYS4WwtwtlGhLOtCGc7Ec72IpwdRDg7inB2EuHsLMLZRYSzqwhnNxHO7iKcPUQ4e4pw9hLh7C3C2UeEs68IZz8RzqgIZ0yEs1CEMy7CmRDhLBLhLCZygg3X8trb+pr5daVfm1tsYbGlxVYWW1tsY7GtxXYW21vsYLGjxU4WO1vsYrGrxW4Wu1vsYbGnxV4We1vsY7GvxX4WoxZjFgstxi0mLBZZLHbWW+LXUm/twv4OyzyN39oWIpxbinBuJcK5tQjnNiKc24pwlotwbifCub0IZ38Rzh1EOAeIcO4owrmTx+/zNrb1ob+Hvl+ZxS0sbmlxK4tbW9zG4rYWyy1uZ3F7i/0t7mBxgMUdLe7krelz7uzXXby1C3sb7srbhrFgGwaMu5oL/jbQr7vZMrwP2/+knluELKLs7tc9Muy/Zwb8Q7a+Pc1ld8dpkF/3Mv+w98+lnMgUXs82jNatxJp5/PaCzdhcgDHkbZh2N1q3EhvkcdvdoOztvC6wmOvXLHsdcv4WTnHLdZYHJeK8LufwxiP87RnFOKr6joeX4tvQljex96Oqa6oqa/uPSQ6pSQ7bo7om6W7EbIvhNCtyGwN3eZbz4ZGU9bgbNliWbmAX7dflrpP9y92bt65oON1G8P7brUI9hzH4Aezj18F+3ddxaOCt++UHJQN7VTRTe1XE8QiKu1dheRb3c+Nu6+Q529tLs9085/Oxhwet3vBkzaCxFSOqhg5M1qb7zsJp1uu2jqmNgPs9BssyuhOndvPwI0MXaLDFfS028ut+ft0/hSOUwlPXbh5xJ4rt53EbkWxv3aLStWD/bjK5DfbJ0DZgcw72uA3+/93/ja/77x40grb0AL8e6K0prSy6vT63J5juILIxdMXzHA8vxTfoigeXiZIjq2oGjBo6pna03xXfrXq4e0DNsZidZj3udkXJcl5nO9szkvK/EYernONcmOutOf3wnM92S7nzOtdhyeOyrN638p3PCriCz8l3luc4HPlcjtX9l7wUf5chQ5+72r9gPf4FaTgKNqC/e2qel8Lp7vvBsn/tbLGuncaDPP5BIxOcB4twHiLCeagI52EinIeLcB4hwjlEhLNChHOoCOcwEc6kCGelCOdwEc4jRTirRDiPEuE8WoRzhAjnSBHOUSKc1SKco0U4jxHhHCPCeawIZ40I51gRzuNEOI8X4TxBhLNWhPNEEc5xIpwniXCeLMJ5igjnqSKcp4lwni7CeYYI55kinGeJcJ4twnmOCOe5IpzniXCeL8J5gQjnhSKcF4lwXizCeYkI56UinJeJcF4uwnmFCOeVIpxXiXBeLcJ5jQjntSKc14lwXi/CeYMI540inDdxOCsThYmMct4ssj1vEeG8VYTzNhHO20U47xDhvFOE8y4RzrtFOO8R4bxXhPM+Ec77RTjHi3BOEOGcKMI5SYRzsgjnFBHOqSKc00Q4p4twzhDhnCnCOUuEc7YI5xwRzrkinPNEOOeLcC7IEGcohTNat7I6qQLL+QER5xDR+UER5zDR+SER5yyi88MiztlE54UizhGi8yIR5xyi82IR552Jzo+IOB9EdH5UxPlgovNjIs6HEJ0fF3E+lOj8hIjzYUTnJ0WcDyc6PyXifATR+WkR5yFE52dEnCuIzs+KOA8lOj8n4jyM6Py8iHOS6PyCiHMl0XmJiPNwovOLIs5HEp1fEnGuIjq/LOJ8FNH5FRHno4nOr4o4jyA6vybiPJLo/LqI8yii8xsiztVE5zdFnEcTnd8ScT6G6Py2iPMYovM7Is7HEp3fFXGuITq/J+I8luj8vojzcUTnpSLOxxOdl4k4n0B0Xi7iXEt0/kDE+USi84cizuOIzh+JOJ9EdP5YxPlkovMnIs6DiM6fijifQnT+TMT5VKLz5yLOpxGdvxBxPp3o/KWI8xlE569EnM8kOn8t4nwW0fkbEeezic4rRJzPITp/K+J8LtH5OxHn84jO34s4n090/kHE+QKi848izhcSnX8Scb6I6PyziPNAovMvIs4XE51/FXG+hOj8m4jzpUTn30WcLyM6/yHifDnR+U8R5yuIzitFnK8kOq8Scb6K6IykEArOVxOd64k4X0N0Dok4X0t0Dos4X0d0zhJxvp7onC3ifAPROSLifCPROUfE+Saic30R55uJzrkizrcQnfNEnG8lOueLON9GdC4Qcb6d6NxAxPkOonNDEec7ic6NRJzvIjo3FnG+m+jcRMT5HqLzJiLO9xKdNxVxvo/ovJmI8/1E581FnMcTnZuKOE8gOjcTcZ5IdG4u4jyJ6NxCxHky0bmliPMUonMrEeepROfWIs7TiM5tRJynE53bijjPIDq3E3GeSXRuL+I8i+jcQcR5NtG5o4jzHKJzJxHnuUTnziLO84jOXUSc5xOdu4o4LyA6dxNxrk907i7inEt07iHinEd07ininE907iXiXEB07i3i3IDo3EfEuSHRua+IcyOicz8R58ZE56iIcxOic0zEeROic6GI86ZE57iI82ZE54SI8+ZE5yIR56ZE52Kic1NbTz1zxjyYmBcS8yRi3kDMo4dzQpwj4ZwBfWj0KdHHQp8Dx2Ack9BGo83CPozfNL7jps52bObX5n4dZ+8xFyrmBsVcmZg7cqFfF/l1sV8x9xzmYsPcZJirC3NXYS4nzG2EuX4w9w3mgsHcKJgrBHNnLPEr5lbAXAPIvY9c9MjNjlzlyN2NXNbI7Yxcx8j9i1y4yA2LXKnIHbrUr8v8utyvyD2IXHzITYdcbchdhlxeyG2FXE/IfYRcQMiNg1wxyJ2ywq/IrYFcE8i9gFwEeDYfz6rj2W08y4xne/GsK579xLOQeDYQz8qtsi8AzxbhWRs8e4JnMfBsAsbqY+w6xnJjbDPG+mLsK8aCYmwkxgpi7BzGkmFsFcYaYewNxqJgbAbGKuDePe5l494u7nXi3h/uheHeEO6V4N4BrqXj2jKuteLaI67F4doUrtXg2gXO5XFui3M9nPvgXAB9Y/QV0XdCXwLHVhxr0PaiLcK+WRxMHOyXvwCgVysmkOwAAA==", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "authwit::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "function_calls", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "struct", + "path": "authwit::entrypoint::FunctionCall", + "fields": [ + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "target_address", + "type": { + "kind": "field" + } + }, + { + "name": "is_public", + "type": { + "kind": "boolean" + } + } + ] + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid_public", + "functionType": "open", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "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" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "set_is_valid_storage", + "functionType": "open", + "isInternal": true, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "value", + "type": { + "kind": "boolean" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "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" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ] +} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json new file mode 100644 index 00000000000..6f79711a6ab --- /dev/null +++ b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json @@ -0,0 +1,621 @@ +{ + "name": "SchnorrSingleKeyAccount", + "functions": [ + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "authwit::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "function_calls", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "struct", + "path": "authwit::entrypoint::FunctionCall", + "fields": [ + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "target_address", + "type": { + "kind": "field" + } + }, + { + "name": "is_public", + "type": { + "kind": "boolean" + } + } + ] + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid_public", + "functionType": "open", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "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" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "set_is_valid_storage", + "functionType": "open", + "isInternal": true, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "value", + "type": { + "kind": "boolean" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "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" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ] +} diff --git a/yarn-project/aztec.js/src/contract/checker.ts b/yarn-project/aztec.js/src/contract/checker.ts index 6e06591675e..616b4840ae7 100644 --- a/yarn-project/aztec.js/src/contract/checker.ts +++ b/yarn-project/aztec.js/src/contract/checker.ts @@ -21,17 +21,17 @@ export function abiChecker(artifact: ContractArtifact) { artifact.functions.forEach(func => { if (!('name' in func && typeof func.name === 'string' && func.name.length > 0)) { - throw new Error('artifact function has no name'); + throw new Error('ABI function has no name'); } // TODO: implement a better check for bytecode (right now only checks if it's > 0) if (!('bytecode' in func && typeof func.bytecode === 'string' && func.bytecode.length > 0)) { - throw new Error('artifact function parameter has incorrect bytecode'); + throw new Error('ABI function parameter has incorrect bytecode'); } func.parameters.forEach(param => { if (!param.type) { - throw new Error('artifact function parameter has no type'); + throw new Error('ABI function parameter has no type'); } abiParameterTypeChecker(param.type); diff --git a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts b/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts index 9477061e11a..f6e1991e632 100644 --- a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts +++ b/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts @@ -38,7 +38,7 @@ export class DeployMethod extends Bas public completeAddress?: CompleteAddress = undefined; /** Constructor function to call. */ - private constructorAbi: FunctionArtifact; + private constructorArtifact: FunctionArtifact; constructor( private publicKey: PublicKey, @@ -49,7 +49,7 @@ export class DeployMethod extends Bas super(pxe); const constructorArtifact = artifact.functions.find(f => f.name === 'constructor'); if (!constructorArtifact) throw new Error('Cannot find constructor in the artifact.'); - this.constructorAbi = constructorArtifact; + this.constructorArtifact = constructorArtifact; } /** @@ -90,8 +90,8 @@ export class DeployMethod extends Bas new Fr(chainId), new Fr(protocolVersion), ); - const args = encodeArguments(this.constructorAbi, this.args); - const functionData = FunctionData.fromAbi(this.constructorAbi); + const args = encodeArguments(this.constructorArtifact, this.args); + const functionData = FunctionData.fromAbi(this.constructorArtifact); const execution = { args, functionData, to: completeAddress.address }; const packedArguments = await PackedArguments.fromArgs(execution.args); diff --git a/yarn-project/aztec.js/src/sandbox/index.ts b/yarn-project/aztec.js/src/sandbox/index.ts index 910b435347a..23d0b438a0f 100644 --- a/yarn-project/aztec.js/src/sandbox/index.ts +++ b/yarn-project/aztec.js/src/sandbox/index.ts @@ -3,7 +3,7 @@ import { sleep } from '@aztec/foundation/sleep'; import zip from 'lodash.zip'; -import SchnorrAccountContractArtifact from '../abis/schnorr_account_contract.json' assert { type: 'json' }; +import SchnorrAccountContractArtifact from '../artifacts/schnorr_account_contract.json' assert { type: 'json' }; import { AccountWalletWithPrivateKey, PXE, createPXEClient, getSchnorrAccount } from '../index.js'; export const INITIAL_SANDBOX_ENCRYPTION_KEYS = [ diff --git a/yarn-project/boxes/blank-react/src/artifacts/blank.ts b/yarn-project/boxes/blank-react/src/artifacts/blank.ts index e2ac9ac7433..3bef8cc447e 100644 --- a/yarn-project/boxes/blank-react/src/artifacts/blank.ts +++ b/yarn-project/boxes/blank-react/src/artifacts/blank.ts @@ -36,7 +36,7 @@ export class BlankContract extends ContractBase { * @returns A promise that resolves to a new Contract instance. */ public static async at(address: AztecAddress, wallet: Wallet) { - return Contract.at(address, BlankContract.abi, wallet) as Promise; + return Contract.at(address, BlankContract.artifact, wallet) as Promise; } /** @@ -54,9 +54,9 @@ export class BlankContract extends ContractBase { } /** - * Returns this contract's ABI. + * Returns this contract's artifact. */ - public static get abi(): ContractArtifact { + public static get artifact(): ContractArtifact { return BlankContractArtifact; } diff --git a/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts b/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts index d2e93285ad0..2b65b2a76b5 100644 --- a/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts +++ b/yarn-project/boxes/blank-react/src/tests/blank.contract.test.ts @@ -28,7 +28,7 @@ const setupSandbox = async () => { async function deployZKContract(owner: CompleteAddress, wallet: Wallet, pxe: PXE) { logger('Deploying Blank contract...'); - const contractAddress = await deployContract(owner, BlankContract.abi, [], Fr.random(), pxe); + const contractAddress = await deployContract(owner, BlankContract.artifact, [], Fr.random(), pxe); logger(`L2 contract deployed at ${contractAddress}`); return BlankContract.at(contractAddress, wallet); diff --git a/yarn-project/boxes/blank/README.md b/yarn-project/boxes/blank/README.md index 242f8fffe0d..36504fefc83 100644 --- a/yarn-project/boxes/blank/README.md +++ b/yarn-project/boxes/blank/README.md @@ -53,7 +53,7 @@ The `src/artifacts` folder can be re-generated from the command line yarn compile ``` -This will generate a [Contract ABI](src/artifacts/test_contract.json) and TypeScript class for the [Aztec smart contract](src/contracts/main.nr), which the frontend uses to generate the UI. +This will generate a [contract artifact](src/artifacts/test_contract.json) and TypeScript class for the [Aztec smart contract](src/contracts/main.nr), which the frontend uses to generate the UI. Note: the `compile` command seems to generate a Typescript file which needs a single change - @@ -63,7 +63,7 @@ import TestContractArtifactJson from 'text_contract.json' assert { type: 'json' import TestContractArtifactJson from './test_contract.json' assert { type: 'json' }; ``` -After compiling, you can re-deploy the upated noir smart contract from the web UI. The function interaction forms are generated from parsing the ContractABI, so they should update automatically after you recompile. +After compiling, you can re-deploy the updated noir smart contract from the web UI. The function interaction forms are generated from parsing the contract artifact, so they should update automatically after you recompile. ## Learn More diff --git a/yarn-project/boxes/private-token/README.md b/yarn-project/boxes/private-token/README.md index 75f385ccb7e..99b8eb3fe68 100644 --- a/yarn-project/boxes/private-token/README.md +++ b/yarn-project/boxes/private-token/README.md @@ -60,9 +60,9 @@ Most relevant to you is likely `src/contracts/main.nr` (and the build config `sr The `src/artifacts` folder can be re-generated from the command line with `yarn compile`. -This will generate a [Contract ABI](src/artifacts/test_contract.json) and TypeScript class for the Aztec smart contract in `src/contracts/main.nr`, which the frontend uses to generate the UI. +This will generate a [contract artifact](src/artifacts/test_contract.json) and TypeScript class for the Aztec smart contract in `src/contracts/main.nr`, which the frontend uses to generate the UI. -After compiling, you can re-deploy the upated noir smart contract from the web UI. The function interaction forms are generated from parsing the ContractABI, so they should update automatically after you recompile. +After compiling, you can re-deploy the updated noir smart contract from the web UI. The function interaction forms are generated from parsing the contract artifact, so they should update automatically after you recompile. ## Learn More diff --git a/yarn-project/boxes/private-token/src/artifacts/private_token.ts b/yarn-project/boxes/private-token/src/artifacts/private_token.ts index ce5e41ed3b8..b6bd6fd401c 100644 --- a/yarn-project/boxes/private-token/src/artifacts/private_token.ts +++ b/yarn-project/boxes/private-token/src/artifacts/private_token.ts @@ -36,7 +36,7 @@ export class PrivateTokenContract extends ContractBase { * @returns A promise that resolves to a new Contract instance. */ public static async at(address: AztecAddress, wallet: Wallet) { - return Contract.at(address, PrivateTokenContract.abi, wallet) as Promise; + return Contract.at(address, PrivateTokenContract.artifact, wallet) as Promise; } /** @@ -64,9 +64,9 @@ export class PrivateTokenContract extends ContractBase { } /** - * Returns this contract's ABI. + * Returns this contract's artifact. */ - public static get abi(): ContractArtifact { + public static get artifact(): ContractArtifact { return PrivateTokenContractArtifact; } diff --git a/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts b/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts index 4f3da34e3a7..223ddb1eee1 100644 --- a/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts +++ b/yarn-project/boxes/private-token/src/tests/privatetoken.sandbox.test.ts @@ -33,7 +33,7 @@ async function deployZKContract(owner: CompleteAddress, wallet: Wallet, pxe: PXE logger('Deploying PrivateToken contract...'); const typedArgs = [new Fr(INITIAL_BALANCE), owner.address.toField()]; - const contractAddress = await deployContract(owner, PrivateTokenContract.abi, typedArgs, Fr.random(), pxe); + const contractAddress = await deployContract(owner, PrivateTokenContract.artifact, typedArgs, Fr.random(), pxe); logger(`L2 contract deployed at ${contractAddress}`); return PrivateTokenContract.at(contractAddress, wallet); diff --git a/yarn-project/cli/README.md b/yarn-project/cli/README.md index 652a748afea..0ae7ead9837 100644 --- a/yarn-project/cli/README.md +++ b/yarn-project/cli/README.md @@ -140,22 +140,22 @@ Deploys a compiled Aztec.nr contract to Aztec. Syntax: ```shell -aztec-cli deploy [options] +aztec-cli deploy [options] ``` Options: -- `-c, --contract-artifact `: Path to the compiled Aztec.nr contract's ABI file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractArtifact. You can get a full ist of the available contracts with `aztec-cli example-contracts` +- `-c, --contract-artifact `: Path to the compiled Aztec.nr contract's artifact file in JSON format. You can also use one of Aztec's example contracts found in [@aztec/noir-contracts](https://www.npmjs.com/package/@aztec/noir-contracts), e.g. PrivateTokenContractArtifact. You can get a full ist of the available contracts with `aztec-cli example-contracts` - `-a, --args ` (optional): Contract constructor arguments Default: []. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. - `-k, --public-key `: Public key of the deployer. If not provided, it will check the RPC for existing ones. -This command deploys a compiled Aztec.nr contract to Aztec. It requires the path to the contract's ABI file in JSON format. Optionally, you can specify the public key of the deployer and provide constructor arguments for the contract. The command displays the address of the deployed contract. +This command deploys a compiled Aztec.nr contract to Aztec. It requires the path to the contract's artifact file in JSON format. Optionally, you can specify the public key of the deployer and provide constructor arguments for the contract. The command displays the address of the deployed contract. Example usage: ```shell -aztec-cli deploy -c path/to/contract.abi.json -a ...args +aztec-cli deploy -c path/to/contract.artifact.json -a ...args ``` With an Aztec example contract: @@ -313,7 +313,7 @@ Sends a transaction invoking a function on an Aztec contract. Syntax: ```shell -aztec-cli send --args [functionArgs...] --contract-artifact --contract-address --private-key +aztec-cli send --args [functionArgs...] --contract-artifact --contract-address --private-key ``` - `functionName`: Name of the function to call. @@ -321,17 +321,17 @@ aztec-cli send --args [functionArgs...] --contract-artifact `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. +- `-c, --contract-artifact `: The compiled contract's artifact in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. - `-ca, --contract-address
`: Address of the contract. - `-k, --private-key `: The sender's private key. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. -This command calls a function on an Aztec contract. It requires the contract's ABI, address, function name, and optionally, function arguments. The command executes the function call and displays the transaction details. +This command calls a function on an Aztec contract. It requires the contract's artifact, address, function name, and optionally, function arguments. The command executes the function call and displays the transaction details. Example usage: ```shell -aztec-cli send transfer -ca 0x123456789abcdef123456789abcdef12345678 -a 100 -c path/to/abi.json +aztec-cli send transfer -ca 0x123456789abcdef123456789abcdef12345678 -a 100 -c path/to/artifact.json ``` ### call @@ -342,7 +342,7 @@ Unlike transactions, view calls do not modify the state of the contract. Syntax: ```shell -aztec-cli call -a [functionArgs...] -c -ca -f +aztec-cli call -a [functionArgs...] -c -ca -f ``` - `functionName`: Name of the function to view. @@ -350,17 +350,17 @@ aztec-cli call -a [functionArgs...] -c -ca `: The compiled contract's ABI in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. +- `-c, --contract-artifact `: The compiled contract's artifact in JSON format. You can also use one of Aztec's example contracts found in (@aztec/noir-contracts)[https://www.npmjs.com/package/@aztec/noir-contracts], e.g. PrivateTokenContractArtifact. - `-ca, --contract-address
`: Address of the contract. - `-f, --from `: Address of the caller. If empty, first account in the Private eXecution Environment (PXE) will be used. - `-u, --rpc-url `: URL of PXE Service. Default: `http://localhost:8080`. -This command simulates the execution of a view function on a deployed contract without modifying the state. It requires the contract's ABI, address, function name, and optionally, function arguments. The command displays the result of the view function. +This command simulates the execution of a view function on a deployed contract without modifying the state. It requires the contract's artifact, address, function name, and optionally, function arguments. The command displays the result of the view function. Example usage: ```shell -aztec-cli call balanceOf -c path/to/contract.abi.json -ca 0x123456789abcdef123456789abcdef12345678 -a balanceOf 0xabcdef1234567890abcdef1234567890abcdef12 +aztec-cli call balanceOf -c path/to/contract.artifact.json -ca 0x123456789abcdef123456789abcdef12345678 -a balanceOf 0xabcdef1234567890abcdef1234567890abcdef12 ``` ### parse-parameter-struct @@ -370,19 +370,19 @@ Helper for parsing an encoded string into a contract's parameter struct. Syntax: ```shell -aztec-cli parse-parameter-struct +aztec-cli parse-parameter-struct ``` - `encodedString`: The encoded hex string. -- `contractAbi`: The compiled contract's ABI in JSON format. +- `contractArtifact`: The compiled contract's artifact in JSON format. - `parameterName`: The name of the struct parameter to decode into. -This command is a helper for parsing an encoded hex string into a contract's parameter struct. It requires the encoded string, the contract's ABI, and the name of the struct parameter. The command decodes the string and displays the struct data. +This command is a helper for parsing an encoded hex string into a contract's parameter struct. It requires the encoded string, the contract's artifact, and the name of the struct parameter. The command decodes the string and displays the struct data. Example usage: ```shell -aztec-cli parse-parameter-struct 0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 path/to/contract.abi.json paramName +aztec-cli parse-parameter-struct 0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 path/to/contract.artifact.json paramName ``` ### get-logs diff --git a/yarn-project/cli/src/utils.ts b/yarn-project/cli/src/utils.ts index b159c23176b..39b62a6730f 100644 --- a/yarn-project/cli/src/utils.ts +++ b/yarn-project/cli/src/utils.ts @@ -157,11 +157,11 @@ export async function getTxSender(pxe: PXE, _from?: string) { * @returns Formatted contract address, function arguments and caller's aztec address. */ export async function prepTx(contractFile: string, functionName: string, _functionArgs: string[], log: LogFn) { - const contractAbi = await getContractArtifact(contractFile, log); - const functionAbi = getFunctionArtifact(contractAbi, functionName); - const functionArgs = encodeArgs(_functionArgs, functionAbi.parameters); + const contractArtifact = await getContractArtifact(contractFile, log); + const functionArtifact = getFunctionArtifact(contractArtifact, functionName); + const functionArgs = encodeArgs(_functionArgs, functionArtifact.parameters); - return { functionArgs, contractAbi }; + return { functionArgs, contractAbi: contractArtifact }; } /** diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts index 6d90b0eadf8..07359cba1b1 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts @@ -6,11 +6,11 @@ import { mockVerificationKey } from '../mocked_keys.js'; import { NoirCompilationArtifacts, NoirFunctionEntry } from '../noir_artifact.js'; /** - * Generates an Aztec ABI for a Aztec.nr function build artifact. Replaces verification key with a mock value. + * Generates a function build artifact. Replaces verification key with a mock value. * @param fn - Noir function entry. - * @returns Aztec ABI function entry. + * @returns Function artifact. */ -function generateAbiFunction(fn: NoirFunctionEntry): FunctionArtifact { +function generateFunctionArtifact(fn: NoirFunctionEntry): FunctionArtifact { const functionType = fn.function_type.toLowerCase() as FunctionType; const isInternal = fn.is_internal; @@ -33,11 +33,11 @@ function generateAbiFunction(fn: NoirFunctionEntry): FunctionArtifact { } /** - * Given a Nargo output generates an Aztec-compatible contract ABI. + * Given a Nargo output generates an Aztec-compatible contract artifact. * @param compiled - Noir build output. - * @returns An Aztec valid ABI. + * @returns Aztec contract build artifact. */ -export function generateAztecAbi({ contract, debug }: NoirCompilationArtifacts): ContractArtifact { +export function generateContractArtifact({ contract, debug }: NoirCompilationArtifacts): ContractArtifact { const originalFunctions = contract.functions; // TODO why sort? we should have idempotent compilation so this should not be needed. const sortedFunctions = [...contract.functions].sort((fnA, fnB) => fnA.name.localeCompare(fnB.name)); @@ -55,7 +55,7 @@ export function generateAztecAbi({ contract, debug }: NoirCompilationArtifacts): return { name: contract.name, - functions: sortedFunctions.map(generateAbiFunction), + functions: sortedFunctions.map(generateFunctionArtifact), debug: parsedDebug, }; } diff --git a/yarn-project/noir-compiler/src/index.ts b/yarn-project/noir-compiler/src/index.ts index 1adde25cb2c..e9b368a079a 100644 --- a/yarn-project/noir-compiler/src/index.ts +++ b/yarn-project/noir-compiler/src/index.ts @@ -1,7 +1,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { CompileOpts, NargoContractCompiler } from './compile/nargo.js'; -import { generateAztecAbi } from './contract-interface-gen/abi.js'; +import { generateContractArtifact } from './contract-interface-gen/abi.js'; import NoirVersion from './noir-version.json' assert { type: 'json' }; const { commit: NoirCommit, tag: NoirTag } = NoirVersion; @@ -9,7 +9,7 @@ export { NoirCommit, NoirTag }; export { generateNoirContractInterface } from './contract-interface-gen/noir.js'; export { generateTypescriptContractInterface } from './contract-interface-gen/typescript.js'; -export { generateAztecAbi }; +export { generateContractArtifact as generateAztecAbi }; /** * Compile Aztec.nr contracts in project path using a nargo binary available in the shell. @@ -18,5 +18,5 @@ export { generateAztecAbi }; * @returns Compiled artifacts. */ export async function compileUsingNargo(projectPath: string, opts: CompileOpts = {}): Promise { - return (await new NargoContractCompiler(projectPath, opts).compile()).map(generateAztecAbi); + return (await new NargoContractCompiler(projectPath, opts).compile()).map(generateContractArtifact); } diff --git a/yarn-project/pxe/src/contract_data_oracle/index.ts b/yarn-project/pxe/src/contract_data_oracle/index.ts index c24bab6496f..79be6f6aa44 100644 --- a/yarn-project/pxe/src/contract_data_oracle/index.ts +++ b/yarn-project/pxe/src/contract_data_oracle/index.ts @@ -31,15 +31,15 @@ export class ContractDataOracle { } /** - * Retrieves the ABI of a specified function within a given contract. + * Retrieves the artifact of a specified function within a given contract. * The function is identified by its selector, which is a unique code generated from the function's signature. * Throws an error if the contract address or function selector are invalid or not found. * * @param contractAddress - The AztecAddress representing the contract containing the function. * @param selector - The function selector. - * @returns The corresponding function's ABI as an object. + * @returns The corresponding function's artifact as an object. */ - public async getFunctionAbi(contractAddress: AztecAddress, selector: FunctionSelector) { + public async getFunctionArtifact(contractAddress: AztecAddress, selector: FunctionSelector) { const tree = await this.getTree(contractAddress); return tree.getFunctionArtifact(selector); } @@ -51,20 +51,20 @@ export class ContractDataOracle { * * @param contractAddress - The AztecAddress representing the contract containing the function. * @param selector - The function selector. - * @returns The corresponding function's ABI as an object. + * @returns The corresponding function's artifact as an object. */ public async getFunctionDebugMetadata( contractAddress: AztecAddress, selector: FunctionSelector, ): Promise { const contract = await this.db.getContract(contractAddress); - const functionAbi = contract?.functions.find(f => f.selector.equals(selector)); + const functionArtifact = contract?.functions.find(f => f.selector.equals(selector)); - if (!contract || !functionAbi) { + if (!contract || !functionArtifact) { return undefined; } - return getFunctionDebugMetadata(contract, functionAbi.name); + return getFunctionDebugMetadata(contract, functionArtifact.name); } /** diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index 4df5e4043f9..153674f9bb9 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -334,7 +334,7 @@ export class PXEService implements PXE { const functionCall = await this.#getFunctionCall(functionName, args, to); const executionResult = await this.#simulateUnconstrained(functionCall); - // TODO - Return typed result based on the function abi. + // TODO - Return typed result based on the function artifact. return executionResult; } @@ -420,14 +420,14 @@ export class PXEService implements PXE { /** * Retrieves the simulation parameters required to run an ACIR simulation. - * This includes the contract address, function ABI, portal contract address, and historic tree roots. + * This includes the contract address, function artifact, portal contract address, and historic tree roots. * * @param execRequest - The transaction request object containing details of the contract call. - * @returns An object containing the contract address, function ABI, portal contract address, and historic tree roots. + * @returns An object containing the contract address, function artifact, portal contract address, and historic tree roots. */ async #getSimulationParameters(execRequest: FunctionCall | TxExecutionRequest) { const contractAddress = (execRequest as FunctionCall).to ?? (execRequest as TxExecutionRequest).origin; - const functionAbi = await this.contractDataOracle.getFunctionAbi( + const functionArtifact = await this.contractDataOracle.getFunctionArtifact( contractAddress, execRequest.functionData.selector, ); @@ -439,8 +439,8 @@ export class PXEService implements PXE { return { contractAddress, - functionAbi: { - ...functionAbi, + functionArtifact: { + ...functionArtifact, debug, }, portalContract, @@ -450,11 +450,11 @@ export class PXEService implements PXE { async #simulate(txRequest: TxExecutionRequest): Promise { // TODO - Pause syncing while simulating. - const { contractAddress, functionAbi, portalContract } = await this.#getSimulationParameters(txRequest); + const { contractAddress, functionArtifact, portalContract } = await this.#getSimulationParameters(txRequest); this.log('Executing simulator...'); try { - const result = await this.simulator.run(txRequest, functionAbi, contractAddress, portalContract); + const result = await this.simulator.run(txRequest, functionArtifact, contractAddress, portalContract); this.log('Simulation completed!'); return result; } catch (err) { @@ -474,11 +474,11 @@ export class PXEService implements PXE { * @returns The simulation result containing the outputs of the unconstrained function. */ async #simulateUnconstrained(execRequest: FunctionCall) { - const { contractAddress, functionAbi } = await this.#getSimulationParameters(execRequest); + const { contractAddress, functionArtifact } = await this.#getSimulationParameters(execRequest); this.log('Executing unconstrained simulator...'); try { - const result = await this.simulator.runUnconstrained(execRequest, functionAbi, contractAddress, this.node); + const result = await this.simulator.runUnconstrained(execRequest, functionArtifact, contractAddress, this.node); this.log('Unconstrained simulation completed!'); return result; @@ -590,9 +590,9 @@ export class PXEService implements PXE { if (contract) { err.enrichWithContractName(parsedContractAddress, contract.name); selectors.forEach(selector => { - const functionAbi = contract.functions.find(f => f.selector.toString() === selector); - if (functionAbi) { - err.enrichWithFunctionName(parsedContractAddress, functionAbi.selector, functionAbi.name); + const functionArtifact = contract.functions.find(f => f.selector.toString() === selector); + if (functionArtifact) { + err.enrichWithFunctionName(parsedContractAddress, functionArtifact.selector, functionArtifact.name); } }); } diff --git a/yarn-project/pxe/src/simulator_oracle/index.ts b/yarn-project/pxe/src/simulator_oracle/index.ts index 0ba47fc9366..0974cf0cfac 100644 --- a/yarn-project/pxe/src/simulator_oracle/index.ts +++ b/yarn-project/pxe/src/simulator_oracle/index.ts @@ -64,10 +64,10 @@ export class SimulatorOracle implements DBOracle { contractAddress: AztecAddress, selector: FunctionSelector, ): Promise { - const abi = await this.contractDataOracle.getFunctionAbi(contractAddress, selector); + const artifact = await this.contractDataOracle.getFunctionArtifact(contractAddress, selector); const debug = await this.contractDataOracle.getFunctionDebugMetadata(contractAddress, selector); return { - ...abi, + ...artifact, debug, }; } diff --git a/yarn-project/types/src/contract_data.ts b/yarn-project/types/src/contract_data.ts index af62d0aa3f0..1136ea8d39f 100644 --- a/yarn-project/types/src/contract_data.ts +++ b/yarn-project/types/src/contract_data.ts @@ -122,7 +122,7 @@ export class ExtendedContractData { constructor( /** The base contract data: aztec & portal addresses. */ public contractData: ContractData, - /** ABIs of public functions. */ + /** Artifacts of public functions. */ private publicFunctions: EncodedContractFunction[], /** Partial addresses of the contract. */ public readonly partialAddress: PartialAddress, From 9c5c734ffa69f7bdd3d07fae7f07bd164d61dd14 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 13:39:00 +0000 Subject: [PATCH 06/16] fixes --- yarn-project/aztec.js/src/contract/checker.test.ts | 4 ++-- yarn-project/boxes/blank/src/index.ts | 11 +++++++++-- .../boxes/blank/src/tests/blank.contract.test.ts | 5 +++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/yarn-project/aztec.js/src/contract/checker.test.ts b/yarn-project/aztec.js/src/contract/checker.test.ts index b4ae515188c..7214f924f86 100644 --- a/yarn-project/aztec.js/src/contract/checker.test.ts +++ b/yarn-project/aztec.js/src/contract/checker.test.ts @@ -7,12 +7,12 @@ describe('abiChecker', () => { abi = { name: 'TEST_ABI', }; - expect(() => abiChecker(abi)).toThrowError('ABI has no functions'); + expect(() => abiChecker(abi)).toThrowError('artifact has no functions'); abi = { name: 'TEST_ABI', functions: [], }; - expect(() => abiChecker(abi)).toThrowError('ABI has no functions'); + expect(() => abiChecker(abi)).toThrowError('artifact has no functions'); }); it('should error if ABI has no names', () => { diff --git a/yarn-project/boxes/blank/src/index.ts b/yarn-project/boxes/blank/src/index.ts index c753c00cfdb..69527eb3042 100644 --- a/yarn-project/boxes/blank/src/index.ts +++ b/yarn-project/boxes/blank/src/index.ts @@ -1,3 +1,4 @@ +import { BlankContractArtifact } from './artifacts/blank.js'; import { AccountWallet, AztecAddress, @@ -12,7 +13,7 @@ import { } from '@aztec/aztec.js'; import { ContractArtifact, FunctionArtifact, encodeArguments } from '@aztec/foundation/abi'; import { FieldsOf } from '@aztec/foundation/types'; -import { BlankContractArtifact } from './artifacts/blank.js'; + export const contractArtifact: ContractArtifact = BlankContractArtifact; export const PXE_URL: string = process.env.PXE_URL || 'http://localhost:8080'; @@ -40,7 +41,13 @@ export async function handleDeployClick(): Promise { console.log('Deploying Contract'); const [wallet, ..._rest] = await getSandboxAccountsWallets(pxe); - const contractAztecAddress = await deployContract(wallet.getCompleteAddress(), contractArtifact, [], Fr.random(), pxe); + const contractAztecAddress = await deployContract( + wallet.getCompleteAddress(), + contractArtifact, + [], + Fr.random(), + pxe, + ); return contractAztecAddress.toString(); } diff --git a/yarn-project/boxes/blank/src/tests/blank.contract.test.ts b/yarn-project/boxes/blank/src/tests/blank.contract.test.ts index afbc50e06f8..9fedd2a80ff 100644 --- a/yarn-project/boxes/blank/src/tests/blank.contract.test.ts +++ b/yarn-project/boxes/blank/src/tests/blank.contract.test.ts @@ -1,3 +1,5 @@ +import { BlankContract } from '../artifacts/blank.js'; +import { callContractFunction, deployContract, getWallet } from '../index.js'; import { AccountWallet, AztecAddress, @@ -11,8 +13,7 @@ import { waitForSandbox, } from '@aztec/aztec.js'; import { createDebugLogger } from '@aztec/foundation/log'; -import { BlankContract } from '../artifacts/blank.js'; -import { callContractFunction, deployContract, getWallet } from '../index.js'; + const logger = createDebugLogger('aztec:blank-box-test'); // assumes sandbox is running locally, which this script does not trigger From 5e92dfd7f04a1dad2014bc9dc3ec55f796225fc7 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 13:55:14 +0000 Subject: [PATCH 07/16] fix --- yarn-project/cli/src/index.ts | 46 +++++++++++++++++++++-------------- yarn-project/cli/src/utils.ts | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index 14af57dc8cd..e46da75aeb1 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -187,18 +187,18 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { // `options.wait` is default true. Passing `--no-wait` will set it to false. // https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue .option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction') - .action(async (abiPath, { rpcUrl, publicKey, args: rawArgs, salt, wait }) => { - const contractAbi = await getContractArtifact(abiPath, log); - const constructorAbi = contractAbi.functions.find(({ name }) => name === 'constructor'); + .action(async (artifactPath, { rpcUrl, publicKey, args: rawArgs, salt, wait }) => { + const contractArtifact = await getContractArtifact(artifactPath, log); + const constructorArtifact = contractArtifact.functions.find(({ name }) => name === 'constructor'); const client = await createCompatibleClient(rpcUrl, debugLogger); - const deployer = new ContractDeployer(contractAbi, client, publicKey); + const deployer = new ContractDeployer(contractArtifact, client, publicKey); - const constructor = getFunctionArtifact(contractAbi, 'constructor'); + const constructor = getFunctionArtifact(contractArtifact, 'constructor'); if (!constructor) throw new Error(`Constructor not found in contract ABI`); debugLogger(`Input arguments: ${rawArgs.map((x: any) => `"${x}"`).join(', ')}`); - const args = encodeArgs(rawArgs, constructorAbi!.parameters); + const args = encodeArgs(rawArgs, constructorArtifact!.parameters); debugLogger(`Encoded arguments: ${args.join(', ')}`); const tx = deployer.deploy(...args).send({ contractAddressSalt: salt }); @@ -393,12 +393,17 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .addOption(pxeOption) .option('--no-wait', 'Print transaction hash without waiting for it to be mined') .action(async (functionName, options) => { - const { functionArgs, contractAbi } = await prepTx(options.contractAbi, functionName, options.args, log); + const { functionArgs, contractArtifact } = await prepTx( + options.contractArtifact, + functionName, + options.args, + log, + ); const { contractAddress, privateKey } = options; const client = await createCompatibleClient(options.rpcUrl, debugLogger); const wallet = await getSchnorrAccount(client, privateKey, privateKey, accountCreationSalt).getWallet(); - const contract = await Contract.at(contractAddress, contractAbi, wallet); + const contract = await Contract.at(contractAddress, contractArtifact, wallet); const tx = contract.methods[functionName](...functionArgs).send(); log(`Transaction hash: ${(await tx.getTxHash()).toString()}`); if (options.wait) { @@ -430,9 +435,14 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .option('-f, --from ', 'Aztec address of the caller. If empty, will use the first account from RPC.') .addOption(pxeOption) .action(async (functionName, options) => { - const { functionArgs, contractAbi } = await prepTx(options.contractAbi, functionName, options.args, log); + const { functionArgs, contractArtifact } = await prepTx( + options.contractArtifact, + functionName, + options.args, + log, + ); - const fnAbi = getFunctionArtifact(contractAbi, functionName); + const fnAbi = getFunctionArtifact(contractArtifact, functionName); if (fnAbi.parameters.length !== options.args.length) { throw Error( `Invalid number of args passed. Expected ${fnAbi.parameters.length}; Received: ${options.args.length}`, @@ -470,8 +480,8 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { ) .requiredOption('-p, --parameter ', 'The name of the struct parameter to decode into') .action(async (encodedString, options) => { - const contractAbi = await getContractArtifact(options.contractAbi, log); - const parameterAbitype = contractAbi.functions + const contractArtifact = await getContractArtifact(options.contractArtifact, log); + const parameterAbitype = contractArtifact.functions .map(({ parameters }) => parameters) .flat() .find(({ name, type }) => name === options.parameter && type.kind === 'struct'); @@ -533,16 +543,16 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { .command('inspect-contract') .description('Shows list of external callable functions for a contract') .argument( - '', - `A compiled Noir contract's ABI in JSON format or name of a contract ABI 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`, ) - .action(async (contractAbiFile: string) => { - const contractAbi = await getContractArtifact(contractAbiFile, debugLogger); - const contractFns = contractAbi.functions.filter( + .action(async (contractArtifactFile: string) => { + const contractArtifact = await getContractArtifact(contractArtifactFile, debugLogger); + const contractFns = contractArtifact.functions.filter( f => !f.isInternal && f.name !== 'compute_note_hash_and_nullifier', ); if (contractFns.length === 0) { - log(`No external functions found for contract ${contractAbi.name}`); + log(`No external functions found for contract ${contractArtifact.name}`); } for (const fn of contractFns) { const signature = decodeFunctionSignatureWithParameterNames(fn.name, fn.parameters); diff --git a/yarn-project/cli/src/utils.ts b/yarn-project/cli/src/utils.ts index 39b62a6730f..70486725290 100644 --- a/yarn-project/cli/src/utils.ts +++ b/yarn-project/cli/src/utils.ts @@ -161,7 +161,7 @@ export async function prepTx(contractFile: string, functionName: string, _functi const functionArtifact = getFunctionArtifact(contractArtifact, functionName); const functionArgs = encodeArgs(_functionArgs, functionArtifact.parameters); - return { functionArgs, contractAbi: contractArtifact }; + return { functionArgs, contractArtifact }; } /** From cc040918148685d12e328efcb7b4bef3859b40d6 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 14:11:36 +0000 Subject: [PATCH 08/16] fixes --- yarn-project/acir-simulator/src/client/db_oracle.ts | 2 +- .../acir-simulator/src/client/private_execution.test.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn-project/acir-simulator/src/client/db_oracle.ts b/yarn-project/acir-simulator/src/client/db_oracle.ts index da4ca13d3de..da9233c5453 100644 --- a/yarn-project/acir-simulator/src/client/db_oracle.ts +++ b/yarn-project/acir-simulator/src/client/db_oracle.ts @@ -64,7 +64,7 @@ export interface DBOracle extends CommitmentsDB { * * @param contractAddress - The contract address. * @param selector - The corresponding function selector. - * @returns A Promise that resolves to a FunctionArtifact object containing the ARTIFACT information of the target function. + * @returns A Promise that resolves to a FunctionArtifact object. */ getFunctionArtifact( contractAddress: AztecAddress, diff --git a/yarn-project/acir-simulator/src/client/private_execution.test.ts b/yarn-project/acir-simulator/src/client/private_execution.test.ts index ad4b8843ccc..ae918a69879 100644 --- a/yarn-project/acir-simulator/src/client/private_execution.test.ts +++ b/yarn-project/acir-simulator/src/client/private_execution.test.ts @@ -960,7 +960,7 @@ describe('Private Execution test suite', () => { describe('get public key', () => { it('gets the public key for an address', async () => { - // Tweak the contract ARTIFACT so we can extract return values + // Tweak the contract artifact so we can extract return values const artifact = getFunctionArtifact(TestContractArtifact, 'getPublicKey'); artifact.returnTypes = [{ kind: 'array', length: 2, type: { kind: 'field' } }]; @@ -980,7 +980,7 @@ describe('Private Execution test suite', () => { const portalContractAddress = EthAddress.random(); const aztecAddressToQuery = AztecAddress.random(); - // Tweak the contract ARTIFACT so we can extract return values + // Tweak the contract artifact so we can extract return values const artifact = getFunctionArtifact(TestContractArtifact, 'getPortalContractAddress'); artifact.returnTypes = [{ kind: 'field' }]; @@ -995,7 +995,7 @@ describe('Private Execution test suite', () => { it('this_address should return the current context address', async () => { const contractAddress = AztecAddress.random(); - // Tweak the contract ARTIFACT so we can extract return values + // Tweak the contract artifact so we can extract return values const artifact = getFunctionArtifact(TestContractArtifact, 'getThisAddress'); artifact.returnTypes = [{ kind: 'field' }]; @@ -1007,7 +1007,7 @@ describe('Private Execution test suite', () => { it("this_portal_address should return the current context's portal address", async () => { const portalContractAddress = EthAddress.random(); - // Tweak the contract ARTIFACT so we can extract return values + // Tweak the contract artifact so we can extract return values const artifact = getFunctionArtifact(TestContractArtifact, 'getThisPortalAddress'); artifact.returnTypes = [{ kind: 'field' }]; From 2d74cde8227a2a1950c5750cb93c750f17019846 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 14:13:01 +0000 Subject: [PATCH 09/16] formatting fix --- yarn-project/boxes/private-token/src/app/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/boxes/private-token/src/app/index.html b/yarn-project/boxes/private-token/src/app/index.html index 6fedf6b23a6..a81c17f2a87 100644 --- a/yarn-project/boxes/private-token/src/app/index.html +++ b/yarn-project/boxes/private-token/src/app/index.html @@ -1,4 +1,4 @@ - + From f5f950a29bc3fdcd2123ae17681a2dcb899de0d4 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 14:41:05 +0000 Subject: [PATCH 10/16] cleanup --- yarn-project/noir-compiler/src/index.ts | 2 +- yarn-project/noir-contracts/src/scripts/copy_output.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn-project/noir-compiler/src/index.ts b/yarn-project/noir-compiler/src/index.ts index e9b368a079a..27210cf097f 100644 --- a/yarn-project/noir-compiler/src/index.ts +++ b/yarn-project/noir-compiler/src/index.ts @@ -9,7 +9,7 @@ export { NoirCommit, NoirTag }; export { generateNoirContractInterface } from './contract-interface-gen/noir.js'; export { generateTypescriptContractInterface } from './contract-interface-gen/typescript.js'; -export { generateContractArtifact as generateAztecAbi }; +export { generateContractArtifact }; /** * Compile Aztec.nr contracts in project path using a nargo binary available in the shell. diff --git a/yarn-project/noir-contracts/src/scripts/copy_output.ts b/yarn-project/noir-contracts/src/scripts/copy_output.ts index 75266805632..20e415c87b7 100644 --- a/yarn-project/noir-contracts/src/scripts/copy_output.ts +++ b/yarn-project/noir-contracts/src/scripts/copy_output.ts @@ -1,7 +1,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { createConsoleLogger } from '@aztec/foundation/log'; import { - generateAztecAbi, + generateContractArtifact, generateNoirContractInterface, generateTypescriptContractInterface, } from '@aztec/noir-compiler'; @@ -71,7 +71,7 @@ const main = () => { } // Remove extraneous information from the buildJson (which was output by Nargo) to hone in on the function data we actually care about: - const artifactJson: ContractArtifact = generateAztecAbi({ contract: buildJson, debug }); + const artifactJson: ContractArtifact = generateContractArtifact({ contract: buildJson, debug }); // Write the artifact: const artifactsDir = 'src/artifacts'; From 3be286fe58623029395ce1d8e2cd50988940f544 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 14:54:10 +0000 Subject: [PATCH 11/16] cleanup --- .../src/abis/ecdsa_account_contract.json | 698 ------------------ .../src/abis/schnorr_account_contract.json | 686 ----------------- .../schnorr_single_key_account_contract.json | 621 ---------------- .../blank/src/tests/blank.contract.test.ts | 1 - yarn-project/noir-contracts/scripts/types.sh | 2 +- .../noir-contracts/src/scripts/copy_output.ts | 18 +- 6 files changed, 10 insertions(+), 2016 deletions(-) delete mode 100644 yarn-project/aztec.js/src/abis/ecdsa_account_contract.json delete mode 100644 yarn-project/aztec.js/src/abis/schnorr_account_contract.json delete mode 100644 yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json diff --git a/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json b/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json deleted file mode 100644 index f8617f768f2..00000000000 --- a/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json +++ /dev/null @@ -1,698 +0,0 @@ -{ - "name": "EcdsaAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "preimage", - "type": { - "kind": "array", - "length": 5, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "target_address", - "type": { - "kind": "field" - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "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" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "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" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ] -} diff --git a/yarn-project/aztec.js/src/abis/schnorr_account_contract.json b/yarn-project/aztec.js/src/abis/schnorr_account_contract.json deleted file mode 100644 index a050dcc129c..00000000000 --- a/yarn-project/aztec.js/src/abis/schnorr_account_contract.json +++ /dev/null @@ -1,686 +0,0 @@ -{ - "name": "SchnorrAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "preimage", - "type": { - "kind": "array", - "length": 3, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "field" - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "field" - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "target_address", - "type": { - "kind": "field" - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "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" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "H4sIAAAAAAAA/+2dCZxdyVXe3+3WVirt+67Wrtk03SVpFmlm1KPR0+yrZt81WmYfeUaSx7s93jfZM+N9N4QQYpYQFtsB2xjjgHHAGDAOGAeMQwghhBBCCCGEUHVffejTUfn29G/q0Lfpqt/v6FXV7Vvf/5yv3n679X2dTqfq9Fq/j/md0xuOD8fbwRfXhqp8aw1qcvaNE87+ccI5aZxwTh4nnFPGCefUccI5bZxwmnHCOX2ccNpxwjljnHDOHCecs8YJ5+xxwjlnnHDOHSec88YJ5/yMnEuJc0G8XRhvF8XbxfF2SbzFOcvi7fKY46Q4XuFjpY9VPlbHYyjIgI81Ptb6WOdjvY8NPjb62ORjs48zfJzp4ywfZ/s4x8cWH+fGdYZ8OB9bfWzzsd3HeT7O93GBjwt97PCx08dFPi72cYmPXbFul/rY7eMyH3t8dH3s9XG5jyt8XOnjKh9X+7jGx7U+rvNxfcxlIOZyg48bfdzkY5+Pm33c4uNWH7f5uN3HHT7u9HGXj7t93OPjXh/3+bjfx34fD/g44OOgj0M+Dvt40MdDPh728YiPR3085uNxH0/4OCJq/hIfT/p4ysfReGxOPHbMx3EfL/XxtI+X+Xi5j1f4eKWPV/l4tY/X+Hitj9f5eMbH6328Qaz1Rh9v8vFmH2/x8VYfb/Pxdh/v8PFOHyd8vMvHu3086+M5H8/7eE9cqy+u9V4f7xNz7/fxgdj/YLz9ULz9cLz9SLz9aLz9WLz9eLz9RLz9ZOdk+7nZvdvwWg77fF7n5Bzeh8+lORyfQ3M4PpvmcHwWzeH4TJrD8Rk0h+OW5nB8Os3xcdzi+DSaw/GpNIfjU2gOxyfTHI5Pojkc76c5HO+jORyvaA7HO0I/tOF4O/gi25RO9sfXwZDzIOXRSeTLn+HIfCcl6jI5UT/2A8fZNxxnf/k4bnGc9wuO877Bcd5/OM77FMd5P+M473sc5/sHjvP9CMf5/obj82kOxxfQHI4vpDkcX0RzOL6Y5nB8Cc3h+FKaw3E8n4W8Qu2Xx/FwvB18cc0Z0kCrxHiY+tAPLCsVWFaMgmUlsazKy1K/v14d11pGOgOZdSrSwboYQ8sSwypFFpvQ1tDh2qI1+TxALGvystQPqWtJC1xrqPY4voA41mauSUWaWBdjaBmaWzHGLJYYVtMcfm5Aj88ZwRda0/5ZSyzrs7IMDQaWdaNgWU8sG7Ky9F53bMy8ZlhjE/EjV7BbOr6RctuUl6Pekxs6p9YUY+YrrIW1sBbWwlpYC2thLawTm9XQ3JoxZuH3R+vUWIYGbUJb4/0Gf8aFtcPniB8hzdWZc+PvOvDZBBig1U8/86OzTnLhM/jpdHyNGqs7oPUZGT4DQnuhn5GtyOxF+Ex2KtVSfh4Azj5iWJaV4fTPb6AJneA1PrPkz1HwOSyOhf3xw8TZls9Z+TNR/hwy876qH79WCBaMocWfQ/YpstiEdps+b+b7IH8Ol/fxo+fJKsGCMX/mBoZ+RRab0FbQGfXjG/TDeQOxz5+RZ/68eIiff7AuxvyZMRgmKbLYTvp5LLOO49qiNXkC/XAeHnMHiG9d5jpUnVOfA4ZpDC2u1WRFFpvQVtBxRuQcWpMn0A/n4TNo/lw882vD2pP1ggVjfp/ADFosNqGtoOOMyDm0Jk+gH87D+yT+fkDjPcpGwYIxv0cBw1RFFpvQVtBxRuQcWpMn/L5xc+zze9gzMtehIh2sizG0uFbTFFlsQltBxxmRc2hNnkA/nHdm7G8mvrMy16EiHayLMbS4VkaRxSa0FXScETmH1uTJWZT72bF/JvGdk7kOFelgXYyhxbWarshiE9oKOs6InENr8gT64bwtsX828Z2buQ4V6WBdjKHFtbKKLDahraDjjMg5tCZPoB/Ow/V7W4hvKHMd+LpmrIvxEPkAhhmKLDahraDjjMg5tCZPoB/Oc2Agvq2Z61CRDtbFGFpcq5mKLDahraDjjMg5tCZPoB/O2xb7jvi2Z65DRTpYF2Noca1mKbLYhLaCjjMi59CaPIF+OO+82N9GfOdnrkNFOlgXY2hxrWYrstiEtoKOMyLn0Jo8gX4474LYP4/4Lsxch4p0sC7G0OJazVFksQltBR1nRM6hNXkC/XDejti/gPh2Zq5DRTpYF2Noca3mKrLYhLaCjjMi59CaPIF+OO+i2N9BfBdnrkNFOlgXY2hxreYpstiEtoKOMyLn0Jo8gX4475LYv4j4dmWuQ0U6WBdjaHGt5iuy2IS2go4zIufQmjyBPv89gUuI79LMdaiE/jCNocW1WqTIYhPaCjqOa4vW5AmzXJaXZVtg2T0KlsuIZU9elvp69W7mNcMae4kfuYLd0vEu5bY3L0e9z/d0Tq0pxsxXWCc2q+mcfr8aKxZ+PNytx7LNJrQVdJwROYfW9FjHnlwe+3uI74q8fLUnlwsWjKHFteoqstiEtoKOMyLn0Jo8YZarsrJsra9fvHIULFcRy9VZWXrPW9eQFrigY+k474Nr8nLUe/JqkT/GzFdYC2thLayFtbAW1sJaWAtrYS2shbWwFtbCWlgLa2EtrIW1sBbWwlpYC2thLayFtbAW1vyshuYuH2MWSwxXqrFsrf/OldRWyNkZkXNoTdeJsCfXxv7VxHddXr7ak2sFC8bQ4lp1FVlsQltBxxmRc2hNnjDLDVlZXH0d0fWjYLmBWG7MytK7jugm0gIXdCwd531wU16Oek/eKPLHmPkKa2EtrIW1sBbWwlpYC2thLayFtbAW1sJaWAtrYS2shXW8sBqau3aMWfiz+OvVWFz9PYzUVsjZGZFzaE2fs7Mn+2L/RuK7OS9f7ck+wYIxtLhWXUUWm9BW0HFG5BxakyfMcmtelvpvm9wyCpZbieW2vCz19zC3kxa4oGPpOO+D2/Ny1HvyNpE/xsxXWCc2q6G5fWPMwo9dt+ix1H+HRGor6Dgjcg6t6XGJPbkj9m8jvjvz8tWe3CFYMIYW16qryGIT2go6zoicQ2vyhFnuzsrS+z+k7xoFy93Eck9Wlt7z1r2kBS7oWDrO++DevBz1nrxH5I8x8xXWwlpYC2thLayFtbAW1onNamjujjFm4fcyd6mx9P6/Z6mtkLMzIufQmt6nsCf3xf49xHd/Xr7ak/sEC8bQ4lp1FVlsQltBx3Ft0Zo8uZ9YHsjK0nsfu38ULA8Qy4GsLL33sQdJC1zQsXSc98HBvBz1njwg8seY+QprYS2shbWwFtbCWlgL68RmNTR33xiz8HuZ/WosvfexUlshZ2dEzqE1vU9hTw7F/gHiO5yXr/bkkGDBGFpcq64ii01oK+g4I3IOrckTZnlIgeXBUbA8RCwP52Wp38c+Qlrggo6l47wPHsnLUe/Jh0X+GDPfeGE1NHdojFn4PvagHouzCW0NHSNyDq3p/sOePBr7DxPfY3n5ak8eFSwYQ4tr1VVksQltBR1nRM6hNXnCLE8osDw+CpYniOVIXpb68fUlpAUu6Fg6zvvgJXk56j15ROSPMfONF1ZDc4+OMQvfxx7XY6kfX6W2ho4ROYfWdP9hT56M/SPE91RevtqTJwULxtDiWnUVWWxCW0HHGZFzaE2eQD+cdzT2nyS+Y5nrUJEO1sUYWlyrriKLTWgr6Dgjcg6tyRPoh/OOx/5R4ntp5jpUpIN1MYYW18oostiEtoKOMyLn0Jo8eSnl/nTsHye+l2WuQ0U6WBdjaHGtpiuy2IS2go4zIufQmjyBfjjv5bH/NPG9InMdKtLBuhhDi2tlFVlsQltBxxmRc2hNnkA/nPfK2H858b0qcx0q0sG6GL+KfADDDEUWm9BW0HFG5BxakyfQD+e9OvZfSXyvyVyHinSwLsbQ4lrNVGSxCW0FHWdEzqE1eQL9cN5rY//VxPe6zHWoSAfrYgwtrtUsRRab0FbQcVxbtCZPXhdvw3nPxP5rie/1metQkQ7WxRhaXKvZiiw2oa2g44zIObQmT6AfzntD7D9DfG/MXIeKdLAuxtDiWnUVWWxCW0HHGZFzaE2eQD+c96bYfwPxvTlzHSrSwboYQ4tr1VVksQltBR1nRM6hNXkC/XDeW2L/TcT31sx1qEgH62IMLa5VV5HFJrQVdJwROYfW5An0w3lvi/23EN/bM9ehIh2sizG0uFZdRRab0FbQcUbkHFqTJ9AP570j9t9GfO/MXIeKdLAuxtDiWnUVWWxCW0HHGZFzaE2eMMuJvCz1teDvimu9g3Tenbm2FelgXYyhxfU/ochiE9oKOs6InENr8hn64bxnY/9dxPdc5jpUpIN1MYYW1+qEIotNaCvoOCNyDq3JE+iH856P/WeJ7z2Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoB/Oe2/sP09878tch4p0sC7G0OJadRVZbEJbQccZkXNoTZ5AP5z3/th/L/F9IHMdKtLBuhhDi2vVVWSxCW0FHWdEzqE1eQL9cN4HY//9xPehzHWoSAfrYgwtrlVXkcUmtBV0nBE5h9bkCfTDeR+O/Q8S30cy16EiHayLMbS4Vl1FFpvQVtBxRuQcWpMn0A/nfTT2P0x8H8tch4p0sC7G0OJadRVZbEJbQccZkXNoTZ5AP5z38dj/KPF9InMdKtLBuhhDi2vVVWSxCW0FHWdEzqE1eQL9cN4nY//jxPd9metQkQ7WxRhaXKuuIotNaCvoOK4tWpMn0A/nfX/sf5L4/lnmOlSkg3UxhhbXqqvIYhPaCjrOiJxDa/IE+uG8H4j97ye+f565DhXpYF2MocW16iqy2IS2go4zIufQmjyBfjjvB2P/B4jvX2SuQ0U6WBdjaHGtuoosNqGtoOOMyDm0Jk+gH877odj/QeL7l5nrUJEO1sUYWlyrriKLTWgr6Dgjcg6tyRPoh/M+Ffs/RHw/nLkOFelgXYyhxbXqKrLYhLaCjjMi59CaPIF+OO9HYv9TxPejmetQkQ7WxRhaXKuuIotNaCvoOCNyDq3JE+iH834s9n+E+P5V5jpUpIN1MYYW16qryGIT2go6zoicQ2vyBPrhvB+P/R8jvn+duQ4V6WBdjKHFteoqstiEtoKOMyLn0Jo8gX447ydi/8eJ7ycz16EiHayLMbS4Vl1FFpvQVtBxRuQcWpMnzPLTeVnq/9vhp0bB8tPE8um8LPXvDH6GtMAFHUvHeR98Ji9HvSc/LfLHmPkK68RmNTT3E2PMwo9dP6XHUv/fDlJbQccZkXNoTY9L7MlnY//TxPdv8vLVnnxWsGAMLa5VV5HFJrQVdJwROYfW5Amz/GxWFldfB/Uzo2D5WWL5XFaW3vPW50kLXNCxdJz3wefzctR78nMif4yZr7AW1sJaWAtrYS2shbWwFtbPF9bCWlgLa2EtrIW1sBbWwjpOWA3NfXaMWfiz+J9RY3H133SX2go5OyNyDq3pc3b25Aux/zni+7m8fLUnXxAsGEOLa9VVZLEJbQUdZ0TOoTV5wiw/n5Wl93+TfXEULD9PLF/KytL7HuYXSOuL8RY6lo7zPviFvBz1nvySyB9j5iushbWwFtbCWlgLa2EtrBOb1dDcF8aYhd/LfFGNpfd/k0lthZydETmH1vQ+hT35cux/ifj+bV6+2pMvCxaMocW16iqy2IS2go4zIufQmjxhll/KytJ7H/uLo2D5JWL5SlaW3vvYXyYtcEHH0nHeB7+cl6Pek18R+WPMfIW1sBbWwlpYC2thLayFdWKzGpr78hiz8HuZX1Rj6b2PldoKOTsjcg6t6X0Ke/LV2P8K8f27vHy1J18VLBhDi2vVVWSxCW0FHWdEzqE1ecIsv5qVpfc+9ldGwfKrxPK1rCy997G/Rlrggo6l47wPfi0vR70nvybyx5j5CmthLayFtbAW1sJaWAvrxGY1NPfVMWbh9zK/osbSex8rtRVydkbkHFrT+xT25Oux/zXi+/W8fLUnXxcsGEOLa9VVZLEJbQUdZ0TOoTV5wiy/mZel/rtkvzEKlt8klm/kZanfx/4WaYELOpaO8z74rbwc9Z78hsgfY+YrrBOb1dDc18eYhR+7fkOPpf67ZFJbQccZkXNoTY9L7Mk3Y/8bxPfv8/LVnnxTsGAMLa5VV5HFJrQVdJwROYfW5Amz/E5elvp567dHwfI7xPKtvCz189bvkha4oGPpOO+D383LUe/Jb4n8MWa+wjqxWQ3NfXOMWfix67f1WOrnLamtoOOMyDm0pscl9uTbsf8t4vsPeflqT74tWDCGFteqq8hiE9oKOs6InENr8oRZfl+B5fdGwfL7xPKdvCz189YfkBa4oGPpOO+DP8jLUe/J74j8MWa+8cJqaO7bY8zC97Hf02NxNqGtocO1RWu6/7An34397xDff8zLV3vyXcGCMbS4Vl1FFpvQVtBxRuQcWpMn0A/n/WHsf5f4/lPmOlSkg3UxhhbXqqvIYhPaCjrOiJxDa/IE+uG8P4r9PyS+/5y5DhXpYF2MocW16iqy2IS2go4zIufQmjyBfjjvj2P/j4jvv2SuQ0U6WBdjaHGtuoosNqGtoOOMyDm0Jk+gH877k9j/Y+L7r5nrUJEO1sUYWlyrriKLTWgr6Dgjcg6tyRPoh/P+NPb/hPj+W+Y6VKSDdTGGFteqq8hiE9oKOs6InENr8gT64bw/i/0/Jb7/nrkOFelgXYyhxbXqKrLYhLaCjjMi59CaPIF+OO/PY//PiO9/ZK5DRTpYF2Noca26iiw2oa2g44zIObQmT6AfzvuL2P9z4vufmetQkQ7WxRhaXKuuIotNaCvoOCNyDq3JE+iH8/4y9v+C+P5X5jpUpIN1MYYW16qryGIT2go6zoicQ2vyBPrhvL+K/b8kvv+duQ4V6WBdjKHFteoqstiEtoKOMyLn0Jo8gX44769j/6+I7/9krkNFOlgXY2hxrbqKLDahraDjjMg5tCZPoB/O+5vY/2vi+7+Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoB/O+9vY/xvi+3+Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoB/O+7vY/1vi+/+Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoG/oB/+O+Koqbx0qATRMY2hxrbqKLDahraDjjMg5MTzFE+iH8/qqU08IfP0KnvQJTzDuJ0/AwJ70K3gitRV0nBE5U3qn1AGtnzyZFPt9xDdZwZNJwhOMJ5MnfQlPJit4IrUVdJwROY/kyWTyZErsTyK+qQqeTBGeYDyVPJmU8GSqgidSW0HHGZHzSJ5MJU+mgYv4jIIn04QnGBvyZErCE6PgidRW0HFG5DySJ4Y8mR7704jPKngyXXiCsSVPpiU8sQqeSG0FHWdEziN5YsmTGbE/nfhmKngyQ3iC8UzyZHrCk5kKnkhtBR1nRM4jeTKTPJkV+zOIb7aCJ7OEJxjPJk9mJDyZreCJ1FbQcUbkPJIns8mTObE/i/jmKngyR3iC8VzyZFbCk7kKnkhtBR1nRM4jeTKXPJkX+3OIb76CJ/OEJxjPJ0/mJDyZr+CJ1FbQcUbkPJIn88mTBbE/j/gWKniyQHiC8ULyZF7Ck4UKnkhtBR1nRM4jebKQPFkU+wuIb7GCJ4uEJxgvJk8WJDxZrOCJ1FbQcUbkPJIni8mTJbG/iPiWKniyRHiC8VLyZFHCk6UKnkhtBR1nRM4jebKUPFkW+0uIb7mCJ8uEJxgvJ0+WJDxZruCJ1FbQcUbkPJIny8mTFbG/jPhWKniyQniC8UryZFnCk5UKnkhtBR1nRM4jebKSPFkV+yuIb7WCJ6uEJxivJk9WJDxZreCJ1FbQcUbkPJInzLImL0v9+7YDo2BZQyxr87LUv7e0jsTBtZb2wbrEPlinsCfXij2JMfMV1onNamhuVTW2LPzYNaDHUv++rdRW0HFG5Bxa0+MSe7Je7JnAt0HBk/XCE4w3kCdrE3s1N4tNaCvoOCNyHskTZtmUlcXVf6d34yhYNhHL5rx1qZ+3ziBxcG2mfXBGYh+cobAnN4s9iTHzFdbCWlgLa2EtrIW1sBbWwlpYC2thLayFtbAW1sJaWAvreGE1NIfPp8eKhT+L36jG4ur/Z0JqK+TsjMg5NDE85XN29uRMsWcC31kKnpwpPMH4LPJkc2Kv5maxCW0FHWdEziN5wiznZGXp/X+JZ4+C5Rxi2ZK3LvX3MOeSOLi20D44N7EPzlXYk1vEnsSY+QprYS2shbWwFtbCWlgL68RmNTSH1/djxcLvZc5WY+n9f4lSWyFnZ0TOoYnhKe9T2JNBsWcC35CCJ4PCE4yHyJMtib2am8UmtBV0nBE5j+QJs2zNvA8DixsFy1Zi2Za3LvX72O0kDq5ttA+2J/bBdoU9uU3sSYyZr7AW1sJaWAtrYS2shbWwTmxWQ3N4fT9WLPxexqmx9N7HSm2FnJ0ROYcmhqe8T2FPzhN7JvCdr+DJecITjM8nT7Yl9mpuFpvQVtBxRuQ8kifMcmHmfRhYLhgFy4XEsiNvXer3sTtJHFw7aB/sTOyDnQp7cofYkxgzX2EtrIW1sBbWwlpYC2thndishubw+n6sWPi9zAVqLL33sVJbIWdnRM6hieEp71PYk4vEngl8Fyt4cpHwBOOLyZMdib2am8UmtBV0nBE5j+QJs+zKy1L/XbJLRsGyi1iG87LU72MvJXFwDdM+uDSxDy5V2JPDYk9izHyFdWKzGpq7qBpbFn7sukSPpf67ZFJbQccZkXNoTY9L7MlusWcC32UKnuwWnmB8GXkynNiruVlsQltBxxmR80ieMEtX4XlrzyhYusSyNy9L/bx1OYmDay/tg8sT++ByhT25V+xJjJmvsE5sVkNzu6uxZeHHrj16LPXzltRW0HFG5Bxa0+MSe3KF2DOB70oFT64QnmB8JXmyN7FXc7PYhLaCjjMi55E8YZarFViuGgXL1cRyTV6W+nnrWhIH1zW0D65N7INrFfbkNWJPYsx844XV0NwV1diy8H3sKj0WZxPaGjpG5Bxa0/2HPblO7JnAd72CJ9cJTzC+njy5JrFXc7PYhLaCjjMi55E8uZ48uSH2ryO+GxU8uUF4gvGN5Ml1CU9uVPBEaivoOCNyHsmTG8mTm2L/BuLbp+DJTcITjPeRJzckPNmn4InUVtBxRuQ8kif7yJObY/8m4rtFwZObhScY30Ke3JTw5BYFT6S2go4zIueRPLmFPLk19m8mvtsUPLlVeILxbeTJzQlPblPwRGor6Dgjch7Jk9vIk9tj/1biu0PBk9uFJxjfQZ7cmvDkDgVPpLaCjjMi55E8uYM8uTP2bye+uxQ8uVN4gvFd5MntCU/uUvBEaivoOCNyHsmTu8iTu2P/TuK7R8GTu4UnGN9DntyZ8OQeBU+ktoKOMyLnkTxhlnvzsgyGNe/LnF9Y435KCLneS37i+H2U2/0Ke+tesbcwZr4XyrqgM7asWv7vV9jf949if++n/B7IzDLDrzGVfH1A+AvOPuI5mNgbeNyZ7uNAdfrPoT+JjvNj1WGF/XIorlnFOCy4gu6DCrrQmRx1wQGtfvqZX5/eu53Z6d2X0PqUa8NtmPqH6X6NtqdFLItbxDK7RSwzWsRiWsQypUUs/S1iWdIilgNVe1hmtqgu01vEMrVFLJNaxLK0RSyLWsQy3CKWhS1iWdAillktYrEtYpnWIpbJLWKpxpjFdE5/n2zo+AH6uT5xbqjjZ2afPP6QeF/L6zxUnf5znPvDCrmzzjCNoTWdGB6qxp5lcotYprWIxbaIZVaLWBa0iGVhi1iGW8SyqEUsS1vEMqlFLFNbxDK9RSwzW8RyoGoPy5IW1aW/RSxTWsRiWsQyo0Uss1vEsrhFLHtaxNKXYHkkL0t9jf2jcc3Q8D7tEeIA06PE8VhmjkpwVKQLrX76mafim4Hw+uGIPcl1WScvV3j8wP7E2kHzuILmoQvO2//AtsOHX4jm7rx51t+bQ4s94DZMfejXv1ubl6W+LmBX5vzCGpcQP3IFu6Xjuyi3S/Jy1Pf9Szun1hRj5nuhrAvGmFXL/4vzrlnvb65paE37+2LK76LMLLguBL5ifVlbvk5hR16G+nH/QsoXmtAJj/s7Y59/Dv1JdHwHcZ6fl7PegxfEtaoY5wuWoHuegi50cK0JOKDVTz/zfHxsbrrWRKM23IapD63vda3JWLMsbhHLvBaxzG4Ry4wWsZgWsUxpEUt/i1iWtIhlfotY5rSIZWaLWKa3iGVqi1gmtYhlaYtYhlvEsqhFLDtbxLKwRSxzW8Qyq0UstkUs01rEMrlFLNUYs3yv64FwfCfN9Ylz5fVA2+N8X2Kd7Z3Tf45z36aQO+sM0xhafD3Q9hawTG4Ry7QWsdgWscxqEcvcFrEsbBHLzhaxLGoRy3CLWJa2iGVSi1imtohleotYZraIZU6LWOa3iGVJi1j6W8QypUUspkUsM1rEMrtFLPNaxLK4RSx7WsTSl2DZmpel/u7edU42vJfeShxgcsQxlJmjEhwV6UKrn36mG+/Y4XXV7hknuTSu2cJzDl8/dYWCJl+zNZLm7rx5bmvTNVthjV2klbpmCcf5e8LM13k1XrO0S0+3zv+f4vVlhfWFs5rO6fersWKxpHeZHkv9d+v/Ea4JHOLr9/g6pszXCda1vUTUFuOLqbZguFSRxSa0FXS2tejayN7/FU1a4LqIao/j/DyyM3PtK9LEuhgz3wtl3VVY/0my5tfdWr9+Zd3Qmu6PzKJ9nTC4oGPpOHtxYV6O2osdIn+MU9cnF9bCWlgLa2EtrIW1sBbWwlpYC2thLayFtbAW1sJaWAtrYS2shbWwFtbCWlgLa2EtrIU1H2t+XVdfH8G6oTVdH8EsF2Rl6V0fcT5pgQs6lo6zF5p/Jw3rYsx8hbWwFtbCWlgLa2EtrIW1sBbWwlpYC2thLayFtbAW1sI6XlgVdOvfh2Xd0Jo+X2aWzP8PRf358nbSkv8HhaXj7MX2vBy1F+eJ/DFmvsI6sVnz6w7V3/ewbmhN90fFvwNU3x+3kha4oGPpOHuR+W8ADfHf2sG6GDNfYS2shbWwFtbCWlgLa2Gd2Kz5dXuvz1k3tKbX58zisrL0Xp8PkZb8O5iWjrMXmf82Zu2FE/ljzHyFtbAW1sJaWAtrYS2shXVisyro1v/3PeuG1vT6nFkG87LUy51LWuCCjqXj7MW5eTlqLwZF/hgz33hhVdCt9w3rhta0b5hlS16WGuMc0gIXdCwdZy/OyctRe7FF5I8x840XVkNzfTSH4/00d3bsT6K5s2J/Ms2dSTlh7ozYn0pzm2N/Gs1tiv1FNLcx9vnvrG+I/Ytobn3s76C5dbF/Ac2tjf3zaG5N7G+juYHYdzS3OvYHaW5V7O+iuZXUx+2K2J9Oc8tj39JcN/Zn0Nze2J9Jc5fH/iyauyL2Z9PclQk+eL2F5uA17w14fTbNweuzaA5en0lz8PoMmoPXm2kONdpEc6jRRppDjTbQHGq0nuZQo3U0hxqtpTnUaA3N4f/wGqC5ubG/mubmxf4qmpsf++z9gthfQXMLY385zWG/d2lucezvpbklsX85zS2N/Stoblnsw/vgxRTKYTjeDr645vh+gtb0HAH9wLIqL8sg3+8GSGdFXp36cXWlyA9jaFliWKXIYhPa+XXcIOfcF3NbKHT58WwlsazNnHNgWUbrD5AutPrpZ74Q7/zhsezg7JPnZd5/jp8f0JruC3r7wp1yX3ghLLx3lmdlGRwMay7LvGZYYy3xI1d+PsVx3isae3F559Sayr1YWAtrYS2shbWwFtbCWlgLa2EtrIW1sBbWwlpYC2thLazjiZU/6189xiyWGPS+d3CDNqGt8Xk5f6eHtcN3F9fTdxcrM+cW6szfRwwQA7T66WeemX2Sa1/sT6fjvCcysx5QqLnj7+fRmr4vWU755f1uww2G77SnUi2XCR/A2UcM67Iy9L5fWX8y3X/QhE7wGvcB/u4d/QFi25CXrX5MYLZhGkOLv39dq8hiE9r8PWOoE+4La6h2qxJ1yvsd4NCL+g4w9/d1lfBhmDRYN/M+HmLdKgY0MN9P/eO4KIR+LjR4CObg4fLEz3F/pTjH0vHlyjkvI45hGkMr7NFHKNflCe6FxI3j/ByR+TG45ubH4IFO+loZ5LKGWDRed3yvGvLrjjWiZvlZhurXHVKbryNCzYKnHyEOzdcIfcIfvuYJPPhZ+RpugH5mKZ2HHLXvG/w4NNA5/b7Bjwdvp9c5PznC6xzN64wkKz9mar7mDtf6MQc/ZuJnnot1mRl51mfm4es40Zqex9ZTbTI/39evizaSFrj4dQeOLyCOjZlrUpEm1sWY+TYkWFPPYRvUWHvXIjFHaE3+bSSWzVlZeq9DzqD1h0mDdc/MqzvEungdAg3M91P/U/TcfObJ7j887oA5eLgp8XPc3yDOsXR8k3LOm4ljmMbQCo+rn6BcNyW4lxI3jvPrAfjGj8WbFHLZKHLZKJj5c4gNaiy9zyGkNj8/5X/u7+W/qnOyDXRO/3yAP7dYRVz8uUV/Zq6w5uTMa/J172hNj1fQD9e24xr1o8eOPLX/wUM3Hdp/sKIlJonl+mgZ7vOvXUyhUmKO3/qHNrVzOmK2eswn6L4INynmPSWKT+ucvG4/1CB8hhFeD4RLb4P94br6cB19uG5+PjGeiLfhuTK8lgzXwYfr3sN17mEvheeqcF8Pr3fCPgv7KtzHBjq9197h9Uh4XgvP+eE+F+4X4T4RHmfCY2l4nDmr0/v9hfB7DeH3HcLvKYUn8vB7buF3O8Lfowi/9xH+blz4nZDw9xzD74uE/zdoh4+dnd7vmVzc6f0Oyq5Y20t97PZxmY89nd61+3s7vWvzw7X44dr7q3xc7eMaH9f6uM7H9T5u8HGjj5t87PNxs49bfNzq4zYft/u4w8edPu7ycbePe3zc6+M+H/f72O/jAR8HfBz0ccjHYR8P+njIx8M+HvHxqI/HfDzu4wkfR3y8xMeTPp7ycdTHMR/HfbzUx9M+Xubj5T5e4eOVPl7l49U+XuPjtT5e5+MZH6/38QYfb/TxJh9v9vEWH2/18TYfb/fxDh/v7PS8fpePd/t41sdzPp738R4f7/XxPh/v9/EBHx/08SEfH+703tN81MfHfHzcxyd8fLJz8k7CG//r8RdH8HtB+3r3w4Gjjx05NjA48IT/d/9jjx15+tDBLQN87OjA48ePHhs4emz/U8cGDj915PGBoS287nNWZ91n42Mj7hNXPnHw0MsGjhw/NnDk8MADR44/cfDo3wMOZujV/8QCAA==", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "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" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ] -} diff --git a/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json deleted file mode 100644 index 6f79711a6ab..00000000000 --- a/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json +++ /dev/null @@ -1,621 +0,0 @@ -{ - "name": "SchnorrSingleKeyAccount", - "functions": [ - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [], - "returnTypes": [], - "bytecode": "H4sIAAAAAAAA/9XdVXBUZxyG8U1aoO4N7u6r2bNocHd3smSDu5MKpe7UvaXUnbq3lLpT95ZC3QW55bzDMmS45eXi2ZkzJDeZ5wdkd8+e7/y/XZFIZFtkz6MgPArDo0r+673fV93v+2r5rys/9n5fkv8zES1OJnPpeC6WiJVG45lskIomU9niIBbEUkGqLB4kErkgGaQz2Uw6moklE7lYeSqTKI/ueVSv9LOiB/g4mJ01IJ01IZ21IJ21IZ11IJ11IZ31IJ31IZ0NIJ0NIZ2NIJ2NIZ1NIJ1NIZ3NIJ3NIZ0tIJ0tIZ2tIJ2tIZ1tIJ1tIZ3tIJ3tIZ1RSGcM0hmHdCYgnUlIZwrSWQzpTEM6A0hnBtLZAdLZEdLZCdLZGdLZBdLZFdJZAunsBunsDunsAensCensBensDensA+nsC+nsB+nsD+kcAOkcCOkcBOkcDOkcAukcCukcBukcDukcAekcCekcBekcDekcA+kcC+kcB+kcD+mcAOmcCOmcBOmcDOmcAumcCukshXRmIZ3TIJ1lkM4cpLMc0jkd0jkD0jkT0jkL0jkb0jkH0jkX0jkP0jkf0rkA0rkQ0rkI0rkY0rkE0rkU0rkM0rkc0rkC0rkS0rkK0llxkDoL9+uMHtgjVmA0nwIxFxrNp0LMhxjNp0HMhxrNp0PMVYzm1RBzVaP5DIi5mtG8BmKubjSfCTHXMJrPgphrGs1nQ8y1jOZzIObaRvO5EHMdo/k8iLmu0Xw+xFzPaL4AYq5vNF8IMTcwmi+CmBsazRdDzI2M5ksg5sZG86UQcxOjeS3E3NRovgxibmY0Xw4xNzear4CYWxjNV0LMLY3mqyDmVkbz1RBza6P5Goi5jdF8LcTc1mi+DmJuZzRfDzG3N5pvgJijRvONEHPMaL4JYo4bzTdDzAmj+RaIOWk0r4OYU0bzrRBzsdG8HmJOG823QcyB0Xw7xJwxmu+AmDsYzXdCzB2N5rsg5k5G890Qc2ej+R6IuYvRfC/E3NVovg9iLjGa74eYuxnND0DM3Y3mByHmHkbzQxBzT6N5A8Tcy2h+GGLubTQ/AjH3MZofhZj7Gs2PQcz9jObHIeb+RvMTEPMAo/lJiHmg0fwUxDzIaH4aYh5sND8DMQ8xmp+FmIcazc9BzMOM5uch5uFG8wsQ8wij+UWIeaTRvBFiHmU0vwQxjzaaN0HMY4zmlyHmsUbzKxDzOKP5VYh5vNH8GsQ8wWh+HWKeaDS/ATFPMprfhJgnG81vQcxTjOa3IeapRvM7EHOp0fwuxJw1mt+DmKcZze9DzGVG82aIOWc0fwAxlxvNH0LM043mjyDmGUbzxxDzTKP5E4h5ltH8KcQ822j+DGKeYzR/DjHPNZq/gJjnGc1fQszzjeavIOYFRvPXEPNCo/kbiHmR0fwtxLzYaP4OYl5iNG+BmJcazd9DzMuM5q0Q83KjeRvEvMJo/gFiXmk0/wgxrzKaf4KYK4zmnyHmw4zmXyDmw43mXyHmI4zm3yDmI43m3yHmo4zmPyDmo43mPyHmY4zmvyDmY43mvyHm44zmfyDm443mfyHmE4zm/yDmE43m/yHmk4zm7RDzyUbzDoi5yGjeaTQX5X9OQd6sfTC1L6T2SdS+gdpHT+eEOkfSOYPeQ+s9pd5j6T2HXoP1mqTnaD1n6XdY/6f1b1xU6e+zIv+n9kDVnqDaI1N7Rq4OD+0puCY8tOec9mDTnmTao0t7VmkPJ+1ppD1+tOeN9oDRnijaI0R7ZqwND+2poD0GNHNfM+g1k10zyjWzWzOsNdNZM44181czcDUTVjNSNTN0XXhopuT68NDMQc3g00w6zWjTzDLN8NJMK8140swjzQDSTBzNiNHMlA3hoZkamjGhmQuaQaB78nWPuu7Z1j3MuqdX97jqnk/dA6l7AnWPnO4Z2xgeuqdoU3jonhPdg6F7ErRGX2vWtYZba5q1xldrXrUGVGsitUZQa+Y2h4fWVGmNkdbcaA2K1mRojYKu2esatq7p6hqnrvnpGpiuCekaia4ZbAkPfaa8NTz0maM+g9NnUvqMRp9Z6Bxe57Q6x9M5j84B9J5Y7xH1nknvIfSaqtcYPefqOUi/kzsj+x67AeA6V5skugAA", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "target_address", - "type": { - "kind": "field" - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "H4sIAAAAAAAA/+1dB3wU1fPf9IReRHrvSrlNAklsNEUFC0qXImmH9I4gIL0rSK8iIEiRooJIEaQJ0gSkgyKgIIKKgqiowH+ezMrLJpZfbub+O2bf5zN890Lybtp7U/bdbVR2w+iV1fhjBAAFAoXgtfU61PY6zPa6gO11EdvrErbXZfBaH9br6ohRnqrR0ckxkclmlBnviYxLiK3iia6SUDXWjDWrxFZJioyNikqOjY6NiUuIi/HEmdFRyaa3SlyU13NrlNPm8vg4OPksL4TPu4TwebcQPisI4bOiED4rCeGzshA+PUL4NIXwGSmEzyghfEYL4bOKED6rEvKpeFM5YzGcLy/QDaB8iPkRCyAWRCyEWBixCGJRxGKIxRFLIJZELIVYGrEMYlnEcojlEe9CvBuxAmJFxEqIlRE9iCZiJGIUYjRiFcSq2rwxQLFGykFtwzhDhq/dI4TPe4XweZ8QPu8XwucDQvisJoTP6kL4rCGEz5pC+KwlhM8HhfD5kBA+awvh82GDPufNgfOpfE/lfnGI9yDei3gf4v2IDyBWQ6yOWAOxJmItxAcRH0KsjfiwcTvnfAToUdSb4i0n8uaUfFz9fh2gukBBRuqecFo29/g2zDp0c3mCNT4fQ3wcebbe4wmgJ4HqAT0F9DRQfaAGQA2BGgE1BmoC1BToGaBmQM2BWgC1BHoWqBVQPFACUCJQElAykBeoNdBzQG2A2gK1A2oP1AGoI1AnoM5AXYC6AnUD6g7UA6gn0PNAvYB6A70A1AeoL1A/oBeB+gMNABoINAhoMNAQoKFAw4CGA40AGgk0Cmg00EtAL6MOxmh66o4GjTBu3QvQR6h2XR3R4+Ow7l1QzhmC/BsaGpo8Edp7Bhmp5Q3Wfmb9fwhiNqDMacwZqv1ddRo5TPt6q65dW++l8xLkIF4C/p950W1saD+z/l/3Bbvdla07aOsgJI2/0X/X/nu67KEMsuvvU117bb1XJo2HEAfwEuQgXgLT4CWMlpfICCPlXmnxpI/q2nWYxksEKS/RHjVf+P/AS4TGSyZSXm7t9ZmJ51RzZNH4t2S1eM+s/X9mTbYstHz84X+ZjJQ6tV7r/Lm8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8ury6vLq8urxmbF4jtJ+F/j/zklnjIZyNl2hP5jTem+O8sv75D2tude4/KuD2e9KeHY/26OfYQ3FeiwfrvYK036kTcJuvGDa+bp2z1s+RB9t4yqTxpNue9jz7H18nk8IP9c97WP9nX6+ZDH+skWj1dRNG1jR4y6LxYe0XWTW+rWv9syTZbLpUP8uuzWP9zPo8Y2btZ4FpvIflQ9m0n1n8Zdd+ZvFgzRtmpLStrj+Lt+qIHt9GZIBx25+seYPS0EOExpthk98w0vaJTLbfY9gj/1i7Oh/hRtr7VFbS9731GQ89XqkRYHtdXbvOqvGSnZSXWzrIoc1fXXsP/X1z0r6vqb9vAJL1HtbPg7TreE1BOW9f/unn+lrLlsbv6ddZbH+TWfv/bMwyZ9f4qK69tt5LrYVGmqzZ0uA7SOM7m3Zt8Z2Nge+sNr7T2p+yazxYmIOBl7/Sob63htp0Rs/LrbzG/t763m3pzJ6D0H6+MjpKf09r/JvPXKr9zrJf6+TuNXp0f65xm+4dk7t1C9BmsWaulcbMgZrU1kpM6xO61v+FGWl8Kr26QaEGjxlom9zJH3UvhvOMBXoFaBzQeKAJQBOBJgFNBpoCNBVoGtB0oBlAM4FeBZoF9BrQbKA5QHOBXgeaBzQf6A2gBUALgRYBLQZ6E2gJ0FKgZaikADSU4iXcuP36FdvrcbbX422vJ9heT7S9nmR7Pdn2eort9VTb62m219Ntr2fYXs+0vX7V9nqW7fVrttezba/n2F7Ptb1+3fZ6nu31fNvrN2yvF9heL7S9XmR7vdj2+k3b6yW210ttr5cZKUsENazFWx3R49tIsWZ8/XqRsYRz3ZGFttT6K/2ll89krxoe8xWiuZQtxhHqL4/j9ffH1OZ43+eKRJnNCYT6u9PJ+ov+k09zom9zeTSZzUmE+svrVP1FpuDTnJz+uTw2mc0phPrL50D9VfWm4tOcmr65YtOQ2ZxGqL/8TtNfbJp8mtP/97li/kJmcwah/go4SX8xf8mnOfN/myvyb2Q2XyXUX0Gn6C/mb/k0Z/37uRL/QWbzNUL9FXKC/mL+kU9z9r+by/MvZDbnEOqv8P+3/jz/ik9z7j/PVeVfymy+Tqi/Iv+f+ov+13ya8/52rmjv/yCzOZ9Qf0X/v/QX8z/xab7x13PF/o8ymwsI9Vfs/0F/cd7/mU9zYdpzedIhs7mIUH/F/a0/T7r4NBennstMp8zmm4T6K+FP/SWlm09zScq5onyQ2VxKqL+SftJfpNcnPs1lBl0vUe/Z+aq/Un7Sn8e3YRL22cw7CfVXWoj+CPtEZj5C/ZURoj/CPodZgFB/ZYXoj7BONwsR6q+cEP0R1plmEUL9lReiP8I6ySxGqL+7hOiPMM83SxDq724h+iPMU81ShPqrIER/hHmWWYZQfxWF6I8wTzDLEeqvkhD9EcY58y5C/VUWoj/CfdqsQKg/jxD9Ee4zZiVC/ZlC9Ee4TkxCnzEp9Wd9BOcx49ZjkB43bj/ySQ31yCB1zu1JxHqITyE+jVgfsQFiQ8RGiI0RmyA2RXwGsRlic8QWiC0Rn0VshRiPmICYiJiEmIzoRWyN+BxiG8S2iO0Q2yN2QOyI2AmxM2IXxK6I3RC7I/ZA7In4PGIvxN6ILyD2QeyL2A/xRcT+iAMQByIOQhyMOARxKOIwxOGIIxBHIo5CHI34EuLLiMWMW8M672idg1yCaJ2btM5TWucsFyJa5zKt85rWOU7rfKd17nMuonVOdDaida7UOm9qnUO1zqda51at86zWOVfr/Kt1LtY6L2udo7XO11rnbq3zuNY5Xev8rnWud7mRclCfj15u0O2vijd1VN7aD+1rewyiOn7/FtDbNtkCbbL5yk8goZ7eopvL46/HvOU3aPdra7yjXdsf9WQYKR+RRS2TYXsfux6zGYwfVuAy0jsM864w6BYSl9wr6G2UIjGj3lAodbqSUJdqIdg/S8RlM6K5PJx85hPCZ16DfoPWP/f3LtAqoPeAVgOtAVoLtA7ofaD1QBuAPgDaCLRJk1X/vHJaz/MLsulE+rMswzU5DJu82QyW5+kl6Z/AM2z6tOtN16fiNT9eJ3fs0iO5R3K9Hgnt2yTW7tExsXubTh1rxbdvrzuE9SaWYwSlIaT95/oHvK0Pgesfnrf+LkzDAOoVonbJAkZqbXh8HNqU5E9U3kww162PEnm9/koVNxv0O5EaW7RrN1X0cc7NqFDqebcazk4Vldxb6W3EGtq3EvKpnNceWjl4fo9Jt8R2i9R18SHiNu1n+iNqrd9Vm8/NNHQXoF0H4u8E/s3vBPzFPH+VNrBtMJZwSgHXNWG3pfGmgcTv/aFBt2Fs1+YyY6MiI2Oi1O/FJnnM6KTEyNjIyKSEaE+iJz4xMjku2ozzRkdGRyUmJSbAnPGm1+ONT4zzxt7iy1/RcrvBEy0/0q7daOnjnNtRodTz7jCcHS2V3DvobZQmr77Kvw15pZ53p0G7QNUi3GmkjsLUd/7eI9CBVTpQbtLbiP3IGtR230WoP38Fk10GTzDZrV27wcTHOXehQqnn3WM4O5gouffQ24i19NpDyKe/Sq/VTLoltluK0utjxL3azzJU6aUUoJdeew3+0utjg27D2GfIK732GTzRcr927UZLH+fchwqlnvcTw9nRUsn9Cb2NWEqvvcgr9bwHDNoFqhbhAYO/9FpNoAOrdKDcpPcS+5E1qO1+kFB//gomBw2eYHJIu3aDiY9zHkSFUs972HB2MFFyH6a3EWvpdZiQT3+VXmuYdEtstxSl1xHEo9rPMlTppRSgl15HDf7S64hBt2EcM+SVXscMnmh5XLt2o6WPcx5DhVLPe8JwdrRUcp+gtxFL6XUUeaWe91ODdoGqRfipwV96rSHQgVU6UG7SR4n9yBrUdv+MUH/+CiafGTzB5KR27QYTH+f8DBVKPe/nhrODiZL7c3obsZZenxPy6a/SawOTbontlqL0OoV4WvtZhiq9ThkpS6/TBn/pdcqg2zDOGPJKrzMGT7T8Qrt2o6WPc55BhVLP+6Xh7Gip5P6S3kYspddp5JV63rMG7QJVi/CswV96bSDQgVU6nCK2E5U+df1R2/0cof78FUzOGTzB5Cvt2g0mPs55DhVKPe95w9nBRMl9nt5GrKXXeUI+/VV6fcCkW2K7pSi9vka8oP0sQ5VeSgF66XXB4C+9vjboNoyLhrzS66LBEy2/0a7daOnjnBdRodTzfms4O1oqub+ltxFL6XUBeaWe9zuDdoGqRfidwV96fUCgA6t0oNykLxD7kTWo7X6JUH/+CiaXDJ5g8r127QYTH+e8hAqlnvcHw9nBRMn9A72NWEuvHwj59FfptZFJt8R2S1F6XUa8ov0sQ5VeSgF66XXF4C+9Lht0G8aPhrzS60eDJ1pe1a7daOnjnD+iQqnn/clwdrRUcv9EbyOW0usK8ko9788G7QJVi/Bng7/02kigA6t0oNykrzD7kce3YapvYlzJ4Ee/OFxu9V2bvzDIXS+Ls/eNd5nkforpQRzUCRihfcynsjjbx/Mx2bqBw318FZPcDYX4OKF9zIYO9/G8TLZu4nAf38Qkd1MhPk5oH7Opw338NNraoJ2XhdcLgni94kdeKR58w7Hemzvc99cyyd1CyD5HaB+zhcNtvY7J1q38ZGsH1Y5mK+IH+6nGqdVYVfm1eujXNsS9iEcRMwFdA/oVban+1nqkxFr8nXWI7yOuRzyNeAHxCmJOoN+AfjdSDmpfuW7w+Ao1nzeE8HnToPdDq3d4HX3DopuIEShIQACvrwQGyLBBkBA+gwP4fEXZSvlGEGJwwG1fCYHrUGZfCRNig3AhfEYw+koY+ka45SOar2SC68zMvpJFiA2yCuEzG6OvZEHfyIqYTfOV7HCdg9lXcgqxQS4hfOZm9JWc6Bu5EHNrvnIHXOdh9pU7hdggrxA+8zH6yp3oG3kR82m+kh+uCzD7SkEhNigkhM/CjL5SEH2jEGJhzVeKwHVRZl8pJsQGxYXwWYLRV4qhbxRHLKH5Skm4LsXsK6WF2KCMED7LMvpKafSNMohlNV8pB9flmX3lLiE2uFsInxUYfeUu9I27EStovlIRrisx+0plITbwCOHTZPSVyugbHkRT85VIuI5i9pVoITaoIoTPqoy+Eo2+UQWxquYrMXAdy+wrcUJscI8QPu9l9JU49I17EO/VfOU+uL6f2VceEGKDakL4rM7oKw+gb1RDrK75Sg24rsnsK7WE2OBBIXw+xOgrtdA3HkR8SPOV2nD9MLOvPCLEBo8K4bMOo688gr7xKGIdzVfqwvVjzL7yuBAbPMFgA+s81uOo8ycQw4GehOt6zLp/Sojun2bU/VOo86c13deH6wbMum8oRPeNGHXfEHXeSNN9Y7huwqz7pkJ0/wyj7puizp/RdN8Mrpsz676FEN23ZNR9C9R5S033z8J1K2bdxwvRfQKj7uNR5wma7hPhOolZ98lCdO9l1H0y6tyr6b41XD/HrPs2QnTfllH3bVDnbTXdt4Pr9sy67yBE9x0Zdd8Bdd5R030nuO7MrPsuQnTflVH3XVDnXTXdd4Pr7sy67yFE9z0Zdd8Ddd5T0/3zcN2LWfe9hej+BUbd90adv6Dpvg9c92XWfT8hun+RUff9UOcvarrvD9cDmHU/UIjuBzHqfiDqfJCm+8FwPYRZ90OF6H4Yo+6Hos6HabofDtcjmHU/UojuRzHqfiTqfJSm+9Fw/RKz7l8WovsxQvgcK4TPV4TwOU4In+OF8DlBCJ8ThfA5SQifk4XwOUUIn1OF8DlNCJ/ThfA5QwifM4Xw+aoQPmcJ4fM1IXzOFsLnHCF8zhXC5+tC+JwnhM/5Qvh8QwifC4TwuVAIn4uE8LlYCJ9vCuFziRA+lwrhc5kQPpcL4fMtIXy+LYTPd4TwuUIInyuF8PmuED5XCeHzPSF8rhbC5xohfK4Vwuc6IXy+L4TP9UL43CCEzw+E8LlRCJ+bGM68NMb51Perq7MumxBfxrMvYxDHIr6CaCCGIGZCzI54B2J+xCKIJRHLIVZEjESMQbwPsQZibcS6iE8i1kdsjNgM8VnERMTWiO0QOyF2Q3wesQ9if8TBiMMRRyOOQxyPOAFxIuIkxMmIUxCnIk5DnI44A3Em4quIsxBfQ5yNOAdxLuLriPMQ5yO+gbgAcSHiIsTFiG8iLkFcirgMcTniW4hvI76DuAJxJeK7iKsQ30NcjbgGcS3iOsT3EdcjbkD8AHEj4ibEu4E2w/WWgFvrTf889rvoy9cQN+Pf5ALaCtcfWgsUh3X+qzqir+u1AOFc2+jW/h8P/A0yUg/7fuXxbfzxnEWiuVifOp5PCJ95Ddr93+JxIF5vhxcfAe0A2gm0C2g30B6gj4H2Au0D2g/0CdABoINAh4AOAx0BOgp0DOg40AmgT4E+AzoJ9DnQKaDTQGeAvgD6Eugs0Dmgr4DOA30NdAHoItA3QN8CfQd0Ceh7oB+ALgNdAfoR6CrQT0A/A/0CdA3oV6DfgH4Huq7WPdDNgFuLPAAoECgIKBgoBCgUKAwoHCgCKBNQZqAsQFmBsgFlB8oBlBMoF1BuoDuA8gDdCZQXKB9QfqACQAWBCgEVBioCVBSoGFBxoBJAJYFKAZUGKgNUFqgcUHmgu4DuBqoAVBGoElBlIPUwKBNIPc49CigaqApQVaAYoFigOKB7gO4Fug/ofqAHgKoBVQeqAVQTqBbQg0APAdUGejjwtu9mR1TfXWF/qHaEtn8EaD/T/vyPEapdVyfyW4aHeHvUk+/DNTkMm7zZUJZQ0veNNf94/oSRcthC0p/vpetT8ZobrxPj27ev17VNz/juybV7dEzs3qZTR31pW9MPRAxKQzz7z4M1VViP7gnRfmb9XZiGAdR7nXou8baA1Hrw+DgMbdh59vm7egJ9n8t6DnVaD5NPi2ePb8PUefb4OHR+H9W8y75/qGE5HMN6Ng3b+9j1mC2Nn5G+OYeRlEKp560TSOf8XHLXCSS3EWuSVodwQSnntQdVDp53BPDolthukbou6uKLx7Qfhmj6sX6sNp+baeguQLsOxN8J/JvfCfiLef4qYWDbYCzhlAKua8I+Fpj6TQOJ37su4YbxuDaXGRsVGRkTpX4vNsljRiclRsZGRiYlRHsSPfGJkclx0WacNzoyOioxKTEB5ow3vR5vfGKcN/YWX/6Klo8zRcsn3GhJa6QnGKLlkw6PlkruJ5miJXWq/BjySj1vPeIFqtSp5rRH4SBi2+kR2NfSgXKTfiyQ1o+sQW33pwSWXk8xBZOn3WBCa6SnGYJJfYcHEyV3fWGlV32BpddOgaVXA3zRMKOWXg1spVdDP5ReDQg3jEYCS69GTNGysRstaY3UmCFaNnF4tFRyNxFSejVEXqnnbcpQejX1Q+m1k7D0otykGwopvZ4RWHo9wxRMmrnBhNZIzRiCSXOHBxMld3NhpVdzgaXXLoGlVwt80TKjll4tbKVXSz+UXi0IN4xnBZZezzJFy1ZutKQ1UiuGaBnv8Gip5I4XUnq1RF6p501gKL0S/FB67SIsvSg36ZZCSq9EgaVXIlMwSXKDCa2RkhiCSbLDg4mSO1lY6ZUssPTaJ7D08uKL1hm19PLaSq/Wfii9vIQbxnMCS6/nmKJlGzda0hqpDUO0bOvwaKnkbiuk9GqNvFLP246h9Grnh9JrH2HpRblJtxZSerUXWHq1ZwomHdxgQmukDgzBpKPDg4mSu6Ow0qujwNJrv8DSqxO+6JxRS69OttKrsx9Kr06EG0YXgaVXF6Zo2dWNlrRG6soQLbs5PFoqubsJKb06I6/U83ZnKL26+6H02k9YelFu0p2FlF49BJZePZiCSU83mNAaqSdDMHne4cFEyf28sNLreYGl1ycCS69e+KJ3Ri29etlKr95+KL16EW4YLwgsvV5gipZ93GhJa6Q+DNGyr8OjpZK7r5DSqzfySj1vP4bSq58fSq9PCEsvyk26t5DS60WBpdeLTMGkvxtMaI3UnyGYDHB4MFFyDxBWeg0QWHo9zLTBEtstRek1EF8Myqil10Bb6TXID6XXQMINY7DA0mswU7Qc4kZLWiMNYYiWQx0eLZXcQ4WUXoOQV+p5hzGUXsP8UHo9TFg6UG7SgwJ5/cjj2/jzi/Cp/Wi4w+VWD48ZzrB+ErI4e99QD2HhkDuRWG5rUCdghPYxE7M428fzMfm41+E+/hGTj7cW4uOE9jFbO9zH8zL5eFuH+/gBJh9vJ8THCe1jtnO4j6sccnjgbV06mdfWgnjtLIjX3n7k1dc9RLHJsTd1dPg63c20J3cSsicT2sfs5HBb72GydVc/2dpBda5JKbOyh2ryWk1gVQuoh/KqJ00obIjYEjET0Ai4Hom2VH9rPXlwN/7tHsSPEfcitsY5OiP2RswJNAquR2tzWg9XrIa/Ux2xBmJNxFqIDyKCaoyX4Pplba7OONco/J0DyM9BxEOIhxGPIB5FPIZ4HPEE4qeInyGeRPwc8RTiacQziF8gfol4FvEc4leI5xG/RryAeBHxG8RvEb9DvIT4PeIPiJcRryD+iHgV8SfEnxF/QbyG+Cvib4i/I15HvIF4E9FAfQcgBiIGIQYjhiCGIoYhhiNGWL6HmNmyNWJWxGyI2RFzWP6FmAsxN+IdiHkQ70TMi5gPMT9iAcSCiIUQCyMWQSyKWAyxOGIJxJKIpRBLI5ZBLItYDrE84l2IdyNWQKyIWAmxMqIH0USMRIxCjEasglgVMQYxFjEO8R7EexHvQ7wf8QHElxAfQqxt8Q80Bq7HamvT6mtvR58Zgb87xrIZ0CtwPQ43ZOq4pHq5rzDEpfGBzo7H6mHoWxn62BMI5fbXTdbCBm08tcbEwNvX7k1WH+csjAqlnndSoLNvsiq5JwWS24g12aXU6WS6DeWPUxv6o7Wt4eQNhZPPQkL4LGjQb9AKs+L1FPCxqUDTgKYDzQCaCfQq0Cyg14BmA80Bmgv0urYesyOqY1n2TT5C8zf9+JYeBNQI1a6rE8nJEFQ86rhbuCaHYZM3m5GyeCN63yT1XiFGymEPXtXT0KfiNT9eJ3fs0iO5R3K9Hgnt2yTW7tExsXubTh1rxbdvrzuE9SaWYwSlIaT958GaQqxKOET7mfV3YRoGUK8QtUsWMVJrw+Pj0KYkTxXnEUQJf59enxdIvxOpMd9NFWmNNJ8hVXzD4amikvsN5lSRU6ceH4e/Tq9PC+TRLbHdUpxeX4AvFmo/zFCn15UC9NPrCwP5T68vINwwFmlzSTm9vogpWi52oyWtkRYzRMs3HR4tldxvMkVL6lR5IfJKPe8S4gWq1KnmtEdh6tPr0whLB8pNeiFTZkBt96UCS6+lTMFkmRtMaI20jCGYLHd4MFFyLxdWei0XWHpNF1h6vYUv3s6opddbttLrbT+UXm8RbhjvCCy93mGKlivcaElrpBUM0XKlw6OlknulkNLrbeSVet53GUqvd/1Qek0nLB0oN+m3hZReqwSWXquYgsl7bjChNdJ7DMFktcODiZJ7tbDSa7XA0muGwNJrDb5Ym1FLrzW20mutH0qvNYQbxjqBpdc6pmj5vhstaY30PkO0XO/waKnkXi+k9FqLvFLPu4Gh9Nrgh9JrBmHpQLlJrxVSen0gsPT6gCmYbHSDCa2RNjIEk00ODyZK7k3CSq9NAkuv2QJLr834YktGLb0220qvLX4ovTYTbhhbBZZeW5mi5YdutKQ10ocM0XKbw6OlknubkNJrC/JKPe92htJrux9Kr9mEpQPlJr1FSOn1kcDS6yOmYLLDDSa0RtrBEEx2OjyYKLl3Ciu9dgosveYILL124YvdGbX02mUrvXb7ofTaRbhh7BFYeu1hipYfu9GS1kgfM0TLvQ6PlkruvUJKr93IK/W8+xhKr31+KL3mEJYOlJv0biGl136Bpdd+pmDyiRtMaI30CUMwOeDwYKLkPiCs9DogsPSaK7D0OogvDmXU0uugrfQ65IfS6yDhhnFYYOl1mClaHnGjJa2RjjBEy6MOj5ZK7qNCSq9DyCv1vMcYSq9jfii95hKWDpSb9KFAXj/y+DZM9U2Mkxn86LjD5Vbfe3ucQe7uDn+4mPr+WA65ewh5kA2hfcweDn+QTSEmH+/lcB+fyuTjvYX4OKF9zN4O9/GCTD7e1+E+/jqTj/cT4uOE9jH7OdzHt6CtDdp5eR6UJ4jXQ37kleLBixzrfYDDfX8m0z43UMg+R2gfc6DDbf0qk62HCHnwImVtMoTxwYsqv1YPPFuI+DbiWkT14MUTcP0p2lJ/8OJM/J1XEWchvoa4BXE34iFE9eDFz+D6ZKCRYlD7yueBPL5CzecpIXyeDqT3Q6t3+Dn6xinE04jqjtIZuP6C2Ve+FGKDs0L4PMfoK1+ib5xFPKf5yldwfZ7ZV74WYoMLQvi8yOgrX6NvXEC8qPnKN3D9LbOvfCfEBpeE8Pk9o698h75xCfF7zVd+gOvLzL5yRYgNfhTC51VGX7mCvvEj4lXNV36C65+ZfeUXITa4JoTPXxl95Rf0jWuIv2q+8htc/87sK9eF2OCGED5vMvrKdfSNG4g3NV9RvxQQxOsrgUEybBAkhM/gID5fUbZSvhGEGBx021dC4DqU2VfChNggXAifEYy+Eoa+EW75iOYrmeA6M7OvZBFig6xC+MzG6CtZ0DeyImbTfCU7XOdg9pWcQmyQSwifuRl9JSf6Ri7E3Jqv3AHXeZh95U4hNsgrhM98jL5yJ/pGXsR8mq/kh+sCzL5SUIgNCgnhszCjrxRE3yiEWFjzlSJwXZTZV4oJsUFxIXyWYPSVYugbxRFLaL5SEq5LMftKaSE2KCOEz7KMvlIafaMMYlnNV8rBdXlmX7lLiA3uFsJnBUZfuQt9427ECpqvVITrSsy+UlmIDTwMNrBa4pVR5x6rfwGkPuEayaz7KCG6j2bUfRTqPFrTfRW4rsqs+xghuo9l1H0M6jxW030cXN/DrPt7hej+Pkbd34s6v0/T/f1w/QCz7qsJ0X11Rt1XQ51X13RfA65rMuu+lhDdP8io+1qo8wc13T8E17WZdf+wEN0/wqj7h1Hnj2i6fxSu6zDrvq4Q3T/GqPu6qPPHNN0/DtdPMOv+SSG6r8eo+ydR5/U03T8F108z676+EN03YNR9fdR5A033DeG6EbPuGwvRfRNG3TdGnTfRdN8Urp9h1n0zIbpvzqj7Zqjz5pruW8B1S2bdPytE960Ydf8s6ryVpvt4uE5g1n2iEN0nMeo+EXWepOk+Ga69zLpvLUT3zzHqvjXq/DlN923gui2z7tsJ0X17Rt23Q52313TfAa47Muu+kxDddxbCZxchfHYVwmc3IXx2F8JnDyF89hTC5/NC+OwlhM/eQvh8QQiffYTw2VcIn/2E8PmiED77C+FzgBA+Bwrhc5AQPgcL4XOIED6HCuFzmBA+hwvhc4QQPkcK4XOUED5HC+HzJSF8viyEzzFC+BwrhM9XhPA5Tgif44XwOUEInxOF8DlJCJ+ThfA5RQifU4XwOU0In9OF8DlDCJ8zhfD5qhA+Zwnh8zUhfM4WwuccIXzOFcLn6wxnXhrjfOr71dVZl9cRO+HZl86IXRC7Ip7B3/sK8RvEHxB/QvwN0cC/C0HMhJgd8Q7E/IhFEEsilkOsiGgiVkGMQ7wfsQbiQ4iPIj6O+BRiQ8SmiC0Q4xGTEdsgdkDshtgdsQdiT8TnEXsh9kZ8AbEPYl/EfogvIvZHHIA4EHEQ4mDEIYhDEYchDkccgTgScRTiaMSXEF9GHIM4FvEVxHGI4xEnIE5EnIQ4GXEK4lTEaYjTEWcgzkR8FXEW4muIsxHnIM5FfB3xbqB5cD0/6NZ60z+PPQV97wTiPPybXEBvwPUC6xdxUK/XhUHpnstjm8tvD+ldSLzHWGORpmv3Ib0+zqmMtCiIft7FQXTOzyX34iByG7E+0n4x4YJSogcy8roS5ihg8OrXx7lN+w90fbyJvrFE85EM9Vh7pYANmrBLNOezM0T13m8SbhpL/2au2JjkBG9MdFS8J9qbAPNU9SZHxUfGmd7YKJg+KtpMiE/2JEUnxFSNrhrrjfH4K2IuZYqYy9yISWukZQwRc7nDI6aSezlTxKROl5cgr+THR5geARfko07tfFL60lt0m5I5jPhxcmoTU/zVwDmpfV5lMCsZ/HOEn/zI11KRMiAvIfQjLv1R2/ltgWX720xJyDtuEkJrpHcYkpAVDk9ClNwr/JSEeHwbpnoGLQev9tLdGtT8+7Jhe1OOxDTYZSnbV6K+3/0XZXvNNHRnL9trGv9ctqc1zz+W7RzORjTXn5nVyqDbwgaiUmsYKYevmSujHOa7hJvZKrrF4LX0uYoxc1V6XMJQAY1ifvi3r1mSknslg9yjnSV3Kv6U3O8yyP2SQytee4Ch3Dd0H/f5YLdD9WcbJqF/m4Q+Y3LpL5B4nawkjDXvEVbKag6O2PJeEM8eRmlrjntaEwLp5V4dxOPj1HyuEcLnWiF8riPkUxU56gCW1VlRPqXspXSxjvlwyvtC9L2ecF9V+m5i3I4jSgfrmfW8gTDG+KubuIGpm/iB202kNdIHDN3EjQ7vJiq5NwrqJnLw6h4ESs2zro9NqPPN/6KjWNxIrUd7R7G48c8dxbTm+U90FJUyi2mK2xyUeqd0ckdxM+GGtiWIXr9bglI6EqUeue6Fbw3i3XgpqtJNDNXueAEdxc0Mck9gltvj2/hjv9jKIPdEIZ1AQr80CW1tThRy5uNDgVXah0xV2ja3SqM10jaGKm27w6s0Jfd2QVXadrdK+3MYaQwqnnV9fIQ63+FWaekflqI+slVpO4RVaTsIN7SdDFXaToFV2i4BVdpHDFn7VAFV2g4GuacJqNJ2Mcg9XUiVRuiXJqGtTUr9qWDdxEg9qO1D7Zs7gpzP426me7bkC3IP4U1bqQ61R4BDfUzNIzWDqof7MUPEmCUkYuwmzIr3Ei7KWQIyjb0MfrMviDZSNjZSD0q9cuh2n4CNbT9XpAwkdii9hPZ1rk8EHEHlWJQHgpy/Gb3BIPdsh2/CahF+wiD3HGd+EDsVnwcJ1yOhrc05WcQEsT9vCFH75gEBQeyglCBWhHCuQ4SLRi3oICP1oDZUYYPHUNR8FhLCZ0FCPvWe/UC8PgxOcQToKNAxoONAJ4A+BfoM6CTQ50CngE4DnQH6AuhLoLNA54C+AjoP9DXQBaCLQN8AfQv0HdAloO+BfgC6DHQF6Eegq0A/Af0M9AvQNaBfgX4D+h3oOtANoJvKcWF3DQAKBAoCCgYKAQoFCgMKB4oAygSUGSgLUFagbEDZgXIA5QTKBZQb6A6gPEB3AuUFygeUH6gAUEGgQkCFgYoAFQUqBlQcqARQSaBSQKWBygCVBSoHVB7oLqC7gSoAVQSqBFQZSEUH1b+JBIoCigaqAlQVKAYoFigO6B6ge4HuA7of6AGgakDVgWoA1QSqBfQg0ENAtYEeBnoE6FGgOkB1gR4DehzoCaAngeoBPQX0NFB9oAZADYEaBd/23eyIEUbq0w4R2v6h3ywMNFKOUO26OpHfMpyu+OPzJuGaHIZN3mwoSyjp+8aa6r1CjJTDfm+yehr6VLzmxuvE+Pbt63Vt0zO+e3LtHh0Tu7fp1FFf2tb01hIPSkM8+8+DNVWE4XWI9jPr78I0DKDe6ybDuxxiOihhaArS5/Y1RjcO9n2uZPwQsL9OS+k8e3wcOr9NtL3EPS3l45zKSEqh1PM2DaZzfi65mwaT24g1SWtKuKDsJ6W4eD7KVVHR8hmp6+IZ9Itmmn9kqC+1VQq4rgnbLDj1mwYSv/czhBtGc20uMzYqMjImSv1ebJLHjE5KjIyNjExKiPYkeuITI5Pjos04b3RkdFRiUmICzBlvej3e+MQ4b+wtvvwVLZszRcsWbrSkNVILhmjZ0uHRUsndkilaUqfKzZBX6nmfJV6gahGqOe1RmPqG9lGCG9pW6UC5STcLpvUja1DbvZXA0qsVUzCJd4MJrZHiGYJJgsODiZI7QVjplSCw9DomsPRKRL9IyqilV6Kt9EryQ+mVSLhhJAssvZKZoqXXjZa0RvIyRMvWDo+WSu7WQkqvJOSVet7nGEqv5/xQeh0jLL0oN+kkIaVXG4GlVxumYNLWDSa0RmrLEEzaOTyYKLnbCSu92gksvY4LLL3ao190yKilV3tb6dXBD6VXe8INo6PA0qsjU7Ts5EZLWiN1YoiWnR0eLZXcnYWUXh2QV+p5uzCUXl38UHodJyy9KDfpDkJKr64CS6+uTMGkmxtMaI3UjSGYdHd4MFFydxdWenUXWHp9LrD06oF+0TOjll49bKVXTz+UXj0IN4znBZZezzNFy15utKQ1Ui+GaNnb4dFSyd1bSOnVE3mlnvcFhtLrBT+UXp8Tll6Um3RPIaVXH4GlVx+mYNLXDSa0RurLEEz6OTyYKLn7CSu9+gksvU4JLL1eRL/on1FLrxdtpVd/P5ReLxJuGAMEll4DmKLlQDda0hppIEO0HOTwaKnkHiSk9OqPvFLPO5ih9Brsh9LrFGHpRblJ9xdSeg0RWHoNYQomQ91gQmukoQzBZJjDg4mSe5iw0muYwNLrtMDSazj6xYiMWnoNt5VeI/xQeg0n3DBGCiy9RjJFy1FutKQ10iiGaDna4dFSyT1aSOk1AnmlnvclhtLrJT+UXqcJSy/KTXqEkNLrZYGl18tMwWSMG0xojTSGIZiMdXgwUXKPFVZ6jRVYejVi2mCJ7Zai9HoF/WJcRi29XrGVXuP8UHq9QrhhjBdYeo1nipYT3GhJa6QJDNFyosOjpZJ7opDSaxzySj3vJIbSa5IfSq9GhKUD5SY9LpjXjzy+jT+/CJ/ajyY7XG718JjJDOtnnsMfgq0ewsIh93ymp4NRJ2CE9jHnO/xJcIWYfHyhw338CJOPLxLi44T2MRc53McLMvn4Eof7+BkmH18qxMcJ7WMudbiPqxxysp/qEo9vw+wpiNf+gngd4Udefd1D1Frn2Jvecvg6PcG0J78tZE8mtI/5tsNt/SmTrVf6ydYOqnNNSpmVPVST19oqVS1ww7j1+CKFSYgdEDMBTYHrqWhL9bfWkwdP4N9+ivgZ4knEnjhHf8QRiDmBpsH1dG1O6+GKT+DvPIlYD/EpxKcR6yOCaowZcD1Tm6szzjUNf+cM8vMF4peIZxHPIX6FeB7xa8QLiBcRv0H8FvE7xEuI3yP+gHgZ8Qrij4hXEX9C/BnxF8RriL8i/ob4O+J1xBuINxENlDsAMRAxCDEYMQQxFDEMMRwxwvIBxMyWzhGzImZDzI6Yw7IzYi7E3Ih3IOZBvBMxL2I+xPyIBRALIhZCLIxYBLEoYjHE4oglEEsilkIsjVgGsSxiOcTyiHch3o1YAbEiYiXEyogeRBMxEjEKMRqxCmJVxBjEWMQ4xHsQ70W8D/F+xAcQqyFWR6yBWBOxFuKDiA8h1kZ8GPERxEcR6yDWRXwM8XHEGYgNEBtaegN6Fa5naWvT6msfRl+dgr/7quUrQK/B9Wwtl1ODOo7MCU73XB7bXH67OTgnmDYOWGOupmvrMlD7f/fm4P8wpzLS3GD6eV8PpnN+LrlfZyrArMGpU4+Pw36UhprXlTDHtgBe/fo4t2n/ga6Peegb8zUfyVDHaZQCNmjCztecz84Q1XvPI9w03vibuWJjkhO8MdFR8Z5obwLMU9WbHBUfGWd6Y6Ng+qhoMyE+2ZMUnRBTNbpqrDfG46+I+QZTxFzgRkxaIy1giJgLHR4xldwLmSIm+e1r5JV63lVM7Rxfj8+kuqVL6EuL6DYlcxVxa0htYoq/GjgnVxZD7Uer/eRHvpaKlAF5PqEfcemP2s6LBZbti5mSkDfdJITWSG8yJCFLHJ6EKLmX+CkJ8fg2zMlMvPrrUzC+bNjelCMxDXZZyvalqO9l/6Jsr5mG7uxle03jn8v2tOb5x7Kdw9mI5vozs1oafFvYQFRqDSPloD74TSiHuYxwM1tOtxi8lj6XM2auSo/zGSqgtc46SJcqS1JyL2WQe53DDxAquZcxyP2+Qytee4Ch3Dd0H/dVf+sdqj/bMAn92yT0GXO9kAM0SwljzVuEvqzm4IgtbwXz7GGUtuboBo0PZDgQGMzj49R8viOEzxVC+FxJyKcqcp41bndWlE8peyldrGQ+nPKuEH2vItxXlb5bGbfjiNLBKmY9v0cYY/zVTXyPqZu42u0m0hppNUM3cY3Du4lK7jWCuokcvLoHgVLzrOtjLep83b/oKBY3UuvR3lEsbvxzRzGtef4THUWlzGKa4tYFp94pndxRXEe4ob3PoN/3g1M6EqUeue6Fr2eu+iiq0rUM1e5mAR3FdQxyb3H4R8GU3OsZ5N4qpBNI6Jcmoa3NrULOfGwQWKVtYKrSPnCrNFojfcBQpW10eJWm5N4oqErb6FZpfw4jjUHFs66PTajzzW6Vlv5hKWqTrUrbLKxK20y4oW1h0O8WgVXaVgFV2iaGrP0jAVXaZga5dwio0rYyyL1TSJVG6Jcmoa1NSv2pYN3KSD2o7UPtm5uDnc/jh0z3bMkX5DbCxECqQ20T4FDbqXmkZlD1cLczRIyPhUSMDwmz4o8IF+XHAjKNjzgyrGDaSPmskXpQ6pVDtzsEbGw7uSJlILFDTSZc4LsEHEHlWJS7HX4EVcn9GoPc+xy+CatFuItB7v3O/CB2Kj73EK5HQlub+7OICWJ/3hCi9s3dAoLYHq4gRp5NCzlLvJf4LHG8cTshUDrYy3yWeJ/Au9T7mO5S73fvUtMaaT/DXepPHH6XWsn9iZS71IE8vP7VNxNw6IRp7hR3lQ+gjg5muLvKgfR3PQ/Y7iof9MddZTo5zIOEG9AhhrvKh/7mrrLPrYXAW/ajnveg0++uBqb0UzL7C3kEBKF9zENCzm8eFpgZH2bKjI+4mTGtkY4wZMZHHZ4ZK7mPCsqMj7qZcVojRWZ8DHV03M2M0z8sRR2zZcbHhWXGxwk3oBMMmfEJ5sz4GEOGeFRAZnycQe5jQjJjQvuYx4hvosQbqQe1Tqn31eMCbqJ8KuUmymfEZ+YkOtRnAhzqpNPPzKmez0mGXf5TIWfmPiXMbD4nXJSfOv3MHITbzxn85pR7Zs48JWBjO+30jY3rq/zOCDm+8IXAJucXTE3OL90mJ62RvmRocp51eJNTyX1WUJOTg1c/NTlNzrl1/s+hjr5ym5zpH5aiztmanF8Ja3J+RbgBnWdocp5nbnKeY0jnTwpocn7FIPfnQspfyvVDaGvzcyFHCb4WmGV/zZRlX3CzbFojXWDIsi86PMtWcl8UlGVfdLPsNOfW+f8GdfStm2Wnf1iK+saWZX8rLMv+lnAD+o4hy/6OOcv+hiHbPCMgy/6WQe4vMmCWTWhr8wv3WEKK/cjj4+Di8ZKUYwnfu8cSzO8FONQPTr97p3pRPzBEjHNCIsYlwizpMuGiPCfgWMJlBr+54h5LMK8I2Nh+lBIprwpsHF5lahz+5DYOaY30E0Pj8GeHNw6V3D8Lahxy8OqnxmEk49wpGoe/oI6uuY3D9A9LUb/YGofXhDUOrxFuQL8yNA5/ZW4c/sKQ1p4X0Di8xiD31zLKwEjK9UNoa/NrIbfnfxOYZf/GlGX/7mbZtEb6nSHLvu7wLFvJfV1Qln3dzbLTGimy7Buoo5tulp3+YSnqhi3Lviksy75JuQGF0OtXzcmZZd9gyDa/EZBl32SQ+9sMmGUT2tr81r09n2I/8vg4uHgMCOHxc/IFGUjHqNjb84EhzucxiJpHagZVLyoohOH8iJDb8/qK91XmYMJF+b2A2/PBDH4TEkIbKSXeng8RsLGFSomUYYQL3F+NwzDicssa4SG3r93GoY9zKiOFh9DPG0HosFxyR4SQ24gtSnHw6qfGYRTj3Ckah5lQR5k1XbmNw/9xWIpSyiymKS5ziKzGYWbCDSgLQ+MwC3PjMBNDWntZQOMwM4PcV2SUgVGU64fQ1uYVIbfnswrMsrMyZdnZ3Cyb1kjZGLLs7A7PspXc2QVl2dndLDutkSLLzoE6yulm2ekflqJy2LLsnMKy7JyEG1Auhiw7F3OWnYMh2/xJQJadk0HunzNglk1oa/Nn9/Z8iv3I4+Pg4jG3lJsOd7i35807BDhUHqffnle9qDwMEeNXIbfncxNmSXcSLspfBdyev5PBb/K6t+fNvAI2tnxO39jUl/pvC6B30Pwhzl6YXHIXINzcDG1Q81mQKYWj5rMQoT5VjyfBuN1rUTooFGIYnPwXFtiQL8zUkC/iNuRpjVSEoSFf1OENeSV3UUENeQ5e/2tPxi2GOiruNuTTPyxFFbM15IsLa8gXJ9yASjA05EswN+SLMZSLvwtoyBdnkPu6kCfjEtrHvC7kqEpJgZlxSabMuJSbGdMaqRRDZlza4Zmxkru0oMy4tJsZpzVSZMZlUEdl3cw4/cNSVBlbZlxWWGZclnADKseQGZdjzozLMGSIRlbnZ8ZlGeQOyMqzGVJnxoT2MSllVhtugpF6UOuUel8tK+CmWXkpx0vuIj5eItGh7hLgUHc7/S6s6vnczbDLBzPt8tRZUnnCzKYC5aJkzg48vo0/sssKDH5Tkfh4SWMj9aDUK4duKwrY2CpJOF4yIZDeQSsLOb7gEdjk9DA1OU23yUlrJJOhyRnp8CankjtSUJMzUm6T029Ps41CHUW7Tc70D0tRUbYmZ7SwJmc04QZUhaHJWYW5yRnFkM6HCmhyRjPIHSak/KVcP4S2Nrn0R23nqgKz7KpMWXaMm2XTGimGIcuOdXiWreSOFZRlx7pZdppz6/zHoY7ucbPs9A9LUXG2LPseYVn2PYQb0L0MWfa9zFl2HEO2mUlAln0Pg9yZM2CWTWhrM7N7LCHFfuTxcXDxeJ+UYwn3u8cSzPsFONQDTr97p3pRDzBEjGxCIsZ9hFlSNcJFmU3AsYRqDH5T3T2WYFYXsLHVkBIpawpsHNZkahzWchuHtEaqxdA4fNDhjUMl94OCGocPym0c+u1ptg+hjmq7jcP0D0tRD9kah7WFNQ5rE25ADzM0Dh9mbhw+xJDW5hDQOKzNIHdOGWUg6dNsCW1t5hRye/4RgVn2I0xZ9qNulk1rpEcZsuw6Ds+yldx1BGXZddwsO62RIsuuizp6zM2y0z8sRdW1ZdmPCcuyHyPcgB5nyLIfZ86y6zJkm3cIyLIfY5A7TwbMsgltbeZxb8+n2I88Pg4uHp+QctPhSff2vPmkAIeq5/Tb86oXVY8hYuQTcnv+CcIs6SnCRZlPwO35pxj85mn39rz5tICNrb6USNlAYOOwAVPjsKHbOKQ1UkOGxmEjhzcOldyNBDUOG8ltHPrtabaNUUdN3MZh+oelqMa2xmETYY3DJoQbUFOGxmFT5sZhY4a0toCAxmETBrkLyigDSZ9mS2hrs6CQ2/PPCMyyn2HKspu5WTatkZoxZNnNHZ5lK7mbC8qym7tZdlojRZbdAnXU0s2y0z8sRbWwZdkthWXZLQk3oGcZsuxnmbPsFgzZZhEBWXZLBrmLZsAsm9DWZlH39nyK/cjj4+DisZWUmw7x7u15M16AQyU4/fa86kUlMESMEkJuz7cizJISCRdlCQG35xMZ/CbJvT1vJgnY2JKdvrEVgDlWGvQO6iVc5JLkbh3i7A2pCMxxJphe7lIO34gPQUQ8zSB3aT8FcF/5fI5wPRLa2iwtwG9+ZPCbNg7fJ5TcoQyJS1sBcudjkLudgLiQn0HucgLWdwEGucsLiQvtCeMCoa3N8g73G7VeKjH4TQUB66Uyg9wVhayXDoTrhdDWZkUB66UGg990FBBX6zPI3UmA3MkMcncWILeXQW6PgLjQmkFuU0hc6EIYFwhtbVLqz18HAovTzZXiQGBX90AgrZG6MhwI7ObwA4FK7m5MBwKtEWib21c9UOq0O+FGF2TcXnT6cPKGwslnMSF8FjXoN2iFWfG6B/hYT6DngXoB9QZ6AagPUF+gfkAvAvUHGgA0UFuP2RHV4Ur7Jh+h+Zt+CFMPAmqEatfVieRkCCrq+blGuCaHYZM3G8oSSvu+Seq9NJWn0Kddb7o+Fa/58Tq5Y5ceyT2S6/VIaN8msXaPjond23TqWCu+fXvdIaw3sRwjKA0h7T8P1hQShtch2s+svwvTMIB6hahdsoSRWhseH4c2JXmqPYggSiR7bw1/pYqDmD47MthNFWmNNJghVRzi8FRRyT2EOVXk1KnHx/FXnxuh5vl5ruOotHxG6roYin4x7F98BuVmGrqzfwblpvHPn0FJa55//AwKsRJMSzilgOuasMPS+NxIIPF7DyXcMIZrc5mxUZGRMVHq92KTPGZ0UmJkbGRkUkK0J9ETnxiZHBdtxnmjI6OjEpMSE2DOeNPr8cYnxnljb/Hlr2g5nClajnCjJa2RRjBEy5EOj5ZK7pF++qSlr/IPQ16p5x3F8AEyNac9ClMfD3+esHSg3KSHMWUG1HYfLbD0Gs0UTF5ygwmtkV5iCCYvOzyYKLlfFlZ6vSyw9OolsPQag34xNqOWXmNspddYP5ReYwg3jFcEll6vMEXLcW60pDXSOIZoOd7h0VLJPV5I6TUWeaWedwJD6TXBD6VXL8LSgXKTHiuk9JoosPSayBRMJrnBhNZIkxiCyWSHBxMl92RhpddkgaVXb4Gl1xT0i6kZtfSaYiu9pvqh9JpCuGFME1h6TWOKltPdaElrpOkM0XKGw6OlknuGkNJrKvJKPe9MhtJrph9Kr96EpQPlJj1VSOn1qsDS61WmYDLLDSa0RprFEExec3gwUXK/Jqz0ek1g6fWiwNJrNvrFnIxaes22lV5z/FB6zSbcMOYKLL3mMkXL191oSWuk1xmi5TyHR0sl9zwhpdcc5JV63vkMpdd8P5ReLxKWDpSb9BwhpdcbAkuvN5iCyQI3mNAaaQFDMFno8GCi5F4orPRaKLD06i+w9FqEfrE4o5Zei2yl12I/lF6LCDeMNwWWXm8yRcslbrSkNdIShmi51OHRUsm9VEjptRh5pZ53GUPptcwPpVd/wtKBcpNeLKT0Wi6w9FrOFEzecoMJrZHeYggmbzs8mCi53xZWer0tsPQaILD0egf9YkVGLb3esZVeK/xQer1DuGGsFFh6rWSKlu+60ZLWSO8yRMtVDo+WSu5VQkqvFcgr9bzvMZRe7/mh9BpAWDpQbtIrQnj9yOPbMEvAHN0Z/Gi1w+UuDnOsZpA72uHP91bfH8shdxWmL6OnTsAI7WNWcfiDB4ox+Xisw328J5OPxwnxcUL7mHEO9/GiTD5+n8N9fCCTj98vxMcJ7WPe73Afn4O2NmjnZeF1sSBeV/iRV1/XpVo/HOu9usN9/wWmfa6GkH2O0D5mDYfbug+TrR/0k60dVDualDIre6jGqdVYVfn1DePW91IrHIs4FTET0Bq4Xou2VH9rPVLiBfydPoh9EfshzkFcjLgCMSfQOrh+P8RIMah9Zb2QW+UbhPD5QQi9H1q9w/XoGxsQP0BUd5Q2wvUmZl/ZLMQGW4TwuZXRVzajb2xB3Kr5yodwvY3ZV7YLscFHQvjcwegr29E3PkLcofnKTrjexewru4XYYI8QPj9m9JXd6Bt7ED/WfGUvXO9j9pX9QmzwiRA+DzD6yn70jU8QD2i+chCuDzH7ymEhNjgihM+jjL5yGH3jCOJRzVeOwfVxZl85IcQGnwrh8zNGXzmBvvEp4mear5yE68+ZfeWUEBucFsLnGUZfOYW+cRrxjOYrX8D1l8y+claIDc4J4fMrRl85i75xDvErzVfOw/XXzL5yQYgNLgrh8xtGX7mAvnER8RvNV76F6++YfeWSEBt8L4TPHxh95RL6xveIP2i+chmurzD7yo9CbHBVCJ8/MfrKj+gbVxF/0nzlZ7j+hdlXrgmxwa9C+PyN0VeuoW/8ivib5iu/w/V1Zl+5IcQGN4XwqYzL5Ss30DduIqr/tHwlAK4DQw1WXwkKlWGDYCF8hjD6ShD6RjBiiOYroXAdxuwr4UJsECGEz0yMvhJu+QZiJs1XMsN1FmZfySrEBtkYbGCdx8qKOs+GGA6UHa5zMOs+pxDd52LUfU7UeS5N97nh+g5m3ecRovs7GXWfB3V+p6b7vHCdj1n3+YXovgCj7vOjzgtoui8I14WYdV9YiO6LMOq+MOq8iKb7onBdjFn3xYXovgSj7oujzktoui8J16WYdV9aiO7LMOq+NOq8jKb7snBdjln35YXo/i5G3ZdHnd+l6f5uuK7ArPuKQnRfiVH3FVHnlTTdV4ZrD7PuTSG6j2TUvYk6j9R0HwXX0cy6ryJE91UZdV8FdV5V030MXMcy6z5OiO7vYdR9HOr8Hk3398L1fcy6v1+I7h9g1P39qPMHNN1XU+/HrPsaQnRfk1H3NVDnNTXd14LrB5l1/5AQ3ddm1P1DqPPamu4fhutHmHX/qBDd12HU/aOo8zqa7uvC9WPMun9ciO6fEMLnk0L4rCeEz6eE8Pm0ED7rC+GzgRA+Gwrhs5EQPhsL4bOJED6bCuHzGSF8NhPCZ3MhfLYQwmdLIXw+K4TPVkL4jBfCZ4IQPhOF8JkkhM9kIXx6hfDZWgifzwnhs40QPtsK4bOdED7bC+GzgxA+Owrhs5MQPjsL4bOLED67CuGzmxA+uwvhs4cQPnsK4fN5IXz2EsJnbyF8viCEzz5C+OwrhM9+Qvh8UQif/YXwOUAInwMZzrw0xvnW4WfhByI+jmdfnkB8ErEe4kb8vQ8RdyLuRTyIeAzxJOIXiOcRv0W8jPgz4u+IAfh+oYiZEbMj5kbMi1gQsShiScSyiHcjVkaMQoxBvBexGmItxIcR6yI+hfg0Yn3EBogNERshNkZsgtgU8RnEZojNEVsgtkR8FrEVYjxiAmIiYhJiMqIXsTXic4htENsitkNsj9gBsSNiJ8TOiF0QuyJ2Q+yO2AOxJ+LziL0QeyO+gNgHsS9iP8QXEfsjDkAcaNkTaBBcDw69td6UT1ufx+6BPrQGcRD+TS6gIXA9NNRIMajX67DQdM/lsc3lt4f0DiPeY6wxXNO1+5BeH+dURhoeSj/viFA65+eSe0QouY3+Nmh7fBspdOrxcdgfaR9IzOskmLA13RcEmZNhvi4hvPbycW7T/gNdvyPR10ZpPhei+Yn1u2pDS+vx9gHadSD+TuDf/E7AX8wTof3M+nvWTcsSTilggybsKM2Z7QxRvfdIwk1o9N/MFRuTnOCNiY6K90R7E2Ceqt7kqPjIONMbGwXTR0WbCfHJnqTohJiq0VVjvTEef0Xg0UwR+CU3AtMa6SWGCPyywyOwkvtlpghMnX6PQl7JP/bD9Ei5IB91aueT0pfG0G1KZm3ix9OpTUzxVwPnpPZ5Kyui9qNHHP5IRit7I/+ImZ/Wj68lN2UiMopwrjoO3X9swyT0b5PQZ0wu/VGvk7EC20djmZLXV9zkldZIrzAkr+Mcnrwqucf5KXn1+DZM9SxkDl7tLSRrUPM/yoeNwJtyJKbBLku7Zzzqe8K/aPfUTEN39nZPTeOf2z1pzfOP7R4OZyOa68+MfHzobWEDUak1jJSDOuMglMOcQLiZTaRbDF5LnxMZKx6lx1EMlfMTzBWPr1mSkns8g9xPOkvuVPwpuScwyF3PoZWKPcBQ7hu6j/v8hQtCKj1C/zYJfcbk0l8g8ToZTxhrJhF26tQcHLFlUijPHkZpa44uYmWGblojAV3EDgxyN3ZmFzEVn5MJ1yOhrc3GAvymI4PfTAl1vtydGOSeKkDuzgxyTyOUWzUDRhi3O5BqbSt/UrqdxnyYcHooz35HzecMwv1O6XukcTvfUjqYwaznmYS5mL+67jOZuu6vul13WiO9ytB1n+XwrruSe5agrjsHr+7BzVvDSGNQ8azr9zW04ex/0ckvrv3dX3Xyixv/3MlPa57/RCdfKbOYprjZoal3Xid38mcTbpBzQun1O+df6NNXvucSZmUOPdfB1hl/jaFb9YwAuWczyN3M4V0HJfdcBrmbC+nkE/qlSWhrs7mQM1uvC6weX2eqHue51SOtkeYxVI/zHV49KrnnC6oe57vVo/jq8Q204QK3ekz/sBT1hq16XCCselxAuEEuZKgeF/qhelzkVo/prqLeYKgmWgmQewGD3PECqsdFDHInCKkeCf3SJLS1Sak/FfRHGqkHtX2ofXNBqPN5XMx0j5t8Qb5JGBClOtSbAhxqCTWP1Ayq3vIShojhFRIxFhNm10sJF6VXQKaxlMFvloXSRsoRRupBqVcO3S4TsLEt54qUgcQOpZfivs71loCj7RyL8m2HH91Ucg9hkPs5h2/CahG+xSB3GyFH298hXI+EtjbbZBUTxP68UUXtm28LCGLvSAliJQjnWkG4aNSCDjJSD2pDFTd4DEXNZzEhfBYl5FO/iTQQr1eCj70LtAroPaDVQGuA1gKtA3ofaD3QBqAPgDYCbQLaDLQFaCvQh0DbgLYDfQS0A2gn0C6g3UB7gD4G2gu0D2g/0CdAB4AOAh0COgx0BOgo0DGg40AngD4F+gzoJNDnQKeATgOdAfoC6Eugs0DngL4COg/0NdAFoItA3wB9C/Qd0CWg74F+ALoMdAXoR6CrQD8B/Qz0C9A1oF+BfgP6Heg60A2gm+omXxjoDygQKAgoGCgEKBQoDCgcKAIoE1BmoCxAWYGyAWUHygGUEygXUG6gO4DyAN0JlBcoH1B+oAJABYEKARUGKgJUFKgYUHGgEkAlgUoBlQYqA1QWqBxQeaC7gO4GqgBUEagSUGUgD5AJFAkUBRQddtt3syOqm4n2UxgR2v6h33QMNFIO7T4omd8ynPr44/M54Zochk3ebChLKOn7xprqvbT73Sn0adebrk/Fa268Toxv375e1zY947sn1+7RMbF7m04d9aVtTW8t8aA0xLP/PFhTheURIdrPrL8L0zCAeq/rDu+4IjS1Hjw+DkMb1Al4lTDf50rGLxfw1ykunWePj0Pnt6q2l7inuHycUxlJKZR63pgwOufnkjsmjNxGrElaDOGC8te3bq3iqqho+YzUdRGLfhGn+UeG+pJ1pYDrmrBxYanfNJD4vWMJN4x7tLnM2KjIyJgo9XuxSR4zOikxMjYyMikh2pPoiU+MTI6LNuO80ZHRUYlJiQkwZ7zp9XjjE+O8sbf48le0vIcpWt7rRktaI93LEC3vc3i0VHLfxxQtqVPlOOSVet77iReoWoRqTnsUpr6hvYrghrZVOlBu0nFhtH5kDWq7PyCw9HqAKZhUc4MJrZGqMQST6g4PJn84p7DSq7rA0us9gaVXDfSLmhm19KphK71q+qH0qkG4YdQSWHrVYoqWD7rRktZIDzJEy4ccHi2V3A8JKb1qIq/U89ZmKL1q+6H0eo+w9KLcpGsKKb0eFlh6PcwUTB5xgwmtkR5hCCaPOjyYKLkfFVZ6PSqw9FotsPSqg35RN6OWXnVspVddP5RedQg3jMcEll6PMUXLx91oSWukxxmi5RMOj5ZK7ieElF51kVfqeZ9kKL2e9EPptZqw9KLcpOsKKb3qCSy96jEFk6fcYEJrpKcYgsnTDg8mSu6nhZVeTwssvdYLLL3qo180yKilV31b6dXAD6VXfcINo6HA0qshU7Rs5EZLWiM1YoiWjR0eLZXcjYWUXg2QV+p5mzCUXk38UHqtJyy9KDfpBkJKr6YCS6+mTMHkGTeY0BrpGYZg0szhwUTJ3UxY6dVMYOm1QWDp1Rz9okVGLb2a20qvFn4ovZoTbhgtBZZeLZmi5bNutKQ10rMM0bKVw6OlkruVkNKrBfJKPW88Q+kV74fSawNh6UW5SbcQUnolCCy9EpiCSaIbTGiNlMgQTJIcHkyU3EnCSq8kgaXXBwJLr2T0C29GLb2SbaWX1w+lVzLhhtFaYOnVmilaPudGS1ojPccQLds4PFoqudsIKb28yCv1vG0ZSq+2fii9PiAsvSg3aa+Q0qudwNKrHVMwae8GE1ojtWcIJh0cHkyU3B2ElV4dBJZe0UwbLLHdUpReHdEvOmXU0qujrfTq5IfSqyPhhtFZYOnVmSladnGjJa2RujBEy64Oj5ZK7q5CSq9OyCv1vN0YSq9ufii9oglLB8pNulMYrx95fBt/fhE+tR91d7jcxWGO7gzrp73DH4KtHsLCIXcHpqeDUSdghPYxOzj8SXDFmHy8s8N9/F0mH+8ixMcJ7WN2cbiPF2Xy8e4O9/GNTD7eQ4iPE9rH7OFwH1c5ZHc/1SUe34bZQBCvLQTx6vUjr77uIWqtc+xNvRy+Ttcw7cm9hezJhPYxezvc1muZbN3XT7Z2UJ1rUsqs7KGavFYTWNUCN4xbjy9SWBOxLmImoB5w3RNtic/d/GOswb9di7gO8X3EBjhHC0QvYk6g5+G6lzan9azBCvg7FRErIVZG9CCaiFmAesP1C9pcnXGu5/F3NiI/mxA3I25B3Ir4IeI2xO2IHyHuQNyJuAtxN+IexI8R9yLuQ9yP+AniAcSDiIcQDyMeQTyKeAzxOOIJxE8RP0M8ifg54inE04hnEL9A/BLxLOI5xK8QzyN+jXgB8SLiN4jfIn6HeAnxe8QfEC8jXkH8EfEq4k+IPyP+gngN8VfE3xB/R7yOeAPxJqKBfhCAGIgYhBiMGIIYihiGGI4YYa0JxMyWDyJmRcyGmB0xh+X3iLkQcyPegZgH8U7EvIj5EPMjFkAsiFgIsTBiEcSiiMUQiyOWQCyJWAqxNGIZxLKI5RDLI96FeDdib8RIxCjr94D6wHVfbW1afe2VaJse+Lt9LN0A9YPrF7VcTg3qONI//T1sj20uv90c7M90c3CAe3OQ1kgDGG4ODnT4zUEl90CmAswanDr1+DjsR2moi4dJMGH+ELr5JsN87UN47eXj3Kb9B7p+B6GvDc6ox3OUAjZowg7WnNnOENV7DyLchIb8zVyxMckJ3pjoqHhPtDcB5qnqTY6Kj4wzvbFRMH1UtJkQn+xJik6IqRpdNdYb4/FXBB7CFIGHuhGY1khDGSLwMIdHYCX3MCEt0MHIK/W8LzK1h3w9jmPnk9KXhtNtSuaLxK0mtYkp/mrgnNQ+b2VF1H40wOHtVSt7o5Z7oJ/Wj68lN2UiMphwrkEO3X9swyT0b5PQZ0wu/VGvkxEC20cjmJLXkW7ySmukkQzJ6yiHJ69K7lFCzhp0Z+LVX5/GGuzDRuBNORLTYJel3TMa9f3Sv2j31ExDd/Z2T03jn9s9ac3zj+0eDmcjmuvPjHx02G1hA1GpNYyUgzrjIJTDfIlwM3uZbjF4LX2+zFjxKD0OZqichznrQGeqLEnJPZpB7uEOP8iq5H6JQe4RDq1U7AGGct/QfdxX/Y0UUukR+rdJ6DPmSCEHuUYTxpoxhL6s5uCILWPCePYwSltzdBHPBNPLPUZAF/E5hi7iWGd2EVPzSbgeCW1tjhXgN20Y/OYVh+8TSu62DHKPEyB3Owa5xxPKrZoBrxi3O5BqbSt/Urodz3yYcEIYz35HzedEwv1O6XuccTvfUjqYyKznSYS5mL+67pOYuu6T3a47rZEmM3Tdpzi8667kniKo687Bq3tw89Yw0hhUPOv6nYo2nPYvOvnFtb/7q05+ceOfO/lpzfOf6OQrZRbTFDctLPXO6+RO/jTCDXI6g36n/wt9+sr3DEJ9OvRcB1tnfCpDt2q8ALmnMcg9weFdByX3DAa5Jwrp5BP6pUloa3OikDNbMwVWjzOZqsdX3eqR1kivMlSPsxxePSq5ZwmqHme51aP46vE1tOFst3pM/7AU9ZqtepwtrHqcTbhBzmHQ7xw/VI9z3eox3VXUawzVxFQBcs9mkHuagOpxLoPc04VUj4R+aRLa2qTUnwr644zUg9o+1L45O8z5PL7OdI+bfEHOIwyIUh1qngCHmk/NIzWDqrc8nyFizBISMV4nzK7fIFyUswRkGm8w+M2CMNpI+YqRelDqlUO3CwRsbAu5ImUgsUN1J1zgiwQcbedYlIsdfnRTyd2PQe7ZDt+E1SJcxCD3HCFH29+kbLMRlntzsooJYn/eqKL2zcUCgtibUsq9JULOXi8lPns93ridECgdLGU+e71M4N3zZUx3z5e7d89pjbSc4e75Ww6/e67kfkvK3fMQHl7/6htPOHTCNHeKu9Nvo47eyXB3p0Nod9pAVGYxTXHv+OPuNOFRi3cIN6AVDHenV4SldCRdjz63FkJu2Y+8ue/0u6shKf2Uat75Qh5xRGgfc76Qc6UrBWbGK5ky43fdzJjWSO8yZMarHJ4ZK7lXCcqMV7mZcVojRWb8HupotZsZp39YinrPlhmvFpYZrybcgNYwZMZrmDPj9xgyxIUCMuPVDHIvEpIZE9rHXER8E2W8kXpQ65R6X10t4CbKWik3UdYRn5mT6FDrBDjU+04/M6d6Pu8z7PJLhJyZW0uY2awnXJRLnH5mDrKD9Qx+s8E9M2duELCxfcAVKanP1WwkXJRO/srIvzK0r/rbJLBZuompWbrZbZbSGmkzQ7N0i8ObpUruLYKapVvkNktNzrl1/reijj50m6XpH5aittqapR8Ka5Z+SLgBbWNolm5jbpZuZSgLlgloln7IIPdyIWU05fohtLW5XEiWvV1glr2dKcv+yM2yaY30EUOWvcPhWbaSe4egLHuHm2WnObfO/07U0S43y07/sBS105Zl7xKWZe8i3IB2M2TZu5mz7J0M2eY7ArLsXQxyr8iAWTahrc0V7vGGFPuRx8fBxeMeKccbPnaPN5gfC3CovU4/3qB6UXsZIsYqIRFjD2GWtI9wUa4ScLxhH4Pf7HePN5j7BWxsnzh9Y+N6ouMBId/OcFBgw/QgU8P0kNswpTXSIYaG6WGHN0yV3IcFNUwPy22YRjLOnaJhegR1dNRtmKZ/WIo6YmuYHhXWMD1KuAEdY2iYHmNumB5hSOdXC2iYHmWQe42M8jeS9DOQhA3TNUKOJRwXmGUfZ8qyT7hZNq2RTjBk2Z86PMtWcn8qKMv+1M2y0xopsuzPUEcn3Sw7/cNS1Ge2LPuksCz7JOEG9DlDlv05c5b9GUO2+b6ALPskg9zrM2CWTWhrc717LCHFfuTxcXDxeErKsYTT7rEE87QAhzrj9Lt3qhd1hiFibBRyLOEUYZb0BeGi3CjgWMIXDH7zpXsswfxSwMZ2VsKxhLYMxxLOCTmW8JXAhulXTA3T827DlNZI5xkapl87vGGq5P5aUMP0a7kN0yjGuVM0TC+gji66DdP0D0tRF2wN04vCGqYXCTegbxgapt8wN0wvMKTzmwU0TC8yyL1FRvkbRbl+CG1tbhFyLOFbgVn2t0xZ9ndulk1rpO8YsuxLDs+yldyXBGXZl9wsO62RIsv+HnX0g5tlp39YivrelmX/ICzL/oFwA7rMkGVfZs6yv2fINrcJyLJ/YJB7ewbMsgltbW53jyWk2I88Pg4uHq9IOZbwo3sswfxRgENddfrdO9WLusoQMXYKOZZwhTBL+olwUe4UcCzhJwa/+dk9lmD+LGBj+0XCsYR2DMcSroX5Z2Pzlc9fCTejAYSp8MCsMvT3239ffymaudTr5Hchx3euE9pZ9domGLd7XkoH18MMg5P/GwJvjNxgujFy070xQmukmww3RoxwZ98YUXIrHoltxJaFc/D6X3uydQDqKFDTlXtj5H8clqKUMotpilNKlXRjJJBwAwoKp9dvUDjvjZGAcPp5dwu4MRLIIPceIU+2JrSPuUfIkaFgynVu+CczDibeT6wRogU+NzP2cU5lpJBw+nlDHZ4ZK7lDBWXGoW5mnNZIkRmHoY7C3cw4/cNSVJgtMw4XlhmHE25AEQyZcQRzZhzGkCHuE5AZhzPIvV9IZkxoH3M/8TGfCUbqQa1T6n01PNz5PGYK5/FN8kWUmY5RU6pDZRbgUFmoeaRmUPV8sjDs8geFHPPJRJjZZCVclAcFHPPJyuA32cJpI+UII/Wg1CuHbrMJ2Niyc0VK6uMaOQgXZSPClLCxkGZpToHN0pxMzdJcbrOU1ki5GJqluR3eLFVy5xbULM0tt1nqt6dR34E6yuM2S9M/LEXdYWuW5hHWLM1DuAHdydAsvZO5WXoHQ1lwWECzNA+D3Ecy4NOoCW1tHhGSZecVmGXnZcqy87lZNq2R8jFk2fkdnmUrufMLyrLzu1l2mnPr/BdAHRV0s+z0D0tRBWxZdkFhWXZBwg2oEEOWXYg5yy7AkG0eF5BlF2SQ+0QGzLIJbW2ecI83pNiPPD4OLh4LSzneUMQ93mAWEeBQRZ1+vEH1oooyRIyTQiJGYcIsqRjhojwp4HhDMQa/Ke4ebzCLC9jYSjh9Y1PfYtKR4VtMSjKlCNR8lhLYMC3F1DAt7TZMaY1UmqFhWsbhDVMldxlBDdMychumfnsadVnUUTm3YZr+YSmqrK1hWk5Yw7Qc4QZUnqFhWp65YVqWIZ0/JaBhWo5B7tMZ8GnUhLY2Tws5lnCXwCz7LqYs+243y6Y10t0MWXYFh2fZSu4KgrLsCm6WndZIkWVXRB1VcrPs9A9LURVtWXYlYVl2JcINqDJDll2ZOcuuyJBtfikgy67EIPfZDJhlE9raPOseS0ixH3l8HFw8eqQcSzDdYwmmKcChIp1+9071oiIZIsZ5IccSPIRZUhThojwv4FhCFIPfRLvHEsxoARtbFQnHEjoxHEuoKuRYQozAhmkMU8M01m2Y0hoplqFhGufwhqmSO05QwzRObsPUb0+jvgd1dK/bME3/sBR1j61heq+whum9hBvQfQwN0/uYG6b3MKTzFwQ0TO9lkPtiBnwaNaGtzYtCjiXcLzDLvp8py37AzbJpjfQAQ5ZdzeFZtpK7mqAsu5qbZac1UmTZ1VFHNdwsO/3DUlR1W5ZdQ1iWXYNwA6rJkGXXZM6yqzNkm98JyLJrMMh9KQNm2YS2Ni+5xxJS7EceHwcXj7WkHEt40D2WYD4owKEecvrdO9WLeoghYlwWciyhFmGWVJtwUV4WcCyhNoPfPOweSzAfFrCxPSLhWEJnhmMJj4b7Z2Pzlc86hJvRI4Sp8KOEc3Hqr+5/X38sgaEEzLExjH7d/ehwuVdAt/0DBrmvZpWx3zxGuF4IbW1eFbBeDjD4zS8C1ssnDHJfE7JeHidcL4S2Nq8JWC/nGPzmdwHr5SyD3NeFrJcnCNcLoa3N6wLWyzUGv1E39Jy+Xn5hkDsgm4z18iTheiG0tRngcL9R6+VXBr8JFrBefmOQO0TIeqlHeUeFcL2ECFgv2RkaweEC1ksOBrkjhKyXpwjXC6GtzQgB66UEg99kEbBeSjLInVXIenmacL0Q2trMKmC9VGHwmxwC1ktVBrlzClkv9QnXC6GtzZwC1ssjDH5zh4D18iiD3HmErJcGhOuF0NZmHgHrpQ6D3+QTsF7qMsidX8h6aUi4XghtbVLqz18fdCtNN1eKD7o1cj/oRmukRgwfdGvs8A+6KbkbM33QzRqBtrl91QOlTpsQbnRBxu1Fpw8nbyicfJYSwmdJg36DVpgVr5uCjz0D1AyoOVALoJZAzwK1AooHSgBKBEoCStbWY3ZE9aFB+yYfofmb/uFCPQioEapdVyeSkyGoeNSHMcM1OQybvNlQllDa901S7xVipBz24FU9DX0qXvPjdXLHLj2SeyTX65HQvk1i7R4dE7u36dSxVnz79rpDWG9iOUZQGkLafx6sKSQMr0O0n1l/F6ZhAPUKUbtkGSO1Njw+Dm1K8lTbSxAlkr23hr9SRS/TdyK0dlNFWiO1ZkgVn3N4qqjkfo45VeTUqcfH8Vffh0DNczOuj1nS8hmp66IN+kXbf/HdCjfT0J39uxVuGv/83QppzfOP361ArATTEk4p4LombNs0vg8hkPi92xBuGO20uczYqMjImCj1e7FJHjM6KTEyNjIyKSHak+iJT4xMjos247zRkdFRiUmJCTBnvOn1eOMT47yxt/jyV7RsxxQt27vRktZI7RmiZQeHR0sldwc/fYOQr/K3RV6p5+3I8MUoak57FKb+2HMzwtKBcpNuy5QZUNu9k8DSqxNTMOnsBhNaI3VmCCZdHB5MlNxdhJVeXQSWXs0Fll5d0S+6ZdTSq6ut9Ormh9KrK+GG0V1g6dWdKVr2cKMlrZF6METLng6PlkrunkJKr27IK/W8zzOUXs/7ofRqTlg6UG7S3YSUXr0Ell69mIJJbzeY0BqpN0MwecHhwUTJ/YKw0usFgaVXC4GlVx/0i74ZtfTqYyu9+vqh9OpDuGH0E1h69WOKli+60ZLWSC8yRMv+Do+WSu7+Qkqvvsgr9bwDGEqvAX4ovVoQlg6Um3RfIaXXQIGl10CmYDLIDSa0RhrEEEwGOzyYKLkHCyu9BgssvRIEll5D0C+GZtTSa4it9Brqh9JrCOGGMUxg6TWMKVoOd6MlrZGGM0TLEQ6PlkruEUJKr6HIK/W8IxlKr5F+KL0SCEsHyk16qJDSa5TA0msUUzAZ7QYTWiONZggmLzk8mCi5XxJWer0ksPRKFFh6vYx+MSajll4v20qvMX4ovV4m3DDGCiy9xjJFy1fcaElrpFcYouU4h0dLJfc4IaXXGOSVet7xDKXXeD+UXomEpQPlJj1GSOk1QWDpNYEpmEx0gwmtkSYyBJNJDg8mSu5JwkqvSQJLrySBpddk9IspGbX0mmwrvab4ofSaTLhhTBVYek1lipbT3GhJa6RpDNFyusOjpZJ7upDSawrySj3vDIbSa4YfSq8kwtKBcpOeEs7rRx7fhqm+ibEJgx/NdLjc6ntvZzLIXSibs/cN9f2xHHIXZvoyeuoEjNA+ZmGHP3igFJOPF3O4jz/D5OPFhfg4oX3M4g738ZJMPl7K4T6ezOTjpYX4OKF9zNIO9/GhaGuDdl4WXscI4nWKH3n1dV2q9cOx3ss53PdbMu1z5YXsc4T2Mcs73NbPMtm6gp9s7aDa0aSUWdlDNU6txqrKr28Yt76XWmE3xL6ImYBehetZaEv1t9YjJVri7zyL2AoxHnEo4hjEKYg5gV6D69nhRopB7StzhNwqnyuEz9fD6f3Q6h3OQd+Yi/g6orqjNA+u5zP7yhtCbLBACJ8LGX3lDfSNBYgLNV9ZBNeLmX3lTSE2WCKEz6WMvvIm+sYSxKWaryyD6+XMvvKWEBu8LYTPdxh95S30jbcR39F8ZQVcr2T2lXeF2GCVED7fY/SVd9E3ViG+p/nKarhew+wra4XYYJ0QPt9n9JW16BvrEN/XfGU9XG9g9pUPhNhgoxA+NzH6ygfoGxsRN2m+shmutzD7ylYhNvhQCJ/bGH1lK/rGh4jbNF/ZDtcfMfvKDiE22CmEz12MvrIDfWMn4i7NV3bD9R5mX/lYiA32CuFzH6OvfIy+sRdxn+Yr++H6E2ZfOSDEBgeF8HmI0VcOoG8cRDyk+cphuD7C7CtHhdjgmBA+jzP6ylH0jWOIxzVfOQHXnzL7ymdCbHBSCJ+fM/rKZ+gbJxE/13zlFFyfZvaVM0Js8IUQPr9k9JUz6BtfIH6p+cpZuD7H7CtfCbHBeSF8fs3oK1+hb5xH/FrzlQtwfZHZV74RYoNvhfD5HaOvfIO+8S3id5qvXILr75l95QchNrjMYAPrPNYPqPPLiErlV+CfH5l1f1WI7n9i1P1V1PlPmu5/hn9+Ydb9NSG6/5VR99dQ579quv8N/vmdWffXhej+BqPur6POb2i6v6n+ieDVfUCEDN0HRvDpXulA6Tww4rbug+A6mFn3IUJ0H8qo+xDUeaim+zC4DmfWfYQQ3Wdi1H0E6jyTpvvMcJ2FWfdZheg+G6Pus6LOs2m6zw7XOZh1n1OI7nMx6j4n6jyXpvvccH0Hs+7zCNH9nYy6z4M6v1PTfV64zses+/xCdF+AUff5UecFNN0XhOtCzLovLET3RRh1Xxh1XkTTfVG4Lsas++JCdF+CUffFUeclNN2XhOtSzLovLUT3ZRh1Xxp1XkbTfVm4Lses+/JCdH8Xo+7Lo87v0nR/N1xXYNZ9RSG6r8So+4qo80qa7ivDtYdZ96YQ3UcK4TNKCJ/RQvisIoTPqkL4jBHCZ6wQPuOE8HmPED7vFcLnfUL4vF8Inw8I4bOaED6rC+GzhhA+awrhs5YQPh8UwudDQvisLYTPh4Xw+YgQPh8VwmcdIXzWFcLnY0L4fFwIn08I4fNJIXzWE8LnU0L4fFoIn/WF8NlACJ8NhfDZSAifjYXw2UQIn02F8PmMED6bCeGzuRA+Wwjhs6UQPp8VwmcrIXzGC+EzQQifiUL4TBLCZzLDmZfGON9r+NmlZEQTz75EIkYhRiPOw99bhLgMcQXiasT1iJsRtyPuRtyPeBjxBOIpxLOIFxAvIV5B/BnxN8SbiEHIZxhiZsTsiLkR8yIWRCyKWBKxLOLdiJURqyBWRYxBjEWMQ7wH8V7E+xDvR3wAsRpidcQaiDURayE+iPgQYm3EhxEfQXwUsQ5iXcTHEB9HfALxScR6iE8hPo1YH7EBYkPERoiNEZsgNkV8BrEZYnPEFogtEZ9FbIUYj5iAmIiYhJhs2QXIC9etI26tN/3z2E3RF15F9OLf5AJ6Dq7bMJ/nahuR7rk8trn89pDetsR7jDXaabp2H9Lr45zKSO0i6OdtH0Hn/Fxyt48gtxHrI+3bEy4o+yPtA4l57RYCgYLug9Jmd5ivYTivvXyc27T/QNdvB/S1jprPhWh+Yv2u2tDSerx9gHYdiL8T+De/E/AX8+hxyvp71k3LEk4pYIMmbEfNme0MUb13B8JNqNPfzBUbk5zgjYmOivdEexNgnqre5Kj4yDjTGxsF00dFmwnxyZ6k6ISYqtFVY70xHn9F4E5MEbizG4FpjdSZIQJ3cXgEVnJ3YYrA1Ol3R+SV/KMnTI+UC/JRp3Y+KX2pK92mZFYifjyd2sQUfzVwTmqft7Iiaj/yOPyRjFb2Rv4xJz+tH19LbspEpCPhXJEO3X9swyT0b5PQZ0wu/VGvk24C20fdmJLX7m7ySmuk7gzJaw+HJ69K7h5+Sl49vg1TPQuZg1d7C8ka1Px39GEj8KYciWmwy9Lu6Yn6fv5ftHtqpqE7e7unpvHP7Z605vnHdg+HsxHN9WdG3jPitrCBqNQaRspBnXEQymE+T7iZ9aJbDF5Ln70YKx6lx44MlXNV5orH1yxJyd2TQe4YZ8mdij8l9/MMcsc6tFKxBxjKfUP3cZ8/0C6k0iP0b5PQZ0wu/QUSr5OehLGmN2GnTs3BEVt6R/DsYZS25ugi5mDopj0goIv4FIPc1ZzZRUzF5wuE65HQ1mY1h/uNWi8lGfympoD18jSD3LWErJc+hOuF0NZmLQHrpSqD39QWsF7qM8j9sJD10pdwvRDa2nxYwHp5lMFv6ghYLw0Y5K4rZL30I1wvhLY2KfWnmtZrjNt3ylQOquKq2iv6MR96fzGCxw+o+exP6AdK32uN230BpYP+zHoeQNgz8Nfd4QFMd4cHuneHaY00kOHu8CCH3x1Wcg8SdHeYg1f3Awa3hpHGoOJZ1+9gtOGQf3HHubj2d391x7m48c93nNOa5z9xx1kps5imuCERqXdeJ99xHkK4QQ6NoNfv0H+hT1/5HkaYlTn0/CHbHdzBDHdVnhAg9xAGuZ90eBWv5B7GIHc9IXecCf3SJLS1yaU/ajsPF1g9DmeqHke41SOtkUYwVI8jHV49KrlHCqoeR7rVo/jqcRTacLRbPaZ/WIoaZaseRwurHkcTbpAvMVSPL/mhenzZrR7TXUWNYqgmGgiQezSD3A0FVI8vM8jdSEj1SOiXJqGtTUr9qaC/1kg9qO1D7ZujI5zP4xime9zkC3IsYUCU6lBjBTjUK9Q8UjOoesuvMESMZ4REjDGE2fU4wkX5jIBMYxyD34yPoI2Ua4zUg1KvHLodL2Bjm8AVKQOJHUovxX2da6KAj2BxLMpJEc7fjJ5jkLu5wzdhtQgnMsjdQsiR38mE65HQ1maLbGKC2J83qqh9c5KAIDZZShArQzjXFMJFoxZ0kJF6UBuqtMFjKGo+SwnhsyQhn/pNpIF4PRV8bBrQdKAZQDOBXgWaBfQa0GygOUBzgV4Hmgc0H+gNoAVAC4EWAS0GehNoCdBSoGVAy4HeAnob6B2gFUArgd4FWgX0HtBqoDVAa4HWAb0PtB5oA9AHQBuBNgFtBtoCtBXoQ6BtQNuBPgLaAbQTaBfQbqA9QB8D7QXaB7Qf6BOgA0AHgQ4BHQY6AnQU6BjQcaATQJ8CfQZ0EuhzoFNAp4HOAH0B9CXQWaBzQF8BnQf6GugC0EWgb4C+BfoO6BLQ90A/AF0GugL0I9BVoJ+Afgb6Bega0K9AvwH9DnQd6AbQTSAjE9gLKBAoCCgYKAQoFCgMKBwoAigTUGagLEBZgbIBZQfKAZQTKBdQbqA7gPIA3QmUFyhfptu+mx1Rva39FEaEtn/oNx0DjZQjVLuuTuS3DKc+/vh8Trgmh2GTNxvKEkr6vrHqmS5/3iA2bPq0603Xp+I1N14nxrdvX69rm57x3ZNr9+iY2L1Np4760ramt5Z4UBri2X8erKkiDK9DtJ9ZfxemYQD1XtcEhJwSkVoPHh+HoQ3qBDx/Jt/nSsYvwfHXKS6dZ4+PQ+e3gLaXuKe4fJxTGUkplHregpnonJ9L7oKZyG3EmqQVJFxQ/vp2yOlcFRUtn5G6LgqhXxTW/CNDPQxEKeC6JmzhTKnfNJD4vQsRbhhFtLnM2KjIyJgo9XuxSR4zOikxMjYyMikh2pPoiU+MTI6LNuO80ZHRUYlJiQkwZ7zp9XjjE+O8sbf48le0LMIULYu60ZLWSEUZomUxh0dLJXcxpmhJnSoXRl6p5y1OvEDVIlRz2qMw9Q1tPQL7WjpQbtKFM9H6kTWo7V5CYOlVgimYlHSDCa2RSjIEk1IODyZK7lLCSq9SAkuvGQJLr9LoF2UyaulV2lZ6lfFD6VWacMMoK7D0KssULcu50ZLWSOUYomV5h0dLJXd5IaVXGeSVet67GEqvu/xQes0gLL0oN+kyQkqvuwWWXnczBZMKbjChNVIFhmBS0eHBRMldUVjpVVFg6TVTYOlVCf2ickYtvSrZSq/Kfii9KhFuGB6BpZeHKVqabrSkNZLJEC0jHR4tldyRQkqvysgr9bxRDKVXlB9Kr5mEpRflJl1ZSOkVLbD0imYKJlXcYEJrpCoMwaSqw4OJkruqsNKrqsDSa47A0isG/SI2o5ZeMbbSK9YPpVcM4YYRJ7D0imOKlve40ZLWSPcwRMt7HR4tldz3Cim9YpFX6nnvYyi97vND6TWHsPSi3KRjhZRe9wssve5nCiYPuMGE1kgPMASTag4PJkruasJKr2oCS6+5Akuv6ugXNTJq6VXdVnrV8EPpVZ1ww6gpsPSqyRQta7nRktZItRii5YMOj5ZK7geFlF41kFfqeR9iKL0e8kPpNZew9KLcpGsIKb1qCyy9ajMFk4fdYEJrpIcZgskjDg8mSu5HhJVejwgsvV4XWHo9in5RJ6OWXo/aSq86fii9HiXcMOoKLL3qMkXLx9xoSWukxxii5eMOj5ZK7seFlF51kFfqeZ9gKL2e8EPp9Tph6UW5SdcRUno9KbD0epIpmNRzgwmtkeoxBJOnHB5MlNxPCSu9nhJYeuVj2mCJ7Zai9Hoa/aJ+Ri29nraVXvX9UHo9TbhhNBBYejVgipYN3WhJa6SGDNGykcOjpZK7kZDSqz7ySj1vY4bSq7EfSq98hKUD5SZdPxOvH3l8G39+ET61HzVxuNzq4TFNGNZPK4c/BFs9hIVD7nimp4NRJ2CE9jHjHf4kuFJMPp7kcB+fxuTjyUJ8nNA+ZrLDfbwkk48/53Afn8fk422E+Dihfcw2DvdxlUM28VNd4vFtmLGCeK0hiNc6fuTV1z1ErXWOvam9w9fpq0x7cgchezKhfcwODrf1LCZbd/aTrR1U55qUMit7qCav1QRWtcAN49bjixSWQayMqLbUpvDPM2hL9bfWkwdfxb+dhfga4mzEWJyjBmIdxJxAzeC6uTan9XDFHNbvIOZCzI14B2IexCxALeC6pTZXZ5yrGf7OPORnPuIbiAsQFyIuQlyM+CbiEsSliMsQlyO+hfg24juIKxBXIr6LuArxPcTViGsQ1yKuQ3wfcT3iBsQPEDcibkLcjLgFcSvih4jbELcjfoS4A3En4i7E3Yh7ED9G3Iu4D3E/4ieIBxAPIh5CPIx4BPEo4jHE44gnED9F/AzxJOLniKcQTyOeQfwC8UvEs4jnEL9CPI/4NeIFxIuI3yB+i/gd4iXE7xF/QLyMeAXxR8SriD8h/oz4C+I1xF8Rf0P8HfE64g3Em4gG+nkAYiBiEGIwYghiKGIYYjhihLXmETNbawwxK2I2xOyILRDvRMyLeBfQs3DdSlubVl97KvLeFH/3WWu9A8XDdYKWy6lBHUcS09/D9tjm8tvNwUSmm4NJ7s1BWiMlMdwcTHb4zUEld7KwozTJjEdpqIuHbiEQGMLo5usO89UL57WXj3Ob9h/o+vWir7XOqMdzlAI2aMK21pzZzhDVe3sJN6Hn/mau2JjkBG9MdFS8J9qbAPNU9SZHxUfGmd7YKJg+KtpMiE/2JEUnxFSNrhrrjfH4KwI/xxSB27gRmNZIbRgicFuHR2Ald1shLdDWyCv1vF2Z2kO+Hsex80npS+3oNiWzK3GrSW1iir8aOCe1z1tZEbUfdXd4e9XK3qjl7uGn9eNryU2ZiLQmnKunQ/cf2zAJ/dsk9BmTS3/kt9oEto/aMyWvHdzkldZIHRiS144OT16V3B2FnDVowsSrvz6N1dqHjcCbciSmwS5Lu6cT6rvzv2j31ExDd/Z2T03jn9s9ac3zj+0eDmcjmuvPjLxTptvCBqJSaxgpB3XGQSiH2ZlwM+tCtxi8lj67MFY8So+tGSrnF5x1oDNVlqTk7sQgdx+HH2RVcndmkLuvQysVe4Ch3Dd0H/dVf/2EVHqE/m0S+ozZT8hBrk6EsaYroS+rOThiS9dMPHsYpa05uogbGbqIgwR0ER9j6CIOdmYXMRWf3QjXI6GtzcEO9xu1Xg4wrJdhAtbL4wzrZbiQ9dKdcL0Q2tocLmC9nGNYL6MErJcnGNbLaCHrpQfheiG0tTlawHq5xrBexghYL08yrJexQtZLT8L1Qmhrk1J/qmm9ybh9p0zloCquqr2iJ/Oh9+cz8fgBNZ+9CP1A6XuzcbsvoHTQi1nPvQl7Bv66O9yb6e7wC+7dYVojvcBwd7iPw+8OK7n7CLo7zMGr+wGDW8NIY1DxrOu3L9qw37+441xc+7u/uuNc3PjnO85pzfOfuOOslFlMU1y/TKl3Xiffce5HuEG+yKDfF/+FPn3luz+hPh16/pDtDm5fhrsq4wXI3Y9B7gkOr+KV3P0Z5J4o5I4zoV+ahLY2ufRHbecBAqvHAUzV40C3eqQ10kCG6nGQw6tHJfcgQdXjILd6FF89DkYbDnGrx/QPS1GDbdXjEGHV4xDCDXIog36H+qF6HOZWj+muogYzVBNTBcg9hEHuaQKqx2EMck8XUj0S+qVJaGuTUn8q6G82Ug9q+1D75pBMzudxONM9bvIFOYIwIEp1qBECHGokNY/UDKre8kiGiDFLSMQYTphdjyJclLMEZBqjGPxmdCbaSLnJSD0o9cqh29ECNraXuCJlILFDNSFc4C8L+AgWx6Ic4/CPYCm54xnknu3wTVgtwpcZ5J4j5MjvWML1SGhrc042MUHszxtV1L45RkAQGyul3HtFyNnrccRnr7cYtxMCpYNxzGevxwu8ez6e6e75BPfuOa2RJjDcPZ/o8LvnSu6JUu6eh/Pw+lffzMWhE6a5U9ydnoQ6mpzh7k6H0989nWS7Oz3ZH3en6eQwJxNuQFMY7k5PyZTSkXQ9+txaCL9lP+p55zn97mp4Sj+lmne+kEfxEdrHnC/kXOlUgZnxVKbMeJqbGdMaaRpDZjzd4Zmxknu6oMx4upsZpzVSZMYzUEcz3cw4/cNS1AxbZjxTWGY8k3ADepUhM36VOTOewZAhLhSQGc9kkHuRkMyY0D7mIuKbKFuM1INap9T76kwBN1FmSbmJ8hrxmTmJDvWaAIea7fQzc6rnM5thl18i5MzcLMLMZg7holzi9DNzkB3MYfCbue6ZOXOugI3tda5ISX2uZh7honTyVxv/laF9bmQLbJbOZ2qWvuE2S2mN9AZDs3SBw5ulSu4FgpqlC+Q2S03OuXX+F6KOFrnN0vQPS1ELbc3SRcKapYsIN6DFDM3SxczN0oUMZcEyAc3SRQxyLxdSRlOuH0Jbm8uFZNlvCsyy32TKspe4WTatkZYwZNlLHZ5lK7mXCsqyl7pZdppz6/wvQx0td7Ps9A9LUctsWfZyYVn2csIN6C2GLPst5ix7GUO2+Y6ALHs5g9wrMmCWTWhrc4V7vCHFfuTxcXDx+LaU4w3vuMcbzHcEONQKpx9vUL2oFQwRY5WQiPE2YZa0knBRrhJwvGElg9+86x5vMN8VsLGtknK84T3CRenkJ9H+laF91d9qgY3X1UyN1zVu45XWSGsYGq9rHd54VXKvFdR4XSu38RrJOHeKxus61NH7buM1/cNS1Dpb4/V9YY3X9wk3oPUMjdf1zI3XdQxlwWoBjdf3GeReI6OMjqRcP4S2NtcIybI3CMyyNzBl2R+4WTatkT5gyLI3OjzLVnJvFJRlb3Sz7LRGiix7E+pos5tlp39Yitpky7I3C8uyNxNuQFsYsuwtzFn2JoZs830BWfZmBrnXZ8Asm9DW5nr3eEOK/cjj4+DicauU4w0fuscbzA8FONQ2px9vUL2obQwRY6OQ4w1bCbOk7YSLcqOA4w3bGfzmI/d4g/mRgI1th5TjDTsJF+UowpRwtJDG6y6BjdddTI3X3W7jldZIuxkar3sc3nhVcu8R1HjdI7fxGsU4d4rG68eoo71u4zX9w1LUx7bG615hjde9hBvQPobG6z7mxuvHDGXBZgGN170Mcm+RUUZHkd64IMyytwjJsvcLzLL3M2XZn7hZNq2RPmHIsg84PMtWch8QlGUfcLPstEaKLPsg6uiQm2Wnf1iKOmjLsg8Jy7IPEW5Ahxmy7MPMWfZBhmxzm4As+xCD3NszYJZNaGtzu3u8IcV+5PFxcPF4RMrxhqPu8QbzqACHOub04w2qF3WMIWLsFHK84QhhlnSccFHuFHC84TiD35xwjzeYJwRsbJ9KOd7wGeGiHEOYEo4V0ng9mUkGn58T2ln1TLYat3sXSgefZzIMTv5PCWxwn2JqcJ92G9y0RjrN0OA+4/AGt5L7jKAGNwev/7UnJn+BOvrSbXCnf1iK+sLW4P5SWIP7S8IN6CxDg/ssc4P7C4bya7eABveXDHLvEfLEZEL7mHuEVCDnBGbG55gy46/czJjWSF8xZMbnHZ4ZK7nPC8qMz7uZcVojRWb8NerogpsZp39YivralhlfEJYZXyDcgC4yZMYXmTPjrxkyxH0CMuMLDHLvF5IZE9rH3E98XGOrkXpQ65R6X70g4CbUN1KOa3xLfFxDokN9K8ChvnP6cQ3V8/mOYZc/KOS4xjeEmc0lwkV5UMBxjUsMfvM98XGNNUbqQalXDt1+L2Bj+0HKcY3LhIvyAcKUsJqQZukVgc3SK0zN0h/dZimtkX5kaJZedXizVMl9VVCz9KrcZqnfnnL8E+roZ7dZmv5hKeonW7P0Z2HN0p8JN6BfGJqlvzA3S39iKAsOC2iW/swg95EM+JRjQlubR4Rk2dcEZtnXmLLsX90sm9ZIvzJk2b85PMtWcv8mKMv+zc2y05xb5/931NF1N8tO/7AU9bsty74uLMu+TrgB3WDIsm8wZ9m/M2SbxwVk2dc5PiOaAbNsQlubJ9zjDSn2I4+Pg4vHm1KONxiZ3eMNhDpg4zGAmkdqBv/oRWWmd9CTQiLGTcIsKZBwUZ4UcLwhkMFvgjLTRkqJxxuCBGxswZl51jf58YYQwkVZkzAlrCWk8RqaWV7jNZTQOXV+wzLfvnYbrz7OqYwUlpl+3nBCh+WSOzwzuY3YojwHr/+1pxxHoI4yabpyG6//47AUpZRZTFNcpsyyGq+ZCDegzJnp9Zs5M2/jNYKhLDgloPGaiUHu0xnwKceEtjZPC8myswjMsrMwZdlZ3Syb1khZGbLsbA7PspXc2QRl2dncLDutkSLLzo46yuFm2ekflqKy27LsHMKy7ByEG1BOhiw7J3OWnZ0h2/xSQJadg0Husxkwyya0tXnWPd6QYj/y+Di4eMzFddOGekHmdo83mLkFONQdTj/eoHpRdzBEjPNCjjfkIsyS8hAuyvMCjjfkYfCbO93jDeadAja2vFKON+QjXJS1CVPCh4U0XvMLbLzmZ2q8FnAbr7RGKsDQeC3o8MarkrugoMZrQbmNV7895bgQ6qiw23hN/7AUVcjWeC0srPFamHADKsLQeC3C3HgtxFAWXBDQeC3MIPfFDPiUY0JbmxeFZNlFBWbZRZmy7GJulk1rpGIMWXZxh2fZSu7igrLs4m6WndZIkWWXQB2VdLPs9A9LUSVsWXZJYVl2ScINqBRDll2KOcsuwZBtficgyy7JIPelDJhlE9ravOQeb0ixH3l8HFw8lpZyvKGMe7zBLCPAoco6/XiD6kWVZYgYl4UcbyhNmCWVI1yUlwUcbyjH4Dfl3eMNZnkBG9tdUo433E24KOsQpoR1Hb7Ay8Ac8xi+CO5Hh8s9BZoXrzPIfdVPAdFXPisQrhdCW5tXBayX9xj85hcB62UVg9zXhKyXioTrhdDW5jUB62Ung9/8LmC97GCQ+7qQ9VKJcL0Q2tq8LmC9fMbgN0Z256+XTxnkDsguY71UJlwvhLY2AxzuN2q9/MDgN8EC1stlBrlDhKwXD2VnnHC9hAhYL8EMDb1wAeslhEHuCCHrxSRcL4S2NiMErJe8DH6TRcB6yccgd1Yh6yWScL0Q2trMKmC93MXgNzkErJe7GeTOKWS9RBGuF0Jbm1z6o7ZzdGYZfFYRwmdVIXzGCOEzVgifcUL4vEcIn/cK4fM+IXzeL4TPB4TwWU0In9WF8FlDCJ81hfBZSwifDwrh8yEhfNYWwufDQvh8RAifjwrhs44QPusK4fMxIXw+LoTPJ4Tw+aQQPusJ4fMpIXw+LYTP+kL4bCCEz4ZC+GwkhM/GQvhsIoTPpkL4fEYIn82E8NlcCJ8thPDZUgifzwrhs5UQPuOF8JkghM9EIXwmCeEzWQifXiF8thbC53NC+GwjhM+2QvhsJ4TP9kL47CCEz45C+OwkhM/OQvjsIoTPrkL47CaEz+5C+OwhhM+eQvh8XgifvYTw2VsIny8I4bOPED77CuGznxA+XxTCZ38hfA4QwudAIXwOEsLnYCF8DhHC51AhfA4TwudwYj6pP1fZOJzn+wnvcPjnSdUXr1Zg+DxpHiGfJx1B+HlSQlubeRzuN2q9cHw/YT4B66Uiw3rJL2S9jCRcL4S2NvMLWC8c309YSMB6qcSwXgoLWS+jCNcLoa3NwgLWC8f3ExYTsF4qM6yX4kLWy2jC9UJoa7O4gPXC8T19pQSsFw/DeiktZL28RLheCG1tlhawXji+p6+cgPVicjxoRch6eZlwvRDa2iwvYL1wfE9fBQHrJZJB7opC1ssYwvVCaGuzooD1wvE9fR4B6yWKQW5TyHoZS7heCG1tmkK+n/AVIfezxgnhc7wQPicI4XOiED4nCeFzshA+pzDxGWjj0+PbMAMIZZ4qROZAQpmnCZE5iFDm6UJkDiaUeYYQmUMIZZ4pROZQQplfFSJzGKHMs4TI/AihzK8JkVn//nVfZZ4tROYqhDLPESJzVUKZ5wqROYZQ5teFyBxLKPM8ITLHEco8X4jM9xDK/IYQme8llHmBEJnvI5R5oRCZ7yeUeZEQmR8glHmxEJmrEcr8phCZqxPKvESIzDUIZV4qROaahDIvEyJzLUKZlwuR+UFCmd8SIvNDhDK/LUTm2oQyvyNE5ocJZV4hpQdIKPNKITI/Sijzu0JkrkMo8yohMtcllPk9ITI/RijzaiEyP04o8xohMj9BKPNaITI/SSjzOiEy1yOU+X0hMj9FKPN6ITI/TSjzBiEy1yeU+QMhMjcglHmjEJkbEsq8SYjMjQhl3ixE5saEMm8RInMTQpm3CpG5KaHMHwqR+RlCmbcJkbkZoczbhcjcnFDmj4TI3IJQ5h1CZG5JKPNOITI/SyjzLiEytyKUebcQmeMJZd4jROYEQpk/FiJzIqHMe4XInEQo8z4hMicTyrxfiMxeQpk/ESJza0KZDwiR+TlCmQ8KkbkNocyHhMjcllDmw0Jkbkco8xEhMrcnlPmoEJk7EMp8TIjMHQllPi5E5k6EMp8QInNnQpk/FSJzF0KZPxMic1dCmU8KkbkbocyfC5G5O6HMp4TI3INQ5tNCZO5JKPMZITI/TyjzF0Jk7kUo85dCZO5NKPNZITK/QCjzOSEy9yGU+SshMvcllPm8EJn7Ecr8tRCZXySU+YIQmfsTynxRiMwDCGX+RojMAwll/laIzIMIZf5OiMyDCWW+JETmIYQyfy9E5qGEMv8gROZhhDJfFiLzcEKZrwiReQShzD8KkXkkocxXhcg8ilDmn4TIPJpQ5p+FyPwSocy/CJH5ZUKZrwmReQyhzL8KkXksocy/CZH5FUKZfxci8zhCma8LkXk8ocw3hMg8gVDmm0Jknkgos5FFhsyTCGUOECLzZEKZA4XIPIVQ5iAhMocbdDIHC5E5glDmECEyZyKUOVSIzJkJZQ4TInMWQpnDhciclVDmCCEyZyOUOZMQmbMTypxZiMw5CGXOIkTmnIQyZxUicy5CmbMJkTk3oczZhch8B6HMOYTInIdQ5pxCZL6TUOZchDLfifMEoMzqOZjquZDqOYnquYHqOXqqJlQ1kqoZVA6tckqVY6mcQ8VgFZPUHq32LLWGlU8rG9+JP1cjL1A+oPxABYAKAhUCKgxUBKgoUDGg4kAlgEoClQIqDVQGqCxQH5xLPUdVPVdUPWdTPXdSPYdRPZdQPadPPbdOPcdNPddMPedLPfdKPQdKPRdJPSdIPTdHPUdGPVdFPWdEPXdDPYdCPZdBPadAfW+/+h579b3u6nvO1fd+q+/BVt8Lrb4nWX1vsPoeXfW9sup7VtX3jqrv4VTfS6m+p1F9b6H6Hj/1vXbqe97U956p7wFT34ulvidKfW+S+h4h9b066ntm1PeuqO8hUd/Lob6nQn1vg/oeA/W5fvU5d/W5b/U5aPW5YPU5WfW5UfU5SvW5QvU5O/W5M/U5LPW5JPU5HfW5FfU5DvW5BnXOX517V+fA1blodU5YnZtV50jVuUp1zlCdu1Pn0NS5LHVOSZ3bUedY1LkOdc5B3fdX98HVfWF1n1TdN1T30dR9JXWfRd13UH141ZdWfdqb6CCqr6X6PKrvofoAqi5WdaKqm1QdofJqlWeqvEvlISouqzil9m21j6l1rfzcGv8HYSyMLanaCwA=", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "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" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "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" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ] -} diff --git a/yarn-project/boxes/blank/src/tests/blank.contract.test.ts b/yarn-project/boxes/blank/src/tests/blank.contract.test.ts index 18bec599c57..eea833f0fb6 100644 --- a/yarn-project/boxes/blank/src/tests/blank.contract.test.ts +++ b/yarn-project/boxes/blank/src/tests/blank.contract.test.ts @@ -1,4 +1,3 @@ -import { callContractFunction, deployContract, getWallet } from '../index.js'; import { AccountWallet, AztecAddress, diff --git a/yarn-project/noir-contracts/scripts/types.sh b/yarn-project/noir-contracts/scripts/types.sh index 5072896d341..881978d17d9 100755 --- a/yarn-project/noir-contracts/scripts/types.sh +++ b/yarn-project/noir-contracts/scripts/types.sh @@ -50,7 +50,7 @@ process() { format(){ echo "Formatting contract folders" - yarn run -T prettier -w ../aztec.js/src/abis/*.json ./$types_dir/*.ts + yarn run -T prettier -w ../aztec.js/src/artifacts/*.json ./$types_dir/*.ts echo -e "Done\n" } diff --git a/yarn-project/noir-contracts/src/scripts/copy_output.ts b/yarn-project/noir-contracts/src/scripts/copy_output.ts index 20e415c87b7..352fa339e3d 100644 --- a/yarn-project/noir-contracts/src/scripts/copy_output.ts +++ b/yarn-project/noir-contracts/src/scripts/copy_output.ts @@ -18,27 +18,27 @@ import { format } from 'util'; const log = createConsoleLogger('aztec:noir-contracts'); const PROJECT_CONTRACTS = [ - { name: 'SchnorrSingleKeyAccount', target: '../aztec.js/src/abis/', exclude: [] }, - { name: 'SchnorrAccount', target: '../aztec.js/src/abis/', exclude: [] }, - { name: 'EcdsaAccount', target: '../aztec.js/src/abis/', exclude: [] }, + { name: 'SchnorrSingleKeyAccount', target: '../aztec.js/src/artifacts/', exclude: [] }, + { name: 'SchnorrAccount', target: '../aztec.js/src/artifacts/', exclude: [] }, + { name: 'EcdsaAccount', target: '../aztec.js/src/artifacts/', exclude: [] }, ]; const INTERFACE_CONTRACTS = ['private_token', 'private_token_airdrop', 'non_native_token', 'test']; /** * Writes the contract to a specific project folder, if needed. - * @param abi - The Abi to write. + * @param artifact - The artifact to write. */ -function writeToProject(abi: any) { +function writeToProject(artifact: any) { for (const projectContract of PROJECT_CONTRACTS) { - if (abi.name === projectContract.name) { + if (artifact.name === projectContract.name) { const toWrite = { - ...abi, - functions: abi.functions.map((f: any) => omit(f, projectContract.exclude)), + ...artifact, + functions: artifact.functions.map((f: any) => omit(f, projectContract.exclude)), // If we maintain debug symbols they will get committed to git. debug: undefined, }; - const targetFilename = pathJoin(projectContract.target, `${snakeCase(abi.name)}_contract.json`); + const targetFilename = pathJoin(projectContract.target, `${snakeCase(artifact.name)}_contract.json`); writeFileSync(targetFilename, JSON.stringify(toWrite, null, 2) + '\n'); log(`Written ${targetFilename}`); } From 03ec7a8ba55f2bdbbb5c8825e95d9306b0d809e1 Mon Sep 17 00:00:00 2001 From: benesjan Date: Tue, 10 Oct 2023 15:01:17 +0000 Subject: [PATCH 12/16] fixes --- yarn-project/boxes/blank-react/README.md | 2 +- .../src/app/components/contract_function_form.tsx | 10 +++++----- yarn-project/boxes/blank/src/artifacts/Blank.ts | 2 +- yarn-project/cli/src/utils.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn-project/boxes/blank-react/README.md b/yarn-project/boxes/blank-react/README.md index 5493bf9b20b..3a1035d8a79 100644 --- a/yarn-project/boxes/blank-react/README.md +++ b/yarn-project/boxes/blank-react/README.md @@ -67,7 +67,7 @@ import TestContractArtifactJson from 'text_contract.json' assert { type: 'json' import TestContractArtifactJson from './test_contract.json' assert { type: 'json' }; ``` -After compiling, you can re-deploy the upated noir smart contract from the web UI. The function interaction forms are generated from parsing the ContractABI, so they should update automatically after you recompile. +After compiling, you can re-deploy the updated noir smart contract from the web UI. The function interaction forms are generated from parsing the contract artifacts, so they should update automatically after you recompile. ## Learn More diff --git a/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx b/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx index ec394d7a424..3584d33c1d1 100644 --- a/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx +++ b/yarn-project/boxes/blank-react/src/app/components/contract_function_form.tsx @@ -109,8 +109,8 @@ interface ContractFunctionFormProps { export function ContractFunctionForm({ wallet, contractAddress, - contractArtifact: contractAbi, - functionArtifact: functionAbi, + contractArtifact, + functionArtifact, defaultAddress, buttonText = 'Submit', isLoading, @@ -119,14 +119,14 @@ export function ContractFunctionForm({ onSuccess, onError, }: ContractFunctionFormProps) { - const { validationSchema, initialValues } = generateYupSchema(functionAbi, defaultAddress); + const { validationSchema, initialValues } = generateYupSchema(functionArtifact, defaultAddress); const formik = useFormik({ initialValues: initialValues, validationSchema: validationSchema, onSubmit: async (values: any) => { onSubmit(); try { - const result = await handleFunctionCall(contractAddress, contractAbi, functionAbi.name, values, wallet); + const result = await handleFunctionCall(contractAddress, contractArtifact, functionArtifact.name, values, wallet); onSuccess(result); } catch (e: any) { onError(e.message); @@ -136,7 +136,7 @@ export function ContractFunctionForm({ return (
- {functionAbi.parameters.map(input => ( + {functionArtifact.parameters.map(input => (