diff --git a/dist/docs/404.html b/dist/docs/404.html index e986ee9..af4c6c0 100644 --- a/dist/docs/404.html +++ b/dist/docs/404.html @@ -9,14 +9,14 @@ - +
- + \ No newline at end of file diff --git a/dist/docs/contributing/adding-an-exploration.html b/dist/docs/contributing/adding-an-exploration.html index d01ae1c..3b2433d 100644 --- a/dist/docs/contributing/adding-an-exploration.html +++ b/dist/docs/contributing/adding-an-exploration.html @@ -9,16 +9,16 @@ - + - + -
Skip to content

Adding an Exploration

Each exploration lives in its own folder under src/explorations/ with a few files. This guide walks you through adding a new one.

Quick Overview

An exploration folder looks like this:

src/explorations/eip-XXXX/
+    
Skip to content

Adding an Exploration

Each exploration lives in its own folder under src/explorations/ with a few files. This guide walks you through adding a new one.

Quick Overview

An exploration folder looks like this:

src/explorations/eip-XXXX/
 ├── info.ts          # Metadata (required)
 ├── MyC.vue          # Interactive widget (required)
 ├── examples.ts      # Example presets (recommended)
@@ -206,7 +206,7 @@
 npm run lf           # format + lint
 npm run type-check   # TypeScript check
 npm run build        # verify production build

Checklist

  • [ ] Created src/explorations/<id>/info.ts with metadata
  • [ ] Created src/explorations/<id>/MyC.vue with interactive widget
  • [ ] Created src/explorations/<id>/examples.ts with example presets
  • [ ] Created src/explorations/<id>/tests.spec.ts with unit tests
  • [ ] Added import and entry in src/explorations/REGISTRY.ts
  • [ ] Installed library dependencies (if needed)
  • [ ] All unit tests pass
  • [ ] Linting and type checking pass
  • [ ] Production build succeeds

This project and its documentation are under active development.

- + \ No newline at end of file diff --git a/dist/docs/contributing/how-to-contribute.html b/dist/docs/contributing/how-to-contribute.html index 94e4ff6..c7c7998 100644 --- a/dist/docs/contributing/how-to-contribute.html +++ b/dist/docs/contributing/how-to-contribute.html @@ -9,22 +9,22 @@ - + - + - + -
Skip to content

How to Contribute

Contributions are what make Feel Your Protocol useful. Whether you are adding a brand-new exploration, polishing an existing one, or improving the shared components — every contribution helps the Ethereum community understand protocol changes better.

Ways to Contribute

Add a New Exploration

This is the most impactful contribution. Each exploration is a self-contained folder with metadata and an interactive widget. The Adding an Exploration guide walks you through it step by step.

Improve an Existing Exploration

  • Better examples and presets
  • UI/UX improvements
  • Bug fixes
  • More informative intro and usage texts

Build or Improve E-Components

E-Components are reusable Ethereum-specific components (e.g. a precompile interface). If you spot a pattern shared across explorations, it might be a candidate for a new E-Component.

Improve Documentation

Fix typos, add guides, clarify explanations. Documentation lives in the docs/ folder as standard markdown files. Preview locally with:

bash
npm run docs:dev

Report Issues

Found a bug or have a suggestion? Open an issue on GitHub.

Development Workflow

1. Setup

bash
git clone https://github.com/feelyourprotocol/website.git
+    
Skip to content

How to Contribute

Contributions are what make Feel Your Protocol useful. Whether you are adding a brand-new exploration, polishing an existing one, or improving the shared components — every contribution helps the Ethereum community understand protocol changes better.

Ways to Contribute

Add a New Exploration

This is the most impactful contribution. Each exploration is a self-contained folder with metadata and an interactive widget. The Adding an Exploration guide walks you through it step by step.

Improve an Existing Exploration

  • Better examples and presets
  • UI/UX improvements
  • Bug fixes
  • More informative intro and usage texts

Build or Improve E-Components

E-Components are reusable Ethereum-specific components (e.g. a precompile interface). If you spot a pattern shared across explorations, it might be a candidate for a new E-Component.

Improve Documentation

Fix typos, add guides, clarify explanations. Documentation lives in the docs/ folder as standard markdown files. Preview locally with:

bash
npm run docs:dev

Report Issues

Found a bug or have a suggestion? Open an issue on GitHub. Our issue templates will guide you through the relevant details.

Open an issue early

For new explorations, especially those that need library additions or custom forks, it's a good idea to open an issue before you start coding. This lets us align on taxonomy placement, library setup, and scope — and avoids surprises during review.

Development Workflow

1. Setup

bash
git clone https://github.com/feelyourprotocol/website.git
 cd website
 npm install

2. Develop

bash
npm run dev          # start dev server

3. Verify

Before submitting a PR, run all quality checks:

bash
npm run lf           # format + lint (auto-fix)
 npm run type-check   # TypeScript type checking
 npx vitest run       # unit tests (single run)
 npm run test:e2e     # E2E tests

4. Submit

  • Fork the repository and create a feature branch
  • Make your changes
  • Ensure all checks pass
  • Submit a pull request with a clear description of what you changed and why

What Goes Where

What you are working onWhere it lives
A new explorationsrc/explorations/<id>/
Exploration metadatasrc/explorations/<id>/info.ts
Interactive widgetsrc/explorations/<id>/MyC.vue
Example presetssrc/explorations/<id>/examples.ts
Exploration registrysrc/explorations/REGISTRY.ts
E-Componentssrc/eComponents/<name>EC/
Shared UI componentssrc/eComponents/ui/
Unit testssrc/views/__tests__/ (or co-located __tests__/)
E2E testscypress/e2e/
Documentationdocs/

