,
+amount: Field,
+```
+> Source code: noir-projects/aztec-nr/value-note/src/utils.nr#L27-L30
+
+
+Note that this will create a new note in the set of notes passed as the first argument.
+For example:
+```rust title="increment_valuenote" showLineNumbers
+increment(storage.notes.at(owner), value, owner, sender);
+```
+> Source code: noir-projects/noir-contracts/contracts/test/benchmarking_contract/src/main.nr#L24-L26
+
+
+The `decrement` function works similarly except the `amount` is the number that the value will be decremented by, and it will fail if the sum of the selected notes is less than the amount.
+
+## Learn more
+
+- [Keys, including nullifier keys and outgoing viewer](../../../../../aztec/concepts/accounts/keys.md)
+- [How to implement a note](./implementing_a_note.md)
+- [ValueNote reference](../../../../reference/smart_contract_reference/aztec-nr/value-note/value_note.md)
diff --git a/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/portals/communicate_with_portal.md b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/portals/communicate_with_portal.md
new file mode 100644
index 000000000000..faeacf7b132a
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/portals/communicate_with_portal.md
@@ -0,0 +1,379 @@
+---
+title: Communicating with L1
+tags: [contracts, portals]
+---
+
+Follow the [token bridge tutorial](../../../../../developers/tutorials/codealong/contract_tutorials/token_bridge.md) for hands-on experience writing and deploying a Portal contract.
+
+## Passing data to the rollup
+
+Whether it is tokens or other information being passed to the rollup, the portal should use the `Inbox` to do it.
+
+The `Inbox` can be seen as a mailbox to the rollup, portals put messages into the box, and the sequencer then consumes a batch of messages from the box and include it in their blocks.
+
+When sending messages, we need to specify quite a bit of information beyond just the content that we are sharing. Namely we need to specify:
+
+| Name | Type | Description |
+| ----------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Recipient | `L2Actor` | The message recipient. This **MUST** match the rollup version and an Aztec contract that is **attached** to the contract making this call. If the recipient is not attached to the caller, the message cannot be consumed by it. |
+| Secret Hash | `field` (~254 bits) | A hash of a secret that is used when consuming the message on L2. Keep this preimage a secret to make the consumption private. To consume the message the caller must know the pre-image (the value that was hashed) - so make sure your app keeps track of the pre-images! Use `computeSecretHash` to compute it from a secret. |
+| Content | `field` (~254 bits) | The content of the message. This is the data that will be passed to the recipient. The content is limited to be a single field. If the content is small enough it can just be passed along, otherwise it should be hashed and the hash passed along (you can use our [`Hash` (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/core/libraries/Hash.sol) utilities with `sha256ToField` functions) |
+
+With all that information at hand, we can call the `sendL2Message` function on the Inbox. The function will return a `field` (inside `bytes32`) that is the hash of the message. This hash can be used as an identifier to spot when your message has been included in a rollup block.
+
+```solidity title="send_l1_to_l2_message" showLineNumbers
+/**
+ * @notice Inserts a new message into the Inbox
+ * @dev Emits `MessageSent` with data for easy access by the sequencer
+ * @param _recipient - The recipient of the message
+ * @param _content - The content of the message (application specific)
+ * @param _secretHash - The secret hash of the message (make it possible to hide when a specific message is consumed on L2)
+ * @return The key of the message in the set and its leaf index in the tree
+ */
+function sendL2Message(
+ DataStructures.L2Actor memory _recipient,
+ bytes32 _content,
+ bytes32 _secretHash
+) external returns (bytes32, uint256);
+```
+> Source code: l1-contracts/src/core/interfaces/messagebridge/IInbox.sol#L21-L35
+
+
+A sequencer will consume the message batch your message was included in and include it in their block.
+Upon inclusion, it is made available to be consumed on L2 via the L2 outbox.
+
+To consume the message, we can use the `consume_l1_to_l2_message` function within the `context` struct.
+
+- The `msg_key` is the hash of the message returned by the `sendL2Message` call and is used to help the RPC find the correct message.
+- The `content` is the content of the message, limited to one Field element. For content larger than one Field, we suggest using the `sha256` hash function truncated to a single Field element. `sha256` is suggested as it is cheap on L1 while still being manageable on L2.
+- The `secret` is the pre-image hashed using Pedersen to compute the `secretHash`.
+- If the `content` or `secret` does not match the entry at `msg_key` the message will not be consumed, and the transaction will revert.
+
+:::info
+Note that while the `secret` and the `content` are both hashed, they are actually hashed with different hash functions!
+:::
+
+```rust title="context_consume_l1_to_l2_message" showLineNumbers
+pub fn consume_l1_to_l2_message(
+ &mut self,
+ content: Field,
+ secret: Field,
+ sender: EthAddress,
+ leaf_index: Field,
+) {
+```
+> Source code: noir-projects/aztec-nr/aztec/src/context/private_context.nr#L293-L302
+
+
+### Token bridge example
+
+Computing the `content` must currently be done manually, as we are still adding a number of bytes utilities. A good example exists within the [Token bridge example (codealong tutorial)](../../../../../developers/tutorials/codealong/contract_tutorials/token_bridge.md).
+
+```rust title="claim_public" showLineNumbers
+// Consumes a L1->L2 message and calls the token contract to mint the appropriate amount publicly
+#[public]
+fn claim_public(to: AztecAddress, amount: u128, secret: Field, message_leaf_index: Field) {
+ let content_hash = get_mint_to_public_content_hash(to, amount);
+
+ let config = storage.config.read();
+
+ // Consume message and emit nullifier
+ context.consume_l1_to_l2_message(content_hash, secret, config.portal, message_leaf_index);
+
+ // Mint tokens
+ Token::at(config.token).mint_to_public(to, amount).call(&mut context);
+}
+```
+> Source code: noir-projects/noir-contracts/contracts/app/token_bridge_contract/src/main.nr#L57-L71
+
+
+:::info
+The `content_hash` is a sha256 truncated to a field element (~ 254 bits). In Aztec.nr, you can use our `sha256_to_field()` to do a sha256 hash which fits in one field element
+:::
+
+### Token portal hash library
+
+```rust title="mint_to_public_content_hash_nr" showLineNumbers
+use dep::aztec::prelude::{AztecAddress, EthAddress};
+use dep::aztec::protocol_types::{hash::sha256_to_field, traits::ToField};
+
+// Computes a content hash of a deposit/mint_to_public message.
+// Refer TokenPortal.sol for reference on L1.
+pub fn get_mint_to_public_content_hash(owner: AztecAddress, amount: u128) -> Field {
+ let mut hash_bytes = [0; 68];
+ let recipient_bytes: [u8; 32] = owner.to_field().to_be_bytes();
+ let amount_bytes: [u8; 32] = (amount as Field).to_be_bytes();
+
+ // The purpose of including the following selector is to make the message unique to that specific call. Note that
+ // it has nothing to do with calling the function.
+ let selector =
+ comptime { keccak256::keccak256("mint_to_public(bytes32,uint256)".as_bytes(), 31) };
+
+ for i in 0..4 {
+ hash_bytes[i] = selector[i];
+ }
+
+ for i in 0..32 {
+ hash_bytes[i + 4] = recipient_bytes[i];
+ hash_bytes[i + 36] = amount_bytes[i];
+ }
+
+ let content_hash = sha256_to_field(hash_bytes);
+ content_hash
+}
+```
+> Source code: noir-projects/noir-contracts/contracts/libs/token_portal_content_hash_lib/src/lib.nr#L1-L29
+
+
+### Token Portal contract
+
+In Solidity, you can use our `Hash.sha256ToField()` method:
+
+```solidity title="content_hash_sol_import" showLineNumbers
+import {Hash} from "@aztec/core/libraries/crypto/Hash.sol";
+```
+> Source code: l1-contracts/test/portals/TokenPortal.sol#L12-L14
+
+
+```solidity title="deposit_public" showLineNumbers
+/**
+ * @notice Deposit funds into the portal and adds an L2 message which can only be consumed publicly on Aztec
+ * @param _to - The aztec address of the recipient
+ * @param _amount - The amount to deposit
+ * @param _secretHash - The hash of the secret consumable message. The hash should be 254 bits (so it can fit in a Field element)
+ * @return The key of the entry in the Inbox and its leaf index
+ */
+function depositToAztecPublic(bytes32 _to, uint256 _amount, bytes32 _secretHash)
+ external
+ returns (bytes32, uint256)
+```
+> Source code: l1-contracts/test/portals/TokenPortal.sol#L55-L66
+
+
+The `secret_hash` uses the pederson hash which fits in a field element. You can use the utility method `computeSecretHash()`in `@aztec/aztec.js` npm package to generate a secret and its corresponding hash.
+
+After the transaction has been mined, the message is consumed, a nullifier is emitted and the tokens have been minted on Aztec and are ready for claiming.
+
+Since the message consumption is emitting a nullifier, the same message cannot be consumed again. The index in the message tree is used as part of the nullifier computation, ensuring that the same content and secret being inserted will be distinct messages that can each be consumed. Without the index in the nullifier, it would be possible to perform a kind of attack known as `Faerie Gold` attacks where two seemingly good messages are inserted, but only one of them can be consumed later.
+
+## Passing data to L1
+
+To pass data to L1, we use the `Outbox`. The `Outbox` is the mailbox for L2 to L1 messages. This is the location on L1 where all the messages from L2 will live, and where they can be consumed from.
+
+:::danger
+
+Similarly to messages going to L2 from L1, a message can only be consumed by the specified recipient. But it is up to the portal contract to ensure that the sender is as expected! Any L2 contract can send a message to a portal contract on L1, but the portal contract should only consume messages from the expected sender.
+
+:::
+
+The portal must ensure that the sender is as expected. One flexible solution is to have an `initialize` function in the portal contract which can be used to set the address of the Aztec contract. In this model, the portal contract can check that the sender matches the value it has in storage.
+
+To send a message to L1 from your Aztec contract, you must use the `message_portal` function on the `context`. When messaging to L1, only the `content` is required (as a `Field`).
+
+```rust title="context_message_portal" showLineNumbers
+pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {
+```
+> Source code: noir-projects/aztec-nr/aztec/src/context/private_context.nr#L286-L288
+
+
+When sending a message from L2 to L1 we don't need to pass in a secret.
+
+:::danger
+Access control on the L1 portal contract is essential to prevent consumption of messages sent from the wrong L2 contract.
+:::
+
+### Token bridge
+
+As earlier, we can use a token bridge as an example. In this case, we are burning tokens on L2 and sending a message to the portal to free them on L1.
+
+```rust title="exit_to_l1_private" showLineNumbers
+// Burns the appropriate amount of tokens and creates a L2 to L1 withdraw message privately
+// Requires `msg.sender` (caller of the method) to give approval to the bridge to burn tokens on their behalf using witness signatures
+#[private]
+fn exit_to_l1_private(
+ token: AztecAddress,
+ recipient: EthAddress, // ethereum address to withdraw to
+ amount: u128,
+ caller_on_l1: EthAddress, // ethereum address that can call this function on the L1 portal (0x0 if anyone can call)
+ nonce: Field, // nonce used in the approval message by `msg.sender` to let bridge burn their tokens on L2
+) {
+ let config = storage.config.read();
+
+ // Assert that user provided token address is same as seen in storage.
+ assert_eq(config.token, token, "Token address is not the same as seen in storage");
+
+ // Send an L2 to L1 message
+ let content = get_withdraw_content_hash(recipient, amount, caller_on_l1);
+ context.message_portal(config.portal, content);
+
+ // Burn tokens
+ Token::at(token).burn_private(context.msg_sender(), amount, nonce).call(&mut context);
+}
+```
+> Source code: noir-projects/noir-contracts/contracts/app/token_bridge_contract/src/main.nr#L125-L150
+
+
+When the transaction is included in a rollup block and published to Ethereum the message will be inserted into the `Outbox` on Ethereum, where the recipient portal can consume it from. When consuming, the `msg.sender` must match the `recipient` meaning that only portal can actually consume the message.
+
+```solidity title="l2_to_l1_msg" showLineNumbers
+/**
+ * @notice Struct containing a message from L2 to L1
+ * @param sender - The sender of the message
+ * @param recipient - The recipient of the message
+ * @param content - The content of the message (application specific) padded to bytes32 or hashed if larger.
+ * @dev Not to be confused with L2ToL1Message in Noir circuits
+ */
+struct L2ToL1Msg {
+ DataStructures.L2Actor sender;
+ DataStructures.L1Actor recipient;
+ bytes32 content;
+}
+```
+> Source code: l1-contracts/src/core/libraries/DataStructures.sol#L53-L66
+
+
+#### Outbox `consume`
+
+```solidity title="outbox_consume" showLineNumbers
+/**
+ * @notice Consumes an entry from the Outbox
+ * @dev Only useable by portals / recipients of messages
+ * @dev Emits `MessageConsumed` when consuming messages
+ * @param _message - The L2 to L1 message
+ * @param _l2BlockNumber - The block number specifying the block that contains the message we want to consume
+ * @param _leafIndex - The index inside the merkle tree where the message is located
+ * @param _path - The sibling path used to prove inclusion of the message, the _path length directly depends
+ * on the total amount of L2 to L1 messages in the block. i.e. the length of _path is equal to the depth of the
+ * L1 to L2 message tree.
+ */
+function consume(
+ DataStructures.L2ToL1Msg calldata _message,
+ uint256 _l2BlockNumber,
+ uint256 _leafIndex,
+ bytes32[] calldata _path
+) external;
+```
+> Source code: l1-contracts/src/core/interfaces/messagebridge/IOutbox.sol#L35-L53
+
+
+#### Withdraw
+
+As noted earlier, the portal contract should check that the sender is as expected. In the example below, we support only one sender contract (stored in `l2TokenAddress`) so we can just pass it as the sender, that way we will only be able to consume messages from that contract.
+
+It is possible to support multiple senders from L2. You could use a have `mapping(address => bool) allowed` and check that `allowed[msg.sender]` is `true`.
+
+```solidity title="token_portal_withdraw" showLineNumbers
+/**
+ * @notice Withdraw funds from the portal
+ * @dev Second part of withdraw, must be initiated from L2 first as it will consume a message from outbox
+ * @param _recipient - The address to send the funds to
+ * @param _amount - The amount to withdraw
+ * @param _withCaller - Flag to use `msg.sender` as caller, otherwise address(0)
+ * @param _l2BlockNumber - The address to send the funds to
+ * @param _leafIndex - The amount to withdraw
+ * @param _path - Flag to use `msg.sender` as caller, otherwise address(0)
+ * Must match the caller of the message (specified from L2) to consume it.
+ */
+function withdraw(
+ address _recipient,
+ uint256 _amount,
+ bool _withCaller,
+ uint256 _l2BlockNumber,
+ uint256 _leafIndex,
+ bytes32[] calldata _path
+) external {
+ // The purpose of including the function selector is to make the message unique to that specific call. Note that
+ // it has nothing to do with calling the function.
+ DataStructures.L2ToL1Msg memory message = DataStructures.L2ToL1Msg({
+ sender: DataStructures.L2Actor(l2Bridge, rollupVersion),
+ recipient: DataStructures.L1Actor(address(this), block.chainid),
+ content: Hash.sha256ToField(
+ abi.encodeWithSignature(
+ "withdraw(address,uint256,address)",
+ _recipient,
+ _amount,
+ _withCaller ? msg.sender : address(0)
+ )
+ )
+ });
+
+ outbox.consume(message, _l2BlockNumber, _leafIndex, _path);
+
+ underlying.transfer(_recipient, _amount);
+}
+```
+> Source code: l1-contracts/test/portals/TokenPortal.sol#L122-L161
+
+
+## Considerations
+
+### Structure of messages
+
+Application developers should consider creating messages that follow a function call structure e.g., using a function signature and arguments. This will make it easier to prevent producing messages that could be misinterpreted by the recipient.
+
+An example of a bad format would be using `amount, token_address, recipient_address` as the message for a withdraw function and `amount, token_address, on_behalf_of_address` for a deposit function. Any deposit could then also be mapped to a withdraw or vice versa.
+
+```solidity
+// Don't to this!
+bytes memory message = abi.encode(
+ _amount,
+ _token,
+ _to
+);
+
+// Do this!
+bytes memory message abi.encodeWithSignature(
+ "withdraw(uint256,address,address)",
+ _amount,
+ _token,
+ _to
+);
+```
+
+### Error Handling
+
+Handling error when moving cross chain can quickly get tricky. Since the L1 and L2 calls are async and independent of each other, the L1 part of a deposit might execute just fine, with the L2 part failing. If this is not handled well, the funds may be lost forever! Developers should consider ways their application can fail cross chain, and handle all cases explicitly.
+
+First, entries in the outboxes **SHOULD** only be consumed if the execution is successful. For an L2 -> L1 call, the L1 execution can revert the transaction completely if anything fails. As the tx is atomic, the failure also reverts consumption.
+
+If it is possible to enter a state where the second part of the execution fails forever, the application builder should consider including additional failure mechanisms (for token withdraws this could be depositing them again etc).
+
+Generally it is good practice to keep cross-chain calls simple to avoid too many edge cases and state reversions.
+
+:::info
+Error handling for cross chain messages is handled by the application contract and not the protocol. The protocol only delivers the messages, it does not ensure that they are executed successfully.
+:::
+
+### Designated caller
+
+Designating a caller grants the ability to specify who should be able to call a function that consumes a message. This is useful for ordering of batched messages.
+
+When performing multiple cross-chain calls in one action it is important to consider the order of the calls. Say for example, that you want to perform a uniswap trade on L1. You would withdraw funds from the rollup, swap them on L1, and then deposit the swapped funds back into the rollup. This is a straightforward process, but it requires that the calls are done in the correct order (e.g. if the swap is called before the funds are withdrawn, the swap will fail).
+
+The message boxes (Inbox and Outbox) will only allow the recipient portal to consume the message, and we can use this to ensure that the calls are done in the correct order. Say that we include a designated "caller" in the messages, and that the portal contract checks that the caller matches the designated caller or designated as `address(0)` (if anyone can call). When the messages are to be consumed on L1, it can compute the message as seen below:
+
+```solidity
+bytes memory message = abi.encodeWithSignature(
+ "withdraw(uint256,address,address)",
+ _amount,
+ _to,
+ _withCaller ? msg.sender : address(0)
+);
+```
+
+This way, the message can be consumed by the portal contract, but only if the caller is the specified caller. In the logic of the contract that is the designated caller, we can ensure that the calls are done in the correct order.
+
+For example, we could require that the Uniswap portal is the caller of the withdrawal, and ensure that the uniswap portal contract implementation is executing the withdrawal before the swap.
+The order of execution can be specified in the contract. Since all of the messages are emitted to L1 in the same transaction, we can leverage transaction atomicity to ensure success of failure of all messages.
+
+Note, that crossing the L1/L2 chasm is asynchronous, so there could be a situation where the user has burned their assets on L2 but the swap fails on L1! This could be due to major price movements for example. In such a case, the user could be stuck with funds on L1 that they cannot get back to L2 unless the portal contract implements a way to properly handle such errors.
+
+:::caution
+Designated callers are enforced at the contract level for contracts that are not the rollup itself, and should not be trusted to implement the contract correctly. The user should always be aware that it is possible for the developer to implement something that looks like designated caller without providing the abilities to the user.
+:::
+
+## Examples of portals
+
+- Token bridge (Portal contract built for L1 -> L2, i.e., a non-native L2 asset)
+ - [Portal contract (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/v0.86.0/l1-contracts/test/portals/TokenPortal.sol)
+ - [Aztec contract (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/v0.86.0/noir-projects/noir-contracts/contracts/app/token_bridge_contract/src/main.nr)
diff --git a/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/portals/index.md b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/portals/index.md
new file mode 100644
index 000000000000..d9292f2848e8
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/portals/index.md
@@ -0,0 +1,6 @@
+---
+title: Portals
+sidebar_position: 7
+---
+
+A portal is a point of contact between L1 and a contract on Aztec. For applications such as token bridges, this is the point where the tokens are held on L1 while used in L2. Note, that a portal doesn't actually need to be a contract, it could be any address on L1.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/index.md b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/index.md
new file mode 100644
index 000000000000..622df9645037
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/index.md
@@ -0,0 +1,21 @@
+---
+title: Declaring Storage
+sidebar_position: 2
+tags: [contracts, storage]
+---
+
+On this page, you will learn how to define storage in your smart contract.
+
+To learn more about how storage works in Aztec, read [the concepts](./storage_slots.md).
+
+[See the storage reference](../../../../reference/smart_contract_reference/storage/index.md).
+
+```rust
+#[storage]
+struct Storage {
+ // public state variables
+ // private state variables
+}
+```
+
+If you have defined a struct and annotated it as `#[storage]`, then it will be made available to you through the reserved `storage` keyword within your contract functions.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/notes.md b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/notes.md
new file mode 100644
index 000000000000..d7e5226cf8fe
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/notes.md
@@ -0,0 +1,169 @@
+---
+title: Writing Notes
+description: Core knowledge of Notes and how they work
+useful-for: dev
+tags: [contracts, storage, notes]
+---
+
+Most prominent blockchain networks don't have privacy at the protocol level. Aztec contracts can define public and private functions, that can read/write public and private state.
+
+To be clear, "private" here is referring to the opposite of how things work on a public blockchain network, not the conventional syntax for visibility within code.
+
+For private state we need encryption and techniques to hide information about state changes. For private functions, we need local execution and proof of correct execution.
+
+### Some context
+
+- Public functions and storage work much like other blockchains in terms of having dedicated storage slots and being publicly visible
+- Private functions are executed locally with proofs generated for sound execution, and commitments to private variable updates are stored using append-only trees
+- "Note" types are part of Aztec.nr, a framework that facilitates use of Aztec's different storage trees to achieve things such as private variables
+
+This page will focus on how private variables are implemented with Notes and storage trees.
+
+#### Side-note about execution
+
+Under the hood, the Aztec protocol handles some important details around public and private function calls. Calls between them are asynchronous due to different execution contexts (local execution vs. node execution).
+A detailed explanation of the transaction lifecycle can be found [here](../../../../../aztec/concepts/transactions.md#simple-example-of-the-private-transaction-lifecycle).
+
+## Private state variables in Aztec
+
+State variables in an Aztec contract are defined inside a struct specifically named `Storage`, and must satisfy the [Note Interface (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/aztec/src/note/note_interface.nr) and contain a [Note header (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/aztec/src/note/note_header.nr).
+
+The Note header struct contains the contract address which the value is effectively siloed to, a nonce to ensure unique Note hashes, and a storage "slot" (or ID) to associate multiple notes.
+
+A couple of things to unpack here:
+
+#### Storage "slot"
+
+Storage slots are more literal for public storage, a place where a value is stored. For private storage, a storage slot is logical (more [here](../../../../../aztec/concepts/advanced/storage/storage_slots.md)).
+
+#### Silos
+
+The address of the contract is included in a Note's data to ensure that different contracts don't arrive at the same hash with an identical variable. This is handled in the protocol's execution.
+
+### Note types
+
+There is more than one Note type, such as the `PrivateSet` type is used for private variables. There are also `PrivateMutable` and `PrivateImmutable` types.
+
+Furthermore, notes can be completely custom types, storing any value or set of values that are desired by an application.
+
+### Initialization
+
+Private state variables are stored locally when the contract is created. Depending on the application, values may be privately shared by the creator with others via encrypted logs onchain.
+A hash of a note is stored in the append-only note hash tree on the network so as to prove existence of the current state of the note in a privacy preserving way.
+
+#### Note Hash Tree
+
+By virtue of being append only, notes are not edited. If two transactions amend a private value, multiple notes will be inserted into the tree to the note hash tree and the nullifier tree. The header will contain the same logical storage slot.
+
+### Reading Notes
+
+:::info
+
+Only those with appropriate keys/information will be able to successfully read private values that they have permission to. Notes can be read outside of a transaction or "off-chain" with no changes to data structures on-chain.
+
+:::
+
+When a note is read in a transaction, a subsequent read from another transaction of the same note would reveal a link between the two. So to preserve privacy, notes that are read in a transaction are said to be "consumed" (defined below), and new note(s) are then created with a unique hash.
+
+With type `PrviateSet`, a private variable's value is interpreted as the sum of values of notes with the same logical storage slot.
+
+Consuming, deleting, or otherwise "nullifying" a note is NOT done by deleting the Note hash; this would leak information. Rather a nullifier is created deterministically linked to the value. This nullifier is inserted into another the nullifier storage tree.
+
+When reading a value, the local private execution checks that its notes (of the corresponding storage slot/ID) have not been nullified.
+
+### Updating
+
+:::note
+Only those with appropriate keys/information will be able to successfully nullify a value that they have permission to.
+:::
+
+To update a value, its previous note hash(es) are nullified. The new note value is updated in the user's private execution environment (PXE), and the updated note hash inserted into the note hash tree.
+
+## Supplementary components
+
+Some optional background resources on notes can be found here:
+
+- [High level network architecture](../../../../../aztec/index.md), specifically the Private Execution Environment
+- [Transaction lifecycle (simple diagram)](../../../../../aztec/concepts/transactions.md#simple-example-of-the-private-transaction-lifecycle)
+- [Public and Private state](../../../../../aztec/concepts/storage/state_model.md)
+
+Notes touch several core components of the protocol, but we will focus on a the essentials first.
+
+### Some code context
+
+The way Aztec benefits from the Noir language is via three important components:
+
+- `Aztec.nr` - a Noir framework enabling contracts on Aztec, written in Noir. Includes useful Note implementations
+- `noir contracts` - example Aztec contracts
+- `noir-protocol-circuits` - a crate containing essential circuits for the protocol (public circuits and private wrappers)
+
+A lot of what we will look at will be in [aztec-nr/aztec/src/note (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/aztec/src/note), specifically the lifecycle and note interface.
+
+Looking at the noir circuits in these components, you will see references to the distinction between public/private execution and state.
+
+### Lifecycle functions
+
+Inside the [lifecycle (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr) circuits we see the functions to create and destroy a note, implemented as insertions of note hashes and nullifiers respectively. This is helpful for regular private variables.
+
+We also see a function to create a note hash from the public context, a way of creating a private variable from a public call (run in the sequencer). This could be used in application contracts to give private digital assets to users.
+
+### Note Interface functions
+
+To see a [note_interface (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/aztec/src/note/note_interface.nr) implementation, we will look at a simple [ValueNote GitHub link](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/value-note/src/value_note.nr).
+
+The interface is required to work within an Aztec contract's storage, and a ValueNote is a specific type of note to hold a number (as a `Field`).
+
+#### Computing hashes and nullifiers
+
+A few key functions in the note interface are around computing the note hash and nullifier, with logic to get/use secret keys from the private context.
+
+In the ValueNote implementation you'll notice that it uses the `pedersen_hash` function. This is currently required by the protocol, but may be updated to another hashing function, like poseidon.
+
+As a convenience, the outer [note/utils.nr (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/aztec/src/note/utils.nr) contains implementations of functions that may be needed in Aztec contracts, for example computing note hashes.
+
+#### Serialization and deserialization
+
+Serialization/deserialization of content is used to convert between the Note's variables and a generic array of Field elements. The Field type is understood and used by lower level crypographic libraries.
+This is analogous to the encoding/decoding between variables and bytes in solidity.
+
+For example in ValueNote, the `serialize_content` function simply returns: the value, nullifying public key hash (as a field) and the note randomness; as an array of Field elements.
+
+### Value as a sum of Notes
+
+We recall that multiple notes are associated with a "slot" (or ID), and so the value of a numerical note (like ValueNote) is the sum of each note's value.
+The helper function in [balance_utils (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/#include_/noir-projects/aztec-nr/value-note/src/balance_utils.nr) implements this logic taking a `PrivateSet` of `ValueNotes`.
+
+A couple of things worth clarifying:
+
+- A `PrivateSet` takes a Generic type, specified here as `ValueNote`, but can be any `Note` type (for all notes in the set)
+- A `PrivateSet` of notes also specifies _the_ slot of all Notes that it holds
+
+### Example - Notes in action
+
+The Aztec.nr framework includes examples of high-level states [easy_private_uint (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/v0.86.0/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr) for use in contracts.
+
+The struct (`EasyPrivateUint`) contains a Context, Set of ValueNotes, and storage_slot (used when setting the Set).
+
+Notice how the `add` function shows the simplicity of appending a new note to all existing ones. On the other hand, `sub` (subtraction), needs to first add up all existing values (consuming them in the process), and then insert a single new value of the difference between the sum and parameter.
+
+---
+
+### Apply
+
+Try the [NFT tutorial](../../../../tutorials/codealong/contract_tutorials/nft_contract.md) to see what notes can achieve. In this section you will also find other tutorials using notes in different ways.
+
+### Further reading
+
+- [Proof of prior notes](../how_to_prove_history.md) - public/private reading of public/private proof of state (public or private)
+
+If you're curious about any of the following related topics, search the documentation for...
+
+- Private and public contexts
+- Encryption keys and events
+- Oracle's role in using notes
+- Value Serialization/Deserialization
+
+### References
+
+- ["Stable" state variable (GitHub link)](https://github.com/AztecProtocol/aztec-packages/issues/4130)
+- [Code: Aztec-Patterns (GitHub link)](https://github.com/defi-wonderland/aztec-patterns)
diff --git a/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/storage_slots.md b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/storage_slots.md
new file mode 100644
index 000000000000..3d6c5d239619
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/guides/smart_contracts/writing_contracts/storage/storage_slots.md
@@ -0,0 +1,69 @@
+---
+title: Storage slots
+tags: [contracts, storage]
+---
+
+From the description of storage slots [in the Concepts](../../../../../aztec/concepts/advanced/storage/storage_slots.md) you will get an idea around the logic of storage slots. In this section we will go into more detail and walk through an entire example of how storage slots are computed for private state to improve our storage slot intuition. Recall, that storage slots in the private domain is just a logical construct, and are not "actually" used for lookups, but rather just as a value to constrain against.
+
+For the case of the example, we will look at what is inserted into the note hashes tree when adding a note in the Token contract. Specifically, we are looking at the last part of the `transfer` function:
+
+```rust title="increase_private_balance" showLineNumbers
+storage.balances.at(from).sub(from, amount).emit(encode_and_encrypt_note(
+ &mut context,
+ from,
+ from,
+));
+```
+> Source code: noir-projects/noir-contracts/contracts/app/token_contract/src/main.nr#L374-L380
+
+
+This function is creating a new note and inserting it into the balance set of the recipient `to`. Recall that to ensure privacy, only the note hash is really inserted into the note hashes tree. To share the contents of the note with `to` the contract can emit an encrypted log (which this one does), or it can require an out-of-band data transfer sharing the information. Below, we will walk through the steps of how the note hash is computed and inserted into the tree. For this, we don't care about the encrypted log, so we are going to ignore that part of the function call for now.
+
+Outlining it in more detail below as a sequence diagram, we can see how the calls make their way down the stack.
+In the end a siloed note hash is computed in the kernel.
+
+:::info
+Some of the syntax below is a little butchered to make it easier to follow variables without the full code.
+:::
+
+```mermaid
+sequenceDiagram
+ alt Call
+ Token->>BalanceMap: Map::new(map_slot);
+ Token->>Token: to_bal = storage.balances.at(to)
+ Token->>BalanceMap: BalanceMap.at(to)
+ BalanceMap->>BalanceMap: derived_slot = H(map_slot, to)
+ BalanceMap->>BalanceSet: BalanceSet::new(to, derived_slot)
+ Token->>BalanceSet: to_bal.add(amount)
+ BalanceSet->>BalanceSet: note = UintNote::new(amount, to)
+ BalanceSet->>Set: insert(note)
+ Set->>LifeCycle: create_note(derived_slot, note)
+ LifeCycle->>LifeCycle: note.header = NoteHeader { contract_address,
storage_slot: derived_slot, nonce: 0, note_hash_counter }
+ Utils->>UintNote: note_hiding_point = note.compute_note_hiding_point()
+ UintNote->>Utils: note_hash = note_hiding_point.x
+ LifeCycle->>Context: push_note_hash(note_hash)
+ end
+ Context->>Kernel: unique_note_hash = H(nonce, note_hash)
+ Context->>Kernel: siloed_note_hash = H(contract_address, unique_note_hash)
+```
+
+Notice the `siloed_note_hash` at the very end. It's a hash that will be inserted into the note hashes tree. To clarify what this really is, we "unroll" the values to their simplest components. This gives us a better idea around what is actually inserted into the tree.
+
+```rust
+siloed_note_hash = H(contract_address, unique_note_hash)
+siloed_note_hash = H(contract_address, H(nonce, note_hash))
+siloed_note_hash = H(contract_address, H(H(tx_hash, note_index_in_tx), note_hash))
+siloed_note_hash = H(contract_address, H(H(tx_hash, note_index_in_tx), MSM([G_amt, G_to, G_rand, G_slot], [amount, to, randomness, derived_slot]).x))
+```
+
+MSM is a multi scalar multiplication on a grumpkin curve and G_* values are generators.
+
+And `to` is the actor who receives the note, `amount` of the note and `randomness` is the randomness used to make the note hiding. Without the `randomness` the note could just as well be plaintext (computational cost of a preimage attack would be trivial in such a case).
+
+:::info
+Beware that this hash computation is what the aztec.nr library is doing, and not strictly required by the network (only the kernel computation is).
+:::
+
+With this note structure, the contract can require that only notes sitting at specific storage slots can be used by specific operations, e.g., if transferring funds from `from` to `to`, the notes to destroy should be linked to `H(map_slot, from)` and the new notes (except the change-note) should be linked to `H(map_slot, to)`.
+
+That way, we can have logical storage slots, without them really existing. This means that knowing the storage slot for a note is not enough to actually figure out what is in there (whereas it would be for looking up public state).
diff --git a/docs/versioned_docs/version-v0.86.0/developers/index.md b/docs/versioned_docs/version-v0.86.0/developers/index.md
new file mode 100644
index 000000000000..aa692db11222
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/index.md
@@ -0,0 +1,79 @@
+---
+id: index
+sidebar_position: 0
+title: Build
+---
+
+# Build
+
+## Get Started
+
+
+
+
+ Getting Started
+
+
+ Get started on Aztec by installing the sandbox and playing with it
+
+
+
+
+## Build applications
+
+
+
+
+ Contract Tutorials
+
+
+ Go from zero to hero by following these tutorials in order, starting with a counter contract
+
+
+
+
+
+ Full stack app on Aztec
+
+
+ Learn how everything works together by building an app in JavaScript that connects to a contract
+
+
+
+
+## Clone a repo
+
+
+
+
+
+
+ Full stack app on Aztec
+
+
+ Learn how everything works together by building an app in JavaScript that connects to a contract
+
+
+
+## Get inspired
+
+
+
+
+ What to build on Aztec
+
+
+ Find requests for applications, potential designs, and existing ecosystem projects
+
+
+
diff --git a/docs/versioned_docs/version-v0.86.0/developers/inspiration.md b/docs/versioned_docs/version-v0.86.0/developers/inspiration.md
new file mode 100644
index 000000000000..6f89bd191338
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/inspiration.md
@@ -0,0 +1,98 @@
+---
+id: inspiration
+title: Inspiration and Ideas
+---
+
+This page covers requests for apps on Aztec, designs that some teams are exploring, existing contract examples, and open source ecosystem projects.
+
+## App ideas
+
+### Finance
+
+- Undercollateralized Lending
+- Private order matching
+- Hidden liquidity aggregation
+- Batch Clearing
+- Escrow Systems
+- Private Bill Splitting
+- Fee Payment Contracts (FPCs)
+- Private Auction Systems
+- Private Betting with Commit-Reveal Schemes
+- Stablecoins
+- Stablecoin Swap Portal
+- L1-L2 Lending Portal (supply L1, borrow L2)
+- Mint DAI on L2 via L1 ETH
+- Recurring Payments with Account Abstraction
+- Token Streaming
+
+### Identity & Access Management
+
+- Private Glassdoor
+- Private Yelp
+- Onchain Loyalty System
+- History-based Gating
+- NFT Verification
+- Multisig Implementation
+- Verifiable Random Functions (VRFs)
+- Bridge to connect Aztec with Other L2s
+- L1-L2 Activity Verification, eg prove L1 degeneracy score on L2
+- Storage proof libraries and tooling
+- Private Creator Payment Systems
+
+### Gaming & Governance
+
+- DAO Infrastructure
+- DAO Voting via Portals (threshold-triggered)
+- Private Voting Systems
+- Private Airdrop Systems
+
+### Infrastructure & Tooling
+
+- Privacy-Preserving Oracle Systems
+- Privacy-Preserving RPC Proxies
+
+There are countless other ideas. Join the [developer Discord](https://discord.com/invite/aztec) if you're interested in building any of these or more.
+
+## Design explorations
+
+Many of these are not official resources, may be outdated, or are works in progress.
+
+- [Blog: Can blockchains and zero-knowledge help humanity survive? 47 real-world use cases](https://aztec.network/blog/can-blockchains-and-zero-knowledge-help-humanity-survive-47-real-world-use-cases)
+- [Alpha Build: DEXes](https://docs.google.com/document/d/1J0i2ciIHFN2bJJxLRgEdJnI6hd7FxkedSd78qMC7ziM/edit?usp=sharing) - A Google doc with a deep dive of how various DEXes could work on Aztec
+
+## Contract examples
+
+Explore the [tutorials section](../developers/tutorials/codealong/contract_tutorials/counter_contract.md) for some contract and full-stack project examples.
+
+There is also a list of up-to-date contract examples in the [aztec-packages Github repo](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts).
+
+## Ecosystem projects
+
+- [ShieldSwap](https://app.shieldswap.org/?type=market)
+- [AztecScan](https://aztecscan.xyz/)
+- [Azguard](https://azguardwallet.io/terms)
+
+Explore the [Aztec Network ecosystem page](https://aztec.network/ecosystem) to discover more.
+
+### Proof of concepts
+
+Many of these are outdated.
+
+- [Ikegai](https://github.com/resurgencelabs/ikigai_backend)
+- [Aztec private oracle](https://github.com/defi-wonderland/aztec-private-oracle)
+- [Zybil](https://github.com/mach-34/zybil)
+- [Aztec poker](https://github.com/zobront/aztec-poker/)
+- [Alpha Build winners](https://aztec.network/blog/shaping-the-future-of-payments-meet-the-winners-of-alpha-build-one)
+
+### Noir
+
+This is a list of open source Noir projects, libraries, or primitives that can be integrated into Aztec projects.
+
+- [ZKEmail](https://github.com/zkemail/zkemail.nr/tree/main)
+- [ZKPassport](https://github.com/zkpassport)
+- [StealthNote](https://github.com/saleel/stealthnote)
+- [Anoncast](https://github.com/anondotworld/anonworld)
+
+## Independent projects with open issues
+
+Explore independent projects on [OnlyDust](https://app.onlydust.com/ecosystems/aztec).
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/_category_.yml
new file mode 100644
index 000000000000..57dc01ecdd54
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/_category_.yml
@@ -0,0 +1 @@
+label: "AztecJS"
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/_category_.yml
new file mode 100644
index 000000000000..08af16b98be8
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/_category_.yml
@@ -0,0 +1 @@
+label: "Accounts"
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/_category_.yml
new file mode 100644
index 000000000000..55c7980a4644
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/_category_.yml
@@ -0,0 +1,2 @@
+label: "Classes"
+position: 3
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/defaults.DefaultAccountContract.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/defaults.DefaultAccountContract.md
new file mode 100644
index 000000000000..11d775807e59
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/defaults.DefaultAccountContract.md
@@ -0,0 +1,94 @@
+---
+id: "defaults.DefaultAccountContract"
+title: "Class: DefaultAccountContract"
+sidebar_label: "DefaultAccountContract"
+custom_edit_url: null
+---
+
+[defaults](../modules/defaults.md).DefaultAccountContract
+
+Base class for implementing an account contract. Requires that the account uses the
+default entrypoint method signature.
+
+## Implements
+
+- `AccountContract`
+
+## Constructors
+
+### constructor
+
+• **new DefaultAccountContract**(): [`DefaultAccountContract`](defaults.DefaultAccountContract.md)
+
+#### Returns
+
+[`DefaultAccountContract`](defaults.DefaultAccountContract.md)
+
+## Methods
+
+### getAuthWitnessProvider
+
+▸ **getAuthWitnessProvider**(`address`): `AuthWitnessProvider`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `CompleteAddress` |
+
+#### Returns
+
+`AuthWitnessProvider`
+
+#### Implementation of
+
+AccountContract.getAuthWitnessProvider
+
+___
+
+### getContractArtifact
+
+▸ **getContractArtifact**(): `Promise`\<`ContractArtifact`\>
+
+#### Returns
+
+`Promise`\<`ContractArtifact`\>
+
+#### Implementation of
+
+AccountContract.getContractArtifact
+
+___
+
+### getDeploymentFunctionAndArgs
+
+▸ **getDeploymentFunctionAndArgs**(): `Promise`\<`undefined` \| \{ `constructorArgs`: `any`[] ; `constructorName`: `string` }\>
+
+#### Returns
+
+`Promise`\<`undefined` \| \{ `constructorArgs`: `any`[] ; `constructorName`: `string` }\>
+
+#### Implementation of
+
+AccountContract.getDeploymentFunctionAndArgs
+
+___
+
+### getInterface
+
+▸ **getInterface**(`address`, `nodeInfo`): `AccountInterface`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `CompleteAddress` |
+| `nodeInfo` | `NodeInfo` |
+
+#### Returns
+
+`AccountInterface`
+
+#### Implementation of
+
+AccountContract.getInterface
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/defaults.DefaultAccountInterface.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/defaults.DefaultAccountInterface.md
new file mode 100644
index 000000000000..b55ab89a094d
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/defaults.DefaultAccountInterface.md
@@ -0,0 +1,161 @@
+---
+id: "defaults.DefaultAccountInterface"
+title: "Class: DefaultAccountInterface"
+sidebar_label: "DefaultAccountInterface"
+custom_edit_url: null
+---
+
+[defaults](../modules/defaults.md).DefaultAccountInterface
+
+Default implementation for an account interface. Requires that the account uses the default
+entrypoint signature, which accept an AppPayload and a FeePayload as defined in noir-libs/aztec-noir/src/entrypoint module
+
+## Implements
+
+- `AccountInterface`
+
+## Constructors
+
+### constructor
+
+• **new DefaultAccountInterface**(`authWitnessProvider`, `address`, `nodeInfo`): [`DefaultAccountInterface`](defaults.DefaultAccountInterface.md)
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `authWitnessProvider` | `AuthWitnessProvider` |
+| `address` | `CompleteAddress` |
+| `nodeInfo` | `Pick`\<`NodeInfo`, ``"l1ChainId"`` \| ``"rollupVersion"``\> |
+
+#### Returns
+
+[`DefaultAccountInterface`](defaults.DefaultAccountInterface.md)
+
+## Properties
+
+### address
+
+• `Private` **address**: `CompleteAddress`
+
+___
+
+### authWitnessProvider
+
+• `Private` **authWitnessProvider**: `AuthWitnessProvider`
+
+___
+
+### chainId
+
+• `Private` **chainId**: `Fr`
+
+___
+
+### entrypoint
+
+• `Protected` **entrypoint**: `EntrypointInterface`
+
+___
+
+### version
+
+• `Private` **version**: `Fr`
+
+## Methods
+
+### createAuthWit
+
+▸ **createAuthWit**(`messageHash`): `Promise`\<`AuthWitness`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `messageHash` | `Fr` |
+
+#### Returns
+
+`Promise`\<`AuthWitness`\>
+
+#### Implementation of
+
+AccountInterface.createAuthWit
+
+___
+
+### createTxExecutionRequest
+
+▸ **createTxExecutionRequest**(`exec`, `fee`, `options`): `Promise`\<`TxExecutionRequest`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `exec` | `ExecutionPayload` |
+| `fee` | `FeeOptions` |
+| `options` | `TxExecutionOptions` |
+
+#### Returns
+
+`Promise`\<`TxExecutionRequest`\>
+
+#### Implementation of
+
+AccountInterface.createTxExecutionRequest
+
+___
+
+### getAddress
+
+▸ **getAddress**(): `AztecAddress`
+
+#### Returns
+
+`AztecAddress`
+
+#### Implementation of
+
+AccountInterface.getAddress
+
+___
+
+### getChainId
+
+▸ **getChainId**(): `Fr`
+
+#### Returns
+
+`Fr`
+
+#### Implementation of
+
+AccountInterface.getChainId
+
+___
+
+### getCompleteAddress
+
+▸ **getCompleteAddress**(): `CompleteAddress`
+
+#### Returns
+
+`CompleteAddress`
+
+#### Implementation of
+
+AccountInterface.getCompleteAddress
+
+___
+
+### getVersion
+
+▸ **getVersion**(): `Fr`
+
+#### Returns
+
+`Fr`
+
+#### Implementation of
+
+AccountInterface.getVersion
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaKAccountContract.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaKAccountContract.md
new file mode 100644
index 000000000000..3068a0c66294
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaKAccountContract.md
@@ -0,0 +1,107 @@
+---
+id: "ecdsa.EcdsaKAccountContract"
+title: "Class: EcdsaKAccountContract"
+sidebar_label: "EcdsaKAccountContract"
+custom_edit_url: null
+---
+
+[ecdsa](../modules/ecdsa.md).EcdsaKAccountContract
+
+Account contract that authenticates transactions using ECDSA signatures
+verified against a secp256k1 public key stored in an immutable encrypted note.
+Eagerly loads the contract artifact
+
+## Hierarchy
+
+- `EcdsaKBaseAccountContract`
+
+ ↳ **`EcdsaKAccountContract`**
+
+## Constructors
+
+### constructor
+
+• **new EcdsaKAccountContract**(`signingPrivateKey`): [`EcdsaKAccountContract`](ecdsa.EcdsaKAccountContract.md)
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `signingPrivateKey` | `Buffer` |
+
+#### Returns
+
+[`EcdsaKAccountContract`](ecdsa.EcdsaKAccountContract.md)
+
+#### Overrides
+
+EcdsaKBaseAccountContract.constructor
+
+## Methods
+
+### getAuthWitnessProvider
+
+▸ **getAuthWitnessProvider**(`_address`): `AuthWitnessProvider`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `_address` | `CompleteAddress` |
+
+#### Returns
+
+`AuthWitnessProvider`
+
+#### Inherited from
+
+EcdsaKBaseAccountContract.getAuthWitnessProvider
+
+___
+
+### getContractArtifact
+
+▸ **getContractArtifact**(): `Promise`\<`ContractArtifact`\>
+
+#### Returns
+
+`Promise`\<`ContractArtifact`\>
+
+#### Overrides
+
+EcdsaKBaseAccountContract.getContractArtifact
+
+___
+
+### getDeploymentFunctionAndArgs
+
+▸ **getDeploymentFunctionAndArgs**(): `Promise`\<\{ `constructorArgs`: `Buffer`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Returns
+
+`Promise`\<\{ `constructorArgs`: `Buffer`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Inherited from
+
+EcdsaKBaseAccountContract.getDeploymentFunctionAndArgs
+
+___
+
+### getInterface
+
+▸ **getInterface**(`address`, `nodeInfo`): `AccountInterface`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `CompleteAddress` |
+| `nodeInfo` | `NodeInfo` |
+
+#### Returns
+
+`AccountInterface`
+
+#### Inherited from
+
+EcdsaKBaseAccountContract.getInterface
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaRAccountContract.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaRAccountContract.md
new file mode 100644
index 000000000000..5f0396ddf80d
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaRAccountContract.md
@@ -0,0 +1,107 @@
+---
+id: "ecdsa.EcdsaRAccountContract"
+title: "Class: EcdsaRAccountContract"
+sidebar_label: "EcdsaRAccountContract"
+custom_edit_url: null
+---
+
+[ecdsa](../modules/ecdsa.md).EcdsaRAccountContract
+
+Account contract that authenticates transactions using ECDSA signatures
+verified against a secp256k1 public key stored in an immutable encrypted note.
+Eagerly loads the contract artifact
+
+## Hierarchy
+
+- `EcdsaRBaseAccountContract`
+
+ ↳ **`EcdsaRAccountContract`**
+
+## Constructors
+
+### constructor
+
+• **new EcdsaRAccountContract**(`signingPrivateKey`): [`EcdsaRAccountContract`](ecdsa.EcdsaRAccountContract.md)
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `signingPrivateKey` | `Buffer` |
+
+#### Returns
+
+[`EcdsaRAccountContract`](ecdsa.EcdsaRAccountContract.md)
+
+#### Overrides
+
+EcdsaRBaseAccountContract.constructor
+
+## Methods
+
+### getAuthWitnessProvider
+
+▸ **getAuthWitnessProvider**(`_address`): `AuthWitnessProvider`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `_address` | `CompleteAddress` |
+
+#### Returns
+
+`AuthWitnessProvider`
+
+#### Inherited from
+
+EcdsaRBaseAccountContract.getAuthWitnessProvider
+
+___
+
+### getContractArtifact
+
+▸ **getContractArtifact**(): `Promise`\<`ContractArtifact`\>
+
+#### Returns
+
+`Promise`\<`ContractArtifact`\>
+
+#### Overrides
+
+EcdsaRBaseAccountContract.getContractArtifact
+
+___
+
+### getDeploymentFunctionAndArgs
+
+▸ **getDeploymentFunctionAndArgs**(): `Promise`\<\{ `constructorArgs`: `Buffer`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Returns
+
+`Promise`\<\{ `constructorArgs`: `Buffer`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Inherited from
+
+EcdsaRBaseAccountContract.getDeploymentFunctionAndArgs
+
+___
+
+### getInterface
+
+▸ **getInterface**(`address`, `nodeInfo`): `AccountInterface`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `CompleteAddress` |
+| `nodeInfo` | `NodeInfo` |
+
+#### Returns
+
+`AccountInterface`
+
+#### Inherited from
+
+EcdsaRBaseAccountContract.getInterface
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaRSSHAccountContract.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaRSSHAccountContract.md
new file mode 100644
index 000000000000..7c25ebb65998
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/ecdsa.EcdsaRSSHAccountContract.md
@@ -0,0 +1,110 @@
+---
+id: "ecdsa.EcdsaRSSHAccountContract"
+title: "Class: EcdsaRSSHAccountContract"
+sidebar_label: "EcdsaRSSHAccountContract"
+custom_edit_url: null
+---
+
+[ecdsa](../modules/ecdsa.md).EcdsaRSSHAccountContract
+
+Account contract that authenticates transactions using ECDSA signatures
+verified against a secp256r1 public key stored in an immutable encrypted note.
+Since this implementation relays signatures to an SSH agent, we provide the
+public key here not for signature verification, but to identify actual identity
+that will be used to sign authwitnesses.
+Eagerly loads the contract artifact
+
+## Hierarchy
+
+- `EcdsaRSSHBaseAccountContract`
+
+ ↳ **`EcdsaRSSHAccountContract`**
+
+## Constructors
+
+### constructor
+
+• **new EcdsaRSSHAccountContract**(`signingPrivateKey`): [`EcdsaRSSHAccountContract`](ecdsa.EcdsaRSSHAccountContract.md)
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `signingPrivateKey` | `Buffer` |
+
+#### Returns
+
+[`EcdsaRSSHAccountContract`](ecdsa.EcdsaRSSHAccountContract.md)
+
+#### Overrides
+
+EcdsaRSSHBaseAccountContract.constructor
+
+## Methods
+
+### getAuthWitnessProvider
+
+▸ **getAuthWitnessProvider**(`_address`): `AuthWitnessProvider`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `_address` | `CompleteAddress` |
+
+#### Returns
+
+`AuthWitnessProvider`
+
+#### Inherited from
+
+EcdsaRSSHBaseAccountContract.getAuthWitnessProvider
+
+___
+
+### getContractArtifact
+
+▸ **getContractArtifact**(): `Promise`\<`ContractArtifact`\>
+
+#### Returns
+
+`Promise`\<`ContractArtifact`\>
+
+#### Overrides
+
+EcdsaRSSHBaseAccountContract.getContractArtifact
+
+___
+
+### getDeploymentFunctionAndArgs
+
+▸ **getDeploymentFunctionAndArgs**(): `Promise`\<\{ `constructorArgs`: `Buffer`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Returns
+
+`Promise`\<\{ `constructorArgs`: `Buffer`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Inherited from
+
+EcdsaRSSHBaseAccountContract.getDeploymentFunctionAndArgs
+
+___
+
+### getInterface
+
+▸ **getInterface**(`address`, `nodeInfo`): `AccountInterface`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `CompleteAddress` |
+| `nodeInfo` | `NodeInfo` |
+
+#### Returns
+
+`AccountInterface`
+
+#### Inherited from
+
+EcdsaRSSHBaseAccountContract.getInterface
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/schnorr.SchnorrAccountContract.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/schnorr.SchnorrAccountContract.md
new file mode 100644
index 000000000000..ba045b038046
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/schnorr.SchnorrAccountContract.md
@@ -0,0 +1,107 @@
+---
+id: "schnorr.SchnorrAccountContract"
+title: "Class: SchnorrAccountContract"
+sidebar_label: "SchnorrAccountContract"
+custom_edit_url: null
+---
+
+[schnorr](../modules/schnorr.md).SchnorrAccountContract
+
+Account contract that authenticates transactions using Schnorr signatures
+verified against a Grumpkin public key stored in an immutable encrypted note.
+Eagerly loads the contract artifact
+
+## Hierarchy
+
+- `SchnorrBaseAccountContract`
+
+ ↳ **`SchnorrAccountContract`**
+
+## Constructors
+
+### constructor
+
+• **new SchnorrAccountContract**(`signingPrivateKey`): [`SchnorrAccountContract`](schnorr.SchnorrAccountContract.md)
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `signingPrivateKey` | `Fq` |
+
+#### Returns
+
+[`SchnorrAccountContract`](schnorr.SchnorrAccountContract.md)
+
+#### Overrides
+
+SchnorrBaseAccountContract.constructor
+
+## Methods
+
+### getAuthWitnessProvider
+
+▸ **getAuthWitnessProvider**(`_address`): `AuthWitnessProvider`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `_address` | `CompleteAddress` |
+
+#### Returns
+
+`AuthWitnessProvider`
+
+#### Inherited from
+
+SchnorrBaseAccountContract.getAuthWitnessProvider
+
+___
+
+### getContractArtifact
+
+▸ **getContractArtifact**(): `Promise`\<`ContractArtifact`\>
+
+#### Returns
+
+`Promise`\<`ContractArtifact`\>
+
+#### Overrides
+
+SchnorrBaseAccountContract.getContractArtifact
+
+___
+
+### getDeploymentFunctionAndArgs
+
+▸ **getDeploymentFunctionAndArgs**(): `Promise`\<\{ `constructorArgs`: `Fr`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Returns
+
+`Promise`\<\{ `constructorArgs`: `Fr`[] ; `constructorName`: `string` = 'constructor' }\>
+
+#### Inherited from
+
+SchnorrBaseAccountContract.getDeploymentFunctionAndArgs
+
+___
+
+### getInterface
+
+▸ **getInterface**(`address`, `nodeInfo`): `AccountInterface`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `CompleteAddress` |
+| `nodeInfo` | `NodeInfo` |
+
+#### Returns
+
+`AccountInterface`
+
+#### Inherited from
+
+SchnorrBaseAccountContract.getInterface
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/single_key.SingleKeyAccountContract.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/single_key.SingleKeyAccountContract.md
new file mode 100644
index 000000000000..d9b230516512
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/classes/single_key.SingleKeyAccountContract.md
@@ -0,0 +1,107 @@
+---
+id: "single_key.SingleKeyAccountContract"
+title: "Class: SingleKeyAccountContract"
+sidebar_label: "SingleKeyAccountContract"
+custom_edit_url: null
+---
+
+[single\_key](../modules/single_key.md).SingleKeyAccountContract
+
+Account contract that authenticates transactions using Schnorr signatures verified against
+the note encryption key, relying on a single private key for both encryption and authentication.
+Eagerly loads the contract artifact
+
+## Hierarchy
+
+- `SingleKeyBaseAccountContract`
+
+ ↳ **`SingleKeyAccountContract`**
+
+## Constructors
+
+### constructor
+
+• **new SingleKeyAccountContract**(`signingPrivateKey`): [`SingleKeyAccountContract`](single_key.SingleKeyAccountContract.md)
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `signingPrivateKey` | `Fq` |
+
+#### Returns
+
+[`SingleKeyAccountContract`](single_key.SingleKeyAccountContract.md)
+
+#### Overrides
+
+SingleKeyBaseAccountContract.constructor
+
+## Methods
+
+### getAuthWitnessProvider
+
+▸ **getAuthWitnessProvider**(`account`): `AuthWitnessProvider`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `account` | `CompleteAddress` |
+
+#### Returns
+
+`AuthWitnessProvider`
+
+#### Inherited from
+
+SingleKeyBaseAccountContract.getAuthWitnessProvider
+
+___
+
+### getContractArtifact
+
+▸ **getContractArtifact**(): `Promise`\<`ContractArtifact`\>
+
+#### Returns
+
+`Promise`\<`ContractArtifact`\>
+
+#### Overrides
+
+SingleKeyBaseAccountContract.getContractArtifact
+
+___
+
+### getDeploymentFunctionAndArgs
+
+▸ **getDeploymentFunctionAndArgs**(): `Promise`\<`undefined`\>
+
+#### Returns
+
+`Promise`\<`undefined`\>
+
+#### Inherited from
+
+SingleKeyBaseAccountContract.getDeploymentFunctionAndArgs
+
+___
+
+### getInterface
+
+▸ **getInterface**(`address`, `nodeInfo`): `AccountInterface`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `CompleteAddress` |
+| `nodeInfo` | `NodeInfo` |
+
+#### Returns
+
+`AccountInterface`
+
+#### Inherited from
+
+SingleKeyBaseAccountContract.getInterface
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/index.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/index.md
new file mode 100644
index 000000000000..0c19cb267f7e
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/index.md
@@ -0,0 +1,16 @@
+---
+id: "index"
+title: "@aztec/accounts"
+sidebar_label: "Table of Contents"
+sidebar_position: 0.5
+hide_table_of_contents: true
+custom_edit_url: null
+---
+
+## Modules
+
+- [defaults](modules/defaults.md)
+- [ecdsa](modules/ecdsa.md)
+- [schnorr](modules/schnorr.md)
+- [single\_key](modules/single_key.md)
+- [testing](modules/testing.md)
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/interfaces/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/interfaces/_category_.yml
new file mode 100644
index 000000000000..43bec88cfa0a
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/interfaces/_category_.yml
@@ -0,0 +1,2 @@
+label: "Interfaces"
+position: 4
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/interfaces/testing.InitialAccountData.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/interfaces/testing.InitialAccountData.md
new file mode 100644
index 000000000000..7b2757593317
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/interfaces/testing.InitialAccountData.md
@@ -0,0 +1,42 @@
+---
+id: "testing.InitialAccountData"
+title: "Interface: InitialAccountData"
+sidebar_label: "InitialAccountData"
+custom_edit_url: null
+---
+
+[testing](../modules/testing.md).InitialAccountData
+
+Data for generating an initial account.
+
+## Properties
+
+### address
+
+• **address**: `AztecAddress`
+
+Address of the schnorr account contract.
+
+___
+
+### salt
+
+• **salt**: `Fr`
+
+Contract address salt.
+
+___
+
+### secret
+
+• **secret**: `Fr`
+
+Secret to derive the keys for the account.
+
+___
+
+### signingKey
+
+• **signingKey**: `Fq`
+
+Signing key od the account.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/_category_.yml
new file mode 100644
index 000000000000..63f9c4e40160
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/_category_.yml
@@ -0,0 +1,2 @@
+label: "Modules"
+position: 1
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/defaults.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/defaults.md
new file mode 100644
index 000000000000..9252b70f72ae
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/defaults.md
@@ -0,0 +1,16 @@
+---
+id: "defaults"
+title: "Module: defaults"
+sidebar_label: "defaults"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+The `@aztec/accounts/defaults` export provides the base class [DefaultAccountContract](../classes/defaults.DefaultAccountContract.md) for implementing account contracts that use the default entrypoint payload module.
+
+Read more in [Writing an account contract](https://docs.aztec.network/developers/tutorials/codealong/contract_tutorials/write_accounts_contract).
+
+## Classes
+
+- [DefaultAccountContract](../classes/defaults.DefaultAccountContract.md)
+- [DefaultAccountInterface](../classes/defaults.DefaultAccountInterface.md)
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/ecdsa.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/ecdsa.md
new file mode 100644
index 000000000000..f73fe5ca2770
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/ecdsa.md
@@ -0,0 +1,160 @@
+---
+id: "ecdsa"
+title: "Module: ecdsa"
+sidebar_label: "ecdsa"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Classes
+
+- [EcdsaKAccountContract](../classes/ecdsa.EcdsaKAccountContract.md)
+- [EcdsaRAccountContract](../classes/ecdsa.EcdsaRAccountContract.md)
+- [EcdsaRSSHAccountContract](../classes/ecdsa.EcdsaRSSHAccountContract.md)
+
+## Variables
+
+### EcdsaKAccountContractArtifact
+
+• `Const` **EcdsaKAccountContractArtifact**: `ContractArtifact`
+
+___
+
+### EcdsaRAccountContractArtifact
+
+• `Const` **EcdsaRAccountContractArtifact**: `ContractArtifact`
+
+## Functions
+
+### getEcdsaKAccount
+
+▸ **getEcdsaKAccount**(`pxe`, `secretKey`, `signingPrivateKey`, `salt?`): `Promise`\<`AccountManager`\>
+
+Creates an Account that relies on an ECDSA signing key for authentication.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `secretKey` | `Fr` | Secret key used to derive all the keystore keys. |
+| `signingPrivateKey` | `Buffer` | Secp256k1 key used for signing transactions. |
+| `salt?` | `Salt` | Deployment salt. |
+
+#### Returns
+
+`Promise`\<`AccountManager`\>
+
+An account manager initialized with the account contract and its deployment params
+
+___
+
+### getEcdsaKWallet
+
+▸ **getEcdsaKWallet**(`pxe`, `address`, `signingPrivateKey`): `Promise`\<`AccountWallet`\>
+
+Gets a wallet for an already registered account using ECDSA signatures.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `address` | `AztecAddress` | Address for the account. |
+| `signingPrivateKey` | `Buffer` | ECDSA key used for signing transactions. |
+
+#### Returns
+
+`Promise`\<`AccountWallet`\>
+
+A wallet for this account that can be used to interact with a contract instance.
+
+___
+
+### getEcdsaRAccount
+
+▸ **getEcdsaRAccount**(`pxe`, `secretKey`, `signingPrivateKey`, `salt?`): `Promise`\<`AccountManager`\>
+
+Creates an Account that relies on an ECDSA signing key for authentication.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `secretKey` | `Fr` | Secret key used to derive all the keystore keys. |
+| `signingPrivateKey` | `Buffer` | Secp256k1 key used for signing transactions. |
+| `salt?` | `Salt` | Deployment salt. |
+
+#### Returns
+
+`Promise`\<`AccountManager`\>
+
+An account manager initialized with the account contract and its deployment params
+
+___
+
+### getEcdsaRSSHAccount
+
+▸ **getEcdsaRSSHAccount**(`pxe`, `secretKey`, `signingPublicKey`, `salt?`): `Promise`\<`AccountManager`\>
+
+Creates an Account that relies on an ECDSA signing key for authentication.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `secretKey` | `Fr` | Secret key used to derive all the keystore keys. |
+| `signingPublicKey` | `Buffer` | Secp2561 key used to identify its corresponding private key in the SSH Agent. |
+| `salt?` | `Salt` | Deployment salt. |
+
+#### Returns
+
+`Promise`\<`AccountManager`\>
+
+An account manager initialized with the account contract and its deployment params
+
+___
+
+### getEcdsaRSSHWallet
+
+▸ **getEcdsaRSSHWallet**(`pxe`, `address`, `signingPublicKey`): `Promise`\<`AccountWallet`\>
+
+Gets a wallet for an already registered account using ECDSA signatures.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `address` | `AztecAddress` | Address for the account. |
+| `signingPublicKey` | `Buffer` | - |
+
+#### Returns
+
+`Promise`\<`AccountWallet`\>
+
+A wallet for this account that can be used to interact with a contract instance.
+
+___
+
+### getEcdsaRWallet
+
+▸ **getEcdsaRWallet**(`pxe`, `address`, `signingPrivateKey`): `Promise`\<`AccountWallet`\>
+
+Gets a wallet for an already registered account using ECDSA signatures.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `address` | `AztecAddress` | Address for the account. |
+| `signingPrivateKey` | `Buffer` | ECDSA key used for signing transactions. |
+
+#### Returns
+
+`Promise`\<`AccountWallet`\>
+
+A wallet for this account that can be used to interact with a contract instance.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/schnorr.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/schnorr.md
new file mode 100644
index 000000000000..cbd6dcd7734e
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/schnorr.md
@@ -0,0 +1,108 @@
+---
+id: "schnorr"
+title: "Module: schnorr"
+sidebar_label: "schnorr"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+The `@aztec/accounts/schnorr` export provides an account contract implementation that uses Schnorr signatures with a Grumpkin key for authentication, and a separate Grumpkin key for encryption.
+This is the suggested account contract type for most use cases within Aztec.
+
+## Classes
+
+- [SchnorrAccountContract](../classes/schnorr.SchnorrAccountContract.md)
+
+## Variables
+
+### SchnorrAccountContractArtifact
+
+• `Const` **SchnorrAccountContractArtifact**: `ContractArtifact`
+
+## Functions
+
+### getSchnorrAccount
+
+▸ **getSchnorrAccount**(`pxe`, `secretKey`, `signingPrivateKey`, `salt?`): `Promise`\<`AccountManager`\>
+
+Creates an Account Manager that relies on a Grumpkin signing key for authentication.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `secretKey` | `Fr` | Secret key used to derive all the keystore keys. |
+| `signingPrivateKey` | `Fq` | Grumpkin key used for signing transactions. |
+| `salt?` | `Salt` | Deployment salt. |
+
+#### Returns
+
+`Promise`\<`AccountManager`\>
+
+An account manager initialized with the account contract and its deployment params
+
+___
+
+### getSchnorrAccountContractAddress
+
+▸ **getSchnorrAccountContractAddress**(`secret`, `salt`, `signingPrivateKey?`): `Promise`\<`AztecAddress`\>
+
+Compute the address of a schnorr account contract.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `secret` | `Fr` | A seed for deriving the signing key and public keys. |
+| `salt` | `Fr` | The contract address salt. |
+| `signingPrivateKey?` | `Fq` | A specific signing private key that's not derived from the secret. |
+
+#### Returns
+
+`Promise`\<`AztecAddress`\>
+
+___
+
+### getSchnorrWallet
+
+▸ **getSchnorrWallet**(`pxe`, `address`, `signingPrivateKey`): `Promise`\<`AccountWallet`\>
+
+Gets a wallet for an already registered account using Schnorr signatures.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `address` | `AztecAddress` | Address for the account. |
+| `signingPrivateKey` | `Fq` | Grumpkin key used for signing transactions. |
+
+#### Returns
+
+`Promise`\<`AccountWallet`\>
+
+A wallet for this account that can be used to interact with a contract instance.
+
+___
+
+### getSchnorrWalletWithSecretKey
+
+▸ **getSchnorrWalletWithSecretKey**(`pxe`, `secretKey`, `signingPrivateKey`, `salt`): `Promise`\<`AccountWalletWithSecretKey`\>
+
+Gets a wallet for an already registered account using Schnorr signatures.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `secretKey` | `Fr` | Secret key used to derive all the keystore keys. |
+| `signingPrivateKey` | `Fq` | Grumpkin key used for signing transactions. |
+| `salt` | `Salt` | Deployment salt. |
+
+#### Returns
+
+`Promise`\<`AccountWalletWithSecretKey`\>
+
+A wallet for this account that can be used to interact with a contract instance.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/single_key.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/single_key.md
new file mode 100644
index 000000000000..e376e50fbb03
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/single_key.md
@@ -0,0 +1,64 @@
+---
+id: "single_key"
+title: "Module: single_key"
+sidebar_label: "single_key"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+The `@aztec/accounts/single_key` export provides a testing account contract implementation that uses a single Grumpkin key for both authentication and encryption.
+It is not recommended to use this account type in production.
+
+## Classes
+
+- [SingleKeyAccountContract](../classes/single_key.SingleKeyAccountContract.md)
+
+## Variables
+
+### SchnorrSingleKeyAccountContractArtifact
+
+• `Const` **SchnorrSingleKeyAccountContractArtifact**: `ContractArtifact`
+
+## Functions
+
+### getUnsafeSchnorrAccount
+
+▸ **getUnsafeSchnorrAccount**(`pxe`, `secretKey`, `salt?`): `Promise`\<`AccountManager`\>
+
+Creates an Account that uses the same Grumpkin key for encryption and authentication.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `secretKey` | `Fr` | Secret key used to derive all the keystore keys (in this case also used to get signing key). |
+| `salt?` | `Salt` | Deployment salt. |
+
+#### Returns
+
+`Promise`\<`AccountManager`\>
+
+An account manager initialized with the account contract and its deployment params
+
+___
+
+### getUnsafeSchnorrWallet
+
+▸ **getUnsafeSchnorrWallet**(`pxe`, `address`, `signingPrivateKey`): `Promise`\<`AccountWallet`\>
+
+Gets a wallet for an already registered account using Schnorr signatures with a single key for encryption and authentication.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | An PXE server instance. |
+| `address` | `AztecAddress` | Address for the account. |
+| `signingPrivateKey` | `Fq` | Grumpkin key used for note encryption and signing transactions. |
+
+#### Returns
+
+`Promise`\<`AccountWallet`\>
+
+A wallet for this account that can be used to interact with a contract instance.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/testing.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/testing.md
new file mode 100644
index 000000000000..604fc19f388f
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/accounts/modules/testing.md
@@ -0,0 +1,193 @@
+---
+id: "testing"
+title: "Module: testing"
+sidebar_label: "testing"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+The `@aztec/accounts/testing` export provides utility methods for testing, in particular in a Sandbox environment.
+
+Use [getInitialTestAccountsWallets](testing.md#getinitialtestaccountswallets) to obtain a list of wallets for the Sandbox pre-seeded accounts.
+
+## Interfaces
+
+- [InitialAccountData](../interfaces/testing.InitialAccountData.md)
+
+## Variables
+
+### INITIAL\_TEST\_ACCOUNT\_SALTS
+
+• `Const` **INITIAL\_TEST\_ACCOUNT\_SALTS**: `Fr`[]
+
+___
+
+### INITIAL\_TEST\_ENCRYPTION\_KEYS
+
+• `Const` **INITIAL\_TEST\_ENCRYPTION\_KEYS**: `Fq`[]
+
+___
+
+### INITIAL\_TEST\_SECRET\_KEYS
+
+• `Const` **INITIAL\_TEST\_SECRET\_KEYS**: `Fr`[]
+
+___
+
+### INITIAL\_TEST\_SIGNING\_KEYS
+
+• `Const` **INITIAL\_TEST\_SIGNING\_KEYS**: `Fq`[] = `INITIAL_TEST_ENCRYPTION_KEYS`
+
+## Functions
+
+### deployFundedSchnorrAccount
+
+▸ **deployFundedSchnorrAccount**(`pxe`, `account`, `opts?`, `waitForProvenOptions?`): `Promise`\<`AccountManager`\>
+
+Deploy schnorr account contract.
+It will pay for the fee for the deployment itself. So it must be funded with the prefilled public data.
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `pxe` | `PXE` |
+| `account` | `DeployAccountData` |
+| `opts` | `WaitOpts` & \{ `skipClassRegistration?`: `boolean` } |
+| `waitForProvenOptions?` | `WaitForProvenOpts` |
+
+#### Returns
+
+`Promise`\<`AccountManager`\>
+
+___
+
+### deployFundedSchnorrAccounts
+
+▸ **deployFundedSchnorrAccounts**(`pxe`, `accounts`, `opts?`, `waitForProvenOptions?`): `Promise`\<`AccountManager`[]\>
+
+Deploy schnorr account contracts.
+They will pay for the fees for the deployment themselves. So they must be funded with the prefilled public data.
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `pxe` | `PXE` |
+| `accounts` | `DeployAccountData`[] |
+| `opts` | `WaitOpts` & \{ `skipClassRegistration?`: `boolean` } |
+| `waitForProvenOptions?` | `WaitForProvenOpts` |
+
+#### Returns
+
+`Promise`\<`AccountManager`[]\>
+
+___
+
+### generateSchnorrAccounts
+
+▸ **generateSchnorrAccounts**(`numberOfAccounts`): `Promise`\<\{ `address`: `AztecAddress` ; `salt`: `Fr` ; `secret`: `Fr` ; `signingKey`: `Fq` }[]\>
+
+Generate a fixed amount of random schnorr account contract instance.
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `numberOfAccounts` | `number` |
+
+#### Returns
+
+`Promise`\<\{ `address`: `AztecAddress` ; `salt`: `Fr` ; `secret`: `Fr` ; `signingKey`: `Fq` }[]\>
+
+___
+
+### getDeployedTestAccounts
+
+▸ **getDeployedTestAccounts**(`pxe`): `Promise`\<[`InitialAccountData`](../interfaces/testing.InitialAccountData.md)[]\>
+
+Queries a PXE for it's registered accounts.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | PXE instance. |
+
+#### Returns
+
+`Promise`\<[`InitialAccountData`](../interfaces/testing.InitialAccountData.md)[]\>
+
+A set of key data for each of the initial accounts.
+
+___
+
+### getDeployedTestAccountsWallets
+
+▸ **getDeployedTestAccountsWallets**(`pxe`): `Promise`\<`AccountWalletWithSecretKey`[]\>
+
+Queries a PXE for it's registered accounts and returns wallets for those accounts using keys in the initial test accounts.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | PXE instance. |
+
+#### Returns
+
+`Promise`\<`AccountWalletWithSecretKey`[]\>
+
+A set of AccountWallet implementations for each of the initial accounts.
+
+___
+
+### getInitialTestAccounts
+
+▸ **getInitialTestAccounts**(): `Promise`\<[`InitialAccountData`](../interfaces/testing.InitialAccountData.md)[]\>
+
+Gets the basic information for initial test accounts.
+
+#### Returns
+
+`Promise`\<[`InitialAccountData`](../interfaces/testing.InitialAccountData.md)[]\>
+
+___
+
+### getInitialTestAccountsManagers
+
+▸ **getInitialTestAccountsManagers**(`pxe`): `Promise`\<`AccountManager`[]\>
+
+Gets a collection of account managers for the Aztec accounts that are initially stored in the test environment.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | PXE instance. |
+
+#### Returns
+
+`Promise`\<`AccountManager`[]\>
+
+A set of AccountManager implementations for each of the initial accounts.
+
+___
+
+### getInitialTestAccountsWallets
+
+▸ **getInitialTestAccountsWallets**(`pxe`): `Promise`\<`AccountWalletWithSecretKey`[]\>
+
+Gets a collection of wallets for the Aztec accounts that are initially stored in the test environment.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `pxe` | `PXE` | PXE instance. |
+
+#### Returns
+
+`Promise`\<`AccountWalletWithSecretKey`[]\>
+
+A set of AccountWallet implementations for each of the initial accounts.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/_category_.yml
new file mode 100644
index 000000000000..f5c77d17cdcf
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/_category_.yml
@@ -0,0 +1 @@
+label: "Aztec.js"
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/index.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/index.md
new file mode 100644
index 000000000000..2961da2dd54c
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/index.md
@@ -0,0 +1,46 @@
+---
+id: "index"
+title: "@aztec/aztec.js"
+sidebar_label: "Table of Contents"
+sidebar_position: 0.5
+hide_table_of_contents: true
+custom_edit_url: null
+---
+
+The `account` module provides utilities for managing accounts. The AccountManager class
+allows to deploy and register a fresh account, or to obtain a `Wallet` instance out of an account
+already deployed. Use the `@aztec/accounts` package to load default account implementations that rely
+on ECDSA or Schnorr signatures.
+
+## Interfaces
+
+- [AccountContract](interfaces/AccountContract.md)
+- [AccountInterface](interfaces/AccountInterface.md)
+
+## Type Aliases
+
+### Salt
+
+Ƭ **Salt**: `Fr` \| `number` \| `bigint`
+
+A contract deployment salt.
+
+## Functions
+
+### getAccountContractAddress
+
+▸ **getAccountContractAddress**(`accountContract`, `secret`, `salt`): `Promise`\<`AztecAddress`\>
+
+Compute the address of an account contract from secret and salt.
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `accountContract` | [`AccountContract`](interfaces/AccountContract.md) |
+| `secret` | `Fr` |
+| `salt` | `Fr` |
+
+#### Returns
+
+`Promise`\<`AztecAddress`\>
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/AccountContract.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/AccountContract.md
new file mode 100644
index 000000000000..8e86c77e9efa
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/AccountContract.md
@@ -0,0 +1,75 @@
+---
+id: "AccountContract"
+title: "Interface: AccountContract"
+sidebar_label: "AccountContract"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+An account contract instance. Knows its artifact, deployment arguments, how to create
+transaction execution requests out of function calls, and how to authorize actions.
+
+## Methods
+
+### getAuthWitnessProvider
+
+▸ **getAuthWitnessProvider**(`address`): `AuthWitnessProvider`
+
+Returns the auth witness provider for the given address.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `address` | `CompleteAddress` | Address for which to create auth witnesses. |
+
+#### Returns
+
+`AuthWitnessProvider`
+
+___
+
+### getContractArtifact
+
+▸ **getContractArtifact**(): `Promise`\<`ContractArtifact`\>
+
+Returns the artifact of this account contract.
+
+#### Returns
+
+`Promise`\<`ContractArtifact`\>
+
+___
+
+### getDeploymentFunctionAndArgs
+
+▸ **getDeploymentFunctionAndArgs**(): `Promise`\<`undefined` \| \{ `constructorArgs`: `any`[] ; `constructorName`: `string` }\>
+
+Returns the deployment function name and arguments for this instance, or undefined if this contract does not require deployment.
+
+#### Returns
+
+`Promise`\<`undefined` \| \{ `constructorArgs`: `any`[] ; `constructorName`: `string` }\>
+
+___
+
+### getInterface
+
+▸ **getInterface**(`address`, `nodeInfo`): [`AccountInterface`](AccountInterface.md)
+
+Returns the account interface for this account contract given a deployment at the provided address.
+The account interface is responsible for assembling tx requests given requested function calls, and
+for creating signed auth witnesses given action identifiers (message hashes).
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `address` | `CompleteAddress` | Address where this account contract is deployed. |
+| `nodeInfo` | `NodeInfo` | Info on the chain where it is deployed. |
+
+#### Returns
+
+[`AccountInterface`](AccountInterface.md)
+
+An account interface instance for creating tx requests and authorizing actions.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/AccountInterface.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/AccountInterface.md
new file mode 100644
index 000000000000..c2197f036a0f
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/AccountInterface.md
@@ -0,0 +1,116 @@
+---
+id: "AccountInterface"
+title: "Interface: AccountInterface"
+sidebar_label: "AccountInterface"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Handler for interfacing with an account. Knows how to create transaction execution
+requests and authorize actions for its corresponding account.
+
+## Hierarchy
+
+- `EntrypointInterface`
+
+- `AuthWitnessProvider`
+
+ ↳ **`AccountInterface`**
+
+## Methods
+
+### createAuthWit
+
+▸ **createAuthWit**(`messageHash`): `Promise`\<`AuthWitness`\>
+
+Computes an authentication witness from either a message hash
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `messageHash` | `Fr` \| `Buffer` | The message hash to approve |
+
+#### Returns
+
+`Promise`\<`AuthWitness`\>
+
+The authentication witness
+
+#### Inherited from
+
+AuthWitnessProvider.createAuthWit
+
+___
+
+### createTxExecutionRequest
+
+▸ **createTxExecutionRequest**(`exec`, `fee`, `options`): `Promise`\<`TxExecutionRequest`\>
+
+Generates an execution request out of set of function calls.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `exec` | `ExecutionPayload` | The execution intents to be run. |
+| `fee` | `FeeOptions` | The fee options for the transaction. |
+| `options` | `TxExecutionOptions` | Nonce and whether the transaction is cancellable. |
+
+#### Returns
+
+`Promise`\<`TxExecutionRequest`\>
+
+The authenticated transaction execution request.
+
+#### Inherited from
+
+EntrypointInterface.createTxExecutionRequest
+
+___
+
+### getAddress
+
+▸ **getAddress**(): `AztecAddress`
+
+Returns the address for this account.
+
+#### Returns
+
+`AztecAddress`
+
+___
+
+### getChainId
+
+▸ **getChainId**(): `Fr`
+
+Returns the chain id for this account
+
+#### Returns
+
+`Fr`
+
+___
+
+### getCompleteAddress
+
+▸ **getCompleteAddress**(): `CompleteAddress`
+
+Returns the complete address for this account.
+
+#### Returns
+
+`CompleteAddress`
+
+___
+
+### getVersion
+
+▸ **getVersion**(): `Fr`
+
+Returns the rollup version for this account
+
+#### Returns
+
+`Fr`
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/_category_.yml
new file mode 100644
index 000000000000..43bec88cfa0a
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/aztec-js/interfaces/_category_.yml
@@ -0,0 +1,2 @@
+label: "Interfaces"
+position: 4
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/_category_.yml
new file mode 100644
index 000000000000..3095e3e72ff8
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/_category_.yml
@@ -0,0 +1 @@
+label: "Private Execution Environment (PXE)"
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/enums/EventType.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/enums/EventType.md
new file mode 100644
index 000000000000..338e46d1034e
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/enums/EventType.md
@@ -0,0 +1,21 @@
+---
+id: "EventType"
+title: "Enumeration: EventType"
+sidebar_label: "EventType"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+This is used in getting events via the filter
+
+## Enumeration Members
+
+### Encrypted
+
+• **Encrypted** = ``"Encrypted"``
+
+___
+
+### Unencrypted
+
+• **Unencrypted** = ``"Unencrypted"``
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/enums/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/enums/_category_.yml
new file mode 100644
index 000000000000..1687a9e03fd7
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/enums/_category_.yml
@@ -0,0 +1,2 @@
+label: "Enumerations"
+position: 2
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/index.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/index.md
new file mode 100644
index 000000000000..390faf79398f
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/index.md
@@ -0,0 +1,38 @@
+---
+id: "index"
+title: "@aztec/stdlib"
+sidebar_label: "Exports"
+sidebar_position: 0.5
+custom_edit_url: null
+---
+
+## Enumerations
+
+- [EventType](enums/EventType.md)
+
+## Interfaces
+
+- [ContractClassMetadata](interfaces/ContractClassMetadata.md)
+- [ContractMetadata](interfaces/ContractMetadata.md)
+- [PXE](interfaces/PXE.md)
+- [PXEInfo](interfaces/PXEInfo.md)
+
+## Type Aliases
+
+### EventMetadataDefinition
+
+Ƭ **EventMetadataDefinition**: `Object`
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `abiType` | `AbiType` |
+| `eventSelector` | `EventSelector` |
+| `fieldNames` | `string`[] |
+
+## Variables
+
+### PXESchema
+
+• `Const` **PXESchema**: `ApiSchemaFor`\<[`PXE`](interfaces/PXE.md)\>
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/ContractClassMetadata.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/ContractClassMetadata.md
new file mode 100644
index 000000000000..4a152c2a34a9
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/ContractClassMetadata.md
@@ -0,0 +1,25 @@
+---
+id: "ContractClassMetadata"
+title: "Interface: ContractClassMetadata"
+sidebar_label: "ContractClassMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### artifact
+
+• `Optional` **artifact**: `ContractArtifact`
+
+___
+
+### contractClass
+
+• `Optional` **contractClass**: `ContractClassWithId`
+
+___
+
+### isContractClassPubliclyRegistered
+
+• **isContractClassPubliclyRegistered**: `boolean`
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/ContractMetadata.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/ContractMetadata.md
new file mode 100644
index 000000000000..7bd09ee675a8
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/ContractMetadata.md
@@ -0,0 +1,25 @@
+---
+id: "ContractMetadata"
+title: "Interface: ContractMetadata"
+sidebar_label: "ContractMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### contractInstance
+
+• `Optional` **contractInstance**: `ContractInstanceWithAddress`
+
+___
+
+### isContractInitialized
+
+• **isContractInitialized**: `boolean`
+
+___
+
+### isContractPubliclyDeployed
+
+• **isContractPubliclyDeployed**: `boolean`
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/PXE.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/PXE.md
new file mode 100644
index 000000000000..477ff63c5175
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/PXE.md
@@ -0,0 +1,722 @@
+---
+id: "PXE"
+title: "Interface: PXE"
+sidebar_label: "PXE"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Private eXecution Environment (PXE) runs locally for each user, providing functionality for all the operations
+needed to interact with the Aztec network, including account management, private data management,
+transaction local simulation, and access to an Aztec node. This interface, as part of a Wallet,
+is exposed to dapps for interacting with the network on behalf of the user.
+
+## Methods
+
+### getBlock
+
+▸ **getBlock**(`number`): `Promise`\<`undefined` \| `L2Block`\>
+
+Get the given block.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `number` | `number` | The block number being requested. |
+
+#### Returns
+
+`Promise`\<`undefined` \| `L2Block`\>
+
+The blocks requested.
+
+___
+
+### getBlockNumber
+
+▸ **getBlockNumber**(): `Promise`\<`number`\>
+
+Fetches the current block number.
+
+#### Returns
+
+`Promise`\<`number`\>
+
+The block number.
+
+___
+
+### getContractClassLogs
+
+▸ **getContractClassLogs**(`filter`): `Promise`\<`GetContractClassLogsResponse`\>
+
+Gets contract class logs based on the provided filter.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `filter` | `LogFilter` | The filter to apply to the logs. |
+
+#### Returns
+
+`Promise`\<`GetContractClassLogsResponse`\>
+
+The requested logs.
+
+___
+
+### getContractClassMetadata
+
+▸ **getContractClassMetadata**(`id`, `includeArtifact?`): `Promise`\<[`ContractClassMetadata`](ContractClassMetadata.md)\>
+
+Returns the contract class metadata given a contract class id.
+The metadata consists of its contract class, whether it has been publicly registered, and its artifact.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `id` | `Fr` | Identifier of the class. |
+| `includeArtifact?` | `boolean` | Identifier of the class. |
+
+#### Returns
+
+`Promise`\<[`ContractClassMetadata`](ContractClassMetadata.md)\>
+
+- It returns the contract class metadata, with the artifact field being optional, and will only be returned if true is passed in
+for `includeArtifact`
+TODO(@spalladino): The PXE actually holds artifacts and not classes, what should we return? Also,
+should the pxe query the node for contract public info, and merge it with its own definitions?
+TODO(@spalladino): This method is strictly needed to decide whether to publicly register a class or not
+during a public deployment. We probably want a nicer and more general API for this, but it'll have to
+do for the time being.
+
+**`Remark`**
+
+- it queries the node to check whether the contract class with the given id has been publicly registered.
+
+___
+
+### getContractMetadata
+
+▸ **getContractMetadata**(`address`): `Promise`\<[`ContractMetadata`](ContractMetadata.md)\>
+
+Returns the contract metadata given an address.
+The metadata consists of its contract instance, which includes the contract class identifier,
+initialization hash, deployment salt, and public keys hash; whether the contract instance has been initialized;
+and whether the contract instance with the given address has been publicly deployed.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `address` | `AztecAddress` | The address that the contract instance resides at. |
+
+#### Returns
+
+`Promise`\<[`ContractMetadata`](ContractMetadata.md)\>
+
+- It returns the contract metadata
+TODO(@spalladino): Should we return the public keys in plain as well here?
+
+**`Remark`**
+
+- it queries the node to check whether the contract instance has been initialized / publicly deployed through a node.
+This query is not dependent on the PXE.
+
+___
+
+### getContracts
+
+▸ **getContracts**(): `Promise`\<`AztecAddress`[]\>
+
+Retrieves the addresses of contracts added to this PXE Service.
+
+#### Returns
+
+`Promise`\<`AztecAddress`[]\>
+
+An array of contracts addresses registered on this PXE Service.
+
+___
+
+### getCurrentBaseFees
+
+▸ **getCurrentBaseFees**(): `Promise`\<`GasFees`\>
+
+Method to fetch the current base fees.
+
+#### Returns
+
+`Promise`\<`GasFees`\>
+
+The current base fees.
+
+___
+
+### getL1ToL2MembershipWitness
+
+▸ **getL1ToL2MembershipWitness**(`contractAddress`, `messageHash`, `secret`): `Promise`\<[`bigint`, `SiblingPath`\<``39``\>]\>
+
+Fetches an L1 to L2 message from the node.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `contractAddress` | `AztecAddress` | Address of a contract by which the message was emitted. |
+| `messageHash` | `Fr` | Hash of the message. |
+| `secret` | `Fr` | Secret used to compute a nullifier. |
+
+#### Returns
+
+`Promise`\<[`bigint`, `SiblingPath`\<``39``\>]\>
+
+The l1 to l2 membership witness (index of message in the tree and sibling path).
+
+**`Dev`**
+
+Contract address and secret are only used to compute the nullifier to get non-nullified messages
+
+___
+
+### getL2ToL1MembershipWitness
+
+▸ **getL2ToL1MembershipWitness**(`blockNumber`, `l2Tol1Message`): `Promise`\<[`bigint`, `SiblingPath`\<`number`\>]\>
+
+Gets the membership witness for a message that was emitted at a particular block
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `blockNumber` | `number` | The block number in which to search for the message |
+| `l2Tol1Message` | `Fr` | The message to search for |
+
+#### Returns
+
+`Promise`\<[`bigint`, `SiblingPath`\<`number`\>]\>
+
+The membership witness for the message
+
+___
+
+### getNodeInfo
+
+▸ **getNodeInfo**(): `Promise`\<`NodeInfo`\>
+
+Returns the information about the server's node. Includes current Node version, compatible Noir version,
+L1 chain identifier, rollup version, and L1 address of the rollup contract.
+
+#### Returns
+
+`Promise`\<`NodeInfo`\>
+
+- The node information.
+
+___
+
+### getNotes
+
+▸ **getNotes**(`filter`): `Promise`\<`UniqueNote`[]\>
+
+Gets notes registered in this PXE based on the provided filter.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `filter` | `NotesFilter` | The filter to apply to the notes. |
+
+#### Returns
+
+`Promise`\<`UniqueNote`[]\>
+
+The requested notes.
+
+___
+
+### getPXEInfo
+
+▸ **getPXEInfo**(): `Promise`\<[`PXEInfo`](PXEInfo.md)\>
+
+Returns information about this PXE.
+
+#### Returns
+
+`Promise`\<[`PXEInfo`](PXEInfo.md)\>
+
+___
+
+### getPrivateEvents
+
+▸ **getPrivateEvents**\<`T`\>(`contractAddress`, `eventMetadata`, `from`, `numBlocks`, `recipients`): `Promise`\<`T`[]\>
+
+Returns the private events given search parameters.
+
+#### Type parameters
+
+| Name |
+| :------ |
+| `T` |
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `contractAddress` | `AztecAddress` | The address of the contract to get events from. |
+| `eventMetadata` | [`EventMetadataDefinition`](../#eventmetadatadefinition) | Metadata of the event. This should be the class generated from the contract. e.g. Contract.events.Event |
+| `from` | `number` | The block number to search from. |
+| `numBlocks` | `number` | The amount of blocks to search. |
+| `recipients` | `AztecAddress`[] | The addresses that decrypted the logs. |
+
+#### Returns
+
+`Promise`\<`T`[]\>
+
+- The deserialized events.
+
+___
+
+### getProvenBlockNumber
+
+▸ **getProvenBlockNumber**(): `Promise`\<`number`\>
+
+Fetches the current proven block number.
+
+#### Returns
+
+`Promise`\<`number`\>
+
+The block number.
+
+___
+
+### getPublicEvents
+
+▸ **getPublicEvents**\<`T`\>(`eventMetadata`, `from`, `limit`): `Promise`\<`T`[]\>
+
+Returns the public events given search parameters.
+
+#### Type parameters
+
+| Name |
+| :------ |
+| `T` |
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `eventMetadata` | [`EventMetadataDefinition`](../#eventmetadatadefinition) | Metadata of the event. This should be the class generated from the contract. e.g. Contract.events.Event |
+| `from` | `number` | The block number to search from. |
+| `limit` | `number` | The amount of blocks to search. |
+
+#### Returns
+
+`Promise`\<`T`[]\>
+
+- The deserialized events.
+
+___
+
+### getPublicLogs
+
+▸ **getPublicLogs**(`filter`): `Promise`\<`GetPublicLogsResponse`\>
+
+Gets public logs based on the provided filter.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `filter` | `LogFilter` | The filter to apply to the logs. |
+
+#### Returns
+
+`Promise`\<`GetPublicLogsResponse`\>
+
+The requested logs.
+
+___
+
+### getPublicStorageAt
+
+▸ **getPublicStorageAt**(`contract`, `slot`): `Promise`\<`Fr`\>
+
+Gets the storage value at the given contract storage slot.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `contract` | `AztecAddress` | Address of the contract to query. |
+| `slot` | `Fr` | Slot to query. |
+
+#### Returns
+
+`Promise`\<`Fr`\>
+
+Storage value at the given contract slot.
+
+**`Remarks`**
+
+The storage slot here refers to the slot as it is defined in Noir not the index in the merkle tree.
+Aztec's version of `eth_getStorageAt`.
+
+**`Throws`**
+
+If the contract is not deployed.
+
+___
+
+### getRegisteredAccounts
+
+▸ **getRegisteredAccounts**(): `Promise`\<`CompleteAddress`[]\>
+
+Retrieves the user accounts registered on this PXE Service.
+
+#### Returns
+
+`Promise`\<`CompleteAddress`[]\>
+
+An array of the accounts registered on this PXE Service.
+
+___
+
+### getSenders
+
+▸ **getSenders**(): `Promise`\<`AztecAddress`[]\>
+
+Retrieves the addresses stored as senders on this PXE Service.
+
+#### Returns
+
+`Promise`\<`AztecAddress`[]\>
+
+An array of the senders on this PXE Service.
+
+___
+
+### getTxEffect
+
+▸ **getTxEffect**(`txHash`): `Promise`\<`undefined` \| `IndexedTxEffect`\>
+
+Gets a tx effect.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `txHash` | `TxHash` | The hash of the tx corresponding to the tx effect. |
+
+#### Returns
+
+`Promise`\<`undefined` \| `IndexedTxEffect`\>
+
+The requested tx effect with block info (or undefined if not found).
+
+___
+
+### getTxReceipt
+
+▸ **getTxReceipt**(`txHash`): `Promise`\<`TxReceipt`\>
+
+Fetches a transaction receipt for a given transaction hash. Returns a mined receipt if it was added
+to the chain, a pending receipt if it's still in the mempool of the connected Aztec node, or a dropped
+receipt if not found in the connected Aztec node.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `txHash` | `TxHash` | The transaction hash. |
+
+#### Returns
+
+`Promise`\<`TxReceipt`\>
+
+A receipt of the transaction.
+
+___
+
+### isL1ToL2MessageSynced
+
+▸ **isL1ToL2MessageSynced**(`l1ToL2Message`): `Promise`\<`boolean`\>
+
+Returns whether an L1 to L2 message is synced by archiver and if it's ready to be included in a block.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `l1ToL2Message` | `Fr` | The L1 to L2 message to check. |
+
+#### Returns
+
+`Promise`\<`boolean`\>
+
+Whether the message is synced and ready to be included in a block.
+
+___
+
+### profileTx
+
+▸ **profileTx**(`txRequest`, `profileMode`, `msgSender?`): `Promise`\<`TxProfileResult`\>
+
+Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `txRequest` | `TxExecutionRequest` | An authenticated tx request ready for simulation |
+| `profileMode` | ``"gates"`` \| ``"execution-steps"`` \| ``"full"`` | - |
+| `msgSender?` | `AztecAddress` | (Optional) The message sender to use for the simulation. |
+
+#### Returns
+
+`Promise`\<`TxProfileResult`\>
+
+A trace of the program execution with gate counts.
+
+**`Throws`**
+
+If the code for the functions executed in this transaction have not been made available via `addContracts`.
+
+___
+
+### proveTx
+
+▸ **proveTx**(`txRequest`, `privateExecutionResult`): `Promise`\<`TxProvingResult`\>
+
+Proves the private portion of a simulated transaction, ready to send to the network
+(where validators prove the public portion).
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `txRequest` | `TxExecutionRequest` | An authenticated tx request ready for proving |
+| `privateExecutionResult` | `PrivateExecutionResult` | The result of the private execution of the transaction |
+
+#### Returns
+
+`Promise`\<`TxProvingResult`\>
+
+A result containing the proof and public inputs of the tail circuit.
+
+**`Throws`**
+
+If contract code not found, or public simulation reverts.
+Also throws if simulatePublic is true and public simulation reverts.
+
+___
+
+### registerAccount
+
+▸ **registerAccount**(`secretKey`, `partialAddress`): `Promise`\<`CompleteAddress`\>
+
+Registers a user account in PXE given its master encryption private key.
+Once a new account is registered, the PXE Service will trial-decrypt all published notes on
+the chain and store those that correspond to the registered account. Will do nothing if the
+account is already registered.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `secretKey` | `Fr` | Secret key of the corresponding user master public key. |
+| `partialAddress` | `Fr` | The partial address of the account contract corresponding to the account being registered. |
+
+#### Returns
+
+`Promise`\<`CompleteAddress`\>
+
+The complete address of the account.
+
+___
+
+### registerContract
+
+▸ **registerContract**(`contract`): `Promise`\<`void`\>
+
+Adds deployed contracts to the PXE Service. Deployed contract information is used to access the
+contract code when simulating local transactions. This is automatically called by aztec.js when
+deploying a contract. Dapps that wish to interact with contracts already deployed should register
+these contracts in their users' PXE Service through this method.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `contract` | `Object` | A contract instance to register, with an optional artifact which can be omitted if the contract class has already been registered. |
+| `contract.artifact?` | `ContractArtifact` | - |
+| `contract.instance` | `ContractInstanceWithAddress` | - |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+___
+
+### registerContractClass
+
+▸ **registerContractClass**(`artifact`): `Promise`\<`void`\>
+
+Registers a contract class in the PXE without registering any associated contract instance with it.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `artifact` | `ContractArtifact` | The build artifact for the contract class. |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+___
+
+### registerSender
+
+▸ **registerSender**(`address`): `Promise`\<`AztecAddress`\>
+
+Registers a user contact in PXE.
+
+Once a new contact is registered, the PXE Service will be able to receive notes tagged from this contact.
+Will do nothing if the account is already registered.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `address` | `AztecAddress` | Address of the user to add to the address book |
+
+#### Returns
+
+`Promise`\<`AztecAddress`\>
+
+The address address of the account.
+
+___
+
+### removeSender
+
+▸ **removeSender**(`address`): `Promise`\<`void`\>
+
+Removes a sender in the address book.
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `address` | `AztecAddress` |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+___
+
+### sendTx
+
+▸ **sendTx**(`tx`): `Promise`\<`TxHash`\>
+
+Sends a transaction to an Aztec node to be broadcasted to the network and mined.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `tx` | `Tx` | The transaction as created via `proveTx`. |
+
+#### Returns
+
+`Promise`\<`TxHash`\>
+
+A hash of the transaction, used to identify it.
+
+___
+
+### simulateTx
+
+▸ **simulateTx**(`txRequest`, `simulatePublic`, `msgSender?`, `skipTxValidation?`, `skipFeeEnforcement?`, `scopes?`): `Promise`\<`TxSimulationResult`\>
+
+Simulates a transaction based on the provided preauthenticated execution request.
+This will run a local simulation of private execution (and optionally of public as well), run the
+kernel circuits to ensure adherence to protocol rules (without generating a proof), and return the
+simulation results .
+
+Note that this is used with `ContractFunctionInteraction::simulateTx` to bypass certain checks.
+In that case, the transaction returned is only potentially ready to be sent to the network for execution.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `txRequest` | `TxExecutionRequest` | An authenticated tx request ready for simulation |
+| `simulatePublic` | `boolean` | Whether to simulate the public part of the transaction. |
+| `msgSender?` | `AztecAddress` | (Optional) The message sender to use for the simulation. |
+| `skipTxValidation?` | `boolean` | (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state. |
+| `skipFeeEnforcement?` | `boolean` | (Optional) If false, fees are enforced. |
+| `scopes?` | `AztecAddress`[] | (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all. |
+
+#### Returns
+
+`Promise`\<`TxSimulationResult`\>
+
+A simulated transaction result object that includes public and private return values.
+
+**`Throws`**
+
+If the code for the functions executed in this transaction have not been made available via `addContracts`.
+Also throws if simulatePublic is true and public simulation reverts.
+
+___
+
+### simulateUtility
+
+▸ **simulateUtility**(`functionName`, `args`, `to`, `authwits?`, `from?`, `scopes?`): `Promise`\<`AbiDecoded`\>
+
+Simulate the execution of a contract utility function.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `functionName` | `string` | The name of the utility contract function to be called. |
+| `args` | `any`[] | The arguments to be provided to the function. |
+| `to` | `AztecAddress` | The address of the contract to be called. |
+| `authwits?` | `AuthWitness`[] | (Optional) The authentication witnesses required for the function call. |
+| `from?` | `AztecAddress` | (Optional) The msg sender to set for the call. |
+| `scopes?` | `AztecAddress`[] | (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all. |
+
+#### Returns
+
+`Promise`\<`AbiDecoded`\>
+
+The result of the utility function call, structured based on the function ABI.
+
+___
+
+### updateContract
+
+▸ **updateContract**(`contractAddress`, `artifact`): `Promise`\<`void`\>
+
+Updates a deployed contract in the PXE Service. This is used to update the contract artifact when
+an update has happened, so the new code can be used in the simulation of local transactions.
+This is called by aztec.js when instantiating a contract in a given address with a mismatching artifact.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `contractAddress` | `AztecAddress` | The address of the contract to update. |
+| `artifact` | `ContractArtifact` | The updated artifact for the contract. |
+
+#### Returns
+
+`Promise`\<`void`\>
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/PXEInfo.md b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/PXEInfo.md
new file mode 100644
index 000000000000..b34b5866adef
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/PXEInfo.md
@@ -0,0 +1,25 @@
+---
+id: "PXEInfo"
+title: "Interface: PXEInfo"
+sidebar_label: "PXEInfo"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Provides basic information about the running PXE.
+
+## Properties
+
+### protocolContractAddresses
+
+• **protocolContractAddresses**: `ProtocolContractAddresses`
+
+Protocol contract addresses
+
+___
+
+### pxeVersion
+
+• **pxeVersion**: `string`
+
+Version as tracked in the aztec-packages repository.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/_category_.yml b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/_category_.yml
new file mode 100644
index 000000000000..43bec88cfa0a
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/aztecjs/pxe/interfaces/_category_.yml
@@ -0,0 +1,2 @@
+label: "Interfaces"
+position: 4
\ No newline at end of file
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/_category_.json b/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/_category_.json
new file mode 100644
index 000000000000..3d16e4d09376
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/_category_.json
@@ -0,0 +1,6 @@
+{
+ "label": "Considerations and Limitations",
+ "position": 4,
+ "collapsible": true,
+ "collapsed": true
+}
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/limitations.md b/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/limitations.md
new file mode 100644
index 000000000000..79703d48749c
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/limitations.md
@@ -0,0 +1,328 @@
+---
+title: Limitations
+sidebar_position: 6
+tags: [sandbox]
+---
+
+The Aztec Sandbox and the Aztec Smart Contract Library are **prototypes**, and should be treated as such. They've been released early, to gather feedback on the capabilities of the protocol and user experiences.
+
+## What to expect?
+
+- Regular Breaking Changes;
+- Missing features;
+- Bugs;
+- An 'unpolished' UX;
+- Missing information.
+
+## Why participate?
+
+Front-run the future!
+
+Help shape and define:
+
+- Previously-impossible smart contracts and applications
+- Network tooling;
+- Network standards;
+- Smart contract syntax;
+- Educational content;
+- Core protocol improvements;
+
+## Limitations developers need to know about
+
+- It is a testing environment, it is insecure, unaudited and does not generate any proofs, its only for testing purposes;
+- Constructors can not call nor alter public state
+ - The constructor is executed exclusively in private domain, WITHOUT the ability to call public functions or alter public state. This means to set initial storage values, you need to follow a pattern similar to [proxies in Ethereum](https://blog.openzeppelin.com/proxy-patterns), where you `initialize` the contract with values after it have been deployed.
+ - Beware that what you think of as a `view` could alter state ATM! Notably the account could alter state or re-enter whenever the account contract's `is_valid` function is called.
+- `msg_sender` is currently leaking when doing private -> public calls
+ - The `msg_sender` will always be set, if you call a public function from the private world, the `msg_sender` will be set to the private caller's address.
+- The initial `msg_sender` is 0, which can be problematic for some contracts.
+- Unencrypted logs don't link to the contract that emitted it, so essentially just a `debug_log`` that you can match values against.
+- A note that is created and nullified in the same transaction will still emit an encrypted log.
+- A limited amount of new note hashes, nullifiers and calls that are supported by a transaction, see [circuit limitations](#circuit-limitations).
+
+## Limitations
+
+There are plans to resolve all of the below.
+
+### It is not audited
+
+None of the Sandbox code is audited. It's being iterated-on every day. It will not be audited for quite some time.
+
+### No Proofs
+
+That's right, the Sandbox doesn't actually generate or verify any zk-SNARKs yet!
+
+The main goal of the Sandbox is to enable developers to experiment with building apps, and hopefully to provide feedback. We want the developer experience to be as fast as possible, much like how Ethereum developers use Ganache or Anvil to get super-fast block times, instead of the slow-but-realistic 12-second block times that they'll encounter in production. A fast Sandbox enables fast testing, which enables developers to iterate quickly.
+
+That's not to say a super-fast proving system isn't being worked on as we speak.
+
+#### What are the consequences?
+
+By the time mainnet comes around, zk-SNARKs will be needed in order to validate the correctness of every function that's executed on Aztec. In other words, in order for the execution of a function to be registered as part of the Aztec blockchain's history, a proof of correct execution will need to be furnished. Each proof will be an attestation that the rules of a particular function were followed correctly.
+
+But proofs are really only needed as a protection against malicious behavior. The Sandbox is an emulated ecosystem; entirely contained within your laptop, and it follows the network's rules out of the box. So as long as its inner workings aren't tampered-with, it will act 'honestly'. Since you'll be the only person interacting with the Sandbox on your own laptop, and with a healthy assumption that you should be honest with yourself, you won't need proofs when testing.
+
+### No Circuits!
+
+This is kind-of a repetition of ['No Proofs!'](#no-proofs) above, but for the sake of clarity, there aren't yet any arithmetic circuits in the Sandbox. We might refer to certain components of the core protocol as being 'circuits', and we might refer to user-defined smart contract functions as being compiled to 'circuits', but the Sandbox doesn't actually contain any circuits yet. Instead, there is code which emulates the logic of a circuit. This is intentional, to make execution of the Sandbox as fast as possible.
+
+Obviously, as development continues, the so-called 'circuits' will actually become proper circuits, and actual proofs will be generated.
+
+#### What are the consequences?
+
+The Sandbox will execute more quickly. The logic of all 'circuits' is still in place*. Smart contract logic will be executed, and core protocol logic will be executed*. So invalid transactions will be caught\* and rejected.
+
+\*Note: some core protocol circuit assertions and constraints still need to be written (see [GitHub](https://github.com/AztecProtocol/aztec-packages/issues)). This would be bad in an adversarial environment, but the Sandbox is not that. Naturally, proper circuits will need to be written.
+
+### No Fees!
+
+That's right, there are no L2 network fees yet!
+
+The Sandbox can currently be thought of as a bare-minimum execution layer. We'll be speccing and implementing gas metering and fees soon!
+
+> Note: there is still a notion of an L1 fee in the Sandbox, because it uses Anvil to emulate the Ethereum blockchain.
+
+#### What are the consequences?
+
+Apps won't yet be able to allow for any L2 fee logic. Once fees are introduced, this will cause breaking changes to in-progress apps, which will need to be updated to accommodate the notion of paying network fees for transactions. Clear documentation will be provided.
+
+### Basic Keys and Addresses!
+
+The way in which keypairs and addresses are currently derived and implemented (inside the Sandbox) is greatly over-simplified, relative to future plans.
+
+They're so over-simplified that they're known to be insecure. Other features have been prioritized so-far in Sandbox development.
+
+#### What are the consequences?
+
+This will impact the kinds of apps that you can build with the Sandbox, as it is today:
+
+- The management of keys when designing account contracts and wallets will be affected.
+- The keys used when generating nullifiers will be affected. (Although the machinery relating to nullifiers is mostly abstracted away from developers who use Aztec.nr.
+ - In particular the current, over-simplified key derivation scheme is known to be **insecure**:
+ - Currently, the same nullifier secret key is used by _every_ smart contract on the network. This would enable malicious apps to trivially emit a user's nullifier secret key to the world!
+ - In future, there are detailed plans to 'silo' a nullifier key per contract address (and per user), to fix this obvious vulnerability.
+- The keys used when encrypting and decrypting logs will be affected.
+ - In particular the current, over-simplified key derivation scheme is known to be **insecure**:
+ - Currently, a user's nullifier secret key is the same as their encryption secret key. And as stated above, this would enable malicious apps to trivially emit a user's secret key to the world!
+ - In future there are also plans to have incoming and outgoing viewing keys, inspired by [ZCash Sapling](https://electriccoin.co/blog/explaining-viewing-keys/).
+ - If developers wish to design apps which incorporate certain auditability patterns, the current over-simplification of keys might not be sufficient.
+
+Please open new discussions on [discourse](http://discourse.aztec.network) or open issues on [github](http://github.com/AztecProtocol/aztec-packages), if you have requirements that aren't-yet being met by the Sandbox's current key derivation scheme.
+
+### It's not-yet decentralized
+
+It's an emulated blockchain entirely contained within your own laptop! It's centralized by design!
+As for deploying this all to mainnet, a decentralized sequencer selection and prover selection protocols are still [being discussed](https://discourse.aztec.network/t/request-for-proposals-decentralized-sequencer-selection/350). There are plans for decentralized testnets in 2024.
+
+### You can't read mutable public state from a private function
+
+Private smart contract functions won't be able to read mutable public state yet. We have some [ideas](https://discourse.aztec.network/t/accessing-historic-public-state-from-private-functions/241/7?u=mike) for how to solve this, and will look to implement something very soon.
+
+#### What are the consequences?
+
+Reading public state from a private contract will be a common pattern. For example, it's needed if you want to maintain a public whitelist/blacklist, but prove you are/aren't on that blacklist privately. This will be a high priority, coming soon.
+
+### No delegatecalls
+
+A contract can't perform a delegatecall yet (if ever). Delegatecalls are quite a controversial feature of the EVM.
+
+### No privacy-preserving queries to nodes
+
+Ethereum has a notion of a 'full node' which keeps-up with the blockchain and stores the full chain state. Many users don't wish to run full nodes, so rely on 3rd-party 'full-node-as-a-service' infrastructure providers, who service blockchain queries from their users.
+
+This pattern is likely to develop in Aztec as well, except there's a problem: privacy. If a privacy-seeking user makes a query to a 3rd-party 'full node', that user might leak data about who they are, or about their historical network activity, or about their future intentions. One solution to this problem is "always run a full node", but pragmatically, not everyone will. To protect less-advanced users' privacy, research is underway to explore how a privacy-seeking user may request and receive data from a 3rd-party node without revealing what that data is, nor who is making the request.
+
+### No private data authentication
+
+Private data should not be returned to an app, unless the user authorizes such access to the app. An authorization layer is not-yet in place.
+
+#### What are the consequences?
+
+Any app can request and receive any private user data relating to any other private app. Obviously this sounds bad. But the Sandbox is a sandbox, and no meaningful value or credentials should be stored there; only test values and test credentials.
+
+An auth layer will be added in due course.
+
+### No bytecode validation
+
+Bytecode should not be executed, unless the Sandbox has validated that the user's intentions (the function signature and contract address) match the bytecode.
+
+#### What are the consequences?
+
+Without such 'bytecode validation', if the incorrect bytecode is executed, and that bytecode is malicious, it could read private data from some other contract and emit that private data to the world. Obviously this would be bad in production. But the Sandbox is a sandbox, and no meaningful value or credentials should be stored there; only test values and test credentials.
+
+There are plans to add bytecode validation soon.
+
+### Insecure hashes
+
+Currently, Pedersen hashes are being used pretty-much everywhere. To any cryptographers reading this, don't panic. A thorough review of which hashes to use in which part of the protocol will be conducted soon.
+
+Additionally, domain separation of hashes needs some review.
+
+#### What are the consequences?
+
+Collisions and other hash-related attacks might be possible in the Sandbox. Obviously that would be bad in production. But it's unlikely to cause problems at this early stage of testing.
+
+### `msg_sender` is leaked when making a private -> public call
+
+There are [ongoing discussions](https://discourse.aztec.network/t/who-is-msg-sender-when-making-private-public-function-calls/242) around how to address this.
+
+#### What are the consequences?
+
+When a private function makes a call to a public function, the `msg_sender` of the calling function will be given to the public world. Most critically, this includes if the `msg_sender` is an account contract.
+This will be patched in the near future, but unfortunately, app developers might need to 'overlook' this privacy leakage until then, with the assumption that it will be fixed. But note, one possible 'patch' might be to set `msg_sender` to `0` for all private -> public calls. This might cause breaking changes to your public functions, if they rely on reading `msg_sender`. There are patterns to work around this, but they wouldn't be pretty, and we won't go into details until a solution is chosen. Sorry about this, and thanks for your patience whilst we work this out :)
+
+### New Privacy Standards are required
+
+There are many [patterns](../../reference/considerations/privacy_considerations.md) which can leak privacy, even on Aztec. Standards haven't been developed yet, to encourage best practices when designing private smart contracts.
+
+#### What are the consequences?
+
+For example, until community standards are developed to reduce the uniqueness of ['Tx Fingerprints'](../../reference/considerations/privacy_considerations.md#function-fingerprints-and-tx-fingerprints) app developers might accidentally forfeit some function privacy.
+
+## Circuit limitations
+
+### Upper limits on function outputs and tx outputs
+
+Due to the rigidity of zk-SNARK circuits, there are upper bounds on the amount of computation a circuit can perform, and on the amount of data that can be passed into and out of a function.
+
+> Blockchain developers are no stranger to restrictive computational environments. Ethereum has gas limits, local variable stack limits, call stack limits, contract deployment size limits, log size limits, etc.
+
+Here are the current constants:
+
+```rust title="constants" showLineNumbers
+// "PER CALL" CONSTANTS
+pub global MAX_NOTE_HASHES_PER_CALL: u32 = 16;
+pub global MAX_NULLIFIERS_PER_CALL: u32 = 16;
+pub global MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: u32 = 5;
+pub global MAX_ENQUEUED_CALLS_PER_CALL: u32 = 16;
+pub global MAX_L2_TO_L1_MSGS_PER_CALL: u32 = 2;
+pub global MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL: u32 = 63;
+pub global MAX_PUBLIC_DATA_READS_PER_CALL: u32 = 64;
+pub global MAX_NOTE_HASH_READ_REQUESTS_PER_CALL: u32 = 16;
+pub global MAX_NULLIFIER_READ_REQUESTS_PER_CALL: u32 = 16;
+pub global MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL: u32 = 16;
+pub global MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL: u32 = 16;
+pub global MAX_KEY_VALIDATION_REQUESTS_PER_CALL: u32 = 16;
+pub global MAX_PRIVATE_LOGS_PER_CALL: u32 = 16;
+pub global MAX_PUBLIC_LOGS_PER_CALL: u32 = 4;
+pub global MAX_CONTRACT_CLASS_LOGS_PER_CALL: u32 = 1;
+
+// TREES RELATED CONSTANTS
+pub global ARCHIVE_HEIGHT: u32 = 29;
+pub global VK_TREE_HEIGHT: u32 = 6;
+pub global PROTOCOL_CONTRACT_TREE_HEIGHT: u32 = 3;
+pub global FUNCTION_TREE_HEIGHT: u32 = 5;
+pub global NOTE_HASH_TREE_HEIGHT: u32 = 40;
+pub global PUBLIC_DATA_TREE_HEIGHT: u32 = 40;
+pub global NULLIFIER_TREE_HEIGHT: u32 = 40;
+pub global L1_TO_L2_MSG_TREE_HEIGHT: u32 = 39;
+pub global ARTIFACT_FUNCTION_TREE_MAX_HEIGHT: u32 = 5;
+pub global NULLIFIER_TREE_ID: Field = 0;
+pub global NOTE_HASH_TREE_ID: Field = 1;
+pub global PUBLIC_DATA_TREE_ID: Field = 2;
+pub global L1_TO_L2_MESSAGE_TREE_ID: Field = 3;
+pub global ARCHIVE_TREE_ID: Field = 4;
+
+// SUB-TREES RELATED CONSTANTS
+pub global NOTE_HASH_SUBTREE_HEIGHT: u32 = 6;
+pub global NULLIFIER_SUBTREE_HEIGHT: u32 = 6;
+// Deprecated: to be removed after removal of legacy ts trees
+pub global PUBLIC_DATA_SUBTREE_HEIGHT: u32 = 6;
+pub global L1_TO_L2_MSG_SUBTREE_HEIGHT: u32 = 4;
+pub global NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH: u32 =
+ NOTE_HASH_TREE_HEIGHT - NOTE_HASH_SUBTREE_HEIGHT;
+pub global NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH: u32 =
+ NULLIFIER_TREE_HEIGHT - NULLIFIER_SUBTREE_HEIGHT;
+pub global L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH: u32 =
+ L1_TO_L2_MSG_TREE_HEIGHT - L1_TO_L2_MSG_SUBTREE_HEIGHT;
+
+// "PER TRANSACTION" CONSTANTS
+pub global MAX_NOTE_HASHES_PER_TX: u32 = (1 as u8 << NOTE_HASH_SUBTREE_HEIGHT as u8) as u32;
+pub global MAX_NULLIFIERS_PER_TX: u32 = (1 as u8 << NULLIFIER_SUBTREE_HEIGHT as u8) as u32;
+pub global MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX: u32 = 8;
+pub global MAX_ENQUEUED_CALLS_PER_TX: u32 = 32;
+pub global PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 1;
+pub global MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 =
+ (1 as u8 << PUBLIC_DATA_SUBTREE_HEIGHT as u8) as u32;
+pub global MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 =
+ MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX - PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX;
+pub global MAX_PUBLIC_DATA_READS_PER_TX: u32 = 64;
+pub global MAX_L2_TO_L1_MSGS_PER_TX: u32 = 8;
+pub global MAX_NOTE_HASH_READ_REQUESTS_PER_TX: u32 = 64;
+pub global MAX_NULLIFIER_READ_REQUESTS_PER_TX: u32 = 64;
+pub global MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX: u32 = 64;
+pub global MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX: u32 = 64;
+// TODO: for large multisends we might run out of key validation requests here but not dealing with this now as
+// databus will hopefully make the issue go away.
+pub global MAX_KEY_VALIDATION_REQUESTS_PER_TX: u32 = 64;
+pub global MAX_PRIVATE_LOGS_PER_TX: u32 = 32;
+pub global MAX_PUBLIC_LOGS_PER_TX: u32 = 8;
+pub global MAX_CONTRACT_CLASS_LOGS_PER_TX: u32 = 1;
+```
+> Source code: noir-projects/noir-protocol-circuits/crates/types/src/constants.nr#L28-L97
+
+
+#### What are the consequences?
+
+When you write an Aztec.nr function, there will be upper bounds on the following:
+
+- The number of public state reads and writes;
+- The number of note reads and nullifications;
+- The number of new notes that may be created;
+- The number of encrypted logs that may be emitted;
+- The number of unencrypted logs that may be emitted;
+- The number of L1->L2 messages that may be consumed;
+- The number of L2->L1 messages that may be submitted to L1;
+- The number of private function calls;
+- The number of public function calls that may be enqueued;
+
+Not only are there limits on a _per function_ basis, there are also limits on a _per transaction_ basis.
+
+**In particular, these _per-transaction_ limits will limit transaction call stack depths** in the Sandbox. That means if a function call results in a cascade of nested function calls, and each of those function calls outputs lots of state reads and writes, or logs (etc.), then all of that accumulated output data might exceed the per-transaction limits that we currently have. This would cause such transactions to fail.
+
+There are plans to relax all of this rigidity, by providing many 'sizes' of kernel circuit, and introducing a 'bus' to ferry varying lengths of data between kernel iterations. But that'll all take some time.
+
+> **In the mean time**, if you encounter a per-transaction limit when testing, and you're feeling adventurous, you could 'hack' the Sandbox to increase the limits. See here (TODO: link) for a guide. **However**, the limits cannot be increased indefinitely. So although we do anticipate that we'll be able to increase them a little bit, don't go mad and provide yourself with 1 million state transitions per transaction. That would be as unrealistic as artificially increasing Ethereum gas limits to 1 trillion.
+
+### Circuits Processing Order Differs from Execution Order
+
+Each function call is represented by a circuit with a dedicated zero-knowledge proof of its execution. The private kernel circuit is in charge of stitching all these proofs together to produce a zero-knowledge proof that the whole execution of all function calls within a transaction is correct. In doing so, the processing order differs from the execution order. Firstly, the private kernel has to handle one function call in its entirety at a time because a zk proof cannot be verified partially. This property alone makes it impossible for the ordering of kernel circuit validation to match the order in which the functions of the transaction were executed. Secondly, the private kernel processes function calls in a stack-based order, i.e., after having processed a function call, it processes all direct child function calls in an order which is the reverse of the execution order.
+
+Note that there is no plan to change this in the future.
+
+### Example
+
+Let us assume that the main function named $f_1$ is calling in order $f_2$, $f_3$ (which calls $f_5$ followed by $f_6$), and $f_4$.
+
+Call Dependency:
+
+> $f_1 \longrightarrow f_2$, $f_3$, $f_4$
+
+> $f_3 \longrightarrow f_5$, $f_6$
+
+Execution Order:
+
+> $f_1$, $f_2$, $f_3$, $f_5$, $f_6$, $f_4$
+
+Private Kernel Processing Order:
+
+> $f_1$, $f_4$, $f_3$, $f_6$, $f_5$, $f_2$
+
+#### What are the consequences?
+
+Transaction output elements such as notes in encrypted logs, note hashes (commitments), nullifiers might be ordered differently than the one expected by the execution.
+
+### Chopped Transient Notes are still Emitted in Logs
+
+A note which is created and nullified during the very same transaction is called transient. Such a note is chopped by the private kernel circuit and is never stored in any persistent data tree.
+
+For the time being, such chopped notes are still emitted through encrypted logs (which is the communication channel to transmit notes). When a log containing a chopped note is processed, a warning will be logged about a decrypted note which does not exist in data tree. We [improved (GitHub link)](https://github.com/AztecProtocol/aztec-packages/issues/1603) error logging to help identify such an occurrence. However, this might be a source of confusion.
+This issue is tracked in ticket [#1641 (GitHub link)](https://github.com/AztecProtocol/aztec-packages/issues/1641).
+
+### Note Terminology: Note Commitments and Note Hashes
+
+The notes or UTXOs in Aztec need to be compressed before they are added to the trees. To do so, we need to hash all the data inside a note using a collision-resistant hash function. Currently, we use Pedersen hash (using lookup tables) to compress note data. The compressed note data is referred to as "note commitments" in our architecture. However, note commitments are referred to as "note hashes" in aztec-noir code. Be mindful of that fact that note commitments and note hashes mean the same thing. Note that we only mean to talk about terminology here and in no way one should infer security/cryptographic properties (e.g., hiding, binding) based on the name. Namely, notes come with different flavours of security properties depending on the use case.
+
+## There's more
+
+See the [GitHub issues (GitHub link)](https://github.com/AztecProtocol/aztec-packages/issues) for all known bugs fixes and features currently being worked on.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/privacy_considerations.md b/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/privacy_considerations.md
new file mode 100644
index 000000000000..7a44889e5669
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/considerations/privacy_considerations.md
@@ -0,0 +1,140 @@
+---
+title: Privacy Considerations
+sidebar_position: 5
+tags: [protocol, PXE]
+---
+
+Privacy is important.
+
+Keeping information private is difficult.
+
+Once information is leaked, it cannot be unleaked.
+
+---
+
+## What can Aztec keep private?
+
+Aztec provides a set of tools to enable developers to build private smart contracts. The following can be kept private:
+
+**Private persistent state**
+
+Store state variables in an encrypted form, so that no one can see what those variables are, except those with the decryption key.
+
+**Private events and messages**
+
+Emit encrypted events, or encrypted messages from a private smart contract function. Only those with the decryption key will learn the message.
+
+**Private function execution**
+
+Execute a private function without the world knowing which function you've executed.
+
+:::danger
+Privacy is not guaranteed without care.
+Although Aztec provides the tools for private smart contracts, information can still be leaked unless the dapp developer is careful.
+This page outlines some best practices to aid dapp developers.
+:::
+
+---
+
+## Leaky practices
+
+There are many caveats to the above. Since Aztec also enables interaction with the _public_ world (public L2 functions and L1 functions), private information can be accidentally leaked if developers aren't careful.
+
+### Crossing the private -> public boundary
+
+Any time a private function makes a call to a public function, information is leaked. Now, that might be perfectly fine in some use cases (it's up to the smart contract developer). Indeed, most interesting apps will require some public state. But let's have a look at some leaky patterns:
+
+- Calling a public function from a private function. The public function execution will be publicly visible.
+- Calling a public function from a private function, without revealing the `msg_sender` of that call. (Otherwise the `msg_sender` will be publicly visible).
+- Passing arguments to a public function from a private function. All of those arguments will be publicly visible.
+- Calling an internal public function from a private function. The fact that the call originated from a private function of that same contract will be trivially known.
+- Emitting unencrypted events from a private function. The unencrypted event name and arguments will be publicly visible.
+- Sending L2->L1 messages from a private function. The entire message, and the resulting L1 function execution will all be publicly visible.
+
+### Crossing the public -> private boundary
+
+If a public function sends a message to be consumed by a private function, the act of consuming that message might be leaked if not following recommended patterns.
+
+### Timing of transactions
+
+Information about the nature of a transaction can be leaked based on the timing of that transaction.
+
+If a transaction is executed at 8am GMT, it's much less likely to have been made by someone in the USA.
+
+If there's a spike in transactions on the last day of every month, those might be salaries.
+
+These minor details are information that can disclose much more information about a user than the user might otherwise expect.
+
+Suppose that every time Alice sends Bob a private token, 1 minute later a transaction is always submitted to the tx pool with the same kind of 'fingerprint'. Alice might deduce that these transactions are automated reactions by Bob. (Here, 'fingerprint' is an intentionally vague term. It could be a public function call, or a private tx proof with a particular number of nonzero public inputs, or some other discernible pattern that Alice sees).
+
+TL;DR: app developers should think about the _timing_ of user transactions, and how this might leak information.
+
+### Function Fingerprints and Tx Fingerprints
+
+A 'Function Fingerprint' is any data which is exposed by a function to the outside world. A 'Tx Fingerprint' is any data which is exposed by a tx to the outside world. We're interested in minimizing leakages of information from private txs. The leakiness of a Tx Fingerprint depends on the leakiness of its constituent functions' Function Fingerprints _and_ on the appearance of the tx's Tx Fingerprint as a whole. For a private function (and by extension, for a private tx), the following information _could_ be leaked (depending on the function, of course):
+
+- All calls to public functions.
+ - The contract address of the private function (if it calls an internal public function).
+ - This could be the address of the transactor themselves, if the calling contract is an account contract.
+ - All arguments which are passed to public functions.
+- All calls to L1 functions (in the form of L2 -> L1 messages).
+ - The contents of L2 -> L1 messages.
+- All public logs (topics and arguments).
+- The roots of all trees which have been read from.
+- The _number_ of ['side effects']():
+ - \# new note hashes
+ - \# new nullifiers
+ - \# bytes of encrypted logs
+ - \# public function calls
+ - \# L2->L1 messages
+ - \# nonzero roots[^1]
+
+> Note: many of these were mentioned in the ["Crossing the private -> public boundary"](#crossing-the-private---public-boundary) section.
+
+> Note: the transaction effects submitted to L1 is [encoded (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/core/libraries/Decoder.sol) but not garbled with other transactions: the distinct Tx Fingerprint of each tx can is publicly visible when a tx is submitted to the L2 tx pool.
+
+#### Standardizing Fingerprints
+
+If each private function were to have a unique Fingerprint, then all private functions would be distinguishable from each-other, and all of the efforts of the Aztec protocol to enable 'private function execution' would have been pointless. Standards need to be developed, to encourage smart contract developers to adhere to a restricted set of Tx Fingerprints. For example, a standard might propose that the number of new note hashes, nullifiers, logs, etc. must always be equal, and must always equal a power of two. Such a standard would effectively group private functions/txs into 'privacy sets', where all functions/txs in a particular 'privacy set' would look indistinguishable from each-other, when executed.
+
+### Data queries
+
+It's not just the broadcasting of transactions to the network that can leak data.
+
+Ethereum has a notion of a 'full node' which keeps-up with the blockchain and stores the full chain state. Many users don't wish to run full nodes, so rely on 3rd-party 'full-node-as-a-service' infrastructure providers, who service blockchain queries from their users.
+
+This pattern is likely to develop in Aztec as well, except there's a problem: privacy. If a privacy-seeking user makes a query to a 3rd-party 'full node', that user might leak data about who they are; about their historical network activity; or about their future intentions. One solution to this problem is "always run a full node", but pragmatically, not everyone will. To protect less-advanced users' privacy, research is underway to explore how a privacy-seeking user may request and receive data from a 3rd-party node without revealing what that data is, nor who is making the request.
+
+App developers should be aware of this avenue for private data leakage. **Whenever an app requests information from a node, the entity running that node is unlikely to be your user!**
+
+#### What kind of queries can be leaky?
+
+##### Querying for up-to-date note sibling paths
+
+To read a private state is to read a note from the note hash tree. To read a note is to prove existence of that note in the note hash tree. And to prove existence is to re-compute the root of the note hash tree using the leaf value, the leaf index, and the sibling path of that leaf. This computed root is then exposed to the world, as a way of saying "This note exists", or more precisely "This note has existed at least since this historical snapshot time".
+
+If an old historical snapshot is used, then that old historical root will be exposed, and this leaks some information about the nature of your transaction: it leaks that your note was created before the snapshot date. It shrinks the 'privacy set' of the transaction to a smaller window of time than the entire history of the network.
+
+So for maximal privacy, it's in a user's best interest to read from the very-latest snapshot of the data tree.
+
+Naturally, the note hash tree is continuously changing as new transactions take place and their new notes are appended. Most notably, the sibling path for every leaf in the tree changes every time a new leaf is appended.
+
+If a user runs their own node, there's no problem: they can query the latest sibling path for their note(s) from their own machine without leaking any information to the outside world.
+
+But if a user is not running their own node, they would need to query the very-latest sibling path of their note(s) from some 3rd-party node. In order to query the sibling path of a leaf, the leaf's index needs to be provided as an argument. Revealing the leaf's index to a 3rd-party trivially reveals exactly the note(s) you're about to read. And since those notes were created in some prior transaction, the 3rd-party will be able to link you with that prior transaction. Suppose then that the 3rd-party also serviced the creator of said prior transaction: the 3rd-party will slowly be able to link more and more transactions, and gain more and more insight into a network which is meant to be private!
+
+We're researching cryptographic ways to enable users to retrieve sibling paths from 3rd-parties without revealing leaf indices.
+
+> \* Note: due to the non-uniformity of Aztec transactions, the 'privacy set' of a transaction might not be the entire set of transactions that came before.
+
+##### Any query
+
+Any query to a node leaks information to that node.
+
+We're researching cryptographic ways to enable users to query any data privately.
+
+---
+
+Footnotes
+
+[^1]: All txs should set the kernel circuit public inputs for all roots to _valid_, _up-to-date_ nonzero values, so as to mask which trees have _actually_ been read from. The Sandbox will eventually automate this (see this [issue (GitHub link)](https://github.com/AztecProtocol/aztec-packages/issues/1676)).
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/_category_.json b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/_category_.json
new file mode 100644
index 000000000000..99db708f09cb
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/_category_.json
@@ -0,0 +1,6 @@
+{
+ "label": "Debugging",
+ "position": 3,
+ "collapsible": true,
+ "collapsed": true
+}
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/aztecnr-errors.md b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/aztecnr-errors.md
new file mode 100644
index 000000000000..414ef485e14e
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/aztecnr-errors.md
@@ -0,0 +1,75 @@
+---
+title: Aztec.nr Errors
+tags: [contracts]
+---
+
+This section contains some errors that you may encounter when writing and compiling contracts in Aztec.nr. If you run into an error that is not listed here, please [create an issue (GitHub link)](https://github.com/AztecProtocol/aztec-packages/issues/new).
+
+#### `Aztec dependency not found. Please add aztec as a dependency in your Nargo.toml`
+
+All smart contracts written in Aztec.nr need the `aztec` dependency. In your `Nargo.toml` under `[dependencies]`, add this:
+
+```toml
+aztec = { git="https://github.com/AztecProtocol/aztec-packages/", tag="v0.86.0", directory="noir-projects/aztec-nr/aztec" }
+```
+
+You can learn more about dependencies and their paths [here](../smart_contract_reference/dependencies.md).
+
+#### `backend has encountered an error`
+
+This is likely due to a version mismatch or bad install of barretenberg. Try [reinstalling nargo](../../guides/local_env/versions-updating.md) or uninstalling barretenberg:
+
+```bash
+nargo backend uninstall acvm-backend-barretenberg
+```
+
+It will then reinstall when you compile.
+
+#### `Oracle callback {} not found` & `Oracle callback pedersenHash not found`
+
+This can occasionally happen when there are breaking releases. Make sure that your dependencies in `Nargo.toml` are [updated to the latest release](../../guides/local_env/versions-updating.md#dependency-versions).
+
+#### `error: Failed constraint: 'Public state writes only supported in public functions`
+
+Reading and writing to public state from private functions is currently not supported.
+This is because public values may change before the private function execution is posted on-chain.
+
+This may change in future versions.
+
+#### `Simulation error: Assertion failed:...`
+
+This is an assertion error that is thrown when a condition is not met.
+
+To address the error. find the line in the contract that is throwing the error and investigate why the condition is not met.
+
+#### `Unknown contract 0x0: add it to PXE by calling server.addContracts(...)`
+
+This error occurs when you are trying to interact with a smart contract via an Private Execution Environment (PXE) that does not have the necessary information to execute a transaction.
+
+To execute a transaction, the PXE needs to know the complete address of a contract and contract artifacts.
+
+To address the error, add the contract to the PXE by calling [`pxe.addContracts(...)`](../../../aztec/concepts/pxe/index.md).
+
+#### `Simulation error: No public key registered for address 0x0. Register it by calling pxe.registerRecipient(...) or pxe.registerAccount(...)`
+
+This error occurs when your contract is trying to get a public key via the `get_public_key` oracle call, but the PXE does not have the Complete Address (Complete Address contains the public key).
+
+Your contract typically needs a note recipient's public key when it wants to send a note to because the public key is used to encrypt notes.
+
+:::info
+Manually adding the recipient to the PXE should not be required in case the recipient contract has already been deployed and the PXE is fully synced.
+This is because this information is submitted on-chain when the recipient contract is deployed.
+:::
+
+#### `Could not process note because of "Error: Unknown account.". Skipping note...`
+
+This error occurs when your contract is trying to get a secret via the `get_secret` oracle call, but the PXE does not have the secret for the public key.
+
+This error might occur when you register an account only as a recipient and not as an account.
+To address the error, register the account by calling `server.registerAccount(...)`.
+
+#### `Failed to solve brillig function 'self._is_some`
+
+You may encounter this error when trying to send a transaction that is using an invalid contract. The contract may compile without errors and you only encounter this when sending the transaction.
+
+This error may arise when function parameters are not properly formatted, when trying to "double-spend" a note, or it may indicate that there is a bug deeper in the stack (e.g. a bug in the Aztec.nr library or deeper). If you hit this error, double-check your contract implementation, but also consider [opening an issue (GitHub link)](https://github.com/AztecProtocol/aztec-packages/issues/new).
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/index.md b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/index.md
new file mode 100644
index 000000000000..f020a71f846a
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/index.md
@@ -0,0 +1,67 @@
+---
+title: Debugging
+sidebar_position: 1
+---
+
+## Logging in Aztec.nr
+
+On this section you can learn how to debug your Aztec.nr smart contracts and common errors that you may run into.
+
+You can log statements from Aztec.nr contracts that will show ups in the Sandbox.
+
+:::info
+
+The Noir standard library `std::println` function will not work in Aztec contracts. You must use the `debug_log` and `debug_log_format` defined below.
+
+:::
+
+### Import `debug_log`
+
+Import the `debug_log` dependency from Aztec oracles:
+
+```rust
+use dep::aztec::oracle::debug_log::{ debug_log };
+```
+
+### Write log
+
+Write `debug_log()` in the appropriate place in your contract.
+
+```rust
+debug_log("here");
+```
+
+Other methods for logging include:
+
+`debug_log_format()`: for logging Field values along arbitrary strings.
+
+```rust
+debug_log_format("get_2(slot:{0}) =>\n\t0:{1}\n\t1:{2}", [storage_slot, note0_hash, note1_hash]);
+```
+
+`debug_log_field()`: for logging Fields.
+
+```rust
+debug_log_field(my_field);
+```
+
+`debug_log_array()`: for logging array types.
+
+```rust
+debug_log_array(my_array);
+```
+
+### Start Sandbox in debug mode
+
+Set `LOG_LEVEL` to `verbose` or `debug`:
+
+```bash
+# Options are 'fatal', 'error', 'warn', 'info', 'verbose', 'debug', 'trace'
+LOG_LEVEL=debug aztec start --sandbox
+```
+
+and start the sandbox normally.
+
+You can specify different log levels for different services.
+
+For example: `LOG_LEVEL="verbose;info:sequencer"` will use verbose logging for everything except the `sequencer` service, which will use the `info` level.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/sandbox-errors.md b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/sandbox-errors.md
new file mode 100644
index 000000000000..a43faed0196f
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/debugging/sandbox-errors.md
@@ -0,0 +1,200 @@
+---
+title: Aztec Sandbox Errors
+tags: [sandbox]
+---
+
+import Disclaimer from '@site/src/components/Disclaimers/\_wip_disclaimer.mdx';
+
+
+
+This section contains a list of errors you may encounter when using Aztec Sandbox and an explanation of each of them.
+
+## Circuit Errors
+
+**To prevent bloating this doc, here is a list of some of the common errors.**
+
+### Kernel Circuits
+
+We have several versions of public and private kernels as explained in [the circuits section in the concepts](../../../aztec/concepts/advanced/circuits/index.md). Certain things are only possible in certain versions of the circuits. So always ensure that the right version is being used for proof generation. For example, there is a specific version of the public kernel that only works if the previous kernel iteration was a private kernel. Similarly there is one that only works if the previous kernel was public.
+
+Remember that for each function call (i.e. each item in the call stack), there is a new kernel iteration that gets run.
+
+#### 2002 - PRIVATE_KERNEL\_\_INVALID_CONTRACT_ADDRESS
+
+Cannot call contract at address(0x0) privately.
+This error may also happen when you deploy a new contract and the contract data hash is inconsistent to the expected contract address.
+
+#### 2005 - PRIVATE_KERNEL\_\_NEW_NOTE_HASHES_PROHIBITED_IN_STATIC_CALL
+
+For static calls, new note hashes aren't allowed
+
+#### 2006 - PRIVATE_KERNEL\_\_NEW_NULLIFIERS_PROHIBITED_IN_STATIC_CALL
+
+For static calls, new nullifiers aren't allowed
+
+#### 2009 - PRIVATE_KERNEL\_\_NON_PRIVATE_FUNCTION_EXECUTED_WITH_PRIVATE_KERNEL
+
+You cannot execute a public Aztec.nr function in the private kernel
+
+#### 2011 - PRIVATE_KERNEL\_\_UNSUPPORTED_OP
+
+You are trying to do something that is currently unsupported in the private kernel. If this is a blocker feel free to open up an issue on our monorepo [aztec-packages (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/master) or reach out to us on discord
+
+Note that certain operations are unsupported on certain versions of the private kernel. Eg static calls are allowed for all but the initial iteration of the private kernel (which initializes the kernel for subsequent function calls).
+
+#### 2012 - PRIVATE_KERNEL\_\_CONTRACT_ADDRESS_MISMATCH
+
+For the initial iteration of the private kernel, only the expected Aztec.nr contract should be the entrypoint. Static and delegate calls are not allowed in the initial iteration.
+
+#### 2013 - PRIVATE_KERNEL\_\_NON_PRIVATE_KERNEL_VERIFIED_WITH_PRIVATE_KERNEL
+
+The previous kernel iteration within the private kernel must also be private
+
+#### 2014 - PRIVATE_KERNEL\_\_CONSTRUCTOR_EXECUTED_IN_RECURSION
+
+A constructor must be executed as the first tx in the recursion i.e. a constructor call must be the first item in the call stack i.e. it can be executed in the first kernel iteration but not in subsequent ones. This also means you can't have a contract deploy another contract yet on Aztec.
+
+#### 2017 - PRIVATE_KERNEL\_\_USER_INTENT_MISMATCH_BETWEEN_TX_REQUEST_AND_CALL_STACK_ITEM
+
+Confirms that the TxRequest (user's intent) matches the private call being executed. This error may happen when:
+
+- origin address of tx_request doesn't match call_stack_item's contract_address
+- tx_request.function_data doesn't match call_stack_item.function_data
+- Aztec.nr function args passed to tx_request doesn't match args in the call_stack_item
+
+#### 2018 - PRIVATE_KERNEL\_\_READ_REQUEST_NOTE_HASH_TREE_ROOT_MISMATCH
+
+Given a read request and provided witness, we check that the merkle root obtained from the witness' sibling path and it's leaf is similar to the historical state root we want to read against. This is a sanity check to ensure we are reading from the right state.
+For a non transient read, we fetch the merkle root from the membership witnesses and the leaf index
+
+#### 2019 - PRIVATE_KERNEL\_\_TRANSIENT_READ_REQUEST_NO_MATCH
+
+A pending note hash is the one that is not yet added to note hash tree.
+A transient read is when we try to "read" a pending note hash.
+This error happens when you try to read a pending note hash that doesn't exist.
+
+#### 2021 - PRIVATE_KERNEL\_\_UNRESOLVED_NON_TRANSIENT_READ_REQUEST
+
+For a transient read request we skip merkle membership checks since pending note hashes aren't inserted into the note hash tree yet.
+But for non transient reads, we do a merkle membership check. Reads are done at the kernel circuit. So this checks that there are no already unresolved reads from a previous kernel iteration (other than non transient ones).
+
+#### 3001 - PUBLIC_KERNEL\_\_UNSUPPORTED_OP
+
+You are trying to do something that is currently unsupported in the public kernel. If this is a blocker feel free to open up an issue on our monorepo [aztec-packages (GitHub link)](https://github.com/AztecProtocol/aztec-packages/tree/master) or reach out to us on discord
+
+#### 3002 - PUBLIC_KERNEL\_\_PRIVATE_FUNCTION_NOT_ALLOWED
+
+Calling a private Aztec.nr function in a public kernel is not allowed.
+
+#### 3005 - PUBLIC_KERNEL\_\_NON_EMPTY_PRIVATE_CALL_STACK
+
+Public functions are executed after all the private functions are (see [private-public execution](../../../aztec/smart_contracts/functions/public_private_calls.md)). As such, private call stack must be empty when executing in the public kernel.
+
+#### 3011 - PUBLIC_KERNEL\_\_CALCULATED_PRIVATE_CALL_HASH_AND_PROVIDED_PRIVATE_CALL_HASH_MISMATCH
+
+When the hash stored at the top most of the call stack is different to the call stack item expected by the public kernel's inputs.
+
+#### 3012 - PUBLIC_KERNEL\_\_PUBLIC_CALL_STACK_MISMATCH
+
+Similar to above, except here we actually have the preimages to the call stack and hash to ensure they match.
+
+#### 3013 - PUBLIC_KERNEL\_\_CONTRACT_DEPLOYMENT_NOT_ALLOWED
+
+Public kernel doesn't allow contract deployments
+
+#### 3014 - PUBLIC_KERNEL\_\_CONSTRUCTOR_NOT_ALLOWED
+
+Aztec doesn't support public constructors.
+
+#### 3015 - PUBLIC_KERNEL\_\_CONTRACT_ADDRESS_INVALID
+
+Calling `address(0x0)` publicly is not permitted.
+
+#### 3016 - PUBLIC_KERNEL\_\_FUNCTION_SIGNATURE_INVALID
+
+Cannot call a contract with no function (i.e. function signature of 0) publicly.
+
+#### 3022 - PUBLIC_KERNEL\_\_PUBLIC_CALL_STACK_CONTRACT_STORAGE_UPDATES_PROHIBITED_FOR_STATIC_CALL
+
+For static calls, no contract storage change requests are allowed.
+
+#### 3024 - PUBLIC_KERNEL\_\_CALL_CONTEXT_CONTRACT_STORAGE_UPDATE_REQUESTS_PROHIBITED_FOR_STATIC_CALL
+
+Same as [3022](#3022---public_kernel__public_call_stack_contract_storage_updates_prohibited_for_static_call), no contract changes are allowed for static calls.
+
+#### 3026 - PUBLIC_KERNEL\_\_NOTE_HASHES_PROHIBITED_IN_STATIC_CALL
+
+For static calls, no new note hashes or nullifiers can be added to the state.
+
+#### 3027 - PUBLIC_KERNEL\_\_NEW_NULLIFIERS_PROHIBITED_IN_STATIC_CALL
+
+For static calls, no new note hashes or nullifiers can be added to the state.
+
+### Rollup circuit errors
+
+These are errors that occur when kernel proofs (transaction proofs) are sent to the rollup circuits to create an L2 block. See [rollup circuits](../../../aztec/concepts/advanced/circuits/rollup_circuits/index.md) for more information.
+
+#### 4007 - BASE\_\_INVALID_CHAIN_ID
+
+The L1 chain ID you used in your proof generation (for your private transaction) is different to what the rollup circuits expected. Double check against the global variables passed to noir and the config set in [Aztec's rollup contract (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/core/Rollup.sol) which are [read in by sequencer GitHub link](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/sequencer-client/src/global_variable_builder/global_builder.ts#L32) and subsequently passed in as inputs to the base rollup. When the sequencer submits the block to the rollup contracts, this is again sanity checked so ensure this is the same everywhere.
+
+#### 4008 - BASE\_\_INVALID_VERSION
+
+Same as [section 4007](#4007---base__invalid_chain_id) except the `version` refers to the version of the Aztec L2 instance.
+
+Some scary bugs like `4003 - BASE__INVALID_NULLIFIER_SUBTREE` and `4004 - BASE__INVALID_NULLIFIER_RANGE` which are to do malformed nullifier trees (see [Indexed Merkle Trees](../../../aztec/concepts/advanced/storage/indexed_merkle_tree.mdx)) etc may seem unrelated at a glance, but at a closer look may be because of some bug in an application's Aztec.nr code. Same is true for certain instances of `7008 - MEMBERSHIP_CHECK_FAILED`.
+
+### Generic circuit errors
+
+#### 7009 - ARRAY_OVERFLOW
+
+Circuits work by having a fixed size array. As such, we have limits on how many UTXOs can be created (aka "commitments") or destroyed/nullified (aka "nullifiers") in a transaction. Similarly we have limits on many reads or writes you can do, how many contracts you can create in a transaction. This error typically says that you have reached the current limits of what you can do in a transaction. Some examples when you may hit this error are:
+
+- too many new note hashes in one tx
+- too many new nullifiers in one tx
+ - Note: Nullifiers may be created even outside the context of your Aztec.nr code. Eg, when creating a contract, we add a nullifier for its address to prevent same address from ever occurring. Similarly, we add a nullifier for your transaction hash too.
+- too many private function calls in one tx (i.e. call stack size exceeded)
+- too many public function calls in one tx (i.e. call stack size exceeded)
+- too many new L2 to L1 messages in one tx
+- too many contracts created in one tx
+- too many public data update requests in one tx
+- too many public data reads in one tx
+- too many transient read requests in one tx
+- too many transient read request membership witnesses in one tx
+
+You can have a look at our current constants/limitations in [constants.nr (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr)
+
+#### 7008 - MEMBERSHIP_CHECK_FAILED
+
+Users may create a proof against a historical state in Aztec. The rollup circuits performs a merkle membership check to ensure this state existed at some point. If the historical state doesn't exist, you get this error. Some examples when you may hit this error are:
+
+- using invalid historical note hash tree state (aka historical commitments tree)
+- using invalid historical contracts data tree state
+- using invalid historical L1 to L2 message data tree state
+- inserting a subtree into the greater tree
+ - we make a smaller merkle tree of all the new note hashes/nullifiers etc that were created in a transaction or in a rollup and add it to the bigger state tree. Before inserting, we do a merkle membership check to ensure that the index to insert at is indeed an empty subtree (otherwise we would be overwriting state). This can happen when `next_available_leaf_index` in the state tree's snapshot is wrong (it is fetched by the sequencer from the archiver). The error message should reveal which tree is causing this issue
+ - nullifier tree related errors - The nullifier tree uses an [Indexed Merkle Tree](../../../aztec/concepts/advanced/storage/indexed_merkle_tree.mdx). It requires additional data from the archiver to know which is the nullifier in the tree that is just below the current nullifier before it can perform batch insertion. If the low nullifier is wrong, or the nullifier is in incorrect range, you may receive this error.
+
+---
+
+## Archiver Errors
+
+- "No non-nullified L1 to L2 message found for message hash \$\{messageHash.toString()\}"/"Tried to consume nonexistent L1-to-L2 message" - happens when the L1 to L2 message doesn't exist or is "pending", when the user has sent a message on L1 via the Inbox contract but it has yet to be included in an L2 block by the sequencer - the user has to wait for enough blocks to progress and for the archiver to sync the respective L2 block. You can get the sequencer to pick it up by doing 2 arbitrary transactions on L2 (eg. send DAI to yourself 2 times). This would give the sequencer a transaction to process and as a side effect it would consume 2 subtrees of new messages from the Inbox contract. 2 subtrees need to be consumed and not just 1 because there is a 1 block lag to prevent the subtree from changing when the sequencer is proving.
+
+- "Block number mismatch: expected \$\{l2BlockNum\} but got \$\{block.number\}" - The archiver keeps track of the next expected L2 block number. It throws this error if it got a different one when trying to sync with the rollup contract's events on L1.
+
+## Sequencer Errors
+
+- "\$\{treeName\} tree root mismatch" - The sequencer validates that the root of the tree matches the output of the circuit simulation. The tree name could be Public data tree, Note Hash Tree, Contract tree, Nullifier tree or the L1ToL2Message tree,
+
+- "\$\{treeName\} tree next available leaf index mismatch" - validating a tree's root is not enough. It also checks that the `next_available_leaf_index` is as expected. This is the next index we can insert new values into. Note that for the public data tree, this test is skipped since as it is a sparse tree unlike the others.
+
+- "Public call stack size exceeded" - In Aztec, the sequencer executes all enqueued public functions in a transaction (to prevent race conditions - see [private-public execution](../../../aztec/smart_contracts/functions/public_private_calls.md)). This error says there are too many public functions requested.
+
+- "Array size exceeds target length" - happens if you add more items than allowed by the constants set due to our circuit limitations (eg sending too many L2 to L1 messages or creating a function that exceeds the call stack length or returns more values than what Aztec.nr functions allow)
+
+- "Failed to publish block" - Happens when sequencer tries to submit its L2 block + proof to the rollup contract.
+
+## L1 Aztec Contract Errors
+
+Aztec's L1 contracts use custom errors in solidity. While it saves gas, it has a side effect of making it harder to decode when things go wrong. If you get an error when submitting an L2Block into our rollup contract or when interacting with our Inbox/Outbox contracts, you can use the [Errors.sol library (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/core/libraries/Errors.sol) to match the hex encoded error to the error name.
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/_category_.json b/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/_category_.json
new file mode 100644
index 000000000000..e51f342c74a7
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/_category_.json
@@ -0,0 +1,6 @@
+{
+ "label": "Developer Environment",
+ "position": 0,
+ "collapsible": true,
+ "collapsed": true
+}
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/cheat_codes.md b/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/cheat_codes.md
new file mode 100644
index 000000000000..f63a54ba678c
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/cheat_codes.md
@@ -0,0 +1,558 @@
+---
+title: Cheat Codes
+tags: [sandbox]
+sidebar_position: 4
+---
+
+import Disclaimer from "@site/src/components/Disclaimers/\_wip_disclaimer.mdx";
+
+## Introduction
+
+To help with testing, the sandbox is shipped with a set of cheatcodes.
+
+Cheatcodes allow you to change the time of the Aztec block, load certain state or more easily manipulate Ethereum instead of having to write dedicated RPC calls to anvil or hardhat.
+
+:::info Prerequisites
+If you aren't familiar with [Anvil (Foundry)](https://book.getfoundry.sh/anvil/), we recommend reading up on that since Aztec Sandbox uses Anvil as the local Ethereum instance.
+:::
+
+### Aims
+
+The guide will cover how to manipulate the state of the:
+
+- Ethereum blockchain;
+- Aztec network.
+
+### Dependencies
+
+For this guide, the following Aztec packages are used:
+
+- @aztec/aztec.js
+
+### Initialization
+
+```ts
+import { createPXEClient, CheatCodes } from "@aztec/aztec.js";
+const pxeRpcUrl = "http://localhost:8080";
+const ethRpcUrl = "http://localhost:8545";
+const pxe = createPXEClient(pxeRpcUrl);
+const cc = await CheatCodes.create(ethRpcUrl, pxe);
+```
+
+There are two properties of the CheatCodes class - `eth` and `aztec` for cheatcodes relating to the Ethereum blockchain (L1) and the Aztec network (L2) respectively.
+
+## Ethereum related cheatcodes
+
+These are cheatcodes exposed from anvil/hardhat conveniently wrapped for ease of use in the Sandbox.
+
+### Interface
+
+```ts
+// Fetch current block number of Ethereum
+public async blockNumber(): Promise
+
+// Fetch chain ID of the local Ethereum instance
+public async chainId(): Promise
+
+// Fetch current timestamp on Ethereum
+public async timestamp(): Promise
+
+// Mine a given number of blocks on Ethereum. Mines 1 block by default
+public async mine(numberOfBlocks = 1): Promise
+
+// Set the timestamp for the next block on Ethereum.
+public async setNextBlockTimestamp(timestamp: number): Promise
+
+// Dumps the current Ethereum chain state to a given file.
+public async dumpChainState(fileName: string): Promise
+
+// Loads the Ethereum chain state from a file. You may use `dumpChainState()` to save the state of the Ethereum chain to a file and later load it.
+public async loadChainState(fileName: string): Promise
+
+// Load the value at a storage slot of a contract address on Ethereum
+public async load(contract: EthAddress, slot: bigint): Promise
+
+// Set the value at a storage slot of a contract address on Ethereum (e.g. modify a storage variable on your portal contract or even the rollup contract).
+public async store(contract: EthAddress, slot: bigint, value: bigint): Promise
+
+// Computes the slot value for a given map and key on Ethereum. A convenient wrapper to find the appropriate storage slot to load or overwrite the state.
+public keccak256(baseSlot: bigint, key: bigint): bigint
+
+// Let you send transactions on Ethereum impersonating an externally owned or contract, without knowing the private key.
+public async startImpersonating(who: EthAddress): Promise
+
+// Stop impersonating an account on Ethereum that you are currently impersonating.
+public async stopImpersonating(who: EthAddress): Promise
+
+// Set the bytecode for a Ethereum contract
+public async etch(contract: EthAddress, bytecode: `0x${string}`): Promise
+
+// Get the bytecode for a Ethereum contract
+public async getBytecode(contract: EthAddress): Promise<`0x${string}`>
+```
+
+### blockNumber
+
+#### Function Signature
+
+```ts
+public async blockNumber(): Promise
+```
+
+#### Description
+
+Fetches the current Ethereum block number.
+
+#### Example
+
+```ts
+const blockNumber = await cc.eth.blockNumber();
+```
+
+### chainId
+
+#### Function Signature
+
+```ts
+public async chainId(): Promise
+```
+
+#### Description
+
+Fetches the Ethereum chain ID
+
+#### Example
+
+```ts
+const chainId = await cc.eth.chainId();
+```
+
+### timestamp
+
+#### Function Signature
+
+```ts
+public async timestamp(): Promise
+```
+
+#### Description
+
+Fetches the current Ethereum timestamp.
+
+#### Example
+
+```ts
+const timestamp = await cc.eth.timestamp();
+```
+
+### mine
+
+#### Function Signature
+
+```ts
+public async mine(numberOfBlocks = 1): Promise
+```
+
+#### Description
+
+Mines the specified number of blocks on Ethereum (default 1).
+
+#### Example
+
+```ts
+const blockNum = await cc.eth.blockNumber();
+await cc.eth.mine(10); // mines 10 blocks
+const newBlockNum = await cc.eth.blockNumber(); // = blockNum + 10.
+```
+
+### setNextBlockTimestamp
+
+#### Function Signature
+
+```ts
+public async setNextBlockTimestamp(timestamp: number): Promise
+```
+
+#### Description
+
+Sets the timestamp (unix format in seconds) for the next mined block on Ethereum.
+Time can only be set in the future.
+If you set the timestamp to a time in the past, this method will throw an error.
+
+#### Example
+
+```ts
+// // Set next block timestamp to 16 Aug 2023 10:54:30 GMT
+await cc.eth.setNextBlockTimestamp(1692183270);
+// next transaction you will do will have the timestamp as 1692183270
+```
+
+### dumpChainState
+
+#### Function Signature
+
+```ts
+public async dumpChainState(fileName: string): Promise
+```
+
+#### Description
+
+Dumps the current Ethereum chain state to a file.
+Stores a hex string representing the complete state of the chain in a file with the provided path. Can be re-imported into a fresh/restarted instance of Anvil to reattain the same state.
+When combined with `loadChainState()` cheatcode, it can be let you easily import the current state of mainnet into the Anvil instance of the sandbox.
+
+#### Example
+
+```ts
+await cc.eth.dumpChainState("chain-state.json");
+```
+
+### loadChainState
+
+#### Function Signature
+
+```ts
+public async loadChainState(fileName: string): Promise
+```
+
+#### Description
+
+Loads the Ethereum chain state from a file which contains a hex string representing an Ethereum state.
+When given a file previously written to by `cc.eth.dumpChainState()`, it merges the contents into the current chain state. Will overwrite any colliding accounts/storage slots.
+
+#### Example
+
+```ts
+await cc.eth.loadChainState("chain-state.json");
+```
+
+### load
+
+#### Function Signature
+
+```ts
+public async load(contract: EthAddress, slot: bigint): Promise
+```
+
+#### Description
+
+Loads the value at a storage slot of a Ethereum contract.
+
+#### Example
+
+```solidity
+contract LeetContract {
+ uint256 private leet = 1337; // slot 0
+}
+```
+
+```ts
+const leetContractAddress = EthAddress.fromString("0x1234...");
+const value = await cc.eth.load(leetContractAddress, BigInt(0));
+console.log(value); // 1337
+```
+
+### store
+
+#### Function Signature
+
+```ts
+public async store(contract: EthAddress, slot: bigint, value: bigint): Promise
+```
+
+#### Description
+
+Stores the value in storage slot on a Ethereum contract.
+
+#### Example
+
+```solidity
+contract LeetContract {
+ uint256 private leet = 1337; // slot 0
+}
+```
+
+```ts
+const leetContractAddress = EthAddress.fromString("0x1234...");
+await cc.eth.store(leetContractAddress, BigInt(0), BigInt(1000));
+const value = await cc.eth.load(leetContractAddress, BigInt(0));
+console.log(value); // 1000
+```
+
+### keccak256
+
+#### Function Signature
+
+```ts
+public keccak256(baseSlot: bigint, key: bigint): bigint
+```
+
+#### Description
+
+Computes the storage slot for a map key.
+
+#### Example
+
+```solidity
+contract LeetContract {
+ uint256 private leet = 1337; // slot 0
+ mapping(address => uint256) public balances; // base slot 1
+}
+```
+
+```ts
+// find the storage slot for key `0xdead` in the balance map.
+const address = BigInt("0x000000000000000000000000000000000000dead");
+const slot = cc.eth.keccak256(1n, address);
+// store balance of 0xdead as 100
+await cc.eth.store(contractAddress, slot, 100n);
+```
+
+### startImpersonating
+
+#### Function Signature
+
+```ts
+public async startImpersonating(who: EthAddress): Promise
+```
+
+#### Description
+
+Start impersonating an Ethereum account.
+This allows you to use this address as a sender.
+
+#### Example
+
+```ts
+await cc.eth.startImpersonating(EthAddress.fromString(address));
+```
+
+### stopImpersonating
+
+#### Function Signature
+
+```ts
+public async stopImpersonating(who: EthAddress): Promise
+```
+
+#### Description
+
+Stop impersonating an Ethereum account.
+Stops an active impersonation started by startImpersonating.
+
+#### Example
+
+```ts
+await cc.eth.stopImpersonating(EthAddress.fromString(address));
+```
+
+### getBytecode
+
+#### Function Signature
+
+```ts
+public async getBytecode(contract: EthAddress): Promise<`0x${string}`>
+```
+
+#### Description
+
+Get the bytecode for an Ethereum contract.
+
+#### Example
+
+```ts
+const bytecode = await cc.eth.getBytecode(contract); // 0x6080604052348015610010...
+```
+
+### etch
+
+#### Function Signature
+
+```ts
+public async etch(contract: EthAddress, bytecode: `0x${string}`): Promise
+```
+
+#### Description
+
+Set the bytecode for an Ethereum contract.
+
+#### Example
+
+```ts
+const bytecode = `0x6080604052348015610010...`;
+await cc.eth.etch(contract, bytecode);
+console.log(await cc.eth.getBytecode(contract)); // 0x6080604052348015610010...
+```
+
+## Aztec related cheatcodes
+
+These are cheatcodes specific to manipulating the state of Aztec rollup.
+
+### Interface
+
+```ts
+// Get the current aztec block number
+public async blockNumber(): Promise
+
+// Set time of the next execution on aztec. It also modifies time on Ethereum for next execution and stores this time as the last rollup block on the rollup contract.
+public async warp(to: number): Promise
+
+// Loads the value stored at the given slot in the public storage of the given contract.
+public async loadPublic(who: AztecAddress, slot: Fr | bigint): Promise
+
+// Loads the value stored at the given slot in the private storage of the given contract.
+public async loadPrivate(owner: AztecAddress, contract: AztecAddress, slot: Fr | bigint): Promise
+
+// Computes the slot value for a given map and key.
+public computeSlotInMap(baseSlot: Fr | bigint, key: Fr | bigint): Fr
+```
+
+### blockNumber
+
+#### Function Signature
+
+```ts
+public async blockNumber(): Promise
+```
+
+#### Description
+
+Get the current aztec block number.
+
+#### Example
+
+```ts
+const blockNumber = await cc.aztec.blockNumber();
+```
+
+### warp
+
+#### Function Signature
+
+```ts
+public async warp(to: number): Promise
+```
+
+#### Description
+
+Sets the time on Ethereum and the time of the next block on Aztec.
+Like with the corresponding Ethereum cheatcode, time can only be set in the future, not the past.
+Otherwise, it will throw an error.
+
+#### Example
+
+```ts
+const timestamp = await cc.eth.timestamp();
+const newTimestamp = timestamp + 100_000_000;
+await cc.aztec.warp(newTimestamp);
+// any Aztec.nr contract calls that make use of current timestamp
+// and is executed in the next rollup block will now read `newTimestamp`
+```
+
+### computeSlotInMap
+
+#### Function Signature
+
+```ts
+public computeSlotInMap(baseSlot: Fr | bigint, key: Fr | bigint): Fr
+```
+
+#### Description
+
+Compute storage slot for a map key.
+The baseSlot is specified in the Aztec.nr contract.
+
+#### Example
+
+```rust
+#[storage]
+struct Storage {
+ balances: Map>,
+}
+
+contract Token {
+ ...
+}
+```
+
+```ts
+const slot = cc.aztec.computeSlotInMap(1n, key);
+```
+
+### loadPublic
+
+#### Function Signature
+
+```ts
+public async loadPublic(who: AztecAddress, slot: Fr | bigint): Promise
+```
+
+#### Description
+
+Loads the value stored at the given slot in the public storage of the given contract.
+
+Note: One Field element occupies a storage slot. Hence, structs with multiple field elements will be spread over multiple sequential slots. Using loadPublic will only load a single field of the struct (depending on the size of the attributes within it).
+
+#### Example
+
+```rust
+#[storage]
+struct Storage {
+ balances: Map>,
+}
+
+contract Token {
+ ...
+}
+```
+
+```ts
+const address = AztecAddress.fromString("0x123...");
+const slot = cc.aztec.computeSlotInMap(1n, key);
+const value = await cc.aztec.loadPublic(address, slot);
+```
+
+### loadPrivate
+
+#### Function Signature
+
+```ts
+public async loadPrivate(owner: AztecAddress, contract: AztecAddress, slot: Fr | bigint): Promise
+```
+
+#### Description
+
+Loads the value stored at the given slot in the private storage of the given contract.
+
+Note: One Field element occupies a storage slot. Hence, structs with multiple field elements will be spread over multiple sequential slots. Using loadPublic will only load a single field of the struct (depending on the size of the attributes within it).
+
+#### Example
+
+```typescript title="load_private_cheatcode" showLineNumbers
+const mintAmount = 100n;
+
+await mintTokensToPrivate(token, wallet, admin, mintAmount);
+await token.methods.sync_notes().simulate();
+
+const balancesAdminSlot = await cc.aztec.computeSlotInMap(TokenContract.storage.balances.slot, admin);
+
+// check if note was added to pending shield:
+const notes = await cc.aztec.loadPrivate(admin, token.address, balancesAdminSlot);
+
+// @note If you get pain for dinner, this guys is the reason.
+// Assuming that it is still testing the token contract, you need to look at the balances,
+// and then the type of note, currently a `UintNote` which stores fields: [owner, randomness, amount]
+const values = notes.map(note => note.items[2]);
+const balance = values.reduce((sum, current) => sum + current.toBigInt(), 0n);
+expect(balance).toEqual(mintAmount);
+```
+> Source code: yarn-project/end-to-end/src/e2e_cheat_codes.test.ts#L181-L198
+
+
+## Participate
+
+Keep up with the latest discussion and join the conversation in the [Aztec forum](https://discourse.aztec.network).
+
+You can also use the above link to request more cheatcodes.
+
+
diff --git a/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/cli_reference.md b/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/cli_reference.md
new file mode 100644
index 000000000000..5b066ae76734
--- /dev/null
+++ b/docs/versioned_docs/version-v0.86.0/developers/reference/environment_reference/cli_reference.md
@@ -0,0 +1,1393 @@
+---
+title: CLI Reference
+tags: [sandbox]
+sidebar_position: 2
+---
+
+This reference guide provides documentation for the Aztec CLI commands (`aztec`) and their options. The CLI is a powerful tool for interacting with the Aztec network, managing accounts, deploying contracts, and more.
+
+Consider using the [`aztec-wallet`](./cli_wallet_reference.md) for account related or interacting with an existing network (e.g. testnet).
+
+## Overview
+
+The Aztec CLI provides commands for:
+
+- **Starting and Testing**: Starting the Aztec Sandbox and running tests
+- **Account Management**: Creating, deploying, and managing Aztec accounts
+- **Contract Operations**: Deploying, interacting with, and managing smart contracts
+- **Network Information**: Querying node and network status
+- **Transaction Management**: Sending, canceling, and querying transactions
+- **Data Retrieval**: Accessing logs and contract data
+- **Development Tools**: Profiling, debugging, and code generation
+- **L1 Integration**: Managing L1 contracts and bridges
+- **Governance**: Participating in protocol governance
+- **P2P Network**: Managing peer-to-peer network configuration
+- **Utilities**: Various helper commands for development
+
+Each command section includes detailed options and examples of usage. The documentation is organized to help you quickly find the commands you need for your specific use case.
+
+Note: Most commands accept a `--rpc-url` option to specify the Aztec node URL, and many accept fee-related options for gas limit and price configuration.
+
+## Common Commands
+
+- [`aztec get-node-info`](#get-node-info)
+- [`aztec get-l1-addresses`](#get-l1-addresses)
+- [`aztec get-block`](#get-block)
+- [`aztec start --pxe`](#pxe-options)
+
+Example usage:
+
+```bash
+# Start the sandbox
+aztec start --sandbox
+
+# Start with custom ports
+aztec start --sandbox --port 8081
+
+# Start specific components
+aztec start --pxe
+
+# Start with Ethereum options
+aztec start --port 8081 --pxe --pxe.nodeUrl=$BOOTNODE --pxe.proverEnabled false --l1-chain-id 31337
+
+# Start with storage options
+aztec start --node --data-directory /path/to/data --data-store-map-size-kb 134217728 --registry-address
+```
+
+## Starting
+
+### start
+
+Initiates various Aztec modules. It can be used to start individual components or the entire Aztec Sandbox.
+
+```bash
+aztec start [options]
+```
+
+Options:
+
+#### Sandbox Options
+
+- `-sb, --sandbox`: Starts the Aztec Sandbox.
+- `--sandbox.noPXE [value]`: Do not expose PXE service on sandbox start. (default: false)
+
+#### Network Options
+
+- `--network `: Network to run Aztec on, e.g. `alpha-testnet`. By default connects to sandbox (local network)
+
+#### API Options
+
+- `-p, --port `: Port to run the Aztec Services on (default: 8080).
+- `--admin-port `: Port to run admin APIs of Aztec Services on (default: 8880).
+- `--api-prefix `: Prefix for API routes on any service that is started.
+
+#### Ethereum Options
+
+- `--l1-rpc-urls `: List of URLs of Ethereum RPC nodes that services will connect to (comma separated) (default: http://localhost:8545).
+- `--l1-chain-id `: The L1 chain ID (default: 31337).
+- `--l1-mnemonic `: Mnemonic for L1 accounts. Will be used if no publisher private keys are provided (default: test test test test test test test test test test test junk).
+- `--l1-consensus-host-urls `: List of URLs of the Ethereum consensus nodes that services will connect to (comma separated).
+- `--l1-consensus-host-api-keys `: List of API keys for the corresponding Ethereum consensus nodes.
+- `--l1-consensus-host-api-key-headers `: List of API key headers for the corresponding Ethereum consensus nodes. If not set, the api key for the corresponding node will be appended to the URL as `?key=`.
+
+#### Storage Options
+
+- `--data-directory `: Where to store data for services. If not set, will store temporarily.
+- `--data-store-map-size-kb `: The maximum possible size of the data store DB in KB. Can be overridden by component-specific options.
+
+#### L1 Contract Addresses
+
+- `--rollup-address `: The deployed L1 rollup contract address.
+- `--registry-address `: The deployed L1 registry contract address.
+- `--inbox-address `: The deployed L1 -> L2 inbox contract address.
+- `--outbox-address `: The deployed L2 -> L1 outbox contract address.
+- `--fee-juice-address `: The deployed L1 Fee Juice contract address.
+- `--staking-asset-address `: The deployed L1 Staking Asset contract address.
+- `--fee-juice-portal-address `: The deployed L1 Fee Juice portal contract address.
+
+#### Aztec Node Options
+
+- `--node`: Starts Aztec Node with options.
+- `--node.archiver-url `: URL for an archiver service.
+- `--node.deploy-aztec-contracts`: Deploys L1 Aztec contracts before starting the node. Needs mnemonic or private key to be set.
+- `--node.deploy-aztec-contracts-salt `: Numeric salt for deploying L1 Aztec contracts before starting the node. Needs mnemonic or private key to be set. Implies --node.deploy-aztec-contracts.
+- `--node.assume-proven-through-block-number `: Cheats the rollup contract into assuming every block until this one is proven. Useful for speeding up bootstraps.
+- `--node.publisher-private-key `: Private key of account for publishing L1 contracts.
+- `--node.world-state-block-check-interval-ms `: Frequency in which to check for blocks in ms (default: 100).
+- `--node.sync-mode `: Set sync mode to `full` to always sync via L1, `snapshot` to download a snapshot if there is no local data, `force-snapshot` to download even if there is local data (default: snapshot).
+- `--node.snapshots-url `: Base URL for downloading snapshots for snapshot sync.
+
+##### Example Usage
+
+Here is an example of how to start a node that connects to the alpha-testnet.
+
+```bash
+aztec-up 0.85.0-alpha-testnet.2
+
+export DATA_DIRECTORY=/any/directory/to/store/node/data
+export BLOB_SINK_URL=
+export LOG_LEVEL=info
+export IP=Your_IP_address_here
+
+aztec start --node --network alpha-testnet
+ --l1-rpc-urls ...
+ --l1-consensus-host-urls ...
+ --l1-consensus-host-api-keys ...
+ --l1-consensus-host-api-key-headers X...
+ --p2p.p2pIp $IP
+ --archiver
+```
+
+#### P2P Subsystem Options
+
+- `--p2p-enabled [value]`: Enable P2P subsystem.
+- `--p2p.block-check-interval-ms `: The frequency in which to check for new L2 blocks (default: 100).
+- `--p2p.debug-disable-colocation-penalty `: DEBUG: Disable colocation penalty - NEVER set to true in production.
+- `--p2p.peer-check-interval-ms `: The frequency in which to check for new peers (default: 30000).
+- `--p2p.l2-queue-size `: Size of queue of L2 blocks to store (default: 1000).
+- `--p2p.listen-address `: The listen address. ipv4 address (default: 0.0.0.0).
+- `--p2p.p2p-port `: The port for the P2P service (default: 40400).
+- `--p2p.p2p-ip `: The IP address for the P2P service. ipv4 address.
+- `--p2p.peer-id-private-key `: An optional peer id private key. If blank, will generate a random key.
+- `--p2p.peer-id-private-key-path `: An optional path to store generated peer id private keys.
+- `--p2p.bootstrap-nodes `: A list of bootstrap peer ENRs to connect to. Separated by commas.
+- `--p2p.bootstrap-node-enr-version-check `: Whether to check the version of the bootstrap node ENR.
+- `--p2p.bootstrap-nodes-as-full-peers `: Whether to consider our configured bootnodes as full peers.
+- `--p2p.max-peer-count `: The maximum number of peers to connect to (default: 100).
+- `--p2p.query-for-ip `: If announceUdpAddress or announceTcpAddress are not provided, query for the IP address of the machine. Default is false.
+- `--p2p.keep-proven-txs-in-pool-for `: How many blocks have to pass after a block is proven before its txs are deleted (zero to delete immediately once proven).
+- `--p2p.keep-attestations-in-pool-for `: How many slots to keep attestations for (default: 96).
+- `--p2p.gossipsub-interval `: The interval of the gossipsub heartbeat to perform maintenance tasks (default: 700).
+- `--p2p.gossipsub-d `: The D parameter for the gossipsub protocol (default: 8).
+- `--p2p.gossipsub-dlo `: The Dlo parameter for the gossipsub protocol (default: 4).
+- `--p2p.gossipsub-dhi `: The Dhi parameter for the gossipsub protocol (default: 12).
+- `--p2p.gossipsub-dlazy `: The Dlazy parameter for the gossipsub protocol (default: 8).
+- `--p2p.gossipsub-flood-publish `: Whether to flood publish messages. - For testing purposes only (default: true).
+- `--p2p.gossipsub-mcache-length `: The number of gossipsub interval message cache windows to keep (default: 6).
+- `--p2p.gossipsub-mcache-gossip `: How many message cache windows to include when gossiping with other pears (default: 3).
+- `--p2p.gossipsub-tx-topic-weight `: The weight of the tx topic for the gossipsub protocol (default: 1).
+- `--p2p.gossipsub-tx-invalid-message-deliveries-weight `: The weight of the tx invalid message deliveries for the gossipsub protocol (default: -20).
+- `--p2p.gossipsub-tx-invalid-message-deliveries-decay `: Determines how quickly the penalty for invalid message deliveries decays over time. Between 0 and 1 (default: 0.5).
+- `--p2p.peer-penalty-values `: The values for the peer scoring system. Passed as a comma separated list of values in order: low, mid, high tolerance errors (default: 2,10,50).
+- `--p2p.double-spend-severe-peer-penalty-window `: The "age" (in L2 blocks) of a tx after which we heavily penalize a peer for sending it (default: 30).
+- `--p2p.block-request-batch-size `: The number of blocks to fetch in a single batch (default: 20).
+- `--p2p.archived-tx-limit `: The number of transactions that will be archived. If the limit is set to 0 then archiving will be disabled.
+- `--p2p.trusted-peers `: A list of trusted peers ENRs. Separated by commas.
+- `--p2p.p2p-store-map-size-kb `: The maximum possible size of the P2P DB in KB. Overwrites the general dataStoreMapSizeKB.
+- `--p2p.tx-public-setup-allow-list `: The list of functions calls allowed to run in setup.
+- `--p2p.max-tx-pool-size `: The maximum cumulative tx size of pending txs (in bytes) before evicting lower priority txs (default: 100000000).
+- `--p2p.overall-request-timeout-ms `: The overall timeout for a request response operation (default: 4000).
+- `--p2p.individual-request-timeout-ms `: The timeout for an individual request response peer interaction (default: 2000).
+- `--p2p.rollup-version `: The version of the rollup.
+
+#### Telemetry Options
+
+- `--tel.metrics-collector-url `: The URL of the telemetry collector for metrics.
+- `--tel.traces-collector-url `: The URL of the telemetry collector for traces.
+- `--tel.logs-collector-url `: The URL of the telemetry collector for logs.
+- `--tel.otel-collect-interval-ms `: The interval at which to collect metrics (default: 60000).
+- `--tel.otel-export-timeout-ms `: The timeout for exporting metrics (default: 30000).
+- `--tel.otel-exclude-metrics `: A list of metric prefixes to exclude from export.
+
+#### PXE Options
+
+- `--pxe`: Starts Aztec PXE with options.
+- `--pxe.data-store-map-size-kb `: DB mapping size to be applied to all key/value stores (default: 134217728).
+- `--pxe.rollup-version `: The version of the rollup.
+- `--pxe.l2-block-batch-size `: Maximum amount of blocks to pull from the stream in one request when synchronizing (default: 200).
+- `--pxe.bb-binary-path `: Path to the BB binary.
+- `--pxe.bb-working-directory `: Working directory for the BB binary.
+- `--pxe.bb-skip-cleanup `: True to skip cleanup of temporary files for debugging purposes.
+- `--pxe.prover-enabled `: Enable real proofs (default: true).
+- `--pxe.network `: External Aztec network to connect to (e.g. devnet).
+- `--pxe.api-key `: API Key required by the external network's node.
+- `--pxe.node-url `: Custom Aztec Node URL to connect to.
+
+##### Example Usage
+
+```bash
+aztec start --port 8081 --pxe --pxe.nodeUrl=$BOOTNODE --pxe.proverEnabled true --l1-chain-id $L1_CHAIN_ID
+```
+
+#### Archiver Options
+
+- `--archiver`: Starts Aztec Archiver with options.
+- `--archiver.blob-sink-url `: The URL of the blob sink.
+- `--archiver.archive-api-url `: The URL of the archive API.
+- `--archiver.archiver-polling-interval-ms `: The polling interval in ms for retrieving new L2 blocks and encrypted logs (default: 500).
+- `--archiver.archiver-batch-size `: The number of L2 blocks the archiver will attempt to download at a time (default: 100).
+- `--archiver.max-logs `: The max number of logs that can be obtained in 1 "getPublicLogs" call (default: 1000).
+- `--archiver.archiver-store-map-size-kb `: The maximum possible size of the archiver DB in KB. Overwrites the general dataStoreMapSizeKB.
+- `--archiver.rollup-version `: The version of the rollup.
+- `--archiver.viem-polling-interval-ms `: The polling interval viem uses in ms (default: 1000).
+- `--archiver.ethereum-slot-duration `: How many seconds an L1 slot lasts (default: 12).
+- `--archiver.aztec-slot-duration `: How many seconds an L2 slots lasts (must be multiple of ethereum slot duration) (default: 24).
+- `--archiver.aztec-epoch-duration `: How many L2 slots an epoch lasts (maximum AZTEC_MAX_EPOCH_DURATION) (default: 16).
+- `--archiver.aztec-target-committee-size `: The target validator committee size (default: 48).
+- `--archiver.aztec-proof-submission-window `: The number of L2 slots that a proof for an epoch can be submitted in, starting from the beginning of the epoch (default: 31).
+- `--archiver.minimum-stake `: The minimum stake for a validator (default: 100000000000000000000).
+- `--archiver.slashing-quorum `: The slashing quorum (default: 6).
+- `--archiver.slashing-round-size