Storage Operations
This guide covers the primary storage API — synapse.storage.upload() — which stores your data with multiple providers for redundancy. For manual control over each upload phase, see Split Operations.
Key Concepts
Section titled “Key Concepts”Data Set: A logical container of pieces stored with one provider. When a data set is created, a payment rail is established with that provider. All pieces in the data set share this single payment rail and are verified together via PDP proofs.
PieceCID: Content-addressed identifier for your data (format: bafkzcib...). Automatically calculated during upload and used to retrieve data from any provider.
Metadata: Optional key-value pairs for organization:
- Data Set Metadata: Max 10 keys (e.g.,
project,environment) - Piece Metadata: Max 5 keys per piece (e.g.,
filename,contentType)
Copies and Durability: By default, upload() stores your data with 2 independent providers. Each provider maintains its own data set with separate PDP proofs and payment rails. If one provider goes down, your data is still available from the other.
Storage Manager: The main entry point for storage operations (synapse.storage). Handles provider selection, multi-copy orchestration, data set management, and provider-agnostic downloads.
Storage Approaches
Section titled “Storage Approaches”Upload Examples
Section titled “Upload Examples”Upload data with a single call — the SDK selects providers and handles multi-copy replication automatically:
import { class Synapse
Synapse } from "@filoz/synapse-sdk";import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from 'viem/accounts'
const const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount('0x...') });
const const data: Uint8Array<ArrayBuffer>
data = new var Uint8Array: Uint8ArrayConstructornew (elements: Iterable<number>) => Uint8Array<ArrayBuffer> (+6 overloads)
Uint8Array([1, 2, 3, 4, 5])
const { const pieceCid: PieceLink
pieceCid, const size: number
size, const copies: CopyResult[]
copies, const failures: FailedCopy[]
failures } = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.upload(data: UploadPieceStreamingData, options?: StorageManagerUploadOptions): Promise<UploadResult>
upload(const data: Uint8Array<ArrayBuffer>
data)
var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("PieceCID:", const pieceCid: PieceLink
pieceCid.Link<MerkleTreeNode, RAW_CODE, MulticodecCode<4113, "fr32-sha2-256-trunc254-padded-binary-tree">, 1>.toString<string>(base?: MultibaseEncoder<string> | undefined): ToString<Link<MerkleTreeNode, RAW_CODE, MulticodecCode<4113, "fr32-sha2-256-trunc254-padded-binary-tree">, Version>, string>
Returns a string representation of an object.
toString())var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("Size:", const size: number
size, "bytes")var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("Stored on", const copies: CopyResult[]
copies.Array<CopyResult>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length, "providers")
for (const const copy: CopyResult
copy of const copies: CopyResult[]
copies) { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(` Provider ${const copy: CopyResult
copy.CopyResult.providerId: bigint
providerId}: role=${const copy: CopyResult
copy.CopyResult.role: "primary" | "secondary"
role}, dataSet=${const copy: CopyResult
copy.CopyResult.dataSetId: bigint
dataSetId}`)}
if (const failures: FailedCopy[]
failures.Array<T>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length > 0) { var console: Console
console.Console.warn(...data: any[]): void
The console.warn() static method outputs a warning message to the console at the 'warning' log level.
warn("Some copies failed:", const failures: FailedCopy[]
failures)}The result contains:
pieceCid— content address of your data, used for downloadssize— size of the uploaded data in bytescopies— array of successful copies, each withproviderId,dataSetId,pieceId,role('primary'or'secondary'),retrievalUrl, andisNewDataSetfailures— array of failed copy attempts (partial failures are returned, not thrown), each withproviderId,role,error, andexplicit
Upload with Metadata
Section titled “Upload with Metadata”Attach metadata to organize uploads. The SDK reuses existing data sets when metadata matches, avoiding duplicate payment rails:
import { class Synapse
Synapse } from "@filoz/synapse-sdk";import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from 'viem/accounts'
const const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount('0x...') });
const const data: Uint8Array<ArrayBuffer>
data = new var TextEncoder: new () => TextEncoder
The TextEncoder interface takes a stream of code points as input and emits a stream of UTF-8 bytes.
TextEncoder().TextEncoder.encode(input?: string): Uint8Array<ArrayBuffer>
The TextEncoder.encode() method takes a string as input, and returns a Global_Objects/Uint8Array containing the text given in parameters encoded with the specific method for that TextEncoder object.
encode("Hello, Filecoin!")
const const result: UploadResult
result = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.upload(data: UploadPieceStreamingData, options?: StorageManagerUploadOptions): Promise<UploadResult>
upload(const data: Uint8Array<ArrayBuffer>
data, { BaseContextOptions.metadata?: Record<string, string>
metadata: { type Application: string
Application: "My DApp", type Version: string
Version: "1.0.0", type Category: string
Category: "Documents", }, StorageManagerUploadOptions.pieceMetadata?: Record<string, string>
pieceMetadata: { filename: string
filename: "hello.txt", contentType: string
contentType: "text/plain", },})
var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("Uploaded:", const result: UploadResult
result.UploadResult.pieceCid: PieceLink
pieceCid.Link<MerkleTreeNode, RAW_CODE, MulticodecCode<4113, "fr32-sha2-256-trunc254-padded-binary-tree">, 1>.toString<string>(base?: MultibaseEncoder<string> | undefined): ToString<Link<MerkleTreeNode, RAW_CODE, MulticodecCode<4113, "fr32-sha2-256-trunc254-padded-binary-tree">, Version>, string>
Returns a string representation of an object.
toString())Subsequent uploads with the same metadata reuse the same data sets and payment rails.
Upload with Callbacks
Section titled “Upload with Callbacks”Track the lifecycle of a multi-copy upload with callbacks:
import { class Synapse
Synapse } from "@filoz/synapse-sdk"import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from "viem/accounts"
const const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount("0x...") })
const const data: Uint8Array<ArrayBuffer>
data = new var Uint8Array: Uint8ArrayConstructornew (length: number) => Uint8Array<ArrayBuffer> (+6 overloads)
Uint8Array(1024) // 1KB of data
const const result: UploadResult
result = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.upload(data: UploadPieceStreamingData, options?: StorageManagerUploadOptions): Promise<UploadResult>
upload(const data: Uint8Array<ArrayBuffer>
data, { StorageManagerUploadOptions.callbacks?: Partial<CombinedCallbacks>
callbacks: { onStored?: (providerId: bigint, pieceCid: PieceCID) => void
onStored: (providerId: bigint
providerId, pieceCid: PieceLink
pieceCid) => { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Data stored on provider ${providerId: bigint
providerId}`) }, onCopyComplete?: (providerId: bigint, pieceCid: PieceCID) => void
onCopyComplete: (providerId: bigint
providerId, pieceCid: PieceLink
pieceCid) => { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Secondary copy complete on provider ${providerId: bigint
providerId}`) }, onCopyFailed?: (providerId: bigint, pieceCid: PieceCID, error: Error) => void
onCopyFailed: (providerId: bigint
providerId, pieceCid: PieceLink
pieceCid, error: Error
error) => { var console: Console
console.Console.warn(...data: any[]): void
The console.warn() static method outputs a warning message to the console at the 'warning' log level.
warn(`Copy failed on provider ${providerId: bigint
providerId}:`, error: Error
error.Error.message: string
message) }, onPullProgress?: (providerId: bigint, pieceCid: PieceCID, status: PullStatus) => void
onPullProgress: (providerId: bigint
providerId, pieceCid: PieceLink
pieceCid, status: PullStatus
status) => { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Pull to provider ${providerId: bigint
providerId}: ${status: PullStatus
status}`) }, onPiecesAdded?: (transaction: Hex, providerId: bigint, pieces: { pieceCid: PieceCID;}[]) => void
onPiecesAdded: (txHash: `0x${string}`
txHash, providerId: bigint
providerId, pieces: { pieceCid: PieceCID;}[]
pieces) => { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`On-chain commit submitted: ${txHash: `0x${string}`
txHash}`) }, onPiecesConfirmed?: (dataSetId: bigint, providerId: bigint, pieces: PieceRecord[]) => void
onPiecesConfirmed: (dataSetId: bigint
dataSetId, providerId: bigint
providerId, pieces: PieceRecord[]
pieces) => { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Confirmed on-chain: dataSet=${dataSetId: bigint
dataSetId}, provider=${providerId: bigint
providerId}`) }, onProgress?: (bytesUploaded: number) => void
onProgress: (bytesUploaded: number
bytesUploaded) => { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Uploaded ${bytesUploaded: number
bytesUploaded} bytes`) }, },})Callback lifecycle:
onProgress— fires during upload to primary provideronStored— primary upload complete, piece parked on SPonPullProgress— SP-to-SP transfer status for secondariesonCopyComplete/onCopyFailed— secondary pull resultonPiecesAdded— commit transaction submittedonPiecesConfirmed— commit confirmed on-chain
Controlling Copy Count
Section titled “Controlling Copy Count”Adjust the number of copies for your durability requirements:
import { class Synapse
Synapse } from "@filoz/synapse-sdk"import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from "viem/accounts"
const const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount("0x...") })
const const data: Uint8Array<ArrayBuffer>
data = new var Uint8Array: Uint8ArrayConstructornew (length: number) => Uint8Array<ArrayBuffer> (+6 overloads)
Uint8Array(256)
// Store 3 copies for higher redundancyconst const result3: UploadResult
result3 = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.upload(data: UploadPieceStreamingData, options?: StorageManagerUploadOptions): Promise<UploadResult>
upload(const data: Uint8Array<ArrayBuffer>
data, { CreateContextsOptions.count?: number
count: 3 })var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("3 copies:", const result3: UploadResult
result3.UploadResult.copies: CopyResult[]
copies.Array<CopyResult>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length)
// Store a single copy when redundancy isn't neededconst const result1: UploadResult
result1 = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.upload(data: UploadPieceStreamingData, options?: StorageManagerUploadOptions): Promise<UploadResult>
upload(const data: Uint8Array<ArrayBuffer>
data, { CreateContextsOptions.count?: number
count: 1 })var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("1 copy:", const result1: UploadResult
result1.UploadResult.copies: CopyResult[]
copies.Array<CopyResult>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length)The default is 2 copies. The first copy is stored on an endorsed provider (high trust, curated), and secondary copies are pulled via SP-to-SP transfer from approved providers.
Understanding the Result
Section titled “Understanding the Result”upload() is designed around partial success over atomicity: it commits whatever succeeded rather than throwing away successful work. This means the return value is the primary interface for understanding what happened — not just whether it threw.
When upload() throws
Section titled “When upload() throws”upload() only throws in these cases:
| Error | What happened | What to do |
|---|---|---|
StoreError | Primary upload failed — no data committed anywhere | Retry the upload |
CommitError | Data is stored on providers but all on-chain commits failed | Use split operations to retry commit() without re-uploading |
| Selection error | No endorsed provider available or reachable | Check provider health / network |
When upload() returns
Section titled “When upload() returns”If upload() returns (no throw), at least one copy is committed on-chain. But the result may contain fewer copies than requested. Every copy in copies[] represents a committed on-chain data set that the user is now paying for.
import { class Synapse
Synapse } from "@filoz/synapse-sdk"import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from "viem/accounts"
const const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount("0x...") })
const const data: Uint8Array<ArrayBuffer>
data = new var Uint8Array: Uint8ArrayConstructornew (length: number) => Uint8Array<ArrayBuffer> (+6 overloads)
Uint8Array(256)
const const result: UploadResult
result = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.upload(data: UploadPieceStreamingData, options?: StorageManagerUploadOptions): Promise<UploadResult>
upload(const data: Uint8Array<ArrayBuffer>
data, { CreateContextsOptions.count?: number
count: 2 })
// Check: did we get all requested copies?if (const result: UploadResult
result.UploadResult.copies: CopyResult[]
copies.Array<CopyResult>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length < 2) { var console: Console
console.Console.warn(...data: any[]): void
The console.warn() static method outputs a warning message to the console at the 'warning' log level.
warn(`Only ${const result: UploadResult
result.UploadResult.copies: CopyResult[]
copies.Array<CopyResult>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length}/2 copies succeeded`) for (const const failure: FailedCopy
failure of const result: UploadResult
result.UploadResult.failures: FailedCopy[]
failures) { var console: Console
console.Console.warn(...data: any[]): void
The console.warn() static method outputs a warning message to the console at the 'warning' log level.
warn(` Provider ${const failure: FailedCopy
failure.FailedCopy.providerId: bigint
providerId} (${const failure: FailedCopy
failure.FailedCopy.role: "primary" | "secondary"
role}): ${const failure: FailedCopy
failure.FailedCopy.error: string
error}`) }}
// Check: did the endorsed primary succeed?const const primaryFailed: FailedCopy | undefined
primaryFailed = const result: UploadResult
result.UploadResult.failures: FailedCopy[]
failures.Array<FailedCopy>.find(predicate: (value: FailedCopy, index: number, obj: FailedCopy[]) => unknown, thisArg?: any): FailedCopy | undefined (+1 overload)
Returns the value of the first element in the array where predicate is true, and undefined
otherwise.
find(f: FailedCopy
f => f: FailedCopy
f.FailedCopy.role: "primary" | "secondary"
role === "primary")if (const primaryFailed: FailedCopy | undefined
primaryFailed) { var console: Console
console.Console.warn(...data: any[]): void
The console.warn() static method outputs a warning message to the console at the 'warning' log level.
warn(`Endorsed provider failed: ${const primaryFailed: FailedCopy
primaryFailed.FailedCopy.error: string
error}`) // Data is only on non-endorsed secondaries}
// Every copy is committed and being paid forfor (const const copy: CopyResult
copy of const result: UploadResult
result.UploadResult.copies: CopyResult[]
copies) { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Provider ${const copy: CopyResult
copy.CopyResult.providerId: bigint
providerId}, dataset ${const copy: CopyResult
copy.CopyResult.dataSetId: bigint
dataSetId}, piece ${const copy: CopyResult
copy.CopyResult.pieceId: bigint
pieceId}`)}Auto-retry behavior
Section titled “Auto-retry behavior”For auto-selected providers (no explicit providerIds or dataSetIds), the SDK automatically retries failed secondaries with alternate providers up to 5 times. If you explicitly specify providers, the SDK respects your choice and does not retry.
Retrieval Approaches
Section titled “Retrieval Approaches”Download from any provider that has the piece — the SDK resolves the provider automatically:
import { class Synapse
Synapse } from "@filoz/synapse-sdk"import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from "viem/accounts"
const const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount("0x...") })
// Download using PieceCID from a previous uploadconst const pieceCid: "bafkzcib..."
pieceCid = "bafkzcib..." // from upload resultconst const bytes: Uint8Array<ArrayBufferLike>
bytes = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.download(options: StorageManagerDownloadOptions): Promise<Uint8Array>
download({ pieceCid: string | PieceLink
pieceCid })const const text: string
text = new var TextDecoder: new (label?: string, options?: TextDecoderOptions) => TextDecoder
The TextDecoder interface represents a decoder for a specific text encoding, such as UTF-8, ISO-8859-2, KOI8-R, GBK, etc.
TextDecoder().TextDecoder.decode(input?: AllowSharedBufferSource, options?: TextDecodeOptions): string
The TextDecoder.decode() method returns a string containing text decoded from the buffer passed as a parameter.
decode(const bytes: Uint8Array<ArrayBufferLike>
bytes)var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("Downloaded:", const text: string
text)For CDN-accelerated downloads:
import { class Synapse
Synapse } from "@filoz/synapse-sdk"import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from "viem/accounts"
// Enable CDN globallyconst const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount("0x..."), SynapseOptions.withCDN?: boolean
withCDN: true,})
const const bytes: Uint8Array<ArrayBufferLike>
bytes = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.download(options: StorageManagerDownloadOptions): Promise<Uint8Array>
download({ pieceCid: string | PieceLink
pieceCid: "bafkzcib..." })
// Or per-download:const const bytes2: Uint8Array<ArrayBufferLike>
bytes2 = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.download(options: StorageManagerDownloadOptions): Promise<Uint8Array>
download({ pieceCid: string | PieceLink
pieceCid: "bafkzcib...", withCDN?: boolean
withCDN: true,})Data Set Management
Section titled “Data Set Management”Getting all data sets
Section titled “Getting all data sets”Retrieve all data sets owned by your account to inspect piece counts, CDN status, and metadata:
import { class Synapse
Synapse } from "@filoz/synapse-sdk";import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from 'viem/accounts'
const const synapse: Synapse
synapse = class Synapse
Synapse.Synapse.create(options: SynapseOptions): Synapse
create({ SynapseOptions.account: `0x${string}` | Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount('0x...') });const const dataSets: EnhancedDataSetInfo[]
dataSets = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.findDataSets(options?: { address?: Address;}): Promise<EnhancedDataSetInfo[]>
findDataSets();
for (const const ds: EnhancedDataSetInfo
ds of const dataSets: EnhancedDataSetInfo[]
dataSets) { var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Dataset ${const ds: EnhancedDataSetInfo
ds.EnhancedDataSetInfo.pdpVerifierDataSetId: bigint
pdpVerifierDataSetId}:`, { live: boolean
live: const ds: EnhancedDataSetInfo
ds.EnhancedDataSetInfo.isLive: boolean
isLive, cdn: boolean
cdn: const ds: EnhancedDataSetInfo
ds.EnhancedDataSetInfo.withCDN: boolean
withCDN, pieces: bigint
pieces: const ds: EnhancedDataSetInfo
ds.EnhancedDataSetInfo.activePieceCount: bigint
activePieceCount, metadata: Record<string, string>
metadata: const ds: EnhancedDataSetInfo
ds.EnhancedDataSetInfo.metadata: Record<string, string>
metadata });}Getting data set pieces
Section titled “Getting data set pieces”List all pieces stored in a specific data set by iterating through a context:
const const context: StorageContext
context = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.createContext(options?: StorageServiceOptions): Promise<StorageContext>
createContext({ StorageServiceOptions.dataSetId?: bigint
dataSetId });
const const pieces: any[]
pieces = [];for await (const const piece: PieceRecord
piece of const context: StorageContext
context.StorageContext.getPieces(options?: { batchSize?: bigint;}): AsyncGenerator<PieceRecord>
getPieces()) { const pieces: any[]
pieces.Array<any>.push(...items: any[]): number
Appends new elements to the end of an array, and returns the new length of the array.
push(const piece: PieceRecord
piece);}var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Found ${const pieces: any[]
pieces.Array<any>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length} pieces`);Getting piece metadata
Section titled “Getting piece metadata”Access custom metadata attached to individual pieces:
import { class WarmStorageService
WarmStorageService } from "@filoz/synapse-sdk/warm-storage";import { function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount } from 'viem/accounts'
const const warmStorage: WarmStorageService
warmStorage = class WarmStorageService
WarmStorageService.WarmStorageService.create(options: { transport?: Transport; chain?: Chain; account: Account;}): WarmStorageService
create({ account: Account
account: function privateKeyToAccount(privateKey: Hex, options?: PrivateKeyToAccountOptions): PrivateKeyAccount
privateKeyToAccount('0x...') });
const const metadata: MetadataObject
metadata = await const warmStorage: WarmStorageService
warmStorage.WarmStorageService.getPieceMetadata(options: { dataSetId: bigint; pieceId: bigint;}): Promise<MetadataObject>
getPieceMetadata({ dataSetId: bigint
dataSetId, pieceId: bigint
pieceId: const piece: { pieceCid: string; pieceId: bigint;}
piece.pieceId: bigint
pieceId });var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("Piece metadata:", const metadata: MetadataObject
metadata);Getting the size of a specific piece
Section titled “Getting the size of a specific piece”Extract the size directly from a PieceCID using Synapse Core:
import { function getSizeFromPieceCID(pieceCidInput: PieceCID | CID | string): number
getSizeFromPieceCID } from "@filoz/synapse-core/piece";
const const pieceCid: "bafkzcib..."
pieceCid = "bafkzcib...";const const size: number
size = function getSizeFromPieceCID(pieceCidInput: PieceCID | CID | string): number
getSizeFromPieceCID(const pieceCid: "bafkzcib..."
pieceCid);var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log(`Piece size: ${const size: number
size} bytes`);Storage Information
Section titled “Storage Information”Query service-wide pricing, available providers, and network parameters:
const const info: StorageInfo
info = await const synapse: Synapse
synapse.Synapse.storage: StorageManager
storage.StorageManager.getStorageInfo(): Promise<StorageInfo>
getStorageInfo();var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("Price/TiB/month:", const info: StorageInfo
info.StorageInfo.pricing: { noCDN: { perTiBPerMonth: bigint; perTiBPerDay: bigint; perTiBPerEpoch: bigint; }; withCDN: { perTiBPerMonth: bigint; perTiBPerDay: bigint; perTiBPerEpoch: bigint; }; tokenAddress: Address; tokenSymbol: string;}
pricing.noCDN: { perTiBPerMonth: bigint; perTiBPerDay: bigint; perTiBPerEpoch: bigint;}
noCDN.perTiBPerMonth: bigint
perTiBPerMonth);var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("Providers:", const info: StorageInfo
info.StorageInfo.providers: PDPProvider[]
providers.Array<PDPProvider>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length);
const const providerInfo: PDPProvider
providerInfo = await const synapse: Synapse
synapse.Synapse.getProviderInfo(providerAddress: Address | bigint): Promise<PDPProvider>
getProviderInfo("0x...");var console: Console
console.Console.log(...data: any[]): void
The console.log() static method outputs a message to the console.
log("PDP URL:", const providerInfo: PDPProvider
providerInfo.PDPProvider.pdp: PDPOffering
pdp.PDPOffering.serviceURL: string
serviceURL);Next Steps
Section titled “Next Steps”-
Split Operations — Manual control over store, pull, and commit phases for batch uploads, custom error handling, and direct core library usage.
-
Plan Storage Costs — Calculate your monthly costs and understand funding requirements.
-
Payment Management — Manage deposits, approvals, and payment rails.