Further Reading

This project and its documentation are under active development.

- + \ No newline at end of file diff --git a/dist/docs/guide/architecture.html b/dist/docs/guide/architecture.html index 447ba98..7dca4ab 100644 --- a/dist/docs/guide/architecture.html +++ b/dist/docs/guide/architecture.html @@ -9,16 +9,16 @@ - + - + -
Skip to content

Architecture

Overview

Feel Your Protocol is a Vue 3 application built with Vite. The core idea is simple: each Ethereum protocol change gets its own interactive widget that runs real library code in the browser.

Tech Stack

Content Model

Content is organized around three taxonomies:

Explorations

The core content unit. Each exploration represents an interactive widget for a protocol change — EIPs, ERCs, or research topics. Explorations live in src/explorations/, one folder per exploration:

src/explorations/eip-7883/
+    
Skip to content

Architecture

Overview

Feel Your Protocol is a Vue 3 application built with Vite. The core idea is simple: each Ethereum protocol change gets its own interactive widget that runs real library code in the browser.

Tech Stack

Content Model

Content is organized around three taxonomies:

Explorations

The core content unit. Each exploration represents an interactive widget for a protocol change — EIPs, ERCs, or research topics. Explorations live in src/explorations/, one folder per exploration:

src/explorations/eip-7883/
 ├── info.ts         # Metadata: id, title, path, topic, timeline, tags, poweredBy, …
 ├── MyC.vue         # The interactive widget
 └── examples.ts     # Example presets for the widget

Each info.ts exports a const INFO object typed as Exploration. The REGISTRY.ts imports all INFO constants and assembles them into the EXPLORATIONS dictionary. The router reads from this dictionary to automatically create routes — no manual route registration needed.

Topics

Topics are the high-level strategic pillars that group explorations by theme. Each exploration belongs to exactly one topic via the topic field in its info.ts. Topics are defined in src/explorations/TOPICS.ts.

Topics are a static, curated set — they are not meant to be added as part of regular contributions. The current topics are:

IDTitleDescription
scalingScalingData availability, throughput, and L2 enablement
privacyPrivacyZK-proofs, homomorphic encryption, private mempools
uxUXAccount abstraction, wallet infrastructure, signature schemes
securitySecurityValidator incentives, cryptographic agility, MEV mitigations
robustnessRobustnessGas cost accuracy, EVM semantics hardening, spec clarity
interoperabilityInteroperabilityCross-chain standards, bridge infrastructure, signature scheme support

When adding an exploration, pick the topic that best reflects the primary concern of the protocol change.

Timeline

Timeline is a taxonomy that combines two dimensions: how settled an idea is (from early mention to finalized spec) and where it sits relative to mainnet Ethereum (specific hardfork vs. general readiness stage). Each exploration belongs to exactly one timeline entry via the timeline field in its info.ts. Timeline entries are defined in src/explorations/TIMELINE.ts.

Hardfork entries are named after their Ethereum community event city of origin (e.g. "Fusaka" from Osaka, "Glamsterdam" from Amsterdam). The non-hardfork categories (Ready, Research, Ideas) are static. New hardfork entries can be added as Ethereum's upgrade schedule evolves.

Tags

Tags enrich navigation by adding broader Ethereum technical concepts, protocol-relevant areas, or general technology topics from the blockchain space. Each exploration can have up to 3–4 tags. Tags are defined as a TypeScript enum in src/explorations/TAGS.ts.

Tags grow with contributions — unlike topics and timeline, new tags can be proposed when adding an exploration. They must follow these rules:

RuleExample
Must be reusable beyond a single explorationEVM ✅ — EIP-7883
Short form preferredEVM ✅ — Ethereum Virtual Machine
No redundancy with existing tagsGas Costs exists → don't add Gas
When in doubt, choose the more generic conceptGas Costs ✅ — Gas Increases

Format: Enum keys use CamelCase (GasCosts), all-caps for abbreviations (EVM). Members must be sorted alphabetically (enforced by lint).

E-Components

E-Components are reusable Ethereum-specific components that encapsulate common patterns across explorations. They live in src/eComponents/ and follow a naming convention: folder and component names are post-fixed with EC.

The first E-Component is precompileInterfaceEC, which provides a complete precompile exploration interface — input parsing, hardfork comparison, result display — as a single component backed by a composable:

src/eComponents/precompileInterfaceEC/
@@ -32,7 +32,7 @@
 const ExplorationComponent = defineAsyncComponent(
   componentModules[`../explorations/${explorationId}/MyC.vue`]
 )

Testing Strategy

The project uses a hybrid testing approach:

  • Unit tests (Vitest + Vue Test Utils) for component rendering, content verification, and UI logic — fast and focused
  • E2E tests (Cypress) as lean smoke tests for critical navigation flows and page-level integration

Unit tests live alongside their components in __tests__/ folders. E2E tests are consolidated in cypress/e2e/.

This project and its documentation are under active development.

- + \ No newline at end of file diff --git a/dist/docs/guide/getting-started.html b/dist/docs/guide/getting-started.html index c69eeb3..8ad5d71 100644 --- a/dist/docs/guide/getting-started.html +++ b/dist/docs/guide/getting-started.html @@ -9,16 +9,16 @@ - + - + -
Skip to content

Getting Started

What is Feel Your Protocol?

Feel Your Protocol is an interactive website that lets you explore Ethereum protocol changes hands on. Instead of just reading specifications, you can interact with real Ethereum library code running directly in the browser.

