supabase
Handles the full Supabase workflow from schema changes to deployment, with built-in security guardrails that catch common traps like RLS...
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.
Full skill instructions
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.
This skill should be triggered when:
https://zigzag-arweave-bridge.herokuapp.com/
0xcb7aca0cdea76c5bd5946714083c559e34627607
1 MB per $1 of stablecoin deposited
Query remaining storage bytes for an address.
Endpoint:
GET /allocation/zksync?address={wallet_address}
Response:
{
"remaining_bytes": 1048576
}
Example:
curl "https://zigzag-arweave-bridge.herokuapp.com/allocation/zksync?address=0xYourWalletAddress"
Get current server timestamp for signature generation.
Endpoint:
GET /time
Response:
{
"timestamp": 1640000000000
}
Example:
curl "https://zigzag-arweave-bridge.herokuapp.com/time"
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:
{
"arweave_tx_id": "abc123...",
"remaining_bytes": 1000000
}
All uploads require cryptographic signature verification:
/time{sender_address}:{timestamp}Message Format:
0xYourAddress:1640000000000
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": {
"formdata-node": "^4.0.0",
"node-fetch": "^3.0.0",
"ethers": "^5.0.0",
"dotenv": "^10.0.0"
}
}
# Required for signing uploads
ETH_PRIVKEY=your_private_key_here
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.
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`);
Use the complete upload example above, ensuring:
Once uploaded, your file is permanently stored on Arweave:
https://arweave.net/{arweave_tx_id}
// 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}`;
// 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
// 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 | 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": "Invalid signature",
"message": "The provided signature does not match the sender address"
}
ETH_PRIVKEY in client-side code┌─────────────┐ ┌─────────────────────┐ ┌─────────────┐
│ User │────▶│ Arweave Bridge │────▶│ Arweave │
│ (zkSync) │ │ (Heroku Server) │ │ (Storage) │
└─────────────┘ └─────────────────────┘ └─────────────┘
│ │
│ USDC/USDT/DAI │ Manages allocations
▼ │ Validates signatures
┌─────────────┐ │ Uploads to Arweave
│ Bridge │◀─────────────┘
│ Address │
└─────────────┘
Handles the full Supabase workflow from schema changes to deployment, with built-in security guardrails that catch common traps like RLS...
Comprehensive guides and best practices for Neon Serverless Postgres, covering setup, connection methods, authentication, and platform APIs.
Guide for setting up and using Firebase Authentication. Use this skill when the user's app requires user sign-in, user management, or secure data access using auth rules.
A skill to evaluate how secure Firestore security rules are. Use this when Firestore security rules are updated to ensure that the generated rules are extremely secure and robust.
Official skill for integrating Firebase AI Logic (Gemini API) into web applications. Covers setup, multimodal inference, structured output, and security.
Complete Better Auth server and client setup with database adapters, session management, plugins, and security configuration.
Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. "deploy to vercel", "set up vercel", "add environment variables to vercel".
Complete Cloudflare platform integration with decision trees for compute, storage, AI, networking, security, and infrastructure-as-code.
Run Azure compliance and security audits with azqr plus Key Vault expiration checks. Covers best-practice assessment, resource review, policy/compliance validation, and security posture checks. WHEN: compliance scan, security audit, BEFORE running azqr (compliance cli tool), Azure best practices, Key Vault expiration check, expired certificates, expiring secrets, orphaned resources, compliance assessment.
Send, read, and manage Gmail messages, drafts, labels, and account settings.
Comprehensive website auditing across 230+ rules in 21 categories including SEO, performance, security, and accessibility.
Shared authentication, CLI syntax, and output formatting patterns for gws Google Workspace commands.
Discover your celebrity doppelgänger with StarByFace!
GeoSpy: Pricing, Features, FAQs, and Alternatives for AI Teams
Detect AI-generated voices to protect against audio fraud.
Ensure Your Content's Originality with AI Plagiarism Checker
Upscale images by 400% without quality loss
Protect your social media from copyright disputes
Accurately Detect AI-Generated Content with TheChecker.AI
Chrome extension that detects and flags AI-generated content