If NFTs stop displaying, this guide explains how to restore them.
22,499 files across 19 collections. This backup ensures your NFTs can always be recovered.
NFT images and metadata are hosted on IPFS. If IPFS becomes unavailable, files can be retrieved from Arweave and re-pinned to IPFS. Once re-pinned, NFTs display normally again — no contract modification required.
Go to pinata.cloud and create an account.
Navigate to API Keys → New Key and enable pinFileToIPFS.
Save your API Key and Secret.
Open ARWEAVE_COMPLETE_MAPPING.json. Each file has a permanent Arweave URL:
{
"Collection_Name": {
"metadata/1.json": {
"url": "https://arweave.net/abc123..."
},
"images/1.png": {
"url": "https://arweave.net/xyz789..."
}
}
}
Open any Arweave URL in your browser to download the file.
For bulk downloads, use the script provided in the technical appendix.
Upload downloaded files to Pinata:
The file will receive the same IPFS hash (CID) as the original.
Once files are pinned, NFTs will display correctly on OpenSea and other platforms.
IPFS uses content-based addressing: identical files produce identical addresses.
✓ NFTs display correctly on all platforms
✓ No smart contract modification required
✓ Original IPFS links remain valid
✓ All collectors benefit from the restoration
| Collection | Items |
|---|---|
| Low_Effort_Magic_Forest | 10,000 |
| Low_effort_medieval_stuff | 250 |
| Low_effort_Homes | 150 |
| High_effort_junk | 124 |
| Low_Effort_Rave_Party_ | 101 |
| SEND_NUDES_ | 75 |
| DAIMON | 51 |
| PIXEL_DANCE_ | 49 |
| VORTEX | 36 |
| PUNK_HARDER | 30 |
| Low_Effort_Order | 29 |
| Buy_punk | 22 |
| Sol_y_Sombra | 20 |
| Forest_Exclusives | 20 |
| Exclusive_Tapestries_ | 12 |
| H_Y_P_E_R_S_P_A_C_E | 8 |
| Esth_tique_de_la_Terreur | 3 |
| galuboy wagon | 3 |
| GOON_CORNER | 1 |
Total: 10,984 NFTs — 22,499 files
// rescue.mjs - Node.js script for bulk recovery
import fs from 'fs';
import https from 'https';
const PINATA_API_KEY = 'your_api_key';
const PINATA_SECRET = 'your_secret_key';
const COLLECTION = 'Collection_Name';
const mapping = JSON.parse(fs.readFileSync('ARWEAVE_COMPLETE_MAPPING.json'));
const files = mapping[COLLECTION];
async function downloadAndPin(filepath, arweaveUrl) {
// Download from Arweave
const buffer = await new Promise((resolve, reject) => {
https.get(arweaveUrl, (res) => {
const chunks = [];
res.on('data', chunk => chunks.push(chunk));
res.on('end', () => resolve(Buffer.concat(chunks)));
res.on('error', reject);
});
});
// Pin to IPFS via Pinata
const FormData = (await import('form-data')).default;
const formData = new FormData();
formData.append('file', buffer, { filename: filepath.split('/').pop() });
const res = await fetch('https://api.pinata.cloud/pinning/pinFileToIPFS', {
method: 'POST',
headers: {
'pinata_api_key': PINATA_API_KEY,
'pinata_secret_api_key': PINATA_SECRET,
},
body: formData
});
return res.json();
}
// Execute recovery
for (const [filepath, data] of Object.entries(files)) {
console.log(`Recovering: ${filepath}`);
const result = await downloadAndPin(filepath, data.url);
console.log(` Pinned: ${result.IpfsHash}`);
}
Run with: npm install form-data && node rescue.mjs