diff --git a/apps/portal/redirects.mjs b/apps/portal/redirects.mjs index 30d5fdb4082..a6d9fba5838 100644 --- a/apps/portal/redirects.mjs +++ b/apps/portal/redirects.mjs @@ -865,6 +865,11 @@ const infrastructureRedirects = { "/storage/how-storage-works": "/infrastructure/storage/how-storage-works", "/storage/upload-to-ipfs": "/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs", + // infrastructure redirects to external portal + "/infrastructure/storage/:path*": + "https://portal.thirdweb.com/references/typescript/v5/functions#storage", + "/infrastructure/rpc-edge/:path*": + "https://portal.thirdweb.com/references/typescript/v5/functions#rpc", }; const glossaryRedirects = { diff --git a/apps/portal/src/app/infrastructure/assets/test.jpg b/apps/portal/src/app/infrastructure/assets/test.jpg deleted file mode 100644 index a606dd3a597..00000000000 Binary files a/apps/portal/src/app/infrastructure/assets/test.jpg and /dev/null differ diff --git a/apps/portal/src/app/infrastructure/layout.tsx b/apps/portal/src/app/infrastructure/layout.tsx deleted file mode 100644 index 2884479bf6b..00000000000 --- a/apps/portal/src/app/infrastructure/layout.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { createMetadata } from "@doc"; -import { DocLayout } from "@/components/Layouts/DocLayout"; -import { sidebar } from "./sidebar"; - -export default async function Layout(props: { children: React.ReactNode }) { - return ( - - {props.children} - - ); -} - -export const metadata = createMetadata({ - description: - "All the infrastructure to scale and build production grade web3 applications", - title: "thirdweb Infrastructure", -}); diff --git a/apps/portal/src/app/infrastructure/page.mdx b/apps/portal/src/app/infrastructure/page.mdx deleted file mode 100644 index f632e6d15b9..00000000000 --- a/apps/portal/src/app/infrastructure/page.mdx +++ /dev/null @@ -1,77 +0,0 @@ -import { ArticleCard, GithubTemplateCard, Grid } from "@doc"; -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "thirdweb Infrastructure", - icon: "infra", - }, - title: "thirdweb Infrastructure", - description: - "All the infrastructure to scale and build production grade applications", -}); - -# Infrastructure - -All the infrastructure to scale and build production grade applications. - -## Products - -- [Storage:](/infrastructure/storage) Secure, fast, decentralized storage -- [RPC Edge:](/infrastructure/rpc-edge/overview) Enterprise-grade RPCs, for free - -### Guides - - - - - - - - - -### Templates - - - - - - - - - - - - - - diff --git a/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/api-key.png b/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/api-key.png deleted file mode 100644 index 1133d054e26..00000000000 Binary files a/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/api-key.png and /dev/null differ diff --git a/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/public-rpcs.png b/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/public-rpcs.png deleted file mode 100644 index a89c90d4f7b..00000000000 Binary files a/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/public-rpcs.png and /dev/null differ diff --git a/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/usage-dashboard.png b/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/usage-dashboard.png deleted file mode 100644 index 5239d6e3c0b..00000000000 Binary files a/apps/portal/src/app/infrastructure/rpc-edge/get-started/assets/usage-dashboard.png and /dev/null differ diff --git a/apps/portal/src/app/infrastructure/rpc-edge/get-started/page.mdx b/apps/portal/src/app/infrastructure/rpc-edge/get-started/page.mdx deleted file mode 100644 index c27a1d3a15c..00000000000 --- a/apps/portal/src/app/infrastructure/rpc-edge/get-started/page.mdx +++ /dev/null @@ -1,153 +0,0 @@ -import { DocImage, Callout } from "@doc"; -import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; -import { createMetadata } from "@doc"; -import usageDashboardImage from "./assets/usage-dashboard.png"; - -import apiKeyImage from "./assets/api-key.png"; - -export const metadata = createMetadata({ - title: "Add RPC Edge to your application | thirdweb", - description: - "To enable RPC Edge usage in an application, obtain a thirdweb Client ID & Secret Key with RPC Edge enabled and pass it into the app's configuration.", -}); - -# Add RPC Edge to your application - -To enable RPC Edge usage in an application, obtain a thirdweb Client ID & Secret Key with RPC Edge enabled and pass it into the app's configuration. - -Obtain a Client ID & Secret Key by navigating to Settings > API Keys > `Create API Key`. - - - -Pass in the Client ID and Secret Keys into the application’s configuration. - - - - React - React Native - TypeScript - - - - -```jsx -import { ThirdwebProvider } from "@thirdweb-dev/react"; - -function MyApp() { - return ( - - - - ); -} -``` - - - - - -```jsx -import { ThirdwebProvider } from "@thirdweb-dev/react-native"; - -function MyApp() { - return ( - - - - ); -} -``` - - - - -```ts - // Read-only mode - const readOnlySdk = new ThirdwebSDK("", { - secretKey: "", - }); -``` - -When using the Typescript SDK for frontend applications, use the client id: - -```ts -const readOnlySdk = new ThirdwebSDK("", { - clientId: "", -}); -``` - - - - - -When using the Unity SDK, you can use the client id to instantiate the SDK: - -```csharp -ThirdwebSDK sdk = new ThirdwebSDK("", 5, new ThirdwebSDK.Options() -{ - clientId = "", -}); -``` - - - - - -## Override default RPC - -To override the default RPC for any given chain: - - - - - React - TypeScript - - - - -```jsx -import { ThirdwebProvider } from "@thirdweb-dev/react"; - -const App = () => { - return ( - .com"], - }} - > - - - ); -}; -``` - - - - - -```ts -import { ThirdwebSDK } from "@thirdweb-dev/sdk"; - -const sdk = new ThirdwebSDK({ - rpc: ["https://.com"], -}); -``` - - - - - - - Public RPCs can be used without an API Key. Refer to the [configured chains - page](https://thirdweb.com/chainlist). - - -## View RPC usage - -[View RPC request usage](https://thirdweb.com/team/~/~/usage) in the dashboard settings. - - diff --git a/apps/portal/src/app/infrastructure/rpc-edge/overview/assets/rpc-diagram.svg b/apps/portal/src/app/infrastructure/rpc-edge/overview/assets/rpc-diagram.svg deleted file mode 100644 index 150cd18a0a1..00000000000 --- a/apps/portal/src/app/infrastructure/rpc-edge/overview/assets/rpc-diagram.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/portal/src/app/infrastructure/rpc-edge/overview/page.mdx b/apps/portal/src/app/infrastructure/rpc-edge/overview/page.mdx deleted file mode 100644 index 5ebf2737b12..00000000000 --- a/apps/portal/src/app/infrastructure/rpc-edge/overview/page.mdx +++ /dev/null @@ -1,37 +0,0 @@ -import { Callout, DocImage } from "@doc"; -import { createMetadata } from "@doc"; -import rpcDiagramImage from "./assets/rpc-diagram.svg"; - -export const metadata = createMetadata({ - image: { - title: "thirdweb RPC Edge", - icon: "rpc", - }, - title: "thirdweb RPC Edge", - description: - "Remote Procedure Call (RPC) Edge provides reliable access to querying data and interacting with the blockchain through global edge RPCs.", -}); - -# RPC Edge - -Remote Procedure Call (RPC) Edge provides reliable access to querying data and interacting with the blockchain through global edge RPCs. - - - -By default, we provide publicly available RPCs to every EVM chain. [View the default RPC endpoints](https://thirdweb.com/chainlist) for each supported chain. - - - To use RPC Edge with other tools like Anvil, take a chain's [public RPC endpoint](https://thirdweb.com/chainlist) and attach your app's client ID from Project > Settings page in [dashboard](https://thirdweb.com/team) `https://.rpc.thirdweb.com/`. - - -#### Features - -- **Reduced Latency:** Global edge caching reduces latency by utilizing geographically distributed servers, smart routing, and caching RPC responses. RPC endpoints run on the edge with over 150+ worldwide locations, resulting in minimized latency, especially for frequently requested responses. -- **Improved Performance:** Create critical and scalable applications with maintained uptime and low latency, thanks to reduced response times. -- **High Reliability:** Utilize fallback across multiple providers to ensure high reliability. -- **Cost Efficient:** More cost-efficient at scale compared to competitors. -- **Compatible with any EVM Blockchain:** Use RPC Edge with any deployed contract on any EVM blockchain. - -#### Pricing & Billing - -RPC pricing is based on requests per second. If you're interested in upgrading your RPC Edge limits, you can find more information on the different tiers by visiting [thirdweb's pricing page](https://thirdweb.com/pricing). diff --git a/apps/portal/src/app/infrastructure/sidebar.tsx b/apps/portal/src/app/infrastructure/sidebar.tsx deleted file mode 100644 index 6dd7a066fea..00000000000 --- a/apps/portal/src/app/infrastructure/sidebar.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import type { SideBar } from "@/components/Layouts/DocLayout"; -import { InfraRPCIcon, InfraStorageIcon } from "@/icons"; - -const storageSlug = "/infrastructure/storage"; -const rpcSlug = "/infrastructure/rpc-edge"; - -export const sidebar: SideBar = { - links: [ - { - href: "/infrastructure", - name: "Overview", - }, - // Storage - { separator: true }, - { - icon: , - isCollapsible: false, - links: [ - { - href: `${storageSlug}/overview`, - name: "Overview", - }, - { - href: `${storageSlug}/how-storage-works`, - name: "How Storage Works", - }, - { - links: [ - { - href: "/wallets", - name: "TypeScript SDK", - }, - { - href: `${storageSlug}/how-to-use-storage/upload-files-to-ipfs`, - name: "Upload Files to IPFS", - }, - { - href: `${storageSlug}/how-to-use-storage/host-web-app`, - name: "Host Web App", - }, - ], - name: "How to Use Storage", - }, - ], - name: "Storage", - }, - //RPC Edge - { separator: true }, - { - icon: , - isCollapsible: false, - links: [ - { - href: `${rpcSlug}/overview`, - name: "Overview", - }, - { - href: `${rpcSlug}/get-started`, - name: "Get Started", - }, - ], - name: "RPC Edge", - }, - ], - name: "Infrastructure", -}; diff --git a/apps/portal/src/app/infrastructure/storage/how-storage-works/assets/storage-diagram.svg b/apps/portal/src/app/infrastructure/storage/how-storage-works/assets/storage-diagram.svg deleted file mode 100644 index 434929d6816..00000000000 --- a/apps/portal/src/app/infrastructure/storage/how-storage-works/assets/storage-diagram.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/portal/src/app/infrastructure/storage/how-storage-works/page.mdx b/apps/portal/src/app/infrastructure/storage/how-storage-works/page.mdx deleted file mode 100644 index aa6da643cd3..00000000000 --- a/apps/portal/src/app/infrastructure/storage/how-storage-works/page.mdx +++ /dev/null @@ -1,40 +0,0 @@ -import { Callout, DocImage } from "@doc"; -import { createMetadata } from "@doc"; -import storageDiagramImage from "./assets/storage-diagram.svg"; - -export const metadata = createMetadata({ - title: "how storage works | thirdweb", - description: - "Storage is a tool that simplifies the uploading, pinning, and downloading of files to and from IPFS. It utilizes a pinning service, Pinata, to pin files to IPFS and other solutions simultaneously.", -}); - -# Understand how storage works - -Storage is a tool that simplifies the uploading, pinning, and downloading of files to and from IPFS. It utilizes a pinning service, Pinata, to pin files to IPFS and other solutions simultaneously. - -This mechanism stops data from being deleted automatically because it's not being used or is unpopular. This can happen in decentralized storage systems where users need incentives to provide storage space. - - - Storage powers various functionalities within thirdweb products, including - smart contract ABIs for deployment, the IPFS Renderer UI, NFT metadata - fetching in the SDK, and NFT metadata uploading via the dashboard. - - -## Uploading Data To IPFS - -Uploading data to IPFS or decentralized storage is a process that involves: - -1. **Data Splitting:** Data is broken into smaller pieces by the IPFS Server to make it easier to manage. -2. **Upload:** We choose IPFS to store these pieces of data, and within the IPFS network, several computers (nodes) store the uploaded data. -3. **Access:** When you want to retrieve your data, the network puts all the pieces together and unlocks it for you. You can access the file through a Gateway - -Learn how to upload to IPFS using Storage in the Upload Files to IPFS guide. - -## Accessing Data Through IPFS Gateway - -To read data from IPFS, you need an [IPFS Gateway](https://docs.ipfs.tech/concepts/ipfs-gateway/). This allows you to access data from the IPFS protocol on browsers and other HTTP clients, -such as when building an application using the Contract SDK. - - - -When a user requests data from the network, the request is sent to the gateway. The gateway then retrieves the data from the decentralized storage network and returns it to the user. diff --git a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/host-web-app/page.mdx b/apps/portal/src/app/infrastructure/storage/how-to-use-storage/host-web-app/page.mdx deleted file mode 100644 index 2c480ee5032..00000000000 --- a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/host-web-app/page.mdx +++ /dev/null @@ -1,154 +0,0 @@ -import { InstallTabs } from "@doc"; -import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - title: "Host web application with IPFS | thirdweb Storage", - description: - "Uploading an app to decentralized storage offers perks such as reliable data, resistance to censorship, and better user data control. It is also more secure, scalable, and globally accessible.", -}); - -# Host web application with IPFS - -Uploading an app to decentralized storage offers perks such as reliable data, resistance to censorship, and better user data control. It is also more secure, scalable, and globally accessible. - -Deploy a web app to decentralized storage (IPFS) using the CLI. - -**Prerequisites** - -- configure clientId through `` in your app -- login to the thirdweb CLI using your clientId and SecretKey - -## Using Starter Templates - -[Starter templates](https://thirdweb.com/templates) are already pre-configured and set up for IPFS deployments. - -To deploy an app to IPFS from a starter template: - -1. Run the following command at the root of your project's directory: - - - -Upon executing this script, the application will be constructed, and subsequently, the contents of the `dist` output directory will be uploaded to IPFS. - -2. Once deployed successfully, the CLI will return the corresponding deployed URI and Gateway link. - -## Upload in Your Existing App - -To deploy to IPFS using your existing app, we will highlight the fields needed in your configuration files before running `deploy` in the following frameworks: React, Next, and Vite - - - - React - Next - Vite - - - - -To deploy your app to IPFS in React: - -1. Navigate to your `package.json` file in your project -2. Add a `homepage` field and set it to `"."` - - ```json - { - ... - "homepage": ".", - ... - } - ``` - -3. In the same file, add the following `deploy` script. - - ```json - { - ... - "scripts": { - ... - "deploy": "yarn build && npx thirdweb@latest upload build" - } - } - ``` - -4. Depending on your package manager, run one of the following commands at the root directory of your project: - -
- -
- -5. Once deployed successfully, the CLI will return the corresponding deployed URI and Gateway link. - -
- - - -To deploy your app to IPFS from Next: - -1. Navigate to the `package.json` file in your project. -2. Add the following `deploy` script - - ```json - { - ... - "scripts": { - ... - "deploy": "yarn build && npx thirdweb@latest upload build" - } - } - ``` - -3. Depending on your package manager, run one of the following commands at the root directory of your project to run the script: - -
- -
- -4. Once deployed successfully, the CLI will return the corresponding deployed URI and Gateway link. - -
- - - -To deploy your app to IPFS from Vite: - -1. Navigate to the `vite.config.js` -2. Set the `base` field in your `defaultConfig` to `./` - - ```json - const defaultConfig = { - base: "./", - plugins: [react()], - }; - ``` - -3. Navigate to your `package.json` file and add the following deploy script - - ```json - { - ... - "scripts": { - ... - "deploy": "yarn build && npx thirdweb@latest upload dist" - } - } - ``` - - When running this script, your application will be built, and the output directory `dist` will be uploaded to IPFS, effectively deploying your application. - -4. Depending on your package manager, run one of the following commands at the root directory of your project to run the script: - -
- -5. Once deployed successfully, the CLI will return the corresponding deployed URI and Gateway link. - -
-
diff --git a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-dashboard.png b/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-dashboard.png deleted file mode 100644 index 7fe9caca5c5..00000000000 Binary files a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-dashboard.png and /dev/null differ diff --git a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-upload.png b/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-upload.png deleted file mode 100644 index 13899724edd..00000000000 Binary files a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-upload.png and /dev/null differ diff --git a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-urls.png b/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-urls.png deleted file mode 100644 index 094f00580b4..00000000000 Binary files a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/assets/storage-urls.png and /dev/null differ diff --git a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/page.mdx b/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/page.mdx deleted file mode 100644 index 4e4775c8ad8..00000000000 --- a/apps/portal/src/app/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs/page.mdx +++ /dev/null @@ -1,201 +0,0 @@ -import { Steps, Step, Callout, DocImage } from "@doc"; -import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; -import { createMetadata } from "@doc"; -import storageDashboardImage from "./assets/storage-dashboard.png"; -import stroageUploadImage from "./assets/storage-upload.png"; -import storageUrlsImage from "./assets/storage-urls.png"; - -export const metadata = createMetadata({ - title: "Upload Files to IPFS | thirdweb Storage", - description: - "Upload and pin files and directories directly to IPFS using the dashboard, CLI or via a client or server environment using SDKs", -}); - -# Upload Files to IPFS - -Upload and pin files and directories directly to IPFS using the dashboard, CLI or via a client or server environment using SDKs. - -## Upload files to IPFS using dashboard - -To upload files using dashboard: - - - - - To authenticate to your account, connect your wallet. - - - -Navigate to the [storage dashboard](https://thirdweb.com/team/~/~/usage/storage) - - - - - - -Select your files or drag them into the upload box. Confirm that your files are correct, and then select "Start Upload.” - - - - - The duration of this process will depend on the amount of data uploaded. - - - - - -Upon completion, the corresponding IPFS addresses refers to where your content is stored on the IPFS Network. You may access these files using your unique gateway URL. - - - - - -
- -## Upload files to IPFS using CLI - -To upload files using the CLI, use the `upload` command and specify the relative path to the file name. - -```bash -npx thirdweb@latest upload path/to/file.extension -``` - -### Upload multiple files - -To upload multiple files, specify all the file names separated with spaces: - -```bash -npx thirdweb upload image1.png image2.png image3.png -``` - -### Upload entire directory - -To upload an entire directory, specify the relative directory name: - -```bash -npx thirdweb upload directory_name -``` - -
-## Upload files to IPFS using SDKs - - - - React - React Native - TypeScript - - - ```jsx - // Initialize your provider - import { ThirdwebProvider } from "@thirdweb-dev/react"; - - function Provider() { - return ( - - ... - - ); - } - - // Upload files to IPFS - import { useStorageUpload } from "@thirdweb-dev/react"; - - function App() { - const { mutateAsync: upload } = useStorageUpload(); - - const uploadData = () => { - // Get any data that you want to upload - const dataToUpload = [...]; - - // And upload the data with the upload function - const uris = await upload({ data: dataToUpload }); - } - ... - } - - // Render files from IPFS - import { MediaRenderer } from "@thirdweb-dev/react"; - - function App() { - return ( - // Supported types: image, video, audio, 3d model, html - - ); - } - ``` - - - ```jsx - // Initialize your provider - import { ThirdwebProvider } from "@thirdweb-dev/react"; - - function Provider() { - return ( - - ... - - ); - } - - // Upload files to IPFS - import { useStorageUpload } from "@thirdweb-dev/react"; - - function App() { - const { mutateAsync: upload } = useStorageUpload(); - - const uploadData = () => { - // Get any data that you want to upload - const dataToUpload = [...]; - - // And upload the data with the upload function - const uris = await upload({ data: dataToUpload }); - } - ... - } - - // Render files from IPFS - import { MediaRenderer } from "@thirdweb-dev/react"; - - function App() { - return ( - // Supported types: image, video, audio, 3d model, html - - ); - } - ``` - - - ```jsx - import { ThirdwebStorage } from "@thirdweb-dev/storage"; - - // First, instantiate the thirdweb IPFS storage - const storage = new ThirdwebStorage({ - secretKey: "YOUR_SECRET_KEY", // You can get one from dashboard settings - }); - - // Here we get the IPFS URI of where our metadata has been uploaded - const uri = await storage.upload(metadata); - // This will log a URL like ipfs://QmWgbcjKWCXhaLzMz4gNBxQpAHktQK6MkLvBkKXbsoWEEy/0 - console.info(uri); - - // Here we a URL with a gateway that we can look at in the browser - const url = await storage.resolveScheme(uri); - // This will log a URL like https://ipfs.thirdwebstorage.com/ipfs/QmWgbcjKWCXhaLzMz4gNBxQpAHktQK6MkLvBkKXbsoWEEy/0 - console.info(url); - - // You can also download the data from the uri - const data = await storage.downloadJSON(uri); - ``` - - - diff --git a/apps/portal/src/app/infrastructure/storage/overview/page.mdx b/apps/portal/src/app/infrastructure/storage/overview/page.mdx deleted file mode 100644 index a90cb370188..00000000000 --- a/apps/portal/src/app/infrastructure/storage/overview/page.mdx +++ /dev/null @@ -1,38 +0,0 @@ -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "thirdweb Storage", - icon: "storage", - }, - title: "thirdweb Storage", - description: - "Storage is a decentralized file management solution that allows for the storage and retrieval of information off-chain using IPFS", -}); - -# Storage - -Storage is a decentralized file management solution that allows for the storage and retrieval of information "off-chain" using [IPFS](/glossary/ipfs). With Storage, you can upload and pin files to IPFS and retrieve them at any time using IPFS gateway. - -You can easily upload and pin individual files or entire directories to IPFS using either the dashboard, CLI, or SDK. This makes Storage ideal for storing files in a permanent, decentralized, and censorship-resistant manner. - -Storage supports all types of files, including images, 3D models, videos, audio, full applications, and more. - -#### Gateway - -A gateway is a server that acts as an intermediary between a client and a decentralized storage network. It allows users to access and retrieve data stored on the network. - -#### Features - -- **Save Development Time:** Storage manages the difficult aspects of managing decentralized files, such as handling, pinning, and uploading metadata formats. -- **Improved Performance and Availability:** Benefit from faster upload speeds for decentralized storage, facilitated by our global edge infrastructure. -- **Unlock Product Suite:** Access powerful tools that allow you to easily build apps on top of your contracts, including SDKs and a dashboard. -- **User-friendly interface:** You can easily upload files directly through the dashboard, CLI, or SDKs. -- **Faster and high availability:** Enable fast downloads for decentralized storage through a reliable global infrastructure, simplifying data access and retrieval. -- **Censorship resistant:** Store your data with greater privacy and security using our decentralized storage solution. - -#### Pricing & Billing - -Storage offers usage-based pricing based on the amount of data uploaded and pinned per account. The first 1 GB is free, and each additional gigabyte incurs a charge of $0.10 per billing cycle. - -If you're interested in upgrading your storage limits, you can find more information on the different tiers by visiting [thirdweb's pricing page](https://thirdweb.com/pricing).