arweave-bridge

ZigZag Exchange Arweave Bridge - Pay with zkSync stablecoins (USDC/USDT/DAI) for permanent Arweave storage. Use for building dApps needing decentralized file storage, NFT metadata permanence, or Layer 2 storage solutions.

11 stars

Best use case

arweave-bridge is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

ZigZag Exchange Arweave Bridge - Pay with zkSync stablecoins (USDC/USDT/DAI) for permanent Arweave storage. Use for building dApps needing decentralized file storage, NFT metadata permanence, or Layer 2 storage solutions.

Teams using arweave-bridge should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/arweave-bridge/SKILL.md --create-dirs "https://raw.githubusercontent.com/enuno/claude-command-and-control/main/skills-templates/arweave-bridge/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/arweave-bridge/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How arweave-bridge Compares

Feature / Agentarweave-bridgeStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

ZigZag Exchange Arweave Bridge - Pay with zkSync stablecoins (USDC/USDT/DAI) for permanent Arweave storage. Use for building dApps needing decentralized file storage, NFT metadata permanence, or Layer 2 storage solutions.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# ZigZag Arweave Bridge Skill

The Arweave Bridge is a service built by ZigZag Exchange that enables zkSync transactions to access permanent storage on Arweave. It provides a seamless way for Layer 2 users to store data permanently without needing to acquire AR tokens directly.

**Core Value Proposition**: Access Arweave permanent storage at $1/MB by paying directly on zkSync with stablecoins.

## When to Use This Skill

This skill should be triggered when:
- Building dApps that need permanent, decentralized file storage
- Storing NFT metadata permanently from Layer 2 networks
- Creating permissionless listing systems that need public metadata storage
- Integrating Arweave storage into zkSync applications
- Needing a bridge between L2 payments and permanent storage
- Implementing file upload systems with cryptographic authentication
- Building applications that require immutable data storage guarantees

## Quick Reference

### Base URL
```
https://zigzag-arweave-bridge.herokuapp.com/
```

### Payment Address (zkSync)
```
0xcb7aca0cdea76c5bd5946714083c559e34627607
```

### Supported Tokens
- USDC
- USDT
- DAI

### Conversion Rate
**1 MB per $1** of stablecoin deposited

## API Endpoints

### 1. Check Allocation

Query remaining storage bytes for an address.

**Endpoint:**
```
GET /allocation/zksync?address={wallet_address}
```

**Response:**
```json
{
  "remaining_bytes": 1048576
}
```

**Example:**
```bash
curl "https://zigzag-arweave-bridge.herokuapp.com/allocation/zksync?address=0xYourWalletAddress"
```

### 2. Get Server Time

Get current server timestamp for signature generation.

**Endpoint:**
```
GET /time
```

**Response:**
```json
{
  "timestamp": 1640000000000
}
```

**Example:**
```bash
curl "https://zigzag-arweave-bridge.herokuapp.com/time"
```

### 3. Upload File

Upload a file to Arweave permanent storage.

**Endpoint:**
```
POST /arweave/upload
```

**Content-Type:** `multipart/form-data`

**Required Fields:**
| Field | Type | Description |
|-------|------|-------------|
| `sender` | string | Ethereum wallet address |
| `file` | file | The file to upload |
| `timestamp` | number | Current server timestamp (ms) |
| `signature` | string | ECDSA signature of `{sender}:{timestamp}` |

**Response:**
```json
{
  "arweave_tx_id": "abc123...",
  "remaining_bytes": 1000000
}
```

## Authentication

All uploads require cryptographic signature verification:

1. Get current server timestamp from `/time`
2. Create message: `{sender_address}:{timestamp}`
3. Sign message with your Ethereum private key (ECDSA)
4. Include signature in upload request

**Message Format:**
```
0xYourAddress:1640000000000
```

## Complete Upload Example (Node.js)

```javascript
import { FormData, fileFromPath } from "formdata-node";
import fetch from "node-fetch";
import { ethers } from "ethers";
import dotenv from "dotenv";

dotenv.config();

const BASE_URL = "https://zigzag-arweave-bridge.herokuapp.com";

async function uploadToArweave(filePath) {
  // 1. Get current server time
  const timeResponse = await fetch(`${BASE_URL}/time`);
  const { timestamp } = await timeResponse.json();

  // 2. Create wallet and sign message
  const wallet = new ethers.Wallet(process.env.ETH_PRIVKEY);
  const sender = wallet.address;
  const message = `${sender}:${timestamp}`;
  const signature = await wallet.signMessage(message);

  // 3. Prepare form data
  const formData = new FormData();
  formData.append("sender", sender);
  formData.append("timestamp", timestamp.toString());
  formData.append("signature", signature);
  formData.append("file", await fileFromPath(filePath));

  // 4. Upload file
  const response = await fetch(`${BASE_URL}/arweave/upload`, {
    method: "POST",
    body: formData,
  });

  const result = await response.json();
  console.log("Arweave TX ID:", result.arweave_tx_id);
  console.log("Remaining bytes:", result.remaining_bytes);

  return result;
}

// Usage
uploadToArweave("./my-file.json");
```