Each protocol change — called an Exploration — gets its own page with a dedicated interactive widget. Explorations cover EIPs, ERCs, and protocol research. They are organized through three taxonomies: Topics (static strategic pillars like "Scaling" or "UX"), Timeline (maturity and hardfork placement like "Fusaka" or "Research"), and Tags (reusable technical concepts like "EVM" or "Precompiles") — making it easy to discover and navigate related protocol changes.

Prerequisites

  • Node.js v20.19+ or v22.12+
  • npm (comes with Node.js)

Setup

Clone the repository and install dependencies:

bash
git clone https://github.com/feelyourprotocol/website.git
+    
Skip to content

Getting Started

What is Feel Your Protocol?

Feel Your Protocol is an interactive website that lets you explore Ethereum protocol changes hands on. Instead of just reading specifications, you can interact with real Ethereum library code running directly in the browser.

Each protocol change — called an Exploration — gets its own page with a dedicated interactive widget. Explorations cover EIPs, ERCs, and protocol research. They are organized through three taxonomies: Topics (static strategic pillars like "Scaling" or "UX"), Timeline (maturity and hardfork placement like "Fusaka" or "Research"), and Tags (reusable technical concepts like "EVM" or "Precompiles") — making it easy to discover and navigate related protocol changes.

Prerequisites

  • Node.js v20.19+ or v22.12+
  • npm (comes with Node.js)

Setup

Clone the repository and install dependencies:

bash
git clone https://github.com/feelyourprotocol/website.git
 cd website
 npm install

Development

Start the website dev server:

bash
npm run dev

Start the docs dev server:

bash
npm run docs:dev

Quality Checks

bash
npm run lf           # format + lint (auto-fix)
 npm run lf:ci        # lint + format check (CI mode, no auto-fix)
@@ -64,7 +64,7 @@
 ├── docs/                          # Documentation (VitePress)
 ├── cypress/                       # E2E tests
 └── .github/workflows/             # CI workflows

This project and its documentation are under active development.

- + \ No newline at end of file diff --git a/dist/docs/hashmap.json b/dist/docs/hashmap.json index 483d297..e89b4fb 100644 --- a/dist/docs/hashmap.json +++ b/dist/docs/hashmap.json @@ -1 +1 @@ -{"contributing_adding-an-exploration.md":"CLO_TxsK","contributing_ai-assisted-development.md":"lydwZLlM","contributing_available-e-components.md":"B4Q_z4Hi","contributing_code-conventions.md":"C86y1S4H","contributing_e-components.md":"PhGEgitZ","contributing_how-to-contribute.md":"G0y-xflE","contributing_images.md":"DdK4lm4N","contributing_styling.md":"BKPSSvmJ","contributing_third-party-libraries.md":"DAoVaD5b","contributing_ui-components.md":"vHxMK_fH","guide_architecture.md":"B6eczQC1","guide_getting-started.md":"BjX7SsDe","index.md":"COXeFy5O"} +{"contributing_adding-an-exploration.md":"CLO_TxsK","contributing_ai-assisted-development.md":"lydwZLlM","contributing_available-e-components.md":"B4Q_z4Hi","contributing_code-conventions.md":"C86y1S4H","contributing_e-components.md":"PhGEgitZ","contributing_how-to-contribute.md":"Bw44sjrz","contributing_images.md":"DdK4lm4N","contributing_library-forks.md":"Cd_Ynx_Y","contributing_styling.md":"BKPSSvmJ","contributing_third-party-libraries.md":"UK1Oxgi_","contributing_ui-components.md":"vHxMK_fH","guide_architecture.md":"B6eczQC1","guide_getting-started.md":"BjX7SsDe","index.md":"COXeFy5O"} diff --git a/dist/docs/index.html b/dist/docs/index.html index 65d8f68..f871ed5 100644 --- a/dist/docs/index.html +++ b/dist/docs/index.html @@ -9,9 +9,9 @@ - + - + @@ -19,7 +19,7 @@
Skip to content

Feel Your ProtocolInteractive Ethereum Protocol Explorations

Explore, visualize and understand Ethereum protocol changes — hands on.

Beta — Contributions Welcome!

This project is in beta. Everything works, but the APIs of reusable components (E-Components, shared UI) are still evolving. That means contributions may require some manual coordination during review until the interfaces fully stabilize — we are happy to guide you through! The fastest way to get started is to add a new exploration.

This project and its documentation are under active development.

