> ## Documentation Index
> Fetch the complete documentation index at: https://companyname-a7d5b98e-ton-storage.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Operate a storage provider

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

A storage provider is a paid TON Storage service. It combines a smart contract that holds client balances with a `storage-daemon` that downloads bags, keeps them available, and submits storage proofs.

## Prerequisites

* `storage-daemon` running with network connectivity and persistent storage
* Wallet with at least 1 TON to deploy and fund the provider contract
* Global network config file and access to the TON blockchain (mainnet or testnet)

## How the provider flow works

1. The provider owner starts `storage-daemon`, deploys the provider contract, and configures limits and rates.
2. A client packages files into a bag and generates a storage request message for the provider contract.
3. The contract creates a dedicated storage contract for that bag.
4. The daemon detects the request, downloads the bag, and activates the storage contract.
5. The client tops up the storage contract balance. The provider submits periodic proofs to continue earning payments.
6. When the balance drains or the provider declines the request, the contract deactivates and the obligation to store the bag ends.

<Aside type="note">
  Clients can always retrieve their files by proving ownership to the storage contract. After a successful claim, the contract deactivates.
</Aside>

## Use an existing provider (client side)

1. Fetch provider parameters to confirm limits and rates:

   ```bash theme={null}
   get-provider-params <PROVIDER_ADDRESS>
   ```

   The output includes whether new contracts are accepted, min/max bag size (bytes), storage rate (nanoTON per MB per day), and max proof interval.

   * `<PROVIDER_ADDRESS>` — address of the provider's smart contract

2. Create a bag and generate the storage request body:

   ```bash theme={null}
   new-contract-message <BAG_ID> <OUTPUT_FILE> --query-id 0 --provider <PROVIDER_ADDRESS>
   ```

   * `<BAG_ID>` — 64-character hex bag ID
   * `<OUTPUT_FILE>` — file path to write the generated message body
   * Large bags can take time to process.
   * The message body is saved to `<OUTPUT_FILE>`; it is not a full internal message.
   * Query ID can be any `0` to `2^64-1`. The provider will echo it back.
   * The generated body embeds the provider's current rate and max span. Regenerate the message if the provider changes these before sending.

3. Send the generated body as an internal message to `<PROVIDER_ADDRESS>` from any wallet. On success the storage contract returns a message with `op=0xbf7bd0c1`. After the provider downloads the bag it sends `op=0xd4caedcd`.

### Track balance and close a contract

* The storage contract balance decreases over time according to the provider's rate and the bag size.
* Top up at any time by transferring TON to the storage contract address.
* Read the current balance with the `get_storage_contract_data` getter (`balance` is the second value).
* Close voluntarily by sending a message with `op=0x79f937ea` from the client's wallet; reuse any query ID.

## Run a provider (operator side)

1. Start `storage-daemon` with provider mode enabled:

   ```bash theme={null}
   storage-daemon ... -P
   ```

2. Deploy the provider contract from `storage-daemon-cli`:

   ```bash theme={null}
   deploy-provider
   ```

   <Aside type="caution">
     The CLI prompts for a non-bounceable 1 TON message to initialize the contract. Confirm deployment with `get-provider-info`.
   </Aside>

3. Set local limits to control daemon behavior:

   ```bash theme={null}
   set-provider-config --max-contracts 100 --max-total-size 100000000000
   ```

   * `max contracts` — maximum concurrent storage contracts
   * `max total size` — total size of bags the provider accepts

4. Set on-chain parameters before accepting clients:

   ```bash theme={null}
   set-provider-params --accept 1 --rate 1000000000 --max-span 86400 --min-file-size 1024 --max-file-size 1000000000
   ```

   * Omit any flag to keep its current value.
   * Avoid running several `set-provider-params` commands back to back; wait for on-chain updates to finalize.
   * Fund the provider contract with more than 1 TON to cover future transactions, but avoid large deposits during initial non-bounceable setup.

After `accept` is set to `1`, the provider contract starts creating storage contracts for incoming requests. The daemon automatically downloads bags, seeds them, and submits proofs.

## Operate and withdraw

* List active contracts and balances:

  ```bash theme={null}
  get-provider-info --contracts --balances
  ```

  `Client$` shows client-provided funds; `Contract$` shows total contract funds. The difference is the provider's earnings.

* Withdraw earnings:

  ```bash theme={null}
  withdraw <ADDRESS>
  withdraw-all
  ```

* `<ADDRESS>` — destination TON account to receive funds

* Close a contract explicitly:

  ```bash theme={null}
  close-contract <CONTRACT_ADDRESS>
  ```

* `<CONTRACT_ADDRESS>` — address of the storage contract to close

  Closing transfers available funds to the main provider contract. Bags are deleted unless shared by other active contracts.

* Send TON from the provider contract to any address:

  ```bash theme={null}
  send-coins <ADDRESS> <AMOUNT_NANOTON>
  send-coins <ADDRESS> <AMOUNT_NANOTON> --message "optional note"
  ```

* `<AMOUNT_NANOTON>` — amount in nanotons to transfer

<Aside type="caution">
  All bags stored by the provider are listed with `list`. Do not delete them or use the same daemon to manage unrelated bags; this can disrupt proofs and payouts.
</Aside>

<Aside type="caution">
  Withdrawals and transfers move funds irreversibly. Confirm destination addresses and amounts before running `withdraw`, `withdraw-all`, or `send-coins`.
</Aside>
