Storage·Irys · Ethereum · Solana · Multi-chain
Irys
Programmable datachain (formerly Bundlr) — an L1 that combines a low-cost storage layer with an EVM-compatible execution layer (IrysVM). Funds in any of 20+ supported tokens (ETH, SOL, MATIC, etc.); writes get a permanent, verifiable on-chain receipt.
- 01permanent NFT metadata + media
- 02AI dataset / model weight provenance
- 03onchain content with multi-token payment
- 04verifiable mutable apps via tagged data + manifests
- 05permanent audit logs and historical records
- pnpm add @irys/upload @irys/upload-ethereum
| Variable | Scope | Description |
|---|---|---|
| IRYS_PRIVATE_KEY | Server | Funded private key (Ethereum / Solana / etc.) used by the Irys uploader to pay for storage. Server-side only. |
| NEXT_PUBLIC_IRYS_GATEWAY | Client | Irys gateway base URL for reads (e.g. `https://gateway.irys.xyz`). |
Use the modern `@irys/upload` package (the older `@irys/sdk` and `@bundlr-network/client` are legacy). On the server: `const irysUploader = await Uploader(Ethereum).withWallet(process.env.IRYS_PRIVATE_KEY)`, then upload with `const receipt = await irysUploader.upload(data, { tags: [{ name: 'Content-Type', value: 'application/json' }] })` or `irysUploader.uploadFile(path)` — the returned `receipt.id` is the permanent transaction ID and is fetched via `${NEXT_PUBLIC_IRYS_GATEWAY}/${id}`. Fund once with `irysUploader.fund(irysUploader.utils.toAtomic(0.1))`; check pricing first via `irysUploader.getPrice(bytes)`. For browser flows use `@irys/web-upload` and connect a user wallet — the user pays for their own uploads. Always set descriptive tags (`App-Name`, `Content-Type`, `Type`) so data is discoverable via Irys' GraphQL endpoint later.
- ⚑Bundlr was renamed to Irys in 2023 and the package layout changed again in 2024–2025 — `@bundlr-network/client` and the older `@irys/sdk` are deprecated. Use `@irys/upload` (server) and `@irys/web-upload` (browser).
- ⚑Uploads are permanent and immutable — you cannot delete or update. Re-uploading creates a new id; plan versioning via tags or a manifest object.
- ⚑Pricing is paid up front per byte and depends on the funded token's price — small files (<100 KiB at time of writing) are free, but bulk uploads need a positive funded balance. Always call `getPrice` first.
- ⚑Funding withdrawals take ~30 minutes to clear back to your wallet (`withdrawBalance`) — design batch flows around this.
- ⚑Irys is launching its own L1 datachain (IrysVM) — the legacy 'Irys on Arweave' write path and the new native datachain have different gateways and transaction-id semantics. Match the SDK version to the network you're targeting.
- ⚑Anything uploaded is public, permanent, and impossible to redact — never upload PII, copyrighted material, or anything that could be subject to legal removal requests.