## Dependencies

```json
{
  "dependencies": {
    "formdata-node": "^4.0.0",
    "node-fetch": "^3.0.0",
    "ethers": "^5.0.0",
    "dotenv": "^10.0.0"
  }
}
```

## Environment Variables

```bash
# Required for signing uploads
ETH_PRIVKEY=your_private_key_here
```

## Workflow

### Step 1: Fund Your Allocation

Send stablecoins on zkSync to the bridge address:

```
Address: 0xcb7aca0cdea76c5bd5946714083c559e34627607
Network: zkSync
Tokens: USDC, USDT, or DAI
Rate: $1 = 1 MB storage
```

Credits typically appear within 1-2 minutes.

### Step 2: Check Your Allocation

```javascript
const response = await fetch(
  `${BASE_URL}/allocation/zksync?address=${yourAddress}`
);
const { remaining_bytes } = await response.json();
console.log(`Available storage: ${remaining_bytes / 1024 / 1024} MB`);
```

### Step 3: Upload Files

Use the complete upload example above, ensuring:
- Timestamp is current (stale timestamps are rejected)
- Signature is valid for your address
- File size doesn't exceed your allocation

### Step 4: Access Your Data

Once uploaded, your file is permanently stored on Arweave:

```
https://arweave.net/{arweave_tx_id}
```

## Use Cases

### NFT Metadata Storage

```javascript
// Store NFT metadata permanently
const metadata = {
  name: "My NFT",
  description: "A permanent NFT",
  image: "https://arweave.net/previous_image_tx_id",
  attributes: [...]
};

// Write to temp file and upload
fs.writeFileSync("/tmp/metadata.json", JSON.stringify(metadata));
const result = await uploadToArweave("/tmp/metadata.json");

// Use Arweave URL as NFT tokenURI
const tokenURI = `https://arweave.net/${result.arweave_tx_id}`;
```

### Permissionless Token Listing

```javascript
// Store token pair metadata for DEX listing
const pairMetadata = {
  baseToken: "0x...",
  quoteToken: "0x...",
  icon: "base64_image_data",
  description: "Trading pair info"
};

const result = await uploadToArweave(pairMetadataPath);
// Metadata now permanently accessible and verifiable
```

### Document Archival

```javascript
// Archive important documents permanently
const documents = ["contract.pdf", "agreement.pdf", "records.json"];

for (const doc of documents) {
  const result = await uploadToArweave(doc);
  console.log(`${doc} archived: https://arweave.net/${result.arweave_tx_id}`);
}
```

## Error Handling

### Common Errors

| Error | Cause | Solution |
|-------|-------|----------|
| Invalid signature | Wrong private key or message format | Verify `{sender}:{timestamp}` format |
| Timestamp expired | Request took too long | Get fresh timestamp and retry |
| Insufficient allocation | Not enough storage credits | Send more stablecoins to bridge |
| Invalid sender | Address doesn't match signature | Ensure sender matches signing wallet |

### Error Response Format

```json
{
  "error": "Invalid signature",
  "message": "The provided signature does not match the sender address"
}
```

## Security Considerations

- **Private Key Security**: Never expose your `ETH_PRIVKEY` in client-side code
- **Timestamp Validation**: Always fetch fresh timestamps; stale ones are rejected
- **Replay Protection**: Timestamp in signature prevents replay attacks
- **HTTPS**: Always use HTTPS for API calls

## Why Arweave Bridge?

### The Problem
- Ethereum's original vision included Swarm for decentralized storage, but it was never implemented
- Users on L2s can't easily access permanent storage
- Requiring users to acquire AR tokens creates friction
- Filecoin exists but Arweave has better architecture for permanence

### The Solution
- Pay with familiar stablecoins on zkSync
- No need to acquire or manage AR tokens
- Simple REST API with cryptographic authentication
- Permanent, immutable storage guarantees

## Architecture

```
┌─────────────┐     ┌─────────────────────┐     ┌─────────────┐
│   User      │────▶│  Arweave Bridge     │────▶│   Arweave   │
│  (zkSync)   │     │  (Heroku Server)    │     │  (Storage)  │
└─────────────┘     └─────────────────────┘     └─────────────┘
      │                      │
      │ USDC/USDT/DAI       │ Manages allocations
      ▼                      │ Validates signatures
┌─────────────┐              │ Uploads to Arweave
│   Bridge    │◀─────────────┘
│   Address   │
└─────────────┘
```

## Related Technologies

- **Arweave**: Permanent decentralized storage network
- **zkSync**: Ethereum Layer 2 scaling solution
- **ZigZag Exchange**: Native DEX on ZK Rollups
- **ethers.js**: Ethereum library for signing

## Resources

- [GitHub Repository](https://github.com/ZigZagExchange/arweave-bridge)
- [ZigZag Exchange](https://www.zigzag.exchange/)
- [Arweave Network](https://www.arweave.org/)
- [zkSync](https://zksync.io/)

## Limitations

- Currently supports zkSync only (other L2s planned)
- Requires Node.js environment for the example code
- Server-side signing required (can't sign in browser without exposing private key)
- Hosted on Heroku (consider self-hosting for production)

## Notes

- Allocation credits appear within 1-2 minutes of zkSync transaction
- Files are stored permanently on Arweave once uploaded
- The bridge is open source and can be self-hosted
- Timestamps must be current; the API rejects stale requests
- All uploads are verified via ECDSA signatures

## Version History

- **1.0.0** (2026-01-10): Initial skill release
  - Complete API documentation
  - Node.js upload example
  - Authentication workflow
  - Use case examples
  - Error handling guide

Related Skills

arweave-standards

11
from enuno/claude-command-and-control

GitHub repository skill for ArweaveTeam/arweave-standards

arweave-ao-cookbook

11
from enuno/claude-command-and-control

Build decentralized applications on AO - a permanent, decentralized compute platform using actor model for parallel processes with native message-passing and permanent storage on Arweave

agent-skill-bridge

11
from enuno/claude-command-and-control

No description provided.

web-artifacts-builder

11
from enuno/claude-command-and-control

Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.

ui-ux-pro-max

11
from enuno/claude-command-and-control

UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 8 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.

turbo-sdk

11
from enuno/claude-command-and-control

Complete Arweave Turbo ecosystem including client SDKs, core upload infrastructure, payment service backend, and CLI tools for permanent decentralized storage

terraform-best-practices

11
from enuno/claude-command-and-control

Comprehensive best practices for Terraform infrastructure as code from Anton Babenko's community guide

sveltekit-svelte5-tailwind-skill

11
from enuno/claude-command-and-control

Comprehensive integration skill for building sites with SvelteKit 2, Svelte 5, and Tailwind CSS v4

workflow-ship-faster

11
from enuno/claude-command-and-control

Ship Faster end-to-end workflow for small web apps (default: Next.js 16.1.1): idea/prototype → foundation gate → design-system.md → lightweight guardrails + docs → feature iteration → optional Supabase + Stripe → optional GitHub + Vercel deploy → optional AI-era SEO (sitemap/robots/llms.txt). Resumable, artifact-first under runs/ship-faster/ (or OpenSpec changes/). Trigger: ship/launch/deploy/production-ready MVP.

workflow-project-intake

11
from enuno/claude-command-and-control

Use when you need to clarify requirements and route to the right workflow (idea → executable input). Project intake + routing: help the user brainstorm and clarify intent, persist goal/context artifacts, then dispatch to the right workflow or step skill. Default route is workflow-ship-faster (Next.js 16.1.1) for idea/prototype→launch. Triggers: project kickoff, requirements clarification, brainstorm, ideas, discovery, intake.

workflow-feature-shipper

11
from enuno/claude-command-and-control

Use when you need to ship a single PR-sized feature end-to-end (plan -> implement -> verify) with artifacts. Ship core product features quickly in a Next.js codebase: turn a feature idea into an executable plan, implement in PR-sized slices, and keep artifacts under runs/ (or OpenSpec changes/ when available). Supports plan-only mode for early scoping. For prototype UI work, include a demo-ready wow moment (animation/micro-interaction) by default unless user opts out.

workflow-creator

11
from enuno/claude-command-and-control

Create workflow-* skills by composing existing skills into end-to-end chains. Turns a user idea into a workflow_spec.md SSOT (via workflow-brainstorm), discovers available skills locally + from skills.sh, and generates a new workflow-<slug>/ skill package. Use when you want to design a new workflow, chain multiple skills into a flow, or turn scattered atomic skills into a resumable plan-then-confirm workflow.