IPFS Services 
The SDK provides built-in support for two IPFS services through a unified interface. This allows you to choose your preferred IPFS provider while maintaining consistent functionality across the SDK.
Service Interface 
All IPFS services implement the IPFSServiceBase interface:
typescript
interface IPFSServiceBase {
  /** Upload data to IPFS */
  add(data: Blob | string): Promise<string>;
  /** Get data from IPFS */
  get(cid: string): Promise<Blob>;
  /** Get IPFS gateway URL */
  getGatewayUrl(): string;
}Built-in Services 
1. Pinata Service 
typescript
import { PinataService } from "@buidlerlabs/memejob-sdk-js";
const pinataService = new PinataService({
  gatewayUrl: "https://your-pinata-gateway.com",
  jwt: "your-pinata-jwt",
});Configuration 
| Parameter | Type | Description | 
|---|---|---|
| gatewayUrl | string | Your Pinata gateway URL | 
| jwt | string | Your Pinata JWT token | 
2. Infura Service 
typescript
import { InfuraService } from "@buidlerlabs/memejob-sdk-js";
const infuraService = new InfuraService({
  gatewayUrl: "https://your-infura-gateway.com",
  projectId: "<your-project-id>",
  projectSecret: "y<our-project-secret>",
});Configuration 
| Parameter | Type | Description | 
|---|---|---|
| gatewayUrl | string | Your Infura gateway URL | 
| projectId | string | Your Infura project ID | 
| projectSecret | string | Your Infura project secret | 
Usage 
Basic Setup 
typescript
import { MJMemoBuilder, PinataService } from "@buidlerlabs/memejob-sdk-js";
// Initialize IPFS service
const pinataService = new PinataService({
  gatewayUrl: "https://your-pinata-gateway.com",
  jwt: "your-pinata-jwt",
});
// Create memo builder with the service
const memoBuilder = new MJMemoBuilder(pinataService);Switching Services 
You can easily switch between different IPFS services:
typescript
// Using Pinata
const pinataService = new PinataService({
  gatewayUrl: "https://your-pinata-gateway.com",
  jwt: "your-pinata-jwt",
});
// Using Infura
const infuraService = new InfuraService({
  gatewayUrl: "https://your-infura-gateway.com",
  projectId: "your-project-id",
  projectSecret: "your-project-secret",
});
// Both services can be used interchangeably
const memoBuilder = new MJMemoBuilder(pinataService);
// or
const memoBuilder = new MJMemoBuilder(infuraService);Related Documentation 
- Memo Builder - Using IPFS services with the memo builder
- Token Metadata - Understanding token metadata structure