- + \ No newline at end of file diff --git a/dist/website/assets/favicon-DIYJD7QH.png b/dist/website/assets/favicon-DIYJD7QH.png deleted file mode 100644 index 118e396..0000000 Binary files a/dist/website/assets/favicon-DIYJD7QH.png and /dev/null differ diff --git a/dist/website/assets/image-BSe_Ivnf.webp b/dist/website/assets/image-BSe_Ivnf.webp deleted file mode 100644 index 2d29da5..0000000 Binary files a/dist/website/assets/image-BSe_Ivnf.webp and /dev/null differ diff --git a/dist/website/index.html b/dist/website/index.html index 8bddfbd..5de15d3 100644 --- a/dist/website/index.html +++ b/dist/website/index.html @@ -2,11 +2,11 @@ - + Feel Your Protocol - - + +
diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index aaa986f..53ba72b 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -31,6 +31,7 @@ export default defineConfig({ { text: 'Styling & Design', link: '/contributing/styling' }, { text: 'Code Conventions', link: '/contributing/code-conventions' }, { text: 'Third-Party Libraries', link: '/contributing/third-party-libraries' }, + { text: 'Maintained Library Forks', link: '/contributing/library-forks' }, ], }, ], diff --git a/docs/contributing/library-forks.md b/docs/contributing/library-forks.md new file mode 100644 index 0000000..4c01464 --- /dev/null +++ b/docs/contributing/library-forks.md @@ -0,0 +1,185 @@ +# Maintained Library Forks + +Feel Your Protocol maintains **dedicated library forks** for protocol-core libraries where deep modifications are common. These forks live under the [feelyourprotocol](https://github.com/feelyourprotocol) GitHub organization and allow multiple explorations to carry independent, branch-isolated customizations in a controlled way. + +::: tip When do you need a fork? +Most explorations can use the standard published packages or extend them via subclassing / built-in APIs (see [Third-Party Libraries](/contributing/third-party-libraries)). Forks are reserved for cases where an exploration needs **deep modifications** to a library's internals — for example, adding a new transaction type, modifying EVM execution logic, or implementing a draft EIP end-to-end. +::: + +## Fork Workflow + +If your exploration needs a modification to one of the managed fork libraries: + +1. **Fork the original upstream library** to your own GitHub account +2. **Create a branch** and implement your changes there +3. **Request a named target branch** on the FYP fork — ask a maintainer (via your issue) to create a branch like `eip-XXXX-feature-name` on the managed fork +4. **Open a PR** from your branch towards that named target branch on the FYP fork +5. Your branch is reviewed, merged into the FYP fork, and **kept as a separate branch** — it won't be merged into `master` +6. **A release is built** from that branch and published under the `@feelyourprotocol` npm scope + +::: warning Security policy +For security reasons, code is never integrated directly from a contributor's personal fork or branch into the site. All library code flows through the managed FYP fork, where it can be reviewed and maintained. +::: + +### Branch Maintenance + +Fork branches are regularly **rebased** onto the latest upstream `master` to stay current with upstream bug fixes, new features, and releases. This keeps the diff between the branch and upstream small and well-defined: only the exploration-specific changes sit on top. + +## Versioning + +All fork releases are published under the **`@feelyourprotocol`** npm scope. The version scheme encodes which feature the release belongs to: + +``` +@feelyourprotocol/@.. +``` + +| Segment | Meaning | Example | +|---------|---------|---------| +| `` | Original package name (without scope) | `evm`, `tx`, `common` | +| `` | The EIP or feature number the fork implements | `8141` | +| `` | Incremented for significant rework or rebase | `0`, `1`, `2` | +| `` | Bug fixes within the same iteration | `0`, `1` | + +**Example:** `@feelyourprotocol/evm@8141.0.0` is the first release of the EVM package from the EIP-8141 fork branch. + +For monorepo libraries (like EthereumJS), **all packages are published together** in a single release round with matching versions. This ensures inter-package compatibility — `@feelyourprotocol/evm@8141.0.0` is guaranteed to work with `@feelyourprotocol/common@8141.0.0`. + +### Installing Fork Packages + +In `package.json`, use npm aliases so that fork packages and official packages coexist without conflict: + +```json +{ + "dependencies": { + "@ethereumjs/evm": "^10.1.1", + "@fyp-8141/evm": "npm:@feelyourprotocol/evm@8141.0.0", + "@fyp-8141/common": "npm:@feelyourprotocol/common@8141.0.0", + "@fyp-8141/tx": "npm:@feelyourprotocol/tx@8141.0.0", + "@fyp-8141/vm": "npm:@feelyourprotocol/vm@8141.0.0" + } +} +``` + +In your code, import from the alias: + +```typescript +// Standard EthereumJS (used by other explorations) +import { createEVM } from '@ethereumjs/evm' + +// Fork with EIP-8141 support (used by the frame tx exploration) +import { createVM } from '@fyp-8141/vm' +import { createFrameEIP8141Tx } from '@fyp-8141/tx' +``` + +Thanks to Vite's code splitting, each exploration's fork imports are loaded on demand — other explorations are unaffected. + +--- + +## EthereumJS + +| | | +|---|---| +| **Fork** | [feelyourprotocol/ethereumjs-monorepo](https://github.com/feelyourprotocol/ethereumjs-monorepo) | +| **Upstream** | [ethereumjs/ethereumjs-monorepo](https://github.com/ethereumjs/ethereumjs-monorepo) | +| **npm scope** | `@feelyourprotocol` | +| **Packages** | `binarytree`, `block`, `blockchain`, `common`, `evm`, `genesis`, `mpt`, `rlp`, `statemanager`, `tx`, `util`, `vm` | + +The EthereumJS monorepo provides the EVM, transaction, state, and block libraries that power most protocol-level explorations on Feel Your Protocol. Fork releases are built using the monorepo's own [release script](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/DEVELOPER.md#fork-releases-feel-your-protocol) with the `--scope=feelyourprotocol` flag. + +### EIP-8141 — Frame Transactions + +| | | +|---|---| +| **Branch** | [`eip-8141-frame-transactions`](https://github.com/feelyourprotocol/ethereumjs-monorepo/tree/eip-8141-frame-transactions) | +| **npm version** | `8141.x.x` | +| **Modified packages** | `common`, `evm`, `tx`, `vm` (+ transitive: `statemanager`, `block`) | +| **EIP spec** | [EIP-8141](https://eips.ethereum.org/EIPS/eip-8141) | +| **Status** | Prototype — vertically complete for simple transactions | + +[EIP-8141](https://eips.ethereum.org/EIPS/eip-8141) introduces **Frame Transactions**, a new transaction type (`0x06`) that decouples validation and gas payment from ECDSA signatures. Each transaction consists of one or more "frames" that can carry arbitrary verification logic — enabling post-quantum secure authentication, native account abstraction, and user-defined fee payment schemes at the protocol level. + +The fork implements: + +- **New transaction type** (`FrameEIP8141Tx`) in the `tx` package with full RLP encoding/decoding +- **Frame execution logic** in the `vm` package (`runFrameTx`) processing VERIFY, SENDER, and PAYMASTER frames +- **New EVM opcodes** (`APPROVE`, `FRAMEDATALOAD`, `TXPARAM`) in the `evm` package +- **EIP activation** wiring in the `common` package + +#### Install + +```sh +npm install @feelyourprotocol/common@8141.0.0 @feelyourprotocol/evm@8141.0.0 \ + @feelyourprotocol/tx@8141.0.0 @feelyourprotocol/vm@8141.0.0 +``` + +Or with aliases for coexistence with official packages: + +```json +{ + "@fyp-8141/common": "npm:@feelyourprotocol/common@8141.0.0", + "@fyp-8141/evm": "npm:@feelyourprotocol/evm@8141.0.0", + "@fyp-8141/tx": "npm:@feelyourprotocol/tx@8141.0.0", + "@fyp-8141/vm": "npm:@feelyourprotocol/vm@8141.0.0" +} +``` + +#### Quick Example + +```typescript +import { Common, Hardfork, Mainnet } from '@feelyourprotocol/common' +import { createFrameEIP8141Tx } from '@feelyourprotocol/tx' +import { Account, Address, hexToBytes } from '@feelyourprotocol/util' +import { createVM, runTx } from '@feelyourprotocol/vm' + +// Enable EIP-8141 +const common = new Common({ chain: Mainnet, hardfork: Hardfork.Prague, eips: [8141] }) +const vm = await createVM({ common }) + +// Fund a sender +const sender = new Address(hexToBytes('0x' + 'aa'.repeat(20))) +await vm.stateManager.putAccount(sender, new Account(0n, 10000000000000000n)) + +// Create a frame transaction with VERIFY + SENDER frames +const tx = createFrameEIP8141Tx({ + chainId: 1n, + nonce: 0n, + sender: sender.toString(), + maxFeePerGas: 100n, + maxPriorityFeePerGas: 1n, + maxFeePerBlobGas: 0n, + frames: [ + [new Uint8Array([1]), new Uint8Array(0), /* gasLimit */ ..., verifyData], + [new Uint8Array([2]), new Uint8Array(0), /* gasLimit */ ..., senderData], + ], +}, { common }) + +// Execute +const result = await runTx(vm, { tx }) +console.log(`Gas spent: ${result.totalGasSpent}`) +``` + +For complete working examples, see the [`packages/vm/examples/eip8141-frame-txs/`](https://github.com/feelyourprotocol/ethereumjs-monorepo/tree/eip-8141-frame-transactions/packages/vm/examples/eip8141-frame-txs) directory in the fork. + +#### Local Development (FYP_LOCAL Mode) + +During active development on the EIP-8141 implementation, you can skip the npm publish cycle entirely and bind the website directly to the monorepo fork's TypeScript source. Vite compiles the source on the fly — edits to the monorepo are picked up instantly by the dev server and test runner. + +**Enable:** + +```sh +echo "VITE_FYP_LOCAL=true" > .env.local +``` + +**Disable:** + +```sh +rm .env.local +``` + +When active, all `@fyp-8141/*` imports and their internal `@feelyourprotocol/*` cross-package imports are resolved via Vite aliases to the monorepo source at `../../ethereumjs-monorepo-fyp/packages//src`. This covers the full transitive dependency chain: `common`, `rlp`, `tx`, `util`, `vm`, `evm`, `block`, `statemanager`, `mpt`, and `binarytree`. + +The configuration lives in `vite.config.ts` and is inherited by Vitest automatically. The `.env.local` file is gitignored (`*.local`), so this stays a local-only setting. + +::: warning Monorepo layout assumption +FYP_LOCAL mode assumes the monorepo fork is checked out at `../../ethereumjs-monorepo-fyp` relative to the website directory (i.e. both repos live under the same parent). If your checkout is elsewhere, adjust the path in the `getFypLocalAliases()` function in `vite.config.ts`. +::: diff --git a/docs/contributing/third-party-libraries.md b/docs/contributing/third-party-libraries.md index 78959f0..920523f 100644 --- a/docs/contributing/third-party-libraries.md +++ b/docs/contributing/third-party-libraries.md @@ -42,59 +42,23 @@ Place custom code in your exploration's folder (e.g. a `custom/` subfolder) so i ## 4. Use a Managed Fork (Special Libraries) -For protocol-core libraries where deep modifications are common, Feel Your Protocol maintains **dedicated forks** under the `feelyourprotocol` GitHub organization. These forks allow multiple explorations to carry independent, branch-isolated customizations in a controlled way. +For protocol-core libraries where deep modifications are common, Feel Your Protocol maintains **dedicated forks** under the `feelyourprotocol` GitHub organization. These forks are published under the `@feelyourprotocol` npm scope with a version scheme that encodes the feature branch, and coexist alongside official packages via npm aliases. + +This workflow is fully documented in the dedicated **[Maintained Library Forks](/contributing/library-forks)** page, which covers: + +- The fork contribution workflow (branching, PRs, security policy) +- The unified versioning scheme (`@feelyourprotocol/@..`) +- How to install and import fork packages alongside official ones +- Detailed sections for each managed fork and its release branches ### Currently Managed Forks -| Library | Fork URL | Upstream | -|---------|----------|----------| +| Library | Fork | Upstream | +|---------|------|----------| | **EthereumJS** | [feelyourprotocol/ethereumjs-monorepo](https://github.com/feelyourprotocol/ethereumjs-monorepo) | [ethereumjs/ethereumjs-monorepo](https://github.com/ethereumjs/ethereumjs-monorepo) | Want to propose adding another library as a managed fork? Open an issue. Capacity to maintain forks is limited, so this is reserved for libraries with frequent deep-customization needs. -### Fork Workflow - -If your exploration needs a modification to one of the managed fork libraries: - -1. **Fork the original upstream library** to your own GitHub account -2. **Create a branch** and implement your changes there -3. **Request a named target branch** on the FYP fork — ask a maintainer (via your issue) to create a branch like `my-custom-exploration` on the managed fork -4. **Open a PR** from your branch towards that named target branch on the FYP fork -5. Your branch is reviewed, merged into the FYP fork, and **kept as a separate branch** — it won't be merged into `master` -6. **A release is built** from that branch and integrated into the site's `package.json` using an [npm alias](#npm-package-aliases) - -::: warning Security policy -For security reasons, code is never integrated directly from a contributor's personal fork or branch into the site. All library code flows through the managed FYP fork, where it can be reviewed and maintained. -::: - -### npm Package Aliases - -Multiple versions or forks of the same library coexist in `package.json` using npm aliases: - -```json -{ - "dependencies": { - "@ethereumjs/evm": "^10.1.1-nightly.1", - "@ethereumjs/evm-experimental": "npm:@ethereumjs/evm@^11.0.0-fork.1" - } -} -``` - -Each alias is a fully independent install. In your exploration, import the specific version you need: - -```typescript -import { EVM } from '@ethereumjs/evm' -import { EVM as EVMExp } from '@ethereumjs/evm-experimental' -``` - -### Monorepo Libraries - -For libraries from monorepos (like EthereumJS), where the target package has several intra-monorepo dependencies, use **pre-bundled ESM builds**. The fork is bundled on the monorepo side with all internal dependencies resolved, producing a single ESM file with no wiring issues. - -### Per-Route Isolation - -Each fork is only imported in its specific exploration's `MyC.vue`. Thanks to Vite's code splitting, the fork's code is only loaded when the user visits that page. Other explorations are unaffected. - ## Decision Flowchart Not sure which approach to take? Walk through this: diff --git a/package-lock.json b/package-lock.json index 3294bef..1530965 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,11 @@ "@ethereumjs/common": "^10.1.1-nightly.1", "@ethereumjs/evm": "^10.1.1-nightly.1", "@ethereumjs/util": "^10.1.1-nightly.1", + "@fyp-8141/common": "npm:@feelyourprotocol/common@8141.0.1", + "@fyp-8141/rlp": "npm:@feelyourprotocol/rlp@8141.0.1", + "@fyp-8141/tx": "npm:@feelyourprotocol/tx@8141.0.1", + "@fyp-8141/util": "npm:@feelyourprotocol/util@8141.0.1", + "@fyp-8141/vm": "npm:@feelyourprotocol/vm@8141.0.1", "@headlessui/vue": "^1.7.23", "@heroicons/vue": "^2.2.0", "@paulmillr/trusted-setups": "^0.2.0", @@ -21,6 +26,7 @@ "vue-router": "^4.5.1" }, "devDependencies": { + "@js-sdsl/ordered-map": "^4.4.2", "@tsconfig/node22": "^22.0.2", "@types/jsdom": "^21.1.7", "@types/node": "^22.16.5", @@ -31,12 +37,15 @@ "@vue/test-utils": "^2.4.6", "@vue/tsconfig": "^0.7.0", "cypress": "^14.5.3", + "debug": "^4.4.3", "eslint": "^9.31.0", "eslint-plugin-cypress": "^5.1.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-vue": "~10.3.0", + "eventemitter3": "^5.0.4", "jiti": "^2.4.2", "jsdom": "^26.1.0", + "lru-cache": "^11.2.7", "npm-run-all2": "^8.0.4", "prettier": "3.6.2", "start-server-and-test": "^2.0.12", @@ -65,6 +74,13 @@ "lru-cache": "^10.4.3" } }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -1473,6 +1489,251 @@ "node": ">=20" } }, + "node_modules/@feelyourprotocol/binarytree": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/binarytree/-/binarytree-8141.0.1.tgz", + "integrity": "sha512-JXTUP9I2IA8BNAegQ2VdQo15IMqAEkoNvE+PgH0eYD7rnco9ZjQlelR53UKPsXL63WdCh/UEhA18Ku3YcFlKcQ==", + "license": "MIT", + "dependencies": { + "@feelyourprotocol/rlp": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@noble/hashes": "^2.0.1", + "debug": "^4.4.0", + "lru-cache": "11.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@feelyourprotocol/binarytree/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@feelyourprotocol/block": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/block/-/block-8141.0.1.tgz", + "integrity": "sha512-1CuIgZU9VyJOa6jKROWn11QlyM3t3p1tc1DVGR3ZreL69yz7uD/fYxFM396tOL7WlgQrmwB/iQiq2vq/obrMhQ==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/common": "^8141.0.1", + "@feelyourprotocol/mpt": "^8141.0.1", + "@feelyourprotocol/rlp": "^8141.0.1", + "@feelyourprotocol/tx": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@feelyourprotocol/common": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/common/-/common-8141.0.1.tgz", + "integrity": "sha512-Z1augsoKcdXYaK/CjaHU/1U6Lru97UZegnJ9UNHBFwdpxuak7yy5gw+rwSJQIwsasSngnJVDk9RfmXUN1MdCQg==", + "license": "MIT", + "dependencies": { + "@feelyourprotocol/util": "^8141.0.1", + "eventemitter3": "^5.0.1" + } + }, + "node_modules/@feelyourprotocol/evm": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/evm/-/evm-8141.0.1.tgz", + "integrity": "sha512-drGHUwvJXxPHBzkneApHZXcz8wL0wmnipAtlLUHwZ5DwYjia+Xz5I3RTwbnh0rT/nH563iJWvPK5pn7TLFsmjQ==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/binarytree": "^8141.0.1", + "@feelyourprotocol/common": "^8141.0.1", + "@feelyourprotocol/statemanager": "^8141.0.1", + "@feelyourprotocol/tx": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1", + "debug": "^4.4.0", + "eventemitter3": "^5.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@feelyourprotocol/mpt": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/mpt/-/mpt-8141.0.1.tgz", + "integrity": "sha512-PVCllAb+iQRsZz9lWBEPa+4VIsxpjqnwI6ZfIoeaeoC/33M92bAiLOFE5fbQGRg+XUWhmD2JxF1ERbLGmiyifg==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/rlp": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@noble/hashes": "^2.0.1", + "debug": "^4.4.0", + "lru-cache": "11.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@feelyourprotocol/mpt/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@feelyourprotocol/rlp": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/rlp/-/rlp-8141.0.1.tgz", + "integrity": "sha512-HqKDQ/Dex6BhKLNW4oKuKH+Iew19oFmI7r41RJWHSOr84tTXAt+nrjOPDOUdE/wvz1GthUNIJNfYl/BO96ykqA==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@feelyourprotocol/statemanager": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/statemanager/-/statemanager-8141.0.1.tgz", + "integrity": "sha512-fLFEJzJXxQF+d794eKGkv9at4KciwpDsSnBTDPlkhcZ14xRfsuBklfCs6zXO2NkjR/xEcAmE8xXDyobbICvaeQ==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/binarytree": "^8141.0.1", + "@feelyourprotocol/common": "^8141.0.1", + "@feelyourprotocol/mpt": "^8141.0.1", + "@feelyourprotocol/rlp": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@js-sdsl/ordered-map": "^4.4.2", + "@noble/hashes": "^2.0.1", + "debug": "^4.4.0", + "lru-cache": "11.0.2" + } + }, + "node_modules/@feelyourprotocol/statemanager/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@feelyourprotocol/tx": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/tx/-/tx-8141.0.1.tgz", + "integrity": "sha512-MvtK4LGzsfz9h38cGzx7y880MoEHRw+QJo8Uh0QBmy4Sm1k2BcrbCIfZrAb2jvqLl3dyloD/blDy+z0f9tsa3A==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/common": "^8141.0.1", + "@feelyourprotocol/rlp": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@feelyourprotocol/util": { + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/util/-/util-8141.0.1.tgz", + "integrity": "sha512-llYzgYcbqcfXMboKohyNZRxN+MryUj37HDlMKPk2xj+YcwvaGmdF3+V8mpi6mVu23cBi5vr3pfzWhOgSf4plMA==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/rlp": "^8141.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@fyp-8141/common": { + "name": "@feelyourprotocol/common", + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/common/-/common-8141.0.1.tgz", + "integrity": "sha512-Z1augsoKcdXYaK/CjaHU/1U6Lru97UZegnJ9UNHBFwdpxuak7yy5gw+rwSJQIwsasSngnJVDk9RfmXUN1MdCQg==", + "license": "MIT", + "dependencies": { + "@feelyourprotocol/util": "^8141.0.1", + "eventemitter3": "^5.0.1" + } + }, + "node_modules/@fyp-8141/rlp": { + "name": "@feelyourprotocol/rlp", + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/rlp/-/rlp-8141.0.1.tgz", + "integrity": "sha512-HqKDQ/Dex6BhKLNW4oKuKH+Iew19oFmI7r41RJWHSOr84tTXAt+nrjOPDOUdE/wvz1GthUNIJNfYl/BO96ykqA==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@fyp-8141/tx": { + "name": "@feelyourprotocol/tx", + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/tx/-/tx-8141.0.1.tgz", + "integrity": "sha512-MvtK4LGzsfz9h38cGzx7y880MoEHRw+QJo8Uh0QBmy4Sm1k2BcrbCIfZrAb2jvqLl3dyloD/blDy+z0f9tsa3A==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/common": "^8141.0.1", + "@feelyourprotocol/rlp": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@fyp-8141/util": { + "name": "@feelyourprotocol/util", + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/util/-/util-8141.0.1.tgz", + "integrity": "sha512-llYzgYcbqcfXMboKohyNZRxN+MryUj37HDlMKPk2xj+YcwvaGmdF3+V8mpi6mVu23cBi5vr3pfzWhOgSf4plMA==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/rlp": "^8141.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@fyp-8141/vm": { + "name": "@feelyourprotocol/vm", + "version": "8141.0.1", + "resolved": "https://registry.npmjs.org/@feelyourprotocol/vm/-/vm-8141.0.1.tgz", + "integrity": "sha512-Y5yZaalwCRSdNGsF2ZetLW8sVlM+/R47xlkUIU1YuOPWpdPzjdaokBK6l5+rDA6RtZzzyjlymaWa/LeTVN8KXw==", + "license": "MPL-2.0", + "dependencies": { + "@feelyourprotocol/block": "^8141.0.1", + "@feelyourprotocol/common": "^8141.0.1", + "@feelyourprotocol/evm": "^8141.0.1", + "@feelyourprotocol/mpt": "^8141.0.1", + "@feelyourprotocol/rlp": "^8141.0.1", + "@feelyourprotocol/statemanager": "^8141.0.1", + "@feelyourprotocol/tx": "^8141.0.1", + "@feelyourprotocol/util": "^8141.0.1", + "@noble/hashes": "^2.0.1", + "debug": "^4.4.0", + "eventemitter3": "^5.0.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -4623,9 +4884,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5378,9 +5639,9 @@ "license": "MIT" }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/execa": { @@ -7116,11 +7377,14 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/magic-string": { "version": "0.30.21", @@ -7909,6 +8173,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -8737,6 +9008,24 @@ "node": ">=16" } }, + "node_modules/start-server-and-test/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/start-server-and-test/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", diff --git a/package.json b/package.json index ac00b10..11a8d99 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,11 @@ "@ethereumjs/common": "^10.1.1-nightly.1", "@ethereumjs/evm": "^10.1.1-nightly.1", "@ethereumjs/util": "^10.1.1-nightly.1", + "@fyp-8141/common": "npm:@feelyourprotocol/common@8141.0.1", + "@fyp-8141/rlp": "npm:@feelyourprotocol/rlp@8141.0.1", + "@fyp-8141/tx": "npm:@feelyourprotocol/tx@8141.0.1", + "@fyp-8141/util": "npm:@feelyourprotocol/util@8141.0.1", + "@fyp-8141/vm": "npm:@feelyourprotocol/vm@8141.0.1", "@headlessui/vue": "^1.7.23", "@heroicons/vue": "^2.2.0", "@paulmillr/trusted-setups": "^0.2.0", @@ -38,6 +43,7 @@ "vue-router": "^4.5.1" }, "devDependencies": { + "@js-sdsl/ordered-map": "^4.4.2", "@tsconfig/node22": "^22.0.2", "@types/jsdom": "^21.1.7", "@types/node": "^22.16.5", @@ -48,12 +54,15 @@ "@vue/test-utils": "^2.4.6", "@vue/tsconfig": "^0.7.0", "cypress": "^14.5.3", + "debug": "^4.4.3", "eslint": "^9.31.0", "eslint-plugin-cypress": "^5.1.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-vue": "~10.3.0", + "eventemitter3": "^5.0.4", "jiti": "^2.4.2", "jsdom": "^26.1.0", + "lru-cache": "^11.2.7", "npm-run-all2": "^8.0.4", "prettier": "3.6.2", "start-server-and-test": "^2.0.12", diff --git a/src/explorations/REGISTRY.ts b/src/explorations/REGISTRY.ts index df107b5..a6291a1 100644 --- a/src/explorations/REGISTRY.ts +++ b/src/explorations/REGISTRY.ts @@ -1,12 +1,14 @@ import { INFO as eip7594 } from './eip-7594/info' import { INFO as eip7883 } from './eip-7883/info' import { INFO as eip7951 } from './eip-7951/info' +import { INFO as eip8141 } from './eip-8141/info' import type { Tag } from './TAGS' export const EXPLORATIONS: Explorations = { [eip7594.id]: eip7594, [eip7883.id]: eip7883, [eip7951.id]: eip7951, + [eip8141.id]: eip8141, } export interface Examples { @@ -29,6 +31,8 @@ export interface Exploration { topic: string timeline: string tags: Tag[] + /** Date when the exploration was added, format: "YYYY-MM-DD HH:mm" (UTC). */ + added: string image?: string introText: string usageText: string diff --git a/src/explorations/TAGS.ts b/src/explorations/TAGS.ts index 9fb62e8..cf07533 100644 --- a/src/explorations/TAGS.ts +++ b/src/explorations/TAGS.ts @@ -20,9 +20,11 @@ * - Short form preferred (e.g. "EVM" not "Ethereum Virtual Machine"). */ export enum Tag { + AccountAbstraction = 'Account Abstraction', EVM = 'EVM', GasCosts = 'Gas Costs', PeerDAS = 'PeerDAS', + PostQuantum = 'Post Quantum', Precompiles = 'Precompiles', Signatures = 'Signatures', } diff --git a/src/explorations/eip-7594/info.ts b/src/explorations/eip-7594/info.ts index 3e45e14..a315f15 100644 --- a/src/explorations/eip-7594/info.ts +++ b/src/explorations/eip-7594/info.ts @@ -11,6 +11,7 @@ export const INFO: Exploration = { topic: 'scaling', timeline: 'fusaka', tags: [Tag.PeerDAS], + added: '2025-12-08 11:40', image, introText: 'How do blob transactions change with PeerDAS? ' + diff --git a/src/explorations/eip-7883/info.ts b/src/explorations/eip-7883/info.ts index 249518f..1fb430b 100644 --- a/src/explorations/eip-7883/info.ts +++ b/src/explorations/eip-7883/info.ts @@ -11,6 +11,7 @@ export const INFO: Exploration = { topic: 'robustness', timeline: 'fusaka', tags: [Tag.GasCosts, Tag.Precompiles], + added: '2025-12-17 09:12', image, introText: 'How are ModExp gas costs changing with Fusaka? ' + diff --git a/src/explorations/eip-7951/info.ts b/src/explorations/eip-7951/info.ts index 802b127..996c712 100644 --- a/src/explorations/eip-7951/info.ts +++ b/src/explorations/eip-7951/info.ts @@ -11,6 +11,7 @@ export const INFO: Exploration = { topic: 'ux', timeline: 'fusaka', tags: [Tag.Precompiles, Tag.Signatures], + added: '2025-11-10 15:08', image, introText: 'How can I interact with the new curve precompile? The ' + diff --git a/src/explorations/eip-8141/MyC.vue b/src/explorations/eip-8141/MyC.vue new file mode 100644 index 0000000..46e15cb --- /dev/null +++ b/src/explorations/eip-8141/MyC.vue @@ -0,0 +1,107 @@ + + + diff --git a/src/explorations/eip-8141/components/FrameCardC.vue b/src/explorations/eip-8141/components/FrameCardC.vue new file mode 100644 index 0000000..9faaba3 --- /dev/null +++ b/src/explorations/eip-8141/components/FrameCardC.vue @@ -0,0 +1,86 @@ + + +