diff --git a/app/_content/build/d/features/mutability.mdx b/app/_content/build/d/features/mutability.mdx index 6d7a0fe..1446931 100644 --- a/app/_content/build/d/features/mutability.mdx +++ b/app/_content/build/d/features/mutability.mdx @@ -16,7 +16,7 @@ With mutable references you create a single, static URL that is linked to a sequ To create a mutable reference: -1. Upload a base transaction to Irys and reference it using a URL in the following format `https://gateway.irys.xyz/mutable/:txId` +1. Upload a base transaction to Irys and reference it using a URL in the following format: `https://gateway.irys.xyz/mutable/:txId` Use a token-specific version of `getIrysUploader()` to connect to an Irys Bundler before uploading. Choose [one from here](/build/d/sdk/setup). @@ -28,7 +28,7 @@ const receiptOne = await irysUploader.upload("First TX"); console.log(`TX 1 uploaded https://gateway.irys.xyz/mutable/${receiptOne.id}`); ``` -2. Upload an addition to the series as a new transaction, and add a tag named `Root-TX` with the value of the original transaction ID. +2. Upload an addition to the series as a new transaction, and add a tag named `Root-TX` with the value of the original transaction ID: ```js const tags = [{ name: "Root-TX", value: receiptOne.id }]; diff --git a/app/_content/build/d/features/supported-tokens.mdx b/app/_content/build/d/features/supported-tokens.mdx index 78e9910..1e5df86 100644 --- a/app/_content/build/d/features/supported-tokens.mdx +++ b/app/_content/build/d/features/supported-tokens.mdx @@ -66,7 +66,7 @@ On devnet, uploads are paid for with free faucet tokens. Data is deleted after ~ The Irys SDK reduces dependency bloat by providing dedicated packages for each token. Your import statements and connection code will differ depending on the token used for payment. -The following code is for using ethereum only, we [also have examples covering all of the tokens we support for payment](/build/d/sdk/setup). +The following code is for using Ethereum only, we [also have examples covering all of the tokens we support for payment](/build/d/sdk/setup). ```ts diff --git a/app/_content/build/d/features/tags.mdx b/app/_content/build/d/features/tags.mdx index 6eabe24..73175c5 100644 --- a/app/_content/build/d/features/tags.mdx +++ b/app/_content/build/d/features/tags.mdx @@ -18,7 +18,7 @@ Tags are indexed by gateways and are queryable using [GraphQL](/build/d/graphql) ## Content-Type -Irys automatically infers and sets the appropriate [`Content-Type`](https://developer.mozilla.org/en-US/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) tag based on the file extension when uploading files and folders. You can also manually set the `Content-Type` tag, doing so will override the default behavior and apply the value you provide. +Irys automatically infers and sets the appropriate [`Content-Type`](https://developer.mozilla.org/en-US/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) tag based on the file extension when uploading files and folders. You can also manually set the `Content-Type` tag, however, doing so will override the default behavior and apply the value you provide. ```js // Your file @@ -28,14 +28,14 @@ const fileToUpload = "./myImage.png"; const tags = [{ name: "Content-Type", value: "image/png" }]; try { - const response = await irys.uploadFile(fileToUpload, { tags: tags }); - console.log(`File uploaded ==> https://gateway.irys.xyz/${response.id}`); + const response = await irys.uploadFile(fileToUpload, { tags: tags }); + console.log(`File uploaded ==> https://gateway.irys.xyz/${response.id}`); } catch (e) { - console.log("Error uploading file ", e); + console.log("Error uploading file ", e); } ``` -You can also add tags via the [CLI's](/build/d/storage-cli/installation) `-t` option, followed by a series of name / value pairs +You can also add tags using the [CLI's](/build/d/storage-cli/installation) `-t` option, followed by a series of name / value pairs: ```console irys upload myImage.png \ @@ -50,7 +50,7 @@ irys upload myImage.png \ You can add up to 20 tags to each transaction, enabling the construction of semi-relational models within your data. -A popular practice involves creating an `application-id` tag, this tag helps segregate your uploads from others. +A popular practice involves creating an `application-id` tag, this tag helps separate your uploads from others. ```js // Your file @@ -59,9 +59,9 @@ const fileToUpload = "./myNFT.png"; const tags = [{ name: "application-id", value: "NFTs To The Moon" }]; try { - const response = await irys.uploadFile(fileToUpload, { tags: tags }); - console.log(`File uploaded ==> https://gateway.irys.xyz/${response.id}`); + const response = await irys.uploadFile(fileToUpload, { tags: tags }); + console.log(`File uploaded ==> https://gateway.irys.xyz/${response.id}`); } catch (e) { - console.log("Error uploading file ", e); + console.log("Error uploading file ", e); } ``` diff --git a/app/_content/build/d/features/txids.mdx b/app/_content/build/d/features/txids.mdx index df95b45..5d20dea 100644 --- a/app/_content/build/d/features/txids.mdx +++ b/app/_content/build/d/features/txids.mdx @@ -18,11 +18,10 @@ Transaction IDs are base58 encoded. ## Downloading Data with Transaction IDs -Use your unique transaction ID to download data from our [gateway](/learn/network/gateway) using a URL in the format +Use your unique transaction ID to download data from our [gateway](/learn/network/gateway) using a URL in the format: `https://gateway.irys.xyz/:transactionId` **Example** `https://gateway.irys.xyz/CO9EpX0lekJEfXUOeXncUmMuG8eEp5WJHXl9U9yZUYA` - diff --git a/app/_content/build/d/graphql.mdx b/app/_content/build/d/graphql.mdx index 7afeef9..dd6cd39 100644 --- a/app/_content/build/d/graphql.mdx +++ b/app/_content/build/d/graphql.mdx @@ -63,7 +63,7 @@ Queries return transaction metadata. To then retrieve data, use the returned tra ### Transaction IDs -Search by transaction IDs. +Search by transaction IDs: ```graphql query getByIds { @@ -220,7 +220,7 @@ query getPNGs { ### Sorting -You can sort results by timestamp in either ascending or descending order using the `order` field. +You can sort results by timestamp in either ascending or descending order using the `order` field: ```graphql query getAllByOwnerAsc { diff --git a/app/_content/build/d/irys-in-the-browser.mdx b/app/_content/build/d/irys-in-the-browser.mdx index d3f6f4f..fa485c2 100644 --- a/app/_content/build/d/irys-in-the-browser.mdx +++ b/app/_content/build/d/irys-in-the-browser.mdx @@ -22,7 +22,7 @@ Choose the code for your provider: ## EVM Chains -When connecting from an EVM chain, your connection code will differ based on the token you're using. The examples below use Ethereum and the `WebEthereum` class. To change tokens, use one from the following list. +When connecting from an EVM chain, your connection code will differ based on the token you're using. The examples below use Ethereum and the `WebEthereum` class. To change tokens, use one from the following list: | Token | Class Name | | ----------------- | ---------------- | diff --git a/app/_content/build/d/migrating.mdx b/app/_content/build/d/migrating.mdx index b268df6..bc69ac4 100644 --- a/app/_content/build/d/migrating.mdx +++ b/app/_content/build/d/migrating.mdx @@ -6,12 +6,13 @@ import Callout from "@/components/callout"; # Migrating to the Irys L1 -The Irys testnet is now live with support for permanent data uploads, and temporary data support coming soon. In the coming weeks, we’ll also introduce the [IrysVM](https://docs.irys.xyz/learn/why-build-on-irys/irysvm) and [Programmable Data](https://docs.irys.xyz/learn/why-build-on-irys/programmable-data). **Irys provides early access to all these new features for developers building on our platform.** +The Irys testnet is now live with support for permanent data uploads, and temporary data support coming soon. In the coming weeks, we’ll also introduce the [IrysVM](https://docs.irys.xyz/learn/why/why-irysvm) and [Programmable Data](https://docs.irys.xyz/learn/why/why-programmable-data). **Irys provides early access to all these new features for developers building on our platform.** At mainnet launch, all data uploaded to bundlers will be migrated from testnet to mainnet, with no changes to transaction IDs. -If you're not ready to migrate yet, you do not have to do anything. Irys's bundlers and gateway for Arweave will continue to operate as normal. + If you're not ready to migrate yet, you do not have to do anything. Irys's + bundlers and gateway for Arweave will continue to operate as normal. ## How to Migrate @@ -28,30 +29,32 @@ Change This: import Irys from "@irys/sdk"; const getIrys = async () => { - const irys = new Irys({ - network: "mainnet", - token: "ethereum", - key: process.env.PRIVATE_KEY, - }); - return irys; + const irys = new Irys({ + network: "mainnet", + token: "ethereum", + key: process.env.PRIVATE_KEY, + }); + return irys; }; ``` To This: - ```ts import { Uploader } from "@irys/upload"; import { Ethereum } from "@irys/upload-ethereum"; const getIrysUploader = async () => { - const irysUploader = await Uploader(Ethereum).withWallet(process.env.PRIVATE_KEY); + const irysUploader = await Uploader(Ethereum).withWallet( + process.env.PRIVATE_KEY + ); return irysUploader; }; ``` - - The above code is for ethereum only, [we also have examples](/build/d/sdk/setup) covering all supported tokens. + + The above code is for Ethereum only, [we also have + examples](/build/d/sdk/setup) covering all supported tokens. ### Browser @@ -63,13 +66,17 @@ import { WebIrys } from "@irys/sdk"; import { ethers } from "ethers"; const getWebIrys = async () => { - await window.ethereum.enable(); - const provider = new providers.Web3Provider(window.ethereum); - const wallet = { rpcUrl: rpcUrl, name: "ethersv5", provider: provider }; - const webIrys = new WebIrys({ network: "mainnet", token: "ethereum", wallet }); - await webIrys.ready(); - - return webIrys; + await window.ethereum.enable(); + const provider = new providers.Web3Provider(window.ethereum); + const wallet = { rpcUrl: rpcUrl, name: "ethersv5", provider: provider }; + const webIrys = new WebIrys({ + network: "mainnet", + token: "ethereum", + wallet, + }); + await webIrys.ready(); + + return webIrys; }; ``` @@ -79,18 +86,22 @@ To This: import { WebUploader } from "@irys/web-upload"; import { WebEthereum } from "@irys/web-upload-ethereum"; import { EthereumEthersv5 } from "@irys/web-upload-ethereum-ethers-v5"; - + const getIrysUploader = async () => { const provider = new ethers.providers.Web3Provider(window.ethereum); - const irysUploader = await WebUploader(WebEthereum).withProvider(EthereumEthersv5(provider)); + const irysUploader = await WebUploader(WebEthereum).withProvider( + EthereumEthersv5(provider) + ); return irysUploader; }; ``` - - The above code is for ethereum with ethers v5 only, [we also have examples](/build/d/irys-in-the-browser) covering all supported tokens and providers. + + The above code is for Ethereum with ethers v5 only, [we also have + examples](/build/d/irys-in-the-browser) covering all supported tokens and + providers. ## Support -Need help or just have questions? Come [find us in Discord](https://discord.gg/irys). \ No newline at end of file +Need help or just have questions? Come [find us in Discord](https://discord.gg/irys). diff --git a/app/_content/build/d/networks.mdx b/app/_content/build/d/networks.mdx index acec595..556a3bb 100644 --- a/app/_content/build/d/networks.mdx +++ b/app/_content/build/d/networks.mdx @@ -13,38 +13,35 @@ Irys has two Bundler networks: As well as an [L1 testnet](/build/programmability/introduction). - -## Connecting to the Mainnet bundler - -The following code is for using ethereum only, we [also have examples covering all of the tokens we support for payment](/build/d/sdk/setup). + The following code is for using Ethereum only, we [also have examples covering + all of the tokens we support for payment](/build/d/sdk/setup). +## Connecting to the Mainnet bundler ```ts import { Uploader } from "@irys/upload"; import { Ethereum } from "@irys/upload-ethereum"; - + const getIrysUploader = async () => { - const irysUploader = await Uploader(Ethereum).withWallet(process.env.PRIVATE_KEY); + const irysUploader = await Uploader(Ethereum).withWallet( + process.env.PRIVATE_KEY + ); return irysUploader; }; ``` ## Connecting to the Devnet bundler - -The following code is for using ethereum only, we [also have examples covering all of the tokens we support for payment](/build/d/sdk/setup). - - -To connect to devnet, append the functions `withRpc()` and `devnet()`. RPC URLs are required when using devnet. +To connect to devnet, append the functions `withRpc()` and `devnet()`. RPC URLs are required when using devnet. ```ts import { Uploader } from "@irys/upload"; import { Ethereum } from "@irys/upload-ethereum"; - + const getIrysUploader = async () => { // RPC URLs change often. Use a current one from https://chainlist.org/ - const rpcURL = ""; + const rpcURL = ""; const irysUploader = await Uploader(Ethereum) .withWallet(process.env.PRIVATE_KEY) .withRpc(rpcURL) @@ -52,4 +49,4 @@ const getIrysUploader = async () => { return irysUploader; }; -``` \ No newline at end of file +``` diff --git a/app/_content/build/d/troubleshooting.mdx b/app/_content/build/d/troubleshooting.mdx index c66b15e..2a16469 100644 --- a/app/_content/build/d/troubleshooting.mdx +++ b/app/_content/build/d/troubleshooting.mdx @@ -18,14 +18,14 @@ Errors: This error can be safely ignored, it will not cause any issues. To make the error go away, you'll need to install updated Python and C++ build tools. -**MacOS** +#### **MacOS** Current versions of MacOS come pre-built with Python. To install the C++ build tools: - First install [XCode](https://developer.apple.com/xcode/download/) - Once XCode is installed, go to Preferences, Downloads, and install the Command Line Tools -**Windows** +#### **Windows** Windows users need to install both Python and C++ build tools. These commands must be run with administrator permissions. @@ -37,7 +37,7 @@ npm i -g --add-python-to-path --vs2015 --production windows-build-tools npm i -g node-gyp@latest ``` -**UNIX** +#### **UNIX** Most UNIX distributions come with Python installed. To install C++ build tools, the following works for most Debian-based systems. For others, use your package manager to install "GCC build tools". @@ -49,7 +49,7 @@ sudo apt-get install build-essential **Error message**: Error: Not enough balance for transaction -This error occurs when you try to upload to a node without first funding it. +This error occurs when you try to upload to a node without first funding it. Tokens for use on our devnet bundler can be obtained for free from common faucets like the ones for [Solana](https://faucet.solana.com/) and [Sepolia](https://sepoliafaucet.com/). @@ -63,9 +63,9 @@ This can be fixed by configuring Irys as follows: ```js const irys = new Irys({ - url: nodeUrl, - token, - provider, - config: { tokenOpts: { commitment: "finalized" } }, + url: nodeUrl, + token, + provider, + config: { tokenOpts: { commitment: "finalized" } }, }); ``` diff --git a/app/_content/build/programmability/introduction.mdx b/app/_content/build/programmability/introduction.mdx index 8620e75..f966286 100644 --- a/app/_content/build/programmability/introduction.mdx +++ b/app/_content/build/programmability/introduction.mdx @@ -1,6 +1,6 @@ # Our alpha testnet is live! -With our testnet live you can store data directly on the L1, build apps with IrysVM and Programmable Data +With our testnet live you can store data directly on the L1, build apps with IrysVM and Programmable Data. ## IrysVM @@ -10,11 +10,10 @@ As a fork of the Ethereum Virtual Machine (EVM), the Irys Virtual Machine (IrysV Programmable Irys unlocks a new paradigm where data can be actively used and manipulated in real-time by smart contracts. With Programmable Data, Irys integrates cost-effective data storage and smart-contract functionality, enabling dApps and services to interact programmatically with large amounts of onchain data within a single protocol and ecosystem. This streamlines development, lowers costs, and unlocks unprecedented composability, overcoming the limitations of fragmented integrations. - {/* ## Ledgers Ledgers are a key data model innovation, allowing for scalable configurable duration storage. the Irys testnet currently has 2 ledgers: 0: the Perm ledger - This is for data that is stored permanently. 1: the Term ledger - This is for data upload validation for Perm txs. It has a minimum storage duration of `5 days`. -For a more complete break down, see [Learn: Ledgers](/learn/protocol-overview/ledgers-overview) */} \ No newline at end of file +For a more complete break down, see [Learn: Ledgers](/learn/protocol-overview/ledgers-overview) */} diff --git a/app/_content/build/programmability/programmable-data.mdx b/app/_content/build/programmability/programmable-data.mdx index ef5a2b9..3a5ddb5 100644 --- a/app/_content/build/programmability/programmable-data.mdx +++ b/app/_content/build/programmability/programmable-data.mdx @@ -1,13 +1,14 @@ import Callout from "@/components/callout"; # Programmable data quickstart + - This guide assumes you're decently familiar with solidity smart contract development. + This guide assumes you're decently familiar with Solidity smart contract + development. #### Create a programmable data smart contract - Programmable data is a feature leveraged through Solidity smart contracts via a custom precompile.\ We have a library contract to provide a cleaner API to use programmable data [here](https://github.com/Irys-xyz/precompile-libraries/) @@ -15,7 +16,6 @@ A full example Foundry project [here](https://github.com/Irys-xyz/irys/blob/mast And an example E2E test using `@irys/js` [here](https://github.com/Irys-xyz/irys-js/blob/master/tests/programmableData.ts) - To use this library, first create a Solidity contract that inherits `ProgrammableData`: ```sol @@ -51,37 +51,38 @@ To create a programmable data transaction (which will allow use of the Programma ```ts const accessList = await irysClient.programmable_data - .read(transactionId, startOffset, length) - .toAccessList(); + .read(transactionId, startOffset, length) + .toAccessList(); ``` + This range will read bytes `startOffset` -> `startOffset + length` of `transactionId`'s data. - Only transactions uploaded to the permanent ledger (ledgerId 0) can be read using programmable data.\ - DataItems uploaded through Irys' bundlers are currently not supported (but will be!) + Only transactions uploaded to the permanent ledger (ledgerId 0) can be read using programmable data.\ + DataItems uploaded through Irys' bundlers are currently not supported (but will be!) - #### Add them to a execution Transaction -This should be a transaction aiming to call the `readPdBytesIntoStorage` method of the contract. + +This should be a transaction aiming to call the `readPdBytesIntoStorage` method of the contract. - You will be charged for every chunk you request, even if you don't read them.\ - So only attach a programmable data access list to a transaction that will use them! + You will be charged for every chunk you request, even if you don't read them.\ + So only attach a programmable data access list to a transaction that will use + them! ```ts - import { Wallet } from "ethers"; - const wallet = new Wallet(, irysClient.api.rpcProvider) - const evmTransaction = { - accessList: [accessList], - type: 2 // type must be EIP-1559 or higher - .... - } - await wallet.sendTransaction(evmTransaction); +import { Wallet } from "ethers"; +const wallet = new Wallet(, irysClient.api.rpcProvider) +const evmTransaction = { + accessList: [accessList], + type: 2 // type must be EIP-1559 or higher + .... +} +await wallet.sendTransaction(evmTransaction); ``` + Once the transaction processes, you can call the `getStorage` contract method, which should return the data you specified in your programmable data read range.\ Note that you will pay normal rates for storing data in smart contract storage slots. - - diff --git a/app/_content/learn/network-overview/becoming-a-miner-on-irys.mdx b/app/_content/learn/network-overview/becoming-a-miner-on-irys.mdx index de62953..58d394e 100644 --- a/app/_content/learn/network-overview/becoming-a-miner-on-irys.mdx +++ b/app/_content/learn/network-overview/becoming-a-miner-on-irys.mdx @@ -19,10 +19,10 @@ This dual-layer commitment—both computational and economic—reinforces networ ### Consensus Model -- Irys uses a consensus model that combines Proof of Work with Proof of Staking +- Irys uses a consensus model that combines Proof of Work with Proof of Staking. - Staked resources anchor each miner's commitment to the network's stability. - Staked, verified addresses allow for secure and direct communication across the network, reducing attack vectors and ensuring data consistency. ### Data Partitioning and Verification -- Before mining, each 16TB partition undergoes Matrix Packing. This structured process prepares data for efficient verification and aligns with Irys’s high standards for accuracy and accessibility. \ No newline at end of file +- Before mining, each 16TB partition undergoes Matrix Packing. This structured process prepares data for efficient verification and aligns with Irys’s high standards for accuracy and accessibility. diff --git a/app/_content/learn/protocol-overview/programmable-data.mdx b/app/_content/learn/protocol-overview/programmable-data.mdx index 9a0fe54..f0da484 100644 --- a/app/_content/learn/protocol-overview/programmable-data.mdx +++ b/app/_content/learn/protocol-overview/programmable-data.mdx @@ -1,5 +1,5 @@ --- -description: Programmable data embeds logic into onchain assets, enabling automated, reliable execution for decentralized smart contracts. +description: Programmable data embeds logic into onchain assets, enabling automated, reliable execution for decentralized smart contracts. --- # Programmable Data @@ -23,21 +23,20 @@ This structure allows precise targeting of data stored within Irys’s partition In addition, Programmable Data also offers *Byte Read Ranges*, which build on top of chunk read ranges to provide easy access to specific parts of a transaction's data. the format for a byte read range is: + ```jsx ::: ``` -- + - **partition_index**: (26 bytes) The index of the partition in the Publish Ledger containing the first chunk. - **offset**: (4 bytes) The starting chunk offset within the partition. - **chunk_count**: (2 bytes) The number of sequential chunks to retrieve starting from the offset. - - ## Pricing for Programmable Data ### Base Fee -Unpacking and deserializing data for IrysVM incurs computational overhead, which is mitigated through a **base fee** to prevent spam. +Unpacking and deserializing data for IrysVM incurs computational overhead, which is mitigated through a **base fee** to prevent spam. During the testnet phase: @@ -53,18 +52,14 @@ Dynamic pricing adjusts access costs to Irys’s data ledgers based on market de With testnet block times of **30 seconds**, the network can process up to **7,500 chunks per block** (at 250 chunks/second). Each chunk represents **256KiB of data**. - **Increase:** - - If more than **50%** of block capacity is used, the base fee scales linearly up to **+12.5%** when all **7,500 chunks** are consumed. - -- **Decrease**: + If more than **50%** of block capacity is used, the base fee scales linearly up to **+12.5%** when all **7,500 chunks** are consumed. - If no chunks are used, the base fee decreases by up to **-12.5%** per block, with a **minimum floor of $0.01** and no upper limit. +- **Decrease**: - + If no chunks are used, the base fee decreases by up to **-12.5%** per block, with a **minimum floor of $0.01** and no upper limit. This congestion pricing model avoids unpredictable spikes in costs, providing developers with **consistent economic efficiency**, even during peak demand. - ## Data Availability & Synchronization Irys ensures robust data availability through an efficient synchronization mechanism that leverages both peer-to-peer sharing and miner-based retrieval. This multi-layered approach guarantees data accessibility under all conditions. @@ -89,7 +84,6 @@ The ledger identifies replicas, and the node randomly selects a partition for re This fallback ensures reliable access, even under heavy network demand. - ## Verifying Data for Execution Transaction validation for Programmable Data involves verifying the integrity and availability of the requested chunks. Nodes can retrieve and validate chunks through several pathways: @@ -123,4 +117,4 @@ If the node cannot retrieve chunks through caching or peers within the expected 2. It selects a partition replica at random and requests the chunks. 3. If the chunks are provided in a packed state, the node unpacks them and validates using steps 4–6 from the "Local Packed Chunks" process. -This comprehensive validation ensures the accuracy and reliability of programmable data before execution, maintaining the **integrity of smart contract interactions**. \ No newline at end of file +This comprehensive validation ensures the accuracy and reliability of programmable data before execution, maintaining the **integrity of smart contract interactions**. diff --git a/app/_content/learn/why/why-irysvm.mdx b/app/_content/learn/why/why-irysvm.mdx index 9bcc1a4..864cd00 100644 --- a/app/_content/learn/why/why-irysvm.mdx +++ b/app/_content/learn/why/why-irysvm.mdx @@ -7,21 +7,21 @@ import SimpleRiveViewer from "@/components/SimpleRiveViewer"; # Why IrysVM
-
- -
+
+ +
## What is IrysVM? IrysVM is the virtual machine at the heart of Irys, built to make smart contracts and data work together efficiently and directly. While most blockchains treat data storage and smart contract execution as two separate functions, IrysVM integrates them under a single network. This lets smart contracts interact directly with data in ways that simply aren’t possible on other platforms. -IrysVM offers the same benefits as an Ethereum Virtual Machine, but with a unique advantage: it’s built for direct access to Irys’s data ledgers +IrysVM offers the same benefits as an Ethereum Virtual Machine, but with a unique advantage: it’s built for direct access to Irys’s data ledgers. ## Why IrysVM Matters @@ -29,4 +29,4 @@ The main advantage of IrysVM is that it allows developers to attach specific pro For developers, it opens up a straightforward path to building applications where data is more than just stored information—it’s functional, adaptable, and cheap to work with. -Additionally, with IrysVM’s design, storage and smart contract transactions are kept on separate processing lanes. This prevents the typical competition for blockspace that can drive up costs on other blockchains. Developers gain predictable transaction costs and stability, even as storage needs increase, making it simpler to scale applications over time. \ No newline at end of file +Additionally, with IrysVM’s design, storage and smart contract transactions are kept on separate processing lanes. This prevents the typical competition for blockspace that can drive up costs on other blockchains. Developers gain predictable transaction costs and stability, even as storage needs increase, making it simpler to scale applications over time.