-You can permissionlessly launch an L3 Orbit chain that settles to one of Arbitrum's Layer 2 (L2) chains. There is an emerging licensing structure will soon make it possible to permissionlessly launch an L2 Orbit chain that settles directly to Ethereum. Please get in touch with the Arbitrum Foundation or Offchain Labs for more information.
+You can launch any Orbit chain permissionlessly.
-Note that launching a testnet doesn't require any license.
+Nitro is licensed under a Business Source license, similar to DeFi protocols like Uniswap and Aave, among others. This license contains an Additional Use Grant that permits the permissionless deployment of Nitro software on blockchains that settle to Arbitrum One or Nova.
+
+
+
+However, Orbit chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the AEP.
+
+
+
+
diff --git a/arbitrum-docs/partials/_troubleshooting-stylus-partial.mdx b/arbitrum-docs/partials/_troubleshooting-stylus-partial.mdx
index 92f712d59..d701ee5e5 100644
--- a/arbitrum-docs/partials/_troubleshooting-stylus-partial.mdx
+++ b/arbitrum-docs/partials/_troubleshooting-stylus-partial.mdx
@@ -54,7 +54,7 @@ No. Stylus contracts are compiled down to WASM. The user writes a program in Rus
### How is a Stylus contract deployed?
-Stylus contracts are deployed on chain as a blob of bytes, just like EVM ones. The only difference is that when the contract is executed, instead of invoking the EVM, we invoke a separate WASM runtime. Note that a special EOF-inspired prefix distinguishes Stylus contracts from traditional EVM contracts: when a contract's bytecode starts with the magic 0xEF000000
prefix, it's a Stylus WASM contract.
+Stylus contracts are deployed on chain as a blob of bytes, just like EVM ones. The only difference is that when the contract is executed, instead of invoking the EVM, we invoke a separate WASM runtime. Note that a special EOF-inspired prefix distinguishes Stylus contracts from traditional EVM contracts: when a contract's bytecode starts with the magic 0xEFF00000
prefix, it's a Stylus WASM contract.
diff --git a/arbitrum-docs/run-arbitrum-node/01-overview.md b/arbitrum-docs/run-arbitrum-node/01-overview.mdx
similarity index 62%
rename from arbitrum-docs/run-arbitrum-node/01-overview.md
rename to arbitrum-docs/run-arbitrum-node/01-overview.mdx
index e42717825..8858ada07 100644
--- a/arbitrum-docs/run-arbitrum-node/01-overview.md
+++ b/arbitrum-docs/run-arbitrum-node/01-overview.mdx
@@ -11,8 +11,8 @@ In order to be able to _interact with_ or _build applications on_ any of the Arb
Here, you can find resources that help you run different types of Arbitrum nodes:
-- Step-by-step instructions for running different Arbitrum nodes, including [full Nitro node](/run-arbitrum-node/03-run-full-node.md), [full Classic node](/run-arbitrum-node/more-types/03-run-classic-node.md), [local full chain simulation](/run-arbitrum-node/04-run-local-full-chain-simulation.md), [Nitro dev node](/run-arbitrum-node/run-nitro-dev-node.mdx), [feed relay](/run-arbitrum-node/sequencer/01-run-feed-relay.md), and [validator](/run-arbitrum-node/more-types/02-run-validator-node.md)
-- Step-by-step instructions for how to [read the sequencer feed](/run-arbitrum-node/sequencer/02-read-sequencer-feed.md), [build the Nitro locally](/run-arbitrum-node/nitro/01-build-nitro-locally.md) and [run the sequencer coordinator manager UI tool](/run-arbitrum-node/sequencer/03-run-sequencer-coordination-manager.md)
-- Step-by-step instructions for [how to configure a Data Availability Committee](/run-arbitrum-node/data-availability-committees/01-get-started.md)
-- [Troubleshooting page](/run-arbitrum-node/06-troubleshooting.md)
-- [Frequently asked questions](/node-running/faq.md)
+- Step-by-step instructions for running different Arbitrum nodes, including [full Nitro node](/run-arbitrum-node/03-run-full-node.mdx), [full Classic node](/run-arbitrum-node/more-types/03-run-classic-node.mdx), [local full chain simulation](/run-arbitrum-node/04-run-local-full-chain-simulation.mdx), [Nitro dev node](/run-arbitrum-node/run-nitro-dev-node.mdx), [feed relay](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx), and [validator](/run-arbitrum-node/more-types/02-run-validator-node.mdx)
+- Step-by-step instructions for how to [read the sequencer feed](/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx), [build the Nitro locally](/run-arbitrum-node/nitro/01-build-nitro-locally.mdx) and [run the sequencer coordinator manager UI tool](/run-arbitrum-node/sequencer/03-run-sequencer-coordination-manager.mdx)
+- Step-by-step instructions for [how to configure a Data Availability Committee](/run-arbitrum-node/data-availability-committees/01-get-started.mdx)
+- [Troubleshooting page](/run-arbitrum-node/06-troubleshooting.mdx)
+- [Frequently asked questions](/node-running/faq.mdx)
diff --git a/arbitrum-docs/run-arbitrum-node/02-quickstart.md b/arbitrum-docs/run-arbitrum-node/02-quickstart.mdx
similarity index 96%
rename from arbitrum-docs/run-arbitrum-node/02-quickstart.md
rename to arbitrum-docs/run-arbitrum-node/02-quickstart.mdx
index b835576e8..2a60c838d 100644
--- a/arbitrum-docs/run-arbitrum-node/02-quickstart.md
+++ b/arbitrum-docs/run-arbitrum-node/02-quickstart.mdx
@@ -33,19 +33,19 @@ When it comes to interacting with the Arbitrum network, users have the option to
- Reduced trust requirements: By running a full node, users can interact with the Arbitrum network without relying on third-party services or infrastructure. This reduces the need to trust external entities and mitigates the risk of potential centralized failures or vulnerabilities.
- Lower resource requirements: Compared to archive nodes, full nodes generally require fewer resources such as storage and computational power. This makes them more accessible to users with limited hardware capabilities or those operating on resource-constrained environments.
-For detailed instructions on how to run an Arbitrum full node, see [here](/run-arbitrum-node/03-run-full-node.md).
+For detailed instructions on how to run an Arbitrum full node, see [here](/run-arbitrum-node/03-run-full-node.mdx).
### Considerations for running an Arbitrum archive node
While full nodes offer numerous advantages, there are situations where running an archive node may be more appropriate. Archive nodes store the complete history of the Arbitrum network, making them suitable for users who require extensive historical data access or advanced analytical purposes. However, it's important to note that archive nodes are more resource-intensive, requiring significant storage capacity and computational power.
-For detailed instructions on how to run an Arbitrum archive node, see [here](/run-arbitrum-node/more-types/01-run-archive-node.md).
+For detailed instructions on how to run an Arbitrum archive node, see [here](/run-arbitrum-node/more-types/01-run-archive-node.mdx).
### Considerations for running an Arbitrum classic node
-The significance of running an Arbitrum classic node is mainly applicable to individuals with specific needs for an archive node and access to classic-related commands. More details can be found [here](/run-arbitrum-node/more-types/01-run-archive-node.md).
+The significance of running an Arbitrum classic node is mainly applicable to individuals with specific needs for an archive node and access to classic-related commands. More details can be found [here](/run-arbitrum-node/more-types/01-run-archive-node.mdx).
-For detailed instructions on how to run an Arbitrum classic node, see [here](/run-arbitrum-node/more-types/03-run-classic-node.md).
+For detailed instructions on how to run an Arbitrum classic node, see [here](/run-arbitrum-node/more-types/03-run-classic-node.mdx).
### Considerations for running a feed relay
@@ -53,4 +53,4 @@ If you are running a single node, there is no requirement to set up a feed relay
In the near future, feed endpoints will mandate compression using a custom dictionary. Therefore, if you plan to connect to a feed using anything other than a standard node, it is strongly advised to run a local feed relay. This will ensure that you have access to an uncompressed feed by default, maintaining optimal performance and compatibility.
-For detailed instructions on how to run a feed relay, see [here](/run-arbitrum-node/sequencer/01-run-feed-relay.md).
+For detailed instructions on how to run a feed relay, see [here](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx).
diff --git a/arbitrum-docs/run-arbitrum-node/03-run-full-node.md b/arbitrum-docs/run-arbitrum-node/03-run-full-node.mdx
similarity index 88%
rename from arbitrum-docs/run-arbitrum-node/03-run-full-node.md
rename to arbitrum-docs/run-arbitrum-node/03-run-full-node.mdx
index 50eebb6c8..20e0cd852 100644
--- a/arbitrum-docs/run-arbitrum-node/03-run-full-node.md
+++ b/arbitrum-docs/run-arbitrum-node/03-run-full-node.mdx
@@ -45,23 +45,23 @@ Even though there are alpha and beta versions of the ` for execution layer.
- - If the chain is running [ArbOS 20](/run-arbitrum-node/arbos-releases/arbos20.md), additionally use the parameter `--parent-chain.blob-client.beacon-url=` for consensus layer. You can find a list of beacon chain RPC providers [here](/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.md).
+ - If the chain is running [ArbOS 20](/run-arbitrum-node/arbos-releases/arbos20.mdx), additionally use the parameter `--parent-chain.blob-client.beacon-url=` for consensus layer. You can find a list of beacon chain RPC providers [here](/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.mdx).
- It must provide a standard layer 1 node RPC endpoint that you run yourself or from a node provider.
- - Note: historical blob data is required for chains running [ArbOS 20](/run-arbitrum-node/arbos-releases/arbos20.md) to properly sync up if they are new or have been offline for more than 18 days. This means the consensus layer RPC endpoint you use may also need to provide historical blob data. Please see [Special notes on ArbOS 20: Atlas support for EIP-4844](/run-arbitrum-node/arbos-releases/arbos20.md#special-notes-on-arbos-20-atlas-support-for-eip-4844) for more details.
+ - Note: historical blob data is required for chains running [ArbOS 20](/run-arbitrum-node/arbos-releases/arbos20.mdx) to properly sync up if they are new or have been offline for more than 18 days. This means the consensus layer RPC endpoint you use may also need to provide historical blob data. Please see [Special notes on ArbOS 20: Atlas support for EIP-4844](/run-arbitrum-node/arbos-releases/arbos20.mdx#special-notes-on-arbos-20-atlas-support-for-eip-4844) for more details.
- Note: this parameter was called `--l1.url` in versions prior to `v2.1.0`
- Note: 8545 is usually the default port for the execution layer. For the Beacon endpoint port, you should connect to the correct port set on your parent chain's consensus client.
- L2 chain ID or name
- - Use the parameter `--chain.id=` to set the L2 chain from its chain id. See [RPC endpoints and providers](/build-decentralized-apps/reference/01-node-providers.mdx#rpc-endpoints) for a list of Arbitrum chains and their respective L2 chain IDs.
+ - Use the parameter `--chain.id=` to set the L2 chain from its chain id. See [RPC endpoints and providers](/build-decentralized-apps/reference/01-node-providers.mdx) for a list of Arbitrum chains and their respective L2 chain IDs.
- Alternatively, you can use the parameter `--chain.name=` to set the L2 chain from its name (options are: `arb1`, `nova` and `sepolia-rollup`)
- Note: this parameter was called --l2.chain-id and only accepted chain IDs in versions before `v2.1.0`
diff --git a/arbitrum-docs/run-arbitrum-node/04-run-local-full-chain-simulation.md b/arbitrum-docs/run-arbitrum-node/04-run-local-full-chain-simulation.mdx
similarity index 99%
rename from arbitrum-docs/run-arbitrum-node/04-run-local-full-chain-simulation.md
rename to arbitrum-docs/run-arbitrum-node/04-run-local-full-chain-simulation.mdx
index ede8fe566..9c3e2aa5b 100644
--- a/arbitrum-docs/run-arbitrum-node/04-run-local-full-chain-simulation.md
+++ b/arbitrum-docs/run-arbitrum-node/04-run-local-full-chain-simulation.mdx
@@ -151,6 +151,6 @@ Do not use any of these addresses in a production environment.
Here, We show a list of the parameters that might be useful when running a local devnode. You can also use the flag `./test-node.bash --help` to get them.
-import OptionalDevNodeCLIFlagsPartial from '../partials/_local-devnet-flags.md';
+import OptionalDevNodeCLIFlagsPartial from '../partials/_local-devnet-flags.mdx';
diff --git a/arbitrum-docs/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.md b/arbitrum-docs/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.mdx
similarity index 98%
rename from arbitrum-docs/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.md
rename to arbitrum-docs/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.mdx
index 29473a83f..ae7fb37cd 100644
--- a/arbitrum-docs/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.md
+++ b/arbitrum-docs/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.mdx
@@ -11,7 +11,7 @@ Following [Ethereum's Dencun upgrade in March 2024](https://eips.ethereum.org/EI
### What does this mean for node operators?
-To run a node for an L2 Arbitrum chain (i.e. Arbitrum One, Arbitrum Nova, and L2 Orbit chains), your node will need access to blob data to sync up to the latest state of your Arbitrum L2 chain. Blob data on Ethereum is stored on the beacon chain and is inaccessible to the EVM, hence why dedicated RPC endpoints for the beacon chain will be required after the Dencun upgrade. You can find more details on node requirements in the [Run a full node guide](/run-arbitrum-node/03-run-full-node.md).
+To run a node for an L2 Arbitrum chain (i.e. Arbitrum One, Arbitrum Nova, and L2 Orbit chains), your node will need access to blob data to sync up to the latest state of your Arbitrum L2 chain. Blob data on Ethereum is stored on the beacon chain and is inaccessible to the EVM, hence why dedicated RPC endpoints for the beacon chain will be required after the Dencun upgrade. You can find more details on node requirements in the [Run a full node guide](/run-arbitrum-node/03-run-full-node.mdx).
Furthermore, new node operators joining a network or node operators who come online following an extended period of offline time will require access to _historical_ blob data to sync up to the latest state of their Arbitrum chain.
diff --git a/arbitrum-docs/run-arbitrum-node/06-troubleshooting.md b/arbitrum-docs/run-arbitrum-node/06-troubleshooting.mdx
similarity index 100%
rename from arbitrum-docs/run-arbitrum-node/06-troubleshooting.md
rename to arbitrum-docs/run-arbitrum-node/06-troubleshooting.mdx
diff --git a/arbitrum-docs/run-arbitrum-node/arbos-releases/01-overview.md b/arbitrum-docs/run-arbitrum-node/arbos-releases/01-overview.mdx
similarity index 95%
rename from arbitrum-docs/run-arbitrum-node/arbos-releases/01-overview.md
rename to arbitrum-docs/run-arbitrum-node/arbos-releases/01-overview.mdx
index 4e62df41e..9cc6dda08 100644
--- a/arbitrum-docs/run-arbitrum-node/arbos-releases/01-overview.md
+++ b/arbitrum-docs/run-arbitrum-node/arbos-releases/01-overview.mdx
@@ -23,13 +23,13 @@ import PublicPreviewBannerPartial from '../../node-running/partials/_upgrade-cad
ArbOS upgrades are carried out by the chain's owner; in the case of Arbitrum One and Nova, the owner is the Arbitrum DAO and so an upgrade will require a governance proposal and vote to pass to complete the upgrade. [This is an example of a Nitro release that contains an ArbOS version bump, specifically to ArbOS 11](https://github.com/OffchainLabs/nitro/releases/tag/v2.2.0).
-Visit [Inside Arbitrum Nitro](/how-arbitrum-works/inside-arbitrum-nitro.md) to learn more about Nitro's architecture; more information about ArbOS software releases is available on [the Arbitrum DAO forum](https://forum.arbitrum.foundation/t/arbitrum-arbos-upgrades/19695).
+Visit [Inside Arbitrum Nitro](/how-arbitrum-works/inside-arbitrum-nitro.mdx) to learn more about Nitro's architecture; more information about ArbOS software releases is available on [the Arbitrum DAO forum](https://forum.arbitrum.foundation/t/arbitrum-arbos-upgrades/19695).
## List of available ArbOS releases
-- [ArbOS 32 "Bianca"](/run-arbitrum-node/arbos-releases/arbos32.md)
-- [ArbOS 20 "Atlas"](/run-arbitrum-node/arbos-releases/arbos20.md)
-- [ArbOS 11](/run-arbitrum-node/arbos-releases/arbos11.md)
+- [ArbOS 32 "Bianca"](/run-arbitrum-node/arbos-releases/arbos32.mdx)
+- [ArbOS 20 "Atlas"](/run-arbitrum-node/arbos-releases/arbos20.mdx)
+- [ArbOS 11](/run-arbitrum-node/arbos-releases/arbos11.mdx)
## Naming and numbering scheme
diff --git a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos11.md b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos11.mdx
similarity index 84%
rename from arbitrum-docs/run-arbitrum-node/arbos-releases/arbos11.md
rename to arbitrum-docs/run-arbitrum-node/arbos-releases/arbos11.mdx
index 720f0dfd1..daafe8ab9 100644
--- a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos11.md
+++ b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos11.mdx
@@ -22,7 +22,7 @@ Formal release notes can be found [here](https://github.com/OffchainLabs/nitro/r
- [EIP-3855: PUSH0 instruction](https://eips.ethereum.org/EIPS/eip-3855)
- [EIP-3860: Limit and meter initcode](https://eips.ethereum.org/EIPS/eip-3860)
- [EIP-6049: Deprecate SELFDESTRUCT](https://eips.ethereum.org/EIPS/eip-6049)
-- Improvements and fixes for [retryable tickets](/how-arbitrum-works/arbos/l1-l2-messaging.md) to ensure that the fee calculation to redeem retryable tickets will take into account both the infrastructure fee and the network fee. The infrastructure fee is the minimum L2 base fee only, while the network fee collects L2 congestion charges. This is important for [AnyTrust chains](/how-arbitrum-works/inside-anytrust.md) like Arbitrum Nova because members of the Data Availability Committee (DAC) gets paid a percentage of the infrastructure fee but not the network fee. Previously, the calculations to determine the fee for redeeming retryable tickets did not consider the infrastructure fee.
+- Improvements and fixes for [retryable tickets](/how-arbitrum-works/arbos/l1-l2-messaging.mdx) to ensure that the fee calculation to redeem retryable tickets will take into account both the infrastructure fee and the network fee. The infrastructure fee is the minimum L2 base fee only, while the network fee collects L2 congestion charges. This is important for [AnyTrust chains](/how-arbitrum-works/inside-anytrust.mdx) like Arbitrum Nova because members of the Data Availability Committee (DAC) gets paid a percentage of the infrastructure fee but not the network fee. Previously, the calculations to determine the fee for redeeming retryable tickets did not consider the infrastructure fee.
- Fixes an issue where the [`ArbOwnerPublic` precompile](/build-decentralized-apps/precompiles/02-reference.mdx#arbownerpublic) returned the incorrect list of chain owners. This does not change the parties who are able to perform chain owner actions. As intended, only the Arbitrum DAO is able to take chain owner actions for Arbitrum One and Nova.
- Resolves an issue where the [`arbBlockHash` method](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys) would take up all the gas when reverting. The previous incorrect behavior meant that if a transaction calls `arbBlockHash` with an out-of-range block number, then the transaction would consume all the gas when reverting.
- Addition of the [`L1RewardReceipient`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) and [`L1RewardRate`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) precompile methods to view L1 pricing parameters and make it easier to view the current chain configuration.
diff --git a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos20.md b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos20.mdx
similarity index 99%
rename from arbitrum-docs/run-arbitrum-node/arbos-releases/arbos20.md
rename to arbitrum-docs/run-arbitrum-node/arbos-releases/arbos20.mdx
index 757430d3e..adfb3d807 100644
--- a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos20.md
+++ b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos20.mdx
@@ -12,7 +12,7 @@ ArbOS 20 Atlas is shipped via Nitro v2.3.1, which is available on Docker hub wit
- [Nitro v2.3.1](https://github.com/OffchainLabs/nitro/releases/tag/v2.3.1) or higher
- [nitro-contracts v1.2.1](https://github.com/OffchainLabs/nitro-contracts/releases/tag/v1.2.1) or higher
- Wasm module root: `0x8b104a2e80ac6165dc58b9048de12f301d70b02a0ab51396c22b4b4b802a16a4`
-- Access to the [Ethereum Beacon Chain APIs](https://ethereum.github.io/beacon-APIs/#/), either from your own self-managed L1 Ethereum node or from a 3rd party provider like [those on this list](/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.md).
+- Access to the [Ethereum Beacon Chain APIs](https://ethereum.github.io/beacon-APIs/#/), either from your own self-managed L1 Ethereum node or from a 3rd party provider like [those on this list](/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.mdx).
### High-level description of ArbOS 20 changes
@@ -28,7 +28,7 @@ ArbOS 20 is an upgrade to enable Arbitrum's support for L1 Ethereum's [Dencun up
### Special notes on ArbOS 20: Atlas support for EIP-4844
-- Upgrading to **the Atlas ArbOS release will require access to L1 Ethereum beacon chain endpoints to retrieve blob data. For nodes of a chain that come online 18 days after Atlas gets activated on their chain will need access to historical data to sync up to the latest state.** If you are not operating your own Ethereum consensus client, [please visit this page to view a list of beacon chain RPC providers](/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.md) where you can access blob data.
+- Upgrading to **the Atlas ArbOS release will require access to L1 Ethereum beacon chain endpoints to retrieve blob data. For nodes of a chain that come online 18 days after Atlas gets activated on their chain will need access to historical data to sync up to the latest state.** If you are not operating your own Ethereum consensus client, [please visit this page to view a list of beacon chain RPC providers](/run-arbitrum-node/05-l1-ethereum-beacon-chain-rpc-providers.mdx) where you can access blob data.
- Applications on Arbitrum will not have to be modified or take any explicit action to get the benefits of using EIP-4844 (i.e. the whole chain opts-in with ArbOS 20 “Atlas”).
- ArbOS 20 “Atlas” adds support for Arbitrum chains to send data in a blob storage format to data availability layers, like L1 Ethereum, that support the blob transaction type. This includes Arbitrum One and Arbitrum Nova. ArbOS 20 “Atlas” does not add support for Arbitrum chains to receive data in a blob storage format. This means that an L3 Orbit chain on top of an Arbitrum L2 will use calldata when posting L3 transaction data to the underlying L2. The L2 Arbitrum chain will then be able to post data to a L1 data availability layer like Ethereum using blobs.
- There currently aren’t estimates on what the end-user gas savings of using blob data will be. This topic is something being actively worked on and monitored. Without Mainnet data, the estimates for blob gas prices will not be accurate enough to reliably predict the cost reductions that users will experience - and even with Mainnet data, the savings will vary by use case (i.e. no current way to predict the price impacts from all blob gas market participants yet). In general, however, the use of blobs will reduce the cost of using Arbitrum L2s. To learn more about what EIP-4844 will mean for L2 users, please checkout this [blog post on Medium by Offchain Lab's Co-foudner and Chief Scientist Ed Felten](https://medium.com/offchainlabs/eip-4844-what-does-it-mean-for-l2-users-5e86ebc4c028).
diff --git a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos32.md b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos32.mdx
similarity index 89%
rename from arbitrum-docs/run-arbitrum-node/arbos-releases/arbos32.md
rename to arbitrum-docs/run-arbitrum-node/arbos-releases/arbos32.mdx
index fcaeb0e81..270a159de 100644
--- a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos32.md
+++ b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos32.mdx
@@ -17,7 +17,7 @@ ArbOS 32 "Bianca" is shipped via [Nitro v3.2.1](https://github.com/OffchainLabs/
Please note that it is important that you only run the Nitro v3.2.1 against trusted databases. If you want to use an untrusted database, you can first remove the `wasm` directory if it exists (it might be inside the `nitro` folder). Otherwise, the database may have malicious, unvalidated code that can result in remote code execution. This is also mitigated by ensuring you run the Arbitrum Nitro node inside Docker.
-The Arbitrum docs will remain the canonical home for information regarding ArbOS releases, with more details found on the [ArbOS Software Releases Overview page](./01-overview.md).
+The Arbitrum docs will remain the canonical home for information regarding ArbOS releases, with more details found on the [ArbOS Software Releases Overview page](./01-overview.mdx).
### Requirements:
@@ -27,14 +27,14 @@ The Arbitrum docs will remain the canonical home for information regarding ArbOS
### High-level description of ArbOS 32 changes
-ArbOS 32 Bianca is a major upgrade for Arbitrum chains. As a refresher, ArbOS upgrades can be treated as Arbitrum’s equivalent of a hard fork - more can be read about this subject over in [Arbitrum ArbOS upgrades](https://forum.arbitrum.foundation/t/arbitrum-arbos-upgrades/19695). Please note that ArbOS 21 Bianca is an upgrade that builds upon [ArbOS 20 Atlas](./arbos20.md).
+ArbOS 32 Bianca is a major upgrade for Arbitrum chains. As a refresher, ArbOS upgrades can be treated as Arbitrum’s equivalent of a hard fork - more can be read about this subject over in [Arbitrum ArbOS upgrades](https://forum.arbitrum.foundation/t/arbitrum-arbos-upgrades/19695). Please note that ArbOS 21 Bianca is an upgrade that builds upon [ArbOS 20 Atlas](./arbos20.mdx).
ArbOS 32 Bianca brings many features, improvements, and bug fixes to Arbitrum chains. A full list of changes can be found in the Nitro release notes for [Nitro 3.2.1](https://github.com/OffchainLabs/nitro/releases/tag/v3.2.1) or higher (as Nitro 3.2.1 is the endorsed Nitro node version for ArbOS 32 Bianca). Highlighted below are a few of the most impactful and critical features that are introduced with ArbOS 32 Bianca:
-- Addition and subsequent activation of [Stylus](../../stylus/stylus-gentle-introduction.md) on Arbitrum chains through the addition of a new WebAssembly-based (WASM) virtual machine that runs alongside the EVM. Stylus enables developers to write smart contracts in new programming languages that compile to WASM, like Rust, that are more efficient and safer than Solidity smart contracts while retaining complete interoperability.
+- Addition and subsequent activation of [Stylus](../../stylus/gentle-introduction.mdx) on Arbitrum chains through the addition of a new WebAssembly-based (WASM) virtual machine that runs alongside the EVM. Stylus enables developers to write smart contracts in new programming languages that compile to WASM, like Rust, that are more efficient and safer than Solidity smart contracts while retaining complete interoperability.
- Adding support for [RIP-7212](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md) decreases the costs of verifying the secp256r1 curve on-chain [by 99% when compared to current implementations](https://www.alchemy.com/blog/what-is-rip-7212), making secp256r1 verification more feasible for everyday use and enabling dApp developers and protocols to offer their users improved UX on Arbitrum One and Arbitrum Nova. Without this precompile, verifying this signature on-chain is extremely expensive. Passkey-based wallets offer better security than a typical EOA and seamless cross-device support. Many wallets, notably apps using embedded wallets, have been requesting this feature for over a year.
- [Only relevant to Arbitrum Nova] Updated the transaction fee router contracts on Arbitrum Nova to allow for fees collected to be automatically sent to the ArbitrumDAO Treasury on Arbitrum One. Currently, the ArbitrumDAO receives Arbitrum Nova transaction fees that are sent to an ArbitrumDAO-controlled address that requires a constitutional proposal to move, which is less efficient. This change is specific to Arbitrum Nova and is not expected to impact Orbit chains.
-- Introduction of a new Fast Withdrawals feature for Orbit chains to achieve fast finality. This feature allows for transactions processed by a committee of validators to be unanimously confirmed as quickly as 15 minutes, as opposed to the default 7-day challenge period. While any Orbit chain can adopt Fast Withdrawals, we only recommend Fast Withdrawals for AnyTrust chains. Note that to enable this feature, separate steps must be followed (below).
+- Introduction of a new Fast Withdrawals feature for Orbit chains to achieve fast finality. This feature allows for transactions processed by a committee of validators to be unanimously confirmed as quickly as 15 minutes, as opposed to the default 6.4-day challenge period. While any Orbit chain can adopt Fast Withdrawals, we only recommend Fast Withdrawals for AnyTrust chains. Note that to enable this feature, separate steps must be followed (below).
### Additional requirement for Arbitrum Orbit chains who wish to take advantage of the Stylus Cache Manager
@@ -42,7 +42,7 @@ ArbOS 32 Bianca brings many features, improvements, and bug fixes to Arbitrum ch
It is strongly recommended that teams upgrading to ArbOS 32 also spend the time following the instructions described below to deploy and enable the Stylus Cache Manager. Even if your team does not intend to build with Stylus in the immediate term, enabling the Cache Manager ensures that future usage of Arbitrum Stylus on your chain is smooth and provides a consistent UX with the developer experience of building with Arbitrum Stylus on Arbitrum One.
:::
-Specific to Stylus and ArbOS 32 "Bianca", we have developed a caching strategy that stores frequently accessed contracts in memory to reduce the costs and time associated with contract execution from repeated initializations. Check out the [Stylus caching strategy docs](../../stylus/concepts/stylus-cache-manager.md) to learn more.
+Specific to Stylus and ArbOS 32 "Bianca", we have developed a caching strategy that stores frequently accessed contracts in memory to reduce the costs and time associated with contract execution from repeated initializations. Check out the [Stylus caching strategy docs](../../stylus/how-tos/caching-contracts.mdx) to learn more.
In order to take advantage of this caching strategy, an additional step is required to deploy and enable it's use on your Orbit chain.
diff --git a/arbitrum-docs/run-arbitrum-node/data-availability-committees/01-get-started.md b/arbitrum-docs/run-arbitrum-node/data-availability-committees/01-get-started.mdx
similarity index 68%
rename from arbitrum-docs/run-arbitrum-node/data-availability-committees/01-get-started.md
rename to arbitrum-docs/run-arbitrum-node/data-availability-committees/01-get-started.mdx
index 0f7e61e7b..ae6fa069e 100644
--- a/arbitrum-docs/run-arbitrum-node/data-availability-committees/01-get-started.md
+++ b/arbitrum-docs/run-arbitrum-node/data-availability-committees/01-get-started.mdx
@@ -15,24 +15,24 @@ content_type: overview
This section offers information and a series of how-to guides to help you along the process of setting up a Data Availability Committee. These guides target two audiences: Committee members who wish to deploy a Data Availability Server, and chain owners who wish to configure their chain with the information of the Committee.
-Before following the guides in this section, you should be familiarized with how the AnyTrust protocol works, and the role of the DAC in the protocol. Refer to _[Inside AnyTrust](/how-arbitrum-works/inside-anytrust.md)_ to learn more.
+Before following the guides in this section, you should be familiarized with how the AnyTrust protocol works, and the role of the DAC in the protocol. Refer to _[Inside AnyTrust](/how-arbitrum-works/inside-anytrust.mdx)_ to learn more.
## If you are a DAC member
-Committee members will need to run a DAS. To do that, they will first need to generate a pair of keys and deploy a DAS. They may also choose to deploy an additional mirror DAS. Find more information in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md) and [How to deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.md).
+Committee members will need to run a DAS. To do that, they will first need to generate a pair of keys and deploy a DAS. They may also choose to deploy an additional mirror DAS. Find more information in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx) and [How to deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.mdx).
Here's a basic checklist of actions to complete for DAC members:
-- [Deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md). Send the following information to the chain owner:
+- [Deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx). Send the following information to the chain owner:
- Public BLS key
- The https URL for the RPC endpoint which includes some random string (e.g. das.your-chain.io/rpc/randomstring123), communicated through a secure channel
- The https URL for the REST endpoint (e.g. das.your-chain.io/rest)
-- [Deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.md) if you want to complement your setup with a mirror DAS. Send the following information to the chain owner:
+- [Deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.mdx) if you want to complement your setup with a mirror DAS. Send the following information to the chain owner:
- The https URL for the REST endpoint (e.g. das.your-chain.io/rest)
## If you are a chain owner
-Chain owners will need to gather the information from the committee members to craft the necessary data to update their chain and the batch poster (more information in [How to configure the DAC in your chain](/run-arbitrum-node/data-availability-committees/04-configure-dac.md)). They might also want to test each DAS individually, by following the testing guides available in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md#testing-the-das) and [How to deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.md#testing-the-das).
+Chain owners will need to gather the information from the committee members to craft the necessary data to update their chain and the batch poster (more information in [How to configure the DAC in your chain](/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx)). They might also want to test each DAS individually, by following the testing guides available in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx#testing-the-das) and [How to deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.mdx#testing-the-das).
Here's a basic checklist of actions to complete for chain owners:
@@ -40,11 +40,11 @@ Here's a basic checklist of actions to complete for chain owners:
- Public BLS Key
- URL of the RPC endpoint
- URL(s) of the REST endpoint(s)
-- Ensure that at least one DAS is running as an [archive DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md#archive-da-servers)
-- [Generate the keyset and keyset hash](/run-arbitrum-node/data-availability-committees/04-configure-dac.md#step-1-generate-the-keyset-and-keyset-hash-with-all-the-information-from-the-servers) with all the information from the servers
-- [Update the SequencerInbox contract](/run-arbitrum-node/data-availability-committees/04-configure-dac.md#step-2-update-the-sequencerinbox-contract)
-- [Craft the new configuration for the batch poster](/run-arbitrum-node/data-availability-committees/04-configure-dac.md#step-3-craft-the-new-configuration-for-the-batch-poster)
-- [Craft the new configuration for your chain's nodes](/run-arbitrum-node/data-availability-committees/04-configure-dac.md#step-4-craft-the-new-configuration-for-your-chains-nodes)
+- Ensure that at least one DAS is running as an [archive DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx#archive-da-servers)
+- [Generate the keyset and keyset hash](/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx#step-1-generate-the-keyset-and-keyset-hash-with-all-the-information-from-the-servers) with all the information from the servers
+- [Update the SequencerInbox contract](/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx#step-2-update-the-sequencerinbox-contract)
+- [Craft the new configuration for the batch poster](/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx#step-3-craft-the-new-configuration-for-the-batch-poster)
+- [Craft the new configuration for your chain's nodes](/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx#step-4-craft-the-new-configuration-for-your-chains-nodes)
## Ask for help
diff --git a/arbitrum-docs/run-arbitrum-node/data-availability-committees/02-deploy-das.md b/arbitrum-docs/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx
similarity index 99%
rename from arbitrum-docs/run-arbitrum-node/data-availability-committees/02-deploy-das.md
rename to arbitrum-docs/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx
index 0411cc960..ad7c127f3 100644
--- a/arbitrum-docs/run-arbitrum-node/data-availability-committees/02-deploy-das.md
+++ b/arbitrum-docs/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx
@@ -18,11 +18,11 @@ In this how-to, you'll learn how to deploy a DAS that exposes:
1. **An RPC interface** that the sequencer uses to store batches of data on the DAS.
2. **An HTTP REST interface** that lets the DAS respond to requests for those batches of data.
-For more information related to configuring a DAC, refer to the _[Introduction](/run-arbitrum-node/data-availability-committees/01-get-started.md)_.
+For more information related to configuring a DAC, refer to the _[Introduction](/run-arbitrum-node/data-availability-committees/01-get-started.mdx)_.
This how-to assumes that you're familiar with:
-- The DAC's role in the AnyTrust protocol. Refer to _[Inside AnyTrust](/how-arbitrum-works/inside-anytrust.md)_ for a refresher.
+- The DAC's role in the AnyTrust protocol. Refer to _[Inside AnyTrust](/how-arbitrum-works/inside-anytrust.mdx)_ for a refresher.
- [Kubernetes](https://kubernetes.io/). The examples in this guide use Kubernetes to containerize your DAS.
## How does a DAS work?
@@ -405,7 +405,7 @@ In general, mirror DA servers serve two main purposes:
1. Prevent the main DAS from having to serve requests for data, allowing it to focus only on storing the data received.
2. Provide resiliency to the network in the case of a DAS going down.
-Find information about how to setup a mirror DAS in [How to deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.md).
+Find information about how to setup a mirror DAS in [How to deploy a mirror DAS](/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.mdx).
## Security considerations
diff --git a/arbitrum-docs/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.md b/arbitrum-docs/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.mdx
similarity index 97%
rename from arbitrum-docs/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.md
rename to arbitrum-docs/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.mdx
index 30df7e59f..6ac8496c1 100644
--- a/arbitrum-docs/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.md
+++ b/arbitrum-docs/run-arbitrum-node/data-availability-committees/03-deploy-mirror-das.mdx
@@ -8,7 +8,7 @@ content_type: how-to
:::caution Running a regular DAS vs running a mirror DAS
-The main use-case for running a mirror DAS is to complement your setup as a Data Availability Committee (DAC) member. That means that you should run your main DAS first, and then configure the mirror DAS. Refer to _[How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md)_ if needed.
+The main use-case for running a mirror DAS is to complement your setup as a Data Availability Committee (DAC) member. That means that you should run your main DAS first, and then configure the mirror DAS. Refer to _[How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx)_ if needed.
:::
@@ -19,16 +19,16 @@ The main use-case for running a mirror DAS is to complement your setup as a Data
members of the DAC run a Data Availability Server (DAS) to handle these operations.
-In this how-to, you'll learn how to configure a mirror DAS that serves `GET` requests for stored batches of information through a REST HTTP interface. For a refresher on DACs, refer to the _[Introduction](/run-arbitrum-node/data-availability-committees/01-get-started.md)_.
+In this how-to, you'll learn how to configure a mirror DAS that serves `GET` requests for stored batches of information through a REST HTTP interface. For a refresher on DACs, refer to the _[Introduction](/run-arbitrum-node/data-availability-committees/01-get-started.mdx)_.
This how-to assumes that you're familiar with:
-- How a regular DAS works and what configuration options are available. Refer to _[How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md)_ for a refresher.
+- How a regular DAS works and what configuration options are available. Refer to _[How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx)_ for a refresher.
- [Kubernetes](https://kubernetes.io/). The examples in this guide use Kubernetes to containerize your DAS.
## What is a mirror DAS?
-To avoid exposing the REST interface of your main DAS to the public in order to prevent spamming attacks (as explained in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md#security-considerations)), you can choose to run a mirror DAS to complement your setup. The mirror DAS will handle all public REST requests, while reading information from the main DAS via its (now private) REST interface.
+To avoid exposing the REST interface of your main DAS to the public in order to prevent spamming attacks (as explained in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx#security-considerations)), you can choose to run a mirror DAS to complement your setup. The mirror DAS will handle all public REST requests, while reading information from the main DAS via its (now private) REST interface.
In general, mirror DA servers serve two main purposes:
@@ -37,7 +37,7 @@ In general, mirror DA servers serve two main purposes:
## Configuration options
-A mirror DAS will use the same tool and, thus, the same configuration options as your main DAS. You can find an explanation of those options in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md#configuration-options).
+A mirror DAS will use the same tool and, thus, the same configuration options as your main DAS. You can find an explanation of those options in [How to deploy a DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx#configuration-options).
## How to deploy a mirror DAS
diff --git a/arbitrum-docs/run-arbitrum-node/data-availability-committees/04-configure-dac.md b/arbitrum-docs/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx
similarity index 96%
rename from arbitrum-docs/run-arbitrum-node/data-availability-committees/04-configure-dac.md
rename to arbitrum-docs/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx
index 8903c464e..3d244fde0 100644
--- a/arbitrum-docs/run-arbitrum-node/data-availability-committees/04-configure-dac.md
+++ b/arbitrum-docs/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx
@@ -17,13 +17,13 @@ content_type: how-to
and retrieve data from them.
-In this how-to, you'll learn how to configure the DAC in your chain. Refer to the _[Introduction](/run-arbitrum-node/data-availability-committees/01-get-started.md)_ for the full process of running DA servers and configuring the chain.
+In this how-to, you'll learn how to configure the DAC in your chain. Refer to the _[Introduction](/run-arbitrum-node/data-availability-committees/01-get-started.mdx)_ for the full process of running DA servers and configuring the chain.
This how-to assumes that you're familiar with:
-- The DAC's role in the AnyTrust protocol. Refer to _[Inside AnyTrust](/how-arbitrum-works/inside-anytrust.md)_ for a refresher.
+- The DAC's role in the AnyTrust protocol. Refer to _[Inside AnyTrust](/how-arbitrum-works/inside-anytrust.mdx)_ for a refresher.
- [Kubernetes](https://kubernetes.io/). The examples in this guide use Kubernetes to containerize your DAS.
-- [How to deploy a Data Availability Server (DAS)](/run-arbitrum-node/data-availability-committees/02-deploy-das.md). This is needed to understand where the data we'll be handling in this guide comes from.
+- [How to deploy a Data Availability Server (DAS)](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx). This is needed to understand where the data we'll be handling in this guide comes from.
- The [Foundry toolkit](https://github.com/foundry-rs/foundry)
## Step 0: Prerequisites
@@ -34,7 +34,7 @@ Before starting to generate the keyset and configuring the nodes and chain, you'
- URL of the RPC endpoint
- URL(s) of the REST endpoint(s)
-You should also make sure that at least one DAS is running as an [archive DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.md#archive-da-servers), otherwise the information will not be available after the expiry time.
+You should also make sure that at least one DAS is running as an [archive DAS](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx#archive-da-servers), otherwise the information will not be available after the expiry time.
## Step 1: Generate the keyset and keyset hash with all the information from the servers
diff --git a/arbitrum-docs/run-arbitrum-node/more-types/01-run-archive-node.md b/arbitrum-docs/run-arbitrum-node/more-types/01-run-archive-node.mdx
similarity index 80%
rename from arbitrum-docs/run-arbitrum-node/more-types/01-run-archive-node.md
rename to arbitrum-docs/run-arbitrum-node/more-types/01-run-archive-node.mdx
index bc5d8f52d..c3cad95dc 100644
--- a/arbitrum-docs/run-arbitrum-node/more-types/01-run-archive-node.md
+++ b/arbitrum-docs/run-arbitrum-node/more-types/01-run-archive-node.mdx
@@ -20,13 +20,13 @@ Before the Nitro upgrade, Arbitrum One ran on the Classic stack for about one ye
Running an Arbitrum One **full node** in **archive mode** lets you access both pre-Nitro and post-Nitro blocks, but it requires you to run **both Classic and Nitro nodes** together. You may not need to do this, depending on your use case:
-| Use case | Required node type(s) | Docs |
-| ------------------------------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
-| Access the **Arbitrum network** without running your own node | Fully managed by third-parties, exposed via RPC endpoints | [RPC endpoints and providers](/build-decentralized-apps/reference/01-node-providers.mdx) |
-| Run an **archive node** for **Arbitrum Sepolia (testnet)** or **Arbitrum Nova** | Full node (Nitro) | [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.md) |
-| Send **post-Nitro** archive requests | Full node (Nitro) | [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.md) |
-| Send **pre-Nitro** archive requests | Full node (Classic) | [How to run a full node (Classic, pre-Nitro)](/run-arbitrum-node/more-types/03-run-classic-node.md) |
-| Send **post-Nitro** _and_ **pre-Nitro** archive requests | Full node (Nitro) _and_ full node (Classic) | That's what this how-to is for; you're in the right place. |
+| Use case | Required node type(s) | Docs |
+| ------------------------------------------------------------------------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
+| Access the **Arbitrum network** without running your own node | Fully managed by third-parties, exposed via RPC endpoints | [RPC endpoints and providers](/build-decentralized-apps/reference/01-node-providers.mdx) |
+| Run an **archive node** for **Arbitrum Sepolia (testnet)** or **Arbitrum Nova** | Full node (Nitro) | [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.mdx) |
+| Send **post-Nitro** archive requests | Full node (Nitro) | [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.mdx) |
+| Send **pre-Nitro** archive requests | Full node (Classic) | [How to run a full node (Classic, pre-Nitro)](/run-arbitrum-node/more-types/03-run-classic-node.mdx) |
+| Send **post-Nitro** _and_ **pre-Nitro** archive requests | Full node (Nitro) _and_ full node (Classic) | That's what this how-to is for; you're in the right place. |
### System requirements
@@ -78,6 +78,14 @@ The minimum storage requirements will change as the Nitro chains grow (growing r
| - | `--node.cache.allow-slow-lookup` | Required for running an **Arbitrum One Classic** archival node. When this option is present, it will load old blocks from disk if not in memory cache. |
| - | `--core.checkpoint-gas-frequency=156250000` | Required for running an **Arbitrum One Classic** archival node. |
+| Arbitrum Nitro | Arbitrum Classic | Description |
+| ---------------------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--parent-chain.connection.url=` | `--l1.url=` | Provide an standard L1 node RPC endpoint that you run yourself or from a third-party node provider (see [RPC endpoints and providers](/build-decentralized-apps/reference/01-node-providers.mdx)) |
+| `--chain.id=` | `--l2.chain-id=` | See [RPC endpoints and providers](/build-decentralized-apps/reference/01-node-providers.mdx) for a list of Arbitrum chains and the respective L2 chain IDs |
+| `--execution.caching.archive` | `--node.caching.archive` | Required for running an **Arbitrum One Nitro** archival node and retains past block state |
+| - | `--node.cache.allow-slow-lookup` | Required for running an **Arbitrum One Classic** archival node. When this option is present, it will load old blocks from disk if not in memory cache. |
+| - | `--core.checkpoint-gas-frequency=156250000` | Required for running an **Arbitrum One Classic** archival node. |
+
### Run the Docker image(s)
@@ -121,4 +129,4 @@ Both Nitro and Classic have multiple other parameters that can be used to config
### Troubleshooting
-If you run into any issues, visit the [node-running troubleshooting guide](/run-arbitrum-node/06-troubleshooting.md).
+If you run into any issues, visit the [node-running troubleshooting guide](/run-arbitrum-node/06-troubleshooting.mdx).
diff --git a/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.md b/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.md
deleted file mode 100644
index d709ae78f..000000000
--- a/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-title: 'How to run a validator'
-description: Learn how to run an Arbitrum feed relay on your local machine.
-sidebar_position: 4
-content_type: how-to
----
-
-Some Arbitrum nodes will choose to act as validators. This means that they watch the progress of the rollup protocol and perhaps also participate in that protocol to advance the state of the chain securely.
-Not all nodes will choose to do this. Because the rollup protocol doesn’t decide what the chain will do but merely confirms the correct behavior that is fully determined by the inbox messages, a node can ignore the rollup protocol and simply compute for itself the correct behavior.
-Here we describe different strategies that validators follow and provide instructions on how to run them.
-
-### Validation strategies
-
-- Currently, the ability to post assertions on-chain for mainnet Arbitrum chains is allowlisted.
-- Here's a full list of validation strategies:
- - `Defensive` (allowlist required)
- - Post stake and create challenge if local state disagrees with on-chain assertion (wallet required, will only post stake on-chain if bad assertion found)
- - `StakeLatest` (allowlist required)
- - Stay staked on latest assertion and challenge any bad assertions found (wallet required, always staked, uses some gas every time new assertion created)
- - `ResolveNodes` (allowlist required)
- - Stay staked on latest assertion, resolve any unconfirmed assertions and challenge any bad assertions found (wallet required, always staked, uses some gas every time unconfirmed assertion resolved or new assertion created)
- - `MakeNodes` (allowlist required)
- - Continuously create new assertions, challenging any bad assertions found (wallet required, always staked, most expensive node to run)
- - Note that if there is more than one `MakeNodes` validator running, they might all try to create a new assertion at same time. In that case, only one will be successful, and the others will have still spent gas on reverted calls that didn't do anything.
-- There's one more validation strategy that is not allowlisted and is available for all types of node: `Watchtower`. A node in `Watchtower` mode will immediately log an error if an on-chain assertion deviates from the locally computed chain state. It doesn't require a wallet, as it never takes any action on-chain. This strategy is enabled by default in all nodes (full and archive).
-
-### Running a Watchtower validator
-
-- By default, all nodes (full and archive) will run in `Watchtower` mode.
-- If a deviation is detected, a node running in Watchtower mode will log an error containing the string `found incorrect assertion in watchtower mode`
-- To verify that the Watchtower mode is enabled, this line should appear in the logs:
- ```shell
- INFO [09-28|18:43:49.367] running as validator txSender=nil actingAsWallet=nil whitelisted=false strategy=Watchtower
- ```
- - `strategy` should be `Watchtower`
- - The log line `validation succeeded` shows that the L2 block validator is working
- - The log line `found correct assertion` shows that the L1 validator is working
-- Watchtower mode adds a small amount of execution and memory overhead. You can deactivate this mode by using the parameter `--node.staker.enable=false`.
-
-### Creating a wallet for an allowlisted validator
-
-- Watchtower validators never need a wallet, because they never post on-chain
-- Defensive validators need a wallet configured, but the wallet does not need to be funded until it logs that an assertion has been found
-- All other validators require a funded wallet to immediately post stake, as well as additional funds that will be spent at regular intervals
-- Here is an example of how to tell Nitro to create validator wallet for Arbitrum One and exit:
- ```shell
- docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum @latestNitroNodeImage@ --parent-chain.connection.url=https://l1-mainnet-node:8545 --chain.id=42161 --node.staker.enable --node.staker.parent-chain-wallet.only-create-key --node.staker.parent-chain-wallet.password="SOME SECURE PASSWORD"
- ```
-- Wallet file will be created under the mounted directory inside the `arb1/wallet/` directory for Arb1, or `nova/wallet/` directory for Nova. Be sure to backup the wallet, it will be the only way to withdraw stake when desired
-
-### Running an allowlisted defensive validator
-
-- A defensive validator requires that a wallet has already been created using the above steps
-- Defensive validator wallets do not need to be funded initially
-- If a defensive validator detects a deviation, it will log `bringing defensive validator online because of incorrect assertion`, and wait for funds to be added to wallet so stake can be posted and a dispute created
-- Here is an example of how to run an allowlisted defensive validator for Arbitrum One:
- ```shell
- docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum @latestNitroNodeImage@ --parent-chain.connection.url=https://l1-mainnet-node:8545 --chain.id=42161 --node.staker.enable --node.staker.strategy=Defensive --node.staker.parent-chain-wallet.password="SOME SECURE PASSWORD"
- ```
-- For Orbit chains, you need to set the `--chain.info-json=` flag instead of `--chain.id=`
-- To verify validator is working, this log line shows the wallet is setup correctly:
- ```shell
- INFO [09-28|18:43:49.367] running as validator txSender=0x... actingAsWallet=0x... whitelisted=true strategy=Defensive
- ```
- - `whitelisted` should be `true` after your wallet has been added to the allowlist
- - `strategy` should be `Defensive`
- - `txSender` and `actingAsWallet` should both be present and not `nil`
- - The log line `validation succeeded` shows that the L2 block validator is working
- - The log line `found correct assertion` shows that the L1 validator is working
-
-#### Orbit chains: grant whitlelist
-
-- You need to be the chain owner to include a new validator address in the allowlist:
-- Find your `upgradeExecutor` contract address.
-- Send transactions to the `executeCall` method of the`upgradeExecutor` contract and set the `target` address to your Rollup contract's address, set the `targetCalldata` to `0xa3ffb772{Your new allowlist validator address}`. (`0xa3ffb772` is the signature of `setValidator(address[],bool[])`)
-- Call your Rollup contract's `isValidator(address)` and check the result.
diff --git a/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.mdx b/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.mdx
new file mode 100644
index 000000000..c22e2b051
--- /dev/null
+++ b/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.mdx
@@ -0,0 +1,152 @@
+---
+title: 'How to run a validator'
+description: Learn how to run an Arbitrum validator node
+author: TucksonDev
+sme: TucksonDev
+sidebar_position: 4
+content_type: how-to
+---
+
+Validators are nodes that choose to participate in the rollup protocol to advance the state of the chain securely. Since the activation of BoLD, chains can now choose to make validation permissionless. You can learn more in the [BoLD introduction](/how-arbitrum-works/bold/gentle-introduction.mdx).
+
+This page describes the different strategies a validator may follow and provides instructions on how to run a validator for an Arbitrum chain.
+
+This how-to assumes that you're familiar with the following:
+
+- How to run a full node (see instructions [here](/run-arbitrum-node/03-run-full-node.mdx) for DAO-governed chains, and [here](/node-running/how-tos/running-an-orbit-node.mdx) for Orbit chains)
+- [How the Rollup protocol works](/how-arbitrum-works/inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol)
+- [How BoLD works](/bold/concepts/bold-technical-deep-dive.mdx#how-bold-uses-ethereum), if you're running a validator for a chain that has BoLD activated
+
+## Validation strategies
+
+Validators can be configured to follow a specific validation strategy. Here we describe what strategies are available in Nitro:
+
+| Strategy | Description | Gas usage |
+| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
+| **`Defensive`** | If the local state disagrees with the on-chain assertion, this validator will post a stake and create a challenge | Only acts if a bad assertions is found |
+| **`StakeLatest`** | This validator will stay staked on the latest assertion found, and will challenge any bad assertions that it finds (this strategy is only available in pre-BoLD chains) | Gas used every time a new assertion is created |
+| **`ResolveNodes`** | This validator will stay staked on the latest assertion found, resolve any unconfirmed assertions, and it will challenge any bad assertions that it finds | Gas used every time a new assertion is created and to resolve unconfirmed assertions |
+| **`MakeNodes`** | This validator continuously creates new assertions, resolves any unconfirmed assertions, and challenges bad assertions found. Note that if there is more than one `MakeNodes` validator running, they might all try to create a new assertion simultaneously. In that case, only one will be successful, while the others will have their transactions reverted | Gas used to create new assertions, move the stake to the latest one, and resolve unconfirmed assertions |
+
+### The watchtower strategy
+
+One more validation strategy is available for all types of nodes: `watchtower`. This strategy is enabled by default in all nodes (full and archive), and it doesn't require a wallet, as it never takes any action on-chain.
+
+A node in `watchtower` mode will immediately log an error if an on-chain assertion deviates from the locally computed chain state.
+
+```shell
+found incorrect assertion in watchtower mode
+```
+
+To verify that the watchtower mode is enabled, this line should appear in the logs:
+
+```shell
+INFO [09-28|18:43:49.367] running as validator txSender=nil actingAsWallet=nil whitelisted=false strategy=Watchtower
+```
+
+Additionally, the following logs indicate whether all components are working correctly:
+
+- The log line `validation succeeded` shows that the node is validating chain blocks successfully
+- The log line `found correct assertion` shows that the node is finding assertions on the parent chain successfully
+
+Watchtower mode adds a small amount of execution and memory overhead to your node. You can deactivate this mode using the parameter `--node.staker.enable=false`.
+
+## How to run a validator node
+
+This section explains how to configure your node to act as a validator.
+
+### Step 0: prerequisites
+
+A validator node is a regular full node with validation enabled, so you'll have to know how to configure a full node. You can find instructions [here](/run-arbitrum-node/03-run-full-node.mdx) for DAO-governed chains, and [here](/node-running/how-tos/running-an-orbit-node.mdx) for Orbit chains.
+
+Additionally, you'll need a wallet with enough funds to perform actions on-chain and enough tokens to stake. Keep in mind that:
+
+- The token used to perform actions on-chain is the native token of the parent chain (usually `ETH`)
+- For chains with BoLD activated, the token used to stake depends on the chain configuration. For Arbitrum One and Arbitrum Nova, the staking token is `WETH`
+- For chains that don't have BoLD activated, the token used to stake is the native token of the parent chain (usually `ETH`)
+
+### Step 1: configure and run your validator
+
+On top of the configuration of a regular full node, you'll need to configure the following parameters for it to act as a validator:
+
+| Parameter | Value | Description |
+| ----------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--node.staker.enable` | `true` | Enables validation |
+| `--node.staker.strategy` | `Watchtower`, `Defensive`, `StakeLatest`, `ResolveNodes`, `MakeNodes` | Strategy that your node will use (only needed if BoLD is not enabled) |
+| `--node.staker.parent-chain-wallet.private-key` | 0xPrivateKey | Private key of the wallet used to perform the operations on-chain. Use either `private-key` or `password` (below) |
+| `--node.staker.parent-chain-wallet.password` | Password | Password of a wallet generated with nitro (see instructions [here](#use-nitro-to-create-a-wallet-for-your-validator)). Use either `private-key` (above) or `password` |
+| `--node.bold.enable` | true | Enables validation with BoLD (not needed if BoLD is not activated) |
+| `--node.bold.strategy` | `Watchtower`, `Defensive`, `StakeLatest`, `ResolveNodes`, `MakeNodes` | Strategy that your node will use (not needed if BoLD is not activated) |
+
+Here's an example of how to run a defensive validator for Arbitrum One:
+
+```shell
+docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum @latestNitroNodeImage@ --parent-chain.connection.url=https://l1-mainnet-node:8545 --chain.id=42161 --node.staker.enable --node.staker.strategy=Defensive --node.staker.parent-chain-wallet.password="SOME SECURE PASSWORD" --node.bold.enable --node.bold.strategy=Defensive
+```
+
+### Step 2: verify that your node is running as a validator
+
+To verify that your node is acting as a validator, you can look for the following log line:
+
+```shell
+INFO [09-28|18:43:49.367] running as validator txSender=0x... actingAsWallet=0x... whitelisted=true strategy=Defensive
+```
+
+Note that `strategy` should be the configured strategy. `txSender` and `actingAsWallet` should both be present and not `nil`.
+
+Furthermore, the following logs will indicate that all components are working as intended:
+
+- The log line `validation succeeded` shows that the node is validating chain blocks successfully
+- The log line `found correct assertion` shows that the node is finding assertions on the parent chain successfully
+
+## Run a validator for an Orbit chain
+
+Validation for Orbit chains works the same way as for DAO-governed Arbitrum chains. However, as specified in [How to run a node](/node-running/how-tos/running-an-orbit-node.mdx#2-child-chain-parameters), you need to include the information of the chain when configuring your node by using `--chain.info-json`.
+
+```shell
+--chain.info-json=
+```
+
+Additionally, keep in mind that some chains might not have BoLD activated yet, so BoLD-specific parameters will not be needed.
+
+## Advanced features
+
+### Use Nitro to create a wallet for your validator
+
+Nitro includes a tool to create a validator wallet for a specific chain automatically. You can access it by using the option `--node.staker.parent-chain-wallet.only-create-key` and setting a password for the wallet with `--node.staker.parent-chain-wallet.password`.
+
+Here is an example of how to create a validator wallet for Arbitrum One and exit:
+
+```shell
+docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum @latestNitroNodeImage@ --parent-chain.connection.url=https://l1-mainnet-node:8545 --chain.id=42161 --node.staker.enable --node.staker.parent-chain-wallet.only-create-key --node.staker.parent-chain-wallet.password="SOME SECURE PASSWORD"
+```
+
+The wallet file will be created under the mounted directory inside the `/wallet/` directory (for example, `arb1/wallet/` for Arbitrum One, or `nova/wallet/` for Arbitrum Nova). Be sure to backup the wallet, as it will be the only way to withdraw the stake when desired.
+
+Once the wallet is created, you can instruct your validator to use it by adding the option `--node.staker.parent-chain-wallet.password="SOME SECURE PASSWORD"` when running your node.
+
+### Enable the BoLD API
+
+When activating BoLD on a chain, the amount of logs produced by a validator in case a challenge occurs can be overwhelming, and it might be hard to follow the progress of a challenge. To allow for better visualization of ongoing challenges, as well as querying specific information, Nitro includes an API to capture information about assertions and challenges that the validator observes. You can enable this API by using the following parameters:
+
+| Parameter | Value | Description |
+| ---------------------- | ----- | --------------------------------------- |
+| `--node.bold.api` | true | Enables the API |
+| `--node.bold.api-host` | IP | IP to listen on (defaults to 127.0.0.1) |
+| `--node.bold.api-port` | Port | Port to listen on (defaults to 9393) |
+
+You can find specific documentation about the methods available on this API in [BoLD validator API](/run-arbitrum-node/more-types/04-bold-validator-api.mdx).
+
+### How to add new validators to the allowlist (Orbit chains)
+
+On permissioned validation setups, the set of validators that can act on a given chain is limited to the ones added to the allowlist of validators in the Rollup contract.
+
+Follow these instructions to add a new validator address to the allowlist. Remember that you need to be able to perform admin actions to the chain to complete this operation.
+
+1. Find your `upgradeExecutor` contract address
+2. Call the `executeCall` method of the `upgradeExecutor` contract:
+ - set the `target` address to your Rollup contract's address
+ - set the `targetCalldata` to `0xa3ffb772{Your new allowlist validator address}` (`0xa3ffb772` is the signature of `setValidator(address[],bool[])`). For example, if you want to add the address `0x1234567890123456789012345678901234567890`, your `targetCalldata` should be `0xa3ffb7721234567890123456789012345678901234567890`.
+3. Call your Rollup contract's `isValidator(address)` and check the result
+
+After performing this operation, the new validator will be able to run a validator node to participate in the chain.
diff --git a/arbitrum-docs/run-arbitrum-node/more-types/03-run-classic-node.md b/arbitrum-docs/run-arbitrum-node/more-types/03-run-classic-node.mdx
similarity index 100%
rename from arbitrum-docs/run-arbitrum-node/more-types/03-run-classic-node.md
rename to arbitrum-docs/run-arbitrum-node/more-types/03-run-classic-node.mdx
diff --git a/arbitrum-docs/run-arbitrum-node/more-types/04-bold-validator-api.mdx b/arbitrum-docs/run-arbitrum-node/more-types/04-bold-validator-api.mdx
new file mode 100644
index 000000000..32a0e7b35
--- /dev/null
+++ b/arbitrum-docs/run-arbitrum-node/more-types/04-bold-validator-api.mdx
@@ -0,0 +1,71 @@
+---
+title: 'BoLD validator API'
+description: Describes the API available on BoLD validator nodes
+author: TucksonDev
+sme: TucksonDev
+content_type: concept
+---
+
+When BoLD is activated, validators have access to an optional API that Nitro provides, which provides information about the assertions being posted and the current challenges going on.
+
+This page describes the rationale behind providing this API and the available endpoints.
+
+## Why do we need an API?
+
+BoLD is a complex protocol that enables validators to defend claims about an Arbitrum chain on its parent chain. By default, uncontested claims are confirmed within 7 days, and contested claims can be confirmed within 14 days. Within that sliding window, there can be a significant amount of challenges and activities of validators making moves to defend their claims. Nitro is equipped to make moves on behalf of honest validators automatically and logs a lot of information about ongoing challenges.
+
+However, the amount of information logged between a simple Alice vs. Bob dispute is enormous. Each move made in a challenge emits a log, and there are many other things occurring in a validator node's runtime that are also logged in the process. Because BoLD challenges can be concurrent, we can quickly see an explosion of logs if many participants are involved.
+
+```go
+t=2023-11-03T21:03:08+0000 lvl=info msg="Successfully bisected edge" service=edge-tracker name= challengeType=block_challenge_edge bisectedFrom=16 bisectedFromMerkle=0x87d91006 bisectedTo=8 bisectedToMerkle=0xb3321c66
+t=2023-11-03T21:03:08+0000 lvl=info msg="Tracking edge" service=edge-tracker id=0xc66e7e5d fromBatch=0 toBatch=1 startHeight=0 endHeight=8 endCommit=0xb3321c66 startCommit=0x0107305d validatorName= challengeType=block_challenge_edge
+t=2023-11-03T21:03:08+0000 lvl=info msg="Tracking edge" service=edge-tracker startHeight=8 startCommit=0xb3321c66 endHeight=16 endCommit=0x87d91006 id=0xbb16c213 fromBatch=0 toBatch=1 validatorName= challengeType=block_challenge_edge
+```
+
+Aside from logs, we do not have a good way of understanding if a challenge is going in favor of the honest party. Since we cannot rely solely on logs to understand the progression of a BoLD challenge, Nitro includes an API that provides information to understand ongoing challenges and the health of the honest validators involved.
+
+## Enabling and configuring the API
+
+To enable the API, include the following parameters in the configuration of your validator:
+
+| Parameter | Description |
+| ---------------------- | --------------------------------------- |
+| `--node.bold.api` | Set to true to enable the API |
+| `--node.bold.api-host` | IP to listen on (defaults to 127.0.0.1) |
+| `--node.bold.api-port` | Port to listen on (defaults to 9393) |
+
+## Endpoints available
+
+The following endpoints are available at the configured host and port to query information from the API. Send a `GET` request to access them:
+
+### `/api/v1/assertions`
+
+Lists all assertions up to chain head.
+
+This request will return an array of objects with information about each assertion.
+
+### `/api/v1/assertions/`
+
+Returns information of a specific assertion.
+
+### `/api/v1/challenge//edges`
+
+Returns all edges for a challenged assertion.
+
+This request will return an array of objects with information about each edge.
+
+### `/api/v1/challenge//edges/history/`
+
+Returns information about a specific edge, given its history commitment.
+
+### `/api/v1/challenge//ministakes`
+
+Returns all the ministakes bonded under a challenged assertion.
+
+### `/api/v1/tracked/royal-edges`
+
+Returns the locally-tracked, royal edges kept in-memory by the validator.
+
+### `/api/v1/healthz`
+
+Checks if the API server is ready to serve queries. Returns a status of `200` if it is ready. Notice that this request will not return any result.
diff --git a/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.md b/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.mdx
similarity index 99%
rename from arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.md
rename to arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.mdx
index dba7c4995..f356106ec 100644
--- a/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.md
+++ b/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.mdx
@@ -6,7 +6,7 @@ sidebar_position: 7
content_type: how-to
---
-Arbitrum Nitro is the software that powers all Arbitrum chains. This how-to shows how you can build a Docker image, or binaries, directly from Nitro's source code. If you want to run a node for one of the Arbitrum chains, however, it is recommended that you use the docker image available on DockerHub, as explained in [How to run a full node](/run-arbitrum-node/03-run-full-node.md).
+Arbitrum Nitro is the software that powers all Arbitrum chains. This how-to shows how you can build a Docker image, or binaries, directly from Nitro's source code. If you want to run a node for one of the Arbitrum chains, however, it is recommended that you use the docker image available on DockerHub, as explained in [How to run a full node](/run-arbitrum-node/03-run-full-node.mdx).
This how-to assumes that you're running one of the following operating systems:
diff --git a/arbitrum-docs/run-arbitrum-node/nitro/02-migrate-state-and-history-from-classic.md b/arbitrum-docs/run-arbitrum-node/nitro/02-migrate-state-and-history-from-classic.mdx
similarity index 95%
rename from arbitrum-docs/run-arbitrum-node/nitro/02-migrate-state-and-history-from-classic.md
rename to arbitrum-docs/run-arbitrum-node/nitro/02-migrate-state-and-history-from-classic.mdx
index 2ad1f1603..a205f91fb 100644
--- a/arbitrum-docs/run-arbitrum-node/nitro/02-migrate-state-and-history-from-classic.md
+++ b/arbitrum-docs/run-arbitrum-node/nitro/02-migrate-state-and-history-from-classic.mdx
@@ -8,7 +8,7 @@ content_type: how-to
sidebar_position: 11
---
-When running a Nitro node for the first time on a chain that produced [classic blocks](/build-decentralized-apps/03-public-chains.mdx#classic-deprecated) in the past (like Arbitrum One), you need to initialize its database to, at least, the state of the chain after executing the last classic block. The common, and recommended, way of doing that is to provide a database snapshot using the `--init.url` option (as mentioned in [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.md)). In this how-to we show you an alternative way for doing that, migrating the state and history of the chain from a fully synced classic node.
+When running a Nitro node for the first time on a chain that produced [classic blocks](/build-decentralized-apps/03-public-chains.mdx#classic-deprecated) in the past (like Arbitrum One), you need to initialize its database to, at least, the state of the chain after executing the last classic block. The common, and recommended, way of doing that is to provide a database snapshot using the `--init.url` option (as mentioned in [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.mdx)). In this how-to we show you an alternative way for doing that, migrating the state and history of the chain from a fully synced classic node.
:::info Is this How-to for you?
@@ -22,8 +22,8 @@ Keep in mind that this process only applies to Arbitrum One. Other Arbitrum chai
To successfully migrate the state and history of the chain from a classic (pre-Nitro) node to a Nitro node, you'll need:
-- A fully synced classic node: you can find instructions on how to run a classic node in [this page](/run-arbitrum-node/more-types/03-run-classic-node.md).
-- A clean, uninitialized Nitro node: you can find instructions on how to set up a Nitro node in [this page](/run-arbitrum-node/03-run-full-node.md).
+- A fully synced classic node: you can find instructions on how to run a classic node in [this page](/run-arbitrum-node/more-types/03-run-classic-node.mdx).
+- A clean, uninitialized Nitro node: you can find instructions on how to set up a Nitro node in [this page](/run-arbitrum-node/03-run-full-node.mdx).
## Step 1: Enable export options in your classic node
@@ -87,5 +87,5 @@ This state import operation requires more resources than a regular run of a Nitr
## See also
-- [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.md)
-- [How to run a full node (Classic, pre-Nitro)](/run-arbitrum-node/more-types/03-run-classic-node.md)
+- [How to run a full node (Nitro)](/run-arbitrum-node/03-run-full-node.mdx)
+- [How to run a full node (Classic, pre-Nitro)](/run-arbitrum-node/more-types/03-run-classic-node.mdx)
diff --git a/arbitrum-docs/run-arbitrum-node/nitro/03-nitro-database-snapshots.md b/arbitrum-docs/run-arbitrum-node/nitro/03-nitro-database-snapshots.mdx
similarity index 100%
rename from arbitrum-docs/run-arbitrum-node/nitro/03-nitro-database-snapshots.md
rename to arbitrum-docs/run-arbitrum-node/nitro/03-nitro-database-snapshots.mdx
diff --git a/arbitrum-docs/run-arbitrum-node/sequencer/01-run-feed-relay.md b/arbitrum-docs/run-arbitrum-node/sequencer/01-run-feed-relay.mdx
similarity index 100%
rename from arbitrum-docs/run-arbitrum-node/sequencer/01-run-feed-relay.md
rename to arbitrum-docs/run-arbitrum-node/sequencer/01-run-feed-relay.mdx
diff --git a/arbitrum-docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.md b/arbitrum-docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx
similarity index 94%
rename from arbitrum-docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.md
rename to arbitrum-docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx
index ff5b31142..aa3b9b756 100644
--- a/arbitrum-docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.md
+++ b/arbitrum-docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx
@@ -11,7 +11,7 @@ todos:
- Align on what we want to treat as proper nouns vs common nouns
---
-[Running an Arbitrum relay locally as a feed relay](/run-arbitrum-node/sequencer/01-run-feed-relay.md) lets you subscribe to an uncompressed sequencer feed for real-time data as the sequencer accepts and orders transactions off-chain.
+[Running an Arbitrum relay locally as a feed relay](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx) lets you subscribe to an uncompressed sequencer feed for real-time data as the sequencer accepts and orders transactions off-chain.
When connected to websocket port `9642` of the local relay, you'll receive a data feed that looks something like this:
diff --git a/arbitrum-docs/run-arbitrum-node/sequencer/03-run-sequencer-coordination-manager.md b/arbitrum-docs/run-arbitrum-node/sequencer/03-run-sequencer-coordination-manager.mdx
similarity index 100%
rename from arbitrum-docs/run-arbitrum-node/sequencer/03-run-sequencer-coordination-manager.md
rename to arbitrum-docs/run-arbitrum-node/sequencer/03-run-sequencer-coordination-manager.mdx
diff --git a/arbitrum-docs/stylus/cli-tools-overview.md b/arbitrum-docs/stylus/cli-tools-overview.md
index addca90ab..f1dbb51c9 100644
--- a/arbitrum-docs/stylus/cli-tools-overview.md
+++ b/arbitrum-docs/stylus/cli-tools-overview.md
@@ -4,8 +4,6 @@ title: CLI Tools (cargo-stylus)
sidebar_label: CLI tools overview
---
-# CLI tools (cargo-stylus)
-
The CLI tools provided for Stylus, specifically the `cargo-stylus` tool, are designed to help developers manage, compile, and optimize their Stylus contracts efficiently. This overview provides a summary of the tools available and how to use them effectively.
## Available tools
diff --git a/arbitrum-docs/stylus/concepts/stylus-gas.md b/arbitrum-docs/stylus/concepts/gas-metering.mdx
similarity index 97%
rename from arbitrum-docs/stylus/concepts/stylus-gas.md
rename to arbitrum-docs/stylus/concepts/gas-metering.mdx
index 6a4cbdcaf..95f6cacff 100644
--- a/arbitrum-docs/stylus/concepts/stylus-gas.md
+++ b/arbitrum-docs/stylus/concepts/gas-metering.mdx
@@ -1,5 +1,5 @@
---
-title: 'Gas and ink in Stylus'
+title: 'Gas metering'
description: 'A conceptual overview of gas and ink, the primitives that Stylus uses to measure the cost of WASM activation, compute, memory, and storage.'
author: rachel-bousfield
sme: rachel-bousfield
@@ -75,4 +75,4 @@ However, developers optimizing contracts may choose to measure performance in in
### See also
- [Gas and ink costs](/stylus/reference/opcode-hostio-pricing): Detailed costs per opcode and host I/O
-- [Caching strategy](/stylus/concepts/stylus-cache-manager): Description of the Stylus caching strategy and the `CacheManager` contract
+- [Caching strategy](/stylus/how-tos/caching-contracts): Description of the Stylus caching strategy and the `CacheManager` contract
diff --git a/arbitrum-docs/stylus/concepts/how-it-works.md b/arbitrum-docs/stylus/concepts/how-it-works.md
new file mode 100644
index 000000000..bcb004976
--- /dev/null
+++ b/arbitrum-docs/stylus/concepts/how-it-works.md
@@ -0,0 +1,70 @@
+---
+id: how-it-works
+title: 'Architecture overview'
+sidebar_label: 'Architecture overview'
+description: 'Learn what powers Stylus'
+author: srinjoyc
+SME: srinjoyc
+user_story: As an Ethereum developer/project owner, I need to vet the Stylus.
+content_type: concept
+---
+
+There are four main steps for bringing a Stylus program to life: **coding, activation, execution, and proving**.
+
+## Coding
+
+Developers can now write smart contracts in any programming language that compiles to WASM.
+
+:::note
+Some high-level languages generate far more performant WASMs than others.
+:::
+
+Currently, there is support for Rust, C, and C++. However, the levels of support vary. Rust has rich language support from day one, with an open-source SDK that makes writing smart contracts in Rust as easy as possible. C and C++ are supported off the bat, enabling the deployment of existing contracts in those languages on-chain with minimal modifications.
+
+The Stylus SDK for Rust contains the smart contract development framework and language features most developers will need to use in Stylus. The SDK also makes it possible to perform all EVM-specific functionalities that smart contract developers use. Check out the [Rust SDK Guide](https://docs.arbitrum.io/stylus/rust-sdk-guide) and the [Crate Docs](https://docs.rs/stylus-sdk/latest/stylus_sdk/index.html).
+
+## Activation
+
+Starting from a high-level language (such as Rust, C, or C++), the first compilation stage happens using the CLI provided in the Stylus SDK for Rust or any other compiler, such as Clang for C and C++. Once compiled, the WASM is posted onchain. Then, in an activation process, WASM gets lowered to a node's native machine code (such as ARM or x86).
+
+Activating a Stylus program requires a new precompile, ArbWasm. This precompile produces efficient binary code tailored to a node's native assembly. During this step, a series of middlewares ensure that user programs execute safely and are deterministically fraud-proven. Instrumentation includes gas metering, depth-checking, memory charging, and more to guarantee all WASM programs are safe for the chain to execute. Stylus contracts can be called only after activation.
+
+Gas metering is essential for certifying that computational resources are paid for. In Stylus, the unit for measuring cost is called **ink**, which is similar to Ethereum's gas but thousands of times smaller. There are two reasons why a new measurement is used: First, WASM execution is so much faster than the EVM that executing thousands of WASM opcodes could be done in the same amount of time it takes the EVM to execute one. Second, the conversion rate of ink to gas can change based on future hardware or VM improvements. For a conceptual introduction to Stylus gas and ink, see [gas and ink (Stylus)](https://docs.arbitrum.io/stylus/concepts/gas-metering).
+
+## Execution
+
+Stylus programs execute in a fork of [Wasmer](https://wasmer.io/), the leading WebAssembly runtime, with minimal changes to optimize their codebase for blockchain-specific use cases. Wasmer executes native code much faster than Geth executes EVM bytecode, contributing to the significant gas savings that Stylus provides.
+
+EVM contracts continue to execute the same way they were before Stylus. When calling a contract, the difference between an EVM contract and a WASM program is visible via an [EOF](https://notes.ethereum.org/@ipsilon/evm-object-format-overview)-inspired contract header. From there, the contract executes using its corresponding runtime. Contracts written in Solidity and WASM languages can make cross-contract calls to each other, meaning a developer never has to consider which language the contract is in. Everything is interoperable.
+
+## Proving
+
+Nitro operates in two modes: a "happy case" where it compiles execution history to native code, and a "sad case" during validator disputes, where it compiles execution history to WASM for interactive fraud proofs on Ethereum. Stylus builds on Nitro's fraud-proving technology, allowing it to verify both execution history and WASM programs deployed by developers.
+
+Stylus is made possible by Nitro’s ability to replay and verify disputes using WASM. Validators bisect disputes until an invalid step is identified and proven on-chain through a [“one-step proof.”](/how-arbitrum-works/fraud-proofs/challenge-manager.mdx#general-bisection-protocol). This deterministic fraud-proving capability ensures the correctness of any arbitrary program compiled to WASM. The combination of WASM's and Nitro's properties enables this technological leap we call Stylus.
+
+For more details on Nitro’s architecture, refer to the [documentation](/how-arbitrum-works/inside-arbitrum-nitro.mdx) or the [Nitro whitepaper](https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf).
+
+## Why does this matter?
+
+Stylus innovates on many levels, with the key ones described here:
+
+### One chain, many languages
+
+There are roughly 20k Solidity developers, compared to 3 million Rust developers or 12 million C developers [[1](https://slashdatahq.medium.com/state-of-the-developer-nation-23rd-edition-the-fall-of-web-frameworks-coding-languages-711525e3df3a)]. Developers can now use their preferred programming language, which is interoperable on any Arbitrum chain with Stylus. By onboarding the next million developers, scaling to the next billion users becomes possible.
+
+### A better EVM
+
+Stylus' MultiVM brings the best of both worlds. Developers still get all of the benefits of the EVM, including the ecosystem and liquidity, while getting efficiency improvements and access to existing libraries in Rust, C, and C++, all without changing anything about how the EVM works. EVM equivalence is no longer the ceiling; it's the floor.
+
+### Cheaper execution
+
+Stylus is a more efficient execution environment than the EVM, leading directly to gas savings for complex smart contracts. Computation and memory can be significantly cheaper. Deploying cryptography libraries can be done permissionlessly as custom application layer precompiles. Use cases that are impractical in the EVM are now possible in Stylus.
+
+### Opt-in reentrancy
+
+Stylus doesn't just improve on cost and speed. WASM programs are also safer. Reentrancy is a common vulnerability developers can only attempt to mitigate in Solidity. Stylus provides cheap reentrancy detection, and using the Rust SDK, reentrancy is disabled by default unless intentionally overridden.
+
+### Fully interoperable
+
+Solidity programs and WASM programs are completely composable. If working in Solidity, a developer can call a Rust program or rely on another dependency in a different language. If working in Rust, all Solidity functionalities are accessible out of the box.
diff --git a/arbitrum-docs/stylus/gentle-introduction.mdx b/arbitrum-docs/stylus/gentle-introduction.mdx
new file mode 100644
index 000000000..d54481007
--- /dev/null
+++ b/arbitrum-docs/stylus/gentle-introduction.mdx
@@ -0,0 +1,54 @@
+---
+id: gentle-introduction
+title: 'A gentle introduction to Stylus'
+description: 'An educational introduction that provides a high-level understanding of Stylus, a new way to write EVM-compatible smart contracts using your favorite programming languages.'
+author: amarrazza
+sme: amarrazza
+target_audience: 'Developers who want to build on Arbitrum using popular programming languages, like Rust'
+sidebar_position: 1
+---
+
+# A gentle introduction: Stylus
+
+### In a nutshell:
+
+- Stylus lets you write smart contracts in programming languages that compile to WASM, such as **Rust, C, C++, and many others**, allowing you to tap into their ecosystem of libraries and tools. Rich language and tooling support already exist for Rust. You can try the SDK and CLI with the [quickstart](https://docs.arbitrum.io/stylus/quickstart).
+- Solidity contracts and Stylus contracts are fully interoperable. In Solidity, you can call a Rust program and vice versa, thanks to a second, coequal WASM virtual machine.
+- Stylus contracts offer significantly faster execution and lower gas fees for memory and compute-intensive operations, thanks to the superior efficiency of WASM programs.
+
+### What's Stylus?
+
+Stylus is an upgrade to Arbitrum Nitro [(ArbOS 32)](https://docs.arbitrum.io/run-arbitrum-node/arbos-releases/arbos32), the tech stack powering Arbitrum One, Arbitrum Nova, and Arbitrum Orbit chains. This upgrade adds a second, coequal virtual machine to the EVM, where EVM contracts continue to behave exactly as they would in Ethereum. We call this paradigm **MultiVM** since **everything is entirely additive.**
+
+![Stylus gives you MultiVM](./assets/stylus-multivm.jpg)
+
+This second virtual machine executes WebAssembly (WASM) rather than EVM bytecode. WASM is a modern binary format popularized by its use in major web standards, browsers, and companies to speed up computation. WASM is built to be fast, portable, and human-readable. It has sandboxed execution environments for security and simplicity. Working with WASM is nothing new for Arbitrum chains. Ever since the [Nitro upgrade](https://medium.com/offchainlabs/arbitrum-nitro-one-small-step-for-l2-one-giant-leap-for-ethereum-bc9108047450), WASM has been a fundamental component of Arbitrum's fully functioning fraud proofs.
+
+With a WASM VM, any programming language compilable to WASM is within Stylus's scope. While many popular programming languages can compile into WASM, some compilers are more suitable for smart contract development than others, like Rust, C, and C++. Other languages like Go, Sway, Move, and Cairo are also supported. Languages that include their own runtimes, like Python and Javascript, are more complex for Stylus to support, although not impossible. Compared to Solidity, WASM programs are much more efficient for memory-intensive applications. There are many reasons for this, including the decades of compiler development for Rust and C. WASM also has a faster runtime than the EVM, resulting in faster execution. Third-party [contribution](#contributing) in the form of libraries for new and existing languages is welcomed!
+
+### Use Cases
+
+While many developers will be drawn to new use cases, rebuilding existing applications in Stylus will also open the door to innovation and optimization. dApps have never been faster, cheaper, or safer. Stylus can integrate easily into existing Solidity projects by calling a Stylus contract to optimize specific parts of your dApp or building the entire dApp with Stylus. It's impossible to list all of the use cases Stylus enables; think about the properties of all WASM-compatible languages! That said, here are some particularly exciting ideas:
+
+- Efficient On-Chain Verification with ZK-Proofs: Enable cost-effective onchain verification
+ using zero-knowledge proving systems for privacy, interoperability, and more (see [case
+ study](https://blog.arbitrum.io/renegade-stylus-case-study/)).
+- Advanced DeFi Instruments: Power complex financial instruments and processes like custom
+ pricing curves for AMMs, synthetic assets, options, and futures with onchain computation via
+ extending current protocols (ie. Uniswap V4 hooks) or building your own.
+- High-Performance On-Chain Logic: Support memory and compute-intensive applications like
+ onchain games and generative art either by writing all of the application in Stylus or enhance
+ performance of existing Solidity contracts by optimizing specific parts.
+- **Endless Possibilities**: Enable innovative use cases such as generative art, compute-heavy
+ AI models, on-chain games, and projects utilizing advanced cryptography, unlocking the full potential
+ of resource-intensive applications on-chain.
+
+### Getting Started
+
+1. Utilize our [quickstart](https://docs.arbitrum.io/stylus/quickstart), [Rust SDK](https://docs.arbitrum.io/stylus/reference/overview), to help you start building.
+2. Join our Stylus Developer [Telegram](https://t.me/arbitrum_stylus) group and [Arbitrum Discord](https://discord.gg/arbitrum) for support as well as the official Arbitrum ([@Arbitrum](https://twitter.com/arbitrum)) and Arbitrum Developers ([@ArbitrumDevs](https://twitter.com/ArbitrumDevs)) X accounts for announcements.
+3. Check out the [Awesome Stylus](https://github.com/OffchainLabs/awesome-stylus) repository for various community contributed Stylus projects and tools. If you build something useful, we'd be happy to add it there.
+
+### Contributing
+
+Stylus is open to everyone, with a strong focus on delivering an exceptional programming experience. But the journey doesn't end here—developer feedback is crucial to enhancing Stylus’s tooling, documentation, and language features. By becoming an early adopter, you can explore its full potential and help shape its future. We’re actively seeking builders eager to push the limits of the EVM or develop tooling for Stylus. With over [$5M in grant funding available through the Stylus Sprint](https://blog.arbitrum.io/stylus-sprint/), now’s the time to get involved!
diff --git a/arbitrum-docs/stylus/how-tos/adding-support-for-new-languages.mdx b/arbitrum-docs/stylus/how-tos/adding-support-for-new-languages.mdx
index 96843399f..d2c4119fc 100644
--- a/arbitrum-docs/stylus/how-tos/adding-support-for-new-languages.mdx
+++ b/arbitrum-docs/stylus/how-tos/adding-support-for-new-languages.mdx
@@ -8,7 +8,7 @@ content_type: how-to
sidebar_position: 1
---
-[Arbitrum Stylus](../stylus-gentle-introduction.md) is a new technology developed for Arbitrum chains which gives smart contract developers superpowers. With Stylus, developers can write EVM-compatible smart contracts in many different programming languages, and reap massive performance gains. Stylus slashes fees, with performance gains ranging from 10-70x, and memory efficiency gains as high as 100-500x.
+[Arbitrum Stylus](../gentle-introduction.mdx) is a new technology developed for Arbitrum chains which gives smart contract developers superpowers. With Stylus, developers can write EVM-compatible smart contracts in many different programming languages, and reap massive performance gains. Stylus slashes fees, with performance gains ranging from 10-70x, and memory efficiency gains as high as 100-500x.
This is possible thanks to [WebAssembly](https://www.infoworld.com/article/3291780/what-is-webassembly-the-next-generation-web-platform-explained.html) technology, which all Stylus contracts compile to. Stylus smart contracts live under the **same Ethereum state trie** in Arbitrum nodes, and can fully interoperate with Solidity or Vyper EVM smart contracts. With Stylus, developers can write smart contracts in Rust that talk to Solidity and vice versa without any limitations.
diff --git a/arbitrum-docs/stylus/concepts/stylus-cache-manager.md b/arbitrum-docs/stylus/how-tos/caching-contracts.mdx
similarity index 99%
rename from arbitrum-docs/stylus/concepts/stylus-cache-manager.md
rename to arbitrum-docs/stylus/how-tos/caching-contracts.mdx
index 102e34a0a..e522d4ef0 100644
--- a/arbitrum-docs/stylus/concepts/stylus-cache-manager.md
+++ b/arbitrum-docs/stylus/how-tos/caching-contracts.mdx
@@ -1,5 +1,6 @@
---
-title: 'Stylus caching strategy'
+id: 'caching-contracts'
+title: 'Caching contracts with Stylus'
description: 'A conceptual overview of the Stylus caching strategy and CacheManager contract, and a practical guide for using its functionality.'
sme: mahsa-moosavi
target_audience: 'Developers deploying smart contracts using Stylus.'
diff --git a/arbitrum-docs/stylus/how-tos/debugging-stylus-tx.mdx b/arbitrum-docs/stylus/how-tos/debugging-tx.mdx
similarity index 65%
rename from arbitrum-docs/stylus/how-tos/debugging-stylus-tx.mdx
rename to arbitrum-docs/stylus/how-tos/debugging-tx.mdx
index afb45ee79..ac6e68abf 100644
--- a/arbitrum-docs/stylus/how-tos/debugging-stylus-tx.mdx
+++ b/arbitrum-docs/stylus/how-tos/debugging-tx.mdx
@@ -1,4 +1,5 @@
---
+id: debugging-tx
title: 'How to debug Stylus transactions using Cargo Stylus Replay'
description: 'This how-to explains how to perform trace calls and use GDB to replay and debug Stylus transactions, providing detailed analysis and troubleshooting.'
author: mahsamoosavi
@@ -8,8 +9,6 @@ content_type: how-to
sidebar_position: 2
---
-import MacosVerifyTxIssueBannerPartial from '../../partials/_macos-verify-tx-issue-banner-partial.mdx';
-
Debugging smart contracts can be challenging, especially when dealing with complex transactions. The `cargo-stylus` crate simplifies the debugging process by allowing developers to replay Stylus transactions. This tool leverages GDB to provide an interactive debugging experience, enabling developers to set breakpoints, inspect state changes, and trace the execution flow step-by-step. This capability is crucial for identifying and resolving issues, ensuring that smart contracts function correctly and efficiently.
### Overview
@@ -17,36 +16,40 @@ Debugging smart contracts can be challenging, especially when dealing with compl
Cargo Stylus is a tool designed to simplify the development and debugging process for smart contracts written in Rust for the Stylus execution environment. One of its powerful features is the `cargo stylus` subcommand, which provides essential functionalities for developers:
1. **Trace transactions**: Perform trace calls against Stylus transactions using Ethereum nodes' `debug_traceTransaction` RPC. This feature enables developers to analyze the execution flow and state changes of their transactions in a detailed manner.
-2. **Debugging with GDB**: Replay and debug the execution of a Stylus transaction using the GNU Debugger (GDB). This allows developers to set breakpoints, inspect variables, and step through the transaction execution line by line, providing an in-depth understanding of the transaction's behavior.
+2. **Debugging with GDB or LLDB**: Replay and debug the execution of a Stylus transaction using a debugger. This allows developers to set breakpoints, inspect variables, and step through the transaction execution line by line, providing an in-depth understanding of the transaction's behavior.
### Replaying transactions
-
-
#### Requirements
- **Rust** (version 1.77 or higher)
- **Crate**: `cargo-stylus`
-- **GNU Debugger (GDB)**
+- **GNU Debugger (GDB)** (Linux) or **LLDB** (MacOS)
- **[Cast](https://book.getfoundry.sh/cast/)** (an Ethereum CLI tool)
-- **Local Arbitrum Sepolia node** with tracing endpoints enabled or a [local Stylus dev node](https://arbitrum-docs-ncyp5gty1-offchain-labs.vercel.app/run-arbitrum-node/run-local-dev-node)
+- **[Arbitrum RPC Provider](#rpc-endpoint-compatibility)** with tracing endpoints enabled or a [local Stylus dev node](https://docs.arbitrum.io/run-arbitrum-node/run-nitro-dev-node)
-`cargo stylus replay` allows users to debug the execution of a Stylus transaction using [GDB](https://sourceware.org/gdb/) against the Rust source code.
+`cargo stylus replay` allows users to debug the execution of a Stylus transaction using [GDB](https://sourceware.org/gdb/) or [LLDB](https://lldb.llvm.org/) against the Rust source code.
### Installation and setup
-1. **Install the required crates and GDB**: First, let's ensure that the following crates are installed:
+1. **Install the required crates and debugger**: First, let's ensure that the following crates are installed:
```sh
cargo install cargo-stylus
```
-Install GDB if it's not already installed:
+If on Linux, install GDB if it's not already installed:
```sh
sudo apt-get install gdb
```
+If on MacOS, install LLDB if it's not already installed:
+
+```sh
+xcode-select --install
+```
+
2. **Deploy your Stylus contract**: For this guide, we demonstrate how to debug the execution of the `increment()` method in the [stylus-hello-world](https://github.com/OffchainLabs/stylus-hello-world) smart contract. In Rust, it looks something like this, within `src/lib.rs`:
```sh
@@ -97,7 +100,7 @@ And send a transaction using `Cast`:
cast send --rpc-url=$RPC_URL --private-key=$PRIV_KEY $ADDR "increment()"
```
-4. **Replay the transaction with GDB**: Now, we can replay the transaction with cargo stylus and GDB to inspect each step of it against our source code. Make sure GDB is installed and that you are on a Linux, x86 system.
+4. **Replay the transaction with the debugger**: Now, we can replay the transaction with cargo stylus and the debugger to inspect each step of it against our source code. Make sure GDB is installed and that you are on a Linux, x86 system.
Also, you should set the transaction hash as an environment variable:
```sh
@@ -107,10 +110,20 @@ export TX_HASH=0x18b241841fa0a59e02d3c6d693750ff0080ad792204aac7e5d4ce9e20c46683
And replay the transaction:
```sh
-cargo stylus replay --tx=$TX_HASH --endpoint=$RPC_URL
+cargo stylus replay --tx=$TX_HASH --endpoint=$RPC_URL --use-native-tracer
+```
+
+Options:
+
+```sh
+--tx: Specifies the transaction hash to replay.
+--endpoint: Specifies the RPC endpoint for fetching transaction data.
+--use-native-tracer: Uses the native Stylus tracer instead of the default JS tracer. The native tracer has broader support from RPC providers.
```
-GDB will load and set a breakpoint automatically at the `user_entrypoint` internal Stylus function.
+**Note:** The `--use-native-tracer` flag uses `stylusTracer` instead of `jsTracer`, which is required for tracing Stylus transactions on most RPC providers. See more details [below](#rpc-endpoint-compatibility).
+
+The debugger will load and set a breakpoint automatically at the `user_entrypoint` internal Stylus function. While the examples below showcase GDB commands, you can find the LLDB equivalents [here](https://lldb.llvm.org/use/map.html).
```sh
[Detaching after vfork from child process 370003]
@@ -120,7 +133,7 @@ Thread 1 "cargo-stylus" hit Breakpoint 1, stylus_hello_world::user_entrypoint (l
(gdb)
```
-5. **Debugging with GDB**: Now, set a breakpoint at the `increment()` method:
+5. **Debugging**: Now, set a breakpoint at the `increment()` method:
```sh
(gdb) b stylus_hello_world::Counter::increment
@@ -146,7 +159,7 @@ Thread 1 "cargo-stylus" hit Breakpoint 2, stylus_hello_world::Counter::increment
For traditional tracing, `cargo stylus` supports calls to `debug_traceTransaction`. To trace a transaction, you can use the following command:
```sh
-cargo stylus trace [OPTIONS] --tx
+cargo stylus trace [OPTIONS] --tx --use-native-tracer
```
Options:
@@ -157,16 +170,24 @@ Options:
-p, --project Project path [default: .]
-h, --help Print help
-V, --version Print version
+ --use-native-tracer Uses the native Stylus tracer instead of the default JS tracer. The native tracer has broader support from RPC providers.
```
Run the following command to obtain a trace output:
```sh
-cargo stylus trace --tx=$TX_HASH --endpoint=$RPC_URL
+cargo stylus trace --tx=$TX_HASH --endpoint=$RPC_URL --use-native-tracer
```
-This will produce a trace of the functions called and [ink](https://docs.arbitrum.io/stylus/concepts/stylus-gas#ink-and-gas) left along each method:
+This will produce a trace of the functions called and [ink](https://docs.arbitrum.io/stylus/concepts/gas-metering#ink-and-gas) left along each method:
```sh
[{"args":[0,0,0,4],"endInk":846200000,"name":"user_entrypoint","outs":[],"startInk":846200000},{"args":[],"endInk":846167558,"name":"msg_reentrant","outs":[0,0,0,0],"startInk":846175958},{"args":[],"endInk":846047922,"name":"read_args","outs":[208,157,224,138],"startInk":846061362},{"args":[],"endInk":845914924,"name":"msg_value","outs":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"startInk":845928364},{"args":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"endInk":227196069,"name":"storage_load_bytes32","outs":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"startInk":844944549},{"args":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],"endInk":226716083,"name":"storage_cache_bytes32","outs":[],"startInk":226734563},{"args":[0],"endInk":226418732,"name":"storage_flush_cache","outs":[],"startInk":226486805},{"args":[],"endInk":226362319,"name":"write_result","outs":[],"startInk":226403481},{"args":[],"endInk":846200000,"name":"user_returned","outs":[0,0,0,0],"startInk":846200000}]
```
+
+### RPC endpoint compatibility
+
+Both `cargo stylus trace` and `cargo stylus replay` require an RPC endpoint that supports `debug_traceTransaction`.
+By default, the `jsTracer` type is used, which is not supported by most RPC providers. If the `--use-native-tracer` flag is used, the `stylusTracer` type is used, which is supported by many RPC providers.
+Both `jsTracer` and `stylusTracer` are available on local nodes, but `stylusTracer` is more efficient.
+See this [list of RPC providers](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/chain-info#third-party-rpc-providers) for tracing support.
diff --git a/arbitrum-docs/stylus/stylus-overview.md b/arbitrum-docs/stylus/overview.mdx
similarity index 91%
rename from arbitrum-docs/stylus/stylus-overview.md
rename to arbitrum-docs/stylus/overview.mdx
index add851664..69af1443d 100644
--- a/arbitrum-docs/stylus/stylus-overview.md
+++ b/arbitrum-docs/stylus/overview.mdx
@@ -20,12 +20,12 @@ Let's learn how to write contracts with Stylus!
Stylus' basics. We'll cover the following steps:
-1. [Setting up your development environment](./stylus-quickstart#setting-up-your-development-environment)
-2. [Creating a Stylus project with cargo stylus](./stylus-quickstart#creating-a-stylus-project-with-cargo-stylus)
-3. [Checking the validity of your contract](./stylus-quickstart#checking-if-your-stylus-project-is-valid)
-4. [Deploying your contract](./stylus-quickstart#deploying-your-contract)
-5. [Exporting your contract's ABIs](./stylus-quickstart#exporting-solidity-abis)
-6. [Calling your contract](./stylus-quickstart#calling-your-contract)
-7. [Sending a transaction to your contract](./stylus-quickstart#sending-a-transaction-to-your-contract)
+1. [Setting up your development environment](./quickstart#setting-up-your-development-environment)
+2. [Creating a Stylus project with cargo stylus](./quickstart#creating-a-stylus-project-with-cargo-stylus)
+3. [Checking the validity of your contract](./quickstart#checking-if-your-stylus-project-is-valid)
+4. [Deploying your contract](./quickstart#deploying-your-contract)
+5. [Exporting your contract's ABIs](#exporting-the-solidity-abi-interface)
+6. [Calling your contract](./quickstart#calling-your-contract)
+7. [Sending a transaction to your contract](./quickstart#sending-a-transaction-to-your-contract)
## Setting up your development environment
@@ -172,7 +172,8 @@ Compressed WASM size: 3 KB
Program succeeded Stylus onchain activation checks with Stylus version: 1
```
-Note that running `cargo stylus check` may take a few minutes, especially if you're verifying a contract for the first time.
+Note that running `cargo stylus check` may take a few minutes, especially if you're verifying a contract for the first time
+.
See `cargo stylus check --help` for more options.
@@ -203,7 +204,7 @@ deployment tx total cost: "0.000712373700000000" ETH
### Deployment
-Let's move on to the contract's actual deployment. Two transactions will be sent onchain: the contract deployment and its [activation](stylus/stylus-gentle-introduction.md#activation).
+Let's move on to the contract's actual deployment. Two transactions will be sent onchain: the contract deployment and its activation.
```shell
cargo stylus deploy \
diff --git a/arbitrum-docs/stylus/recommended-libraries.md b/arbitrum-docs/stylus/recommended-libraries.md
index 3ebe933dc..11f5485db 100644
--- a/arbitrum-docs/stylus/recommended-libraries.md
+++ b/arbitrum-docs/stylus/recommended-libraries.md
@@ -1,7 +1,7 @@
---
id: recommended-libraries
title: Recommended Libraries
-sidebar_label: Recommended libraries
+sidebar_label: Use Rust Crates
---
# Recommended libraries
diff --git a/arbitrum-docs/stylus/reference/opcode-hostio-pricing.md b/arbitrum-docs/stylus/reference/opcode-hostio-pricing.md
index 8052fcf99..2ec46968b 100644
--- a/arbitrum-docs/stylus/reference/opcode-hostio-pricing.md
+++ b/arbitrum-docs/stylus/reference/opcode-hostio-pricing.md
@@ -7,7 +7,7 @@ target_audience: 'Developers deploying smart contracts using Stylus.'
sidebar_position: 3
---
-This reference provides the latest gas and ink costs for specific WASM opcodes and host I/Os when using Stylus. For a conceptual introduction to Stylus gas and ink, see [Gas and ink (Stylus)](/stylus/concepts/stylus-gas).
+This reference provides the latest gas and ink costs for specific WASM opcodes and host I/Os when using Stylus. For a conceptual introduction to Stylus gas and ink, see [Gas and ink (Stylus)](/stylus/concepts/gas-metering).
## Opcode costs
@@ -161,4 +161,4 @@ Note that the values in this table were determined via a conservative statistica
### See also
-- [Gas and ink (Stylus)](/stylus/concepts/stylus-gas): A conceptual introduction to the "gas" and "ink" primitives
+- [Gas and ink (Stylus)](/stylus/concepts/gas-metering): A conceptual introduction to the "gas" and "ink" primitives
diff --git a/arbitrum-docs/stylus/reference/overview.md b/arbitrum-docs/stylus/reference/overview.md
index 8152031b1..8020e442a 100644
--- a/arbitrum-docs/stylus/reference/overview.md
+++ b/arbitrum-docs/stylus/reference/overview.md
@@ -7,12 +7,12 @@ sidebar_position: 1
target_audience: Developers using the Stylus Rust SDK to write and deploy smart contracts.
---
-This section provides an in-depth overview of the features provided by the [Stylus Rust SDK](https://github.com/OffchainLabs/stylus-sdk-rs). For information about deploying Rust smart contracts, see the `cargo stylus` [CLI Tool](https://github.com/OffchainLabs/cargo-stylus). For a conceptual introduction to Stylus, see [Stylus: A Gentle Introduction](../stylus-gentle-introduction.md). To deploy your first Stylus smart contract using Rust, refer to the [Quickstart](../stylus-quickstart.mdx).
+This section provides an in-depth overview of the features provided by the [Stylus Rust SDK](https://github.com/OffchainLabs/stylus-sdk-rs). For information about deploying Rust smart contracts, see the `cargo stylus` [CLI Tool](https://github.com/OffchainLabs/cargo-stylus). For a conceptual introduction to Stylus, see [Stylus: A Gentle Introduction](../gentle-introduction.mdx). To deploy your first Stylus smart contract using Rust, refer to the [Quickstart](../quickstart.mdx).
The Stylus Rust SDK is built on top of [Alloy](https://www.paradigm.xyz/2023/06/alloy), a collection of crates empowering the Rust Ethereum ecosystem. Because the SDK uses the same [Rust primitives for Ethereum types](https://docs.rs/alloy-primitives/latest/alloy_primitives/), Stylus is compatible with existing Rust libraries.
The Stylus Rust SDK has been audited in August 2024 at [commit #62bd831](https://github.com/OffchainLabs/stylus-sdk-rs/tree/62bd8318c7f3ab5be954cbc264f85bf2ba3f4b06) by Open Zeppelin which can be viewed [on our audits page](audit-reports.mdx).
-This section contains a set of pages that describe a certain aspect of the Stylus Rust SDK, like how to work with [variables](/stylus-by-example/variables.mdx), or what ways are there to [send ether](/stylus-by-example/sending_ether.mdx). Additionally, there's also a page that compiles a set of [advanced features](/stylus/reference/rust-sdk-guide.md) that the Stylus Rust SDK provides.
+This section contains a set of pages that describe a certain aspect of the Stylus Rust SDK, like how to work with [variables](/stylus-by-example/basic_examples/variables.mdx), or what ways are there to [send ether](/stylus-by-example/basic_examples/sending_ether.mdx). Additionally, there's also a page that compiles a set of [advanced features](/stylus/reference/rust-sdk-guide.md) that the Stylus Rust SDK provides.
Finally, there's also a [Stylus by example](https://stylus-by-example.org) portal available that provides most of the information included in this section, as well as many different example contracts.
diff --git a/arbitrum-docs/stylus/reference/rust-sdk-guide.md b/arbitrum-docs/stylus/reference/rust-sdk-guide.md
index 301acb4ad..6c6e0dd37 100644
--- a/arbitrum-docs/stylus/reference/rust-sdk-guide.md
+++ b/arbitrum-docs/stylus/reference/rust-sdk-guide.md
@@ -9,7 +9,7 @@ target_audience: Developers using the Stylus Rust SDK to write and deploy smart
import StylusNoMultiInheritanceBannerPartial from '../partials/_stylus-no-multi-inheritance-banner-partial.mdx';
-This document provides information about advanced features included in the [Stylus Rust SDK](https://github.com/OffchainLabs/stylus-sdk-rs), that are not described in the previous pages. For information about deploying Rust smart contracts, see the `cargo stylus` [CLI Tool](https://github.com/OffchainLabs/cargo-stylus). For a conceptual introduction to Stylus, see [Stylus: A Gentle Introduction](../stylus-gentle-introduction.md). To deploy your first Stylus smart contract using Rust, refer to the [Quickstart](../stylus-quickstart.mdx).
+This document provides information about advanced features included in the [Stylus Rust SDK](https://github.com/OffchainLabs/stylus-sdk-rs), that are not described in the previous pages. For information about deploying Rust smart contracts, see the `cargo stylus` [CLI Tool](https://github.com/OffchainLabs/cargo-stylus). For a conceptual introduction to Stylus, see [Stylus: A Gentle Introduction](../gentle-introduction.mdx). To deploy your first Stylus smart contract using Rust, refer to the [Quickstart](../quickstart.mdx).
:::info
@@ -19,7 +19,7 @@ Many of the affordances use macros. Though this section details what each does,
## Storage
-This section provides extra information about how the Stylus Rust SDK handles storage. You can find more information and basic examples in [Variables](/stylus-by-example/variables.mdx).
+This section provides extra information about how the Stylus Rust SDK handles storage. You can find more information and basic examples in [Variables](/stylus-by-example/basic_examples/variables.mdx).
Rust smart contracts may use state that persists across transactions. There’s two primary ways to define storage, depending on if you want to use Rust or Solidity definitions. Both are equivalent, and are up to the developer depending on their needs.
@@ -226,7 +226,7 @@ The above allows consumers of `Erc20` to choose immutable constants via speciali
## Functions
-This section provides extra information about how the Stylus Rust SDK handles functions. You can find more information and basic examples in [Functions](/stylus-by-example/function.mdx), [Bytes in, bytes out programming](/stylus-by-example/bytes_in_bytes_out.mdx), [Inheritance](/stylus-by-example/inheritance.mdx) and [Sending ether](/stylus-by-example/sending_ether.mdx).
+This section provides extra information about how the Stylus Rust SDK handles functions. You can find more information and basic examples in [Functions](/stylus-by-example/basic_examples/function.mdx), [Bytes in, bytes out programming](/stylus-by-example/basic_examples/bytes_in_bytes_out.mdx), [Inheritance](/stylus-by-example/basic_examples/inheritance.mdx) and [Sending ether](/stylus-by-example/basic_examples/sending_ether.mdx).
### Pure, View, and Write functions
diff --git a/arbitrum-docs/stylus/stylus-gentle-introduction.md b/arbitrum-docs/stylus/stylus-gentle-introduction.md
deleted file mode 100644
index 1bf3f7995..000000000
--- a/arbitrum-docs/stylus/stylus-gentle-introduction.md
+++ /dev/null
@@ -1,127 +0,0 @@
----
-title: 'A gentle introduction to Stylus'
-description: 'An educational introduction that provides a high-level understanding of Stylus, a new way to write EVM-compatible smart contracts using your favorite programming languages.'
-author: amarrazza
-sme: amarrazza
-target_audience: 'Developers who want to build on Arbitrum using popular programming languages, like Rust'
-sidebar_position: 1
----
-
-# A gentle introduction: Stylus
-
-This introduction is for developers who want to build on