Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

EthFS: Ethereum File System

Browse and upload on-chain files at ethfs.xyz

What?

dhof's on-chain 3D rose NFT inspired tons of fun conversations and projects. It surfaced many examples and use cases for highly reusable on-chain assets (JS libraries, fonts, gifs).

EthFS is an effort to consolidate these assets into a public, durable on-chain repository with ergonomic, gas-optimized methods for reading and writing files.

How does it work?

EthFS leans on SSTORE2's strategy to efficiently read and write data in the form of contract bytecode. The frontend splits files into 24kb chunks (max contract size) and writes them to deterministic content addresses via Safe Singleton Factory. This means the content address can be computed ahead of time and is the same across EVM chains.

A File struct wraps a set of bytecode slices that, when concatenated, represent the full file contents. It also holds the logic for reading/unwrapping the file contents into a single string in a very gas-efficient way.

The FileStore contract acts as a minimum viable registry, a global namespace of human-readable filenames for more ergonomic use within consumer contracts and the frontend's file browser. A CDN of sorts.

Installation (Foundry)

  1. forge install holic/ethfs
  2. Add ethfs/ to remappings.txt or foundry.toml
  3. import "ethfs/contracts/src/FileStore.sol"; in your contract
  4. Have fun!

Reference

Contract addresses

Ethereum
Ethereum Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Ethereum Holesky0xFe1411d6864592549AdE050215482e4385dFa0FB
Base
Base Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Base Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism
Optimism Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Optimism Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape
Shape Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Shape Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora
Zora Mainnet0xFe1411d6864592549AdE050215482e4385dFa0FB
Zora Sepolia0xFe1411d6864592549AdE050215482e4385dFa0FB

About

EthFS: Ethereum File System

Resources

Stars

167 stars

Watchers

5 watching

Forks

Used by

Contributors

Languages

Generated from frolic/web3-scaffold