Skip to content

Build prompts page and shift from repo links to AI prompts#356

Open
carletex wants to merge 7 commits intomainfrom
build-prompts
Open

Build prompts page and shift from repo links to AI prompts#356
carletex wants to merge 7 commits intomainfrom
build-prompts

Conversation

@carletex
Copy link
Member

@carletex carletex commented Feb 18, 2026

Summary

Shifts build ideas from linking to GitHub challenge repos to providing AI-ready prompts users can copy into their AI agent to start building.

  • New /build-prompts page with accordion list: expand to read prompt, one-click copy
  • Removed Build ideas from homepage (we could have a link to /build-prompts somewhere as in /start)
  • Prompt content stored as markdown files with front-matter (build-prompts/*.md), easy to add new ones
  • Builder profile "Build Ideas" cards now link to /build-prompts instead of GitHub repos, removed "View Build Idea" button
  • Added "Build Prompts" link in Builds section header

TODO

  • Prompts for Multisig and SVG (those are AI generated placeholders). We might need to include the "SE-2" skill so it'd install SE-2 and do the thing (link to scaffoldeth.io/SKILL.md?) cc @technophile-04
  • Remove build ideas "challenges" from database? We have all the info now in the .md files

We'd also need to add way more build ideas (and categories possible) but could be in another PR.


Really open, let me know what you guys think!


Images

image image image

@vercel
Copy link

vercel bot commented Feb 18, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
speedrunethereum-v2 Ready Ready Preview, Comment Feb 25, 2026 6:01am

Request Review

@rin-st
Copy link
Member

rin-st commented Feb 18, 2026

nit: there's an images of build ideas in the /start and profile page, but no images in /build-prompts. I think it we need to decide, do we need to generate image for every idea or not. And then add or remove images everywhere.

Prompt, "Extensions to consider" (You said it's AI generated, writing just in case)

  1. Not sure if we need to keep this part inside the prompt, or give it as a separate prompt(s)? It could be too much for one build, especially for newbies
  2. When I read it first, I thought about create-eth extensions. Maybe we need to consider some synonym like feature, enchancement, addition etc?

We might need to include the "SE-2" skill so it'd install SE-2 and do the thing (link to scaffoldeth.io/SKILL.md?) cc @technophile-04

It would be great! Or just suggest to use create eth if skill doesn't work for some reason. Without it AI doesn't understand what to do and slowly googling and fetching data from github and se-2 docs.

Remove build ideas "challenges" from database? We have all the info now in the .md files

I think yes

@carletex
Copy link
Member Author

Thanks Rinat!

nit: there's an images of build ideas in the /start and profile page, but no images in /build-prompts. I think it we need to decide, do we need to generate image for every idea or not. And then add or remove images everywhere.

My reasoning was: since we already have those images, let's use them to make the "CTAs" better (in /start page and in portfolio page), but once in the build prompt page... remove them (It'd be a pain to create an image for each one). But open.

Extensions to consider

I think we can phrase that a bit better, yes haha. My mental model was: If we have a super specific prompt, everyone is going to end with the same build.... so these "extensions" would be something that the Agent can propose to the people. Maybe we can call them "Next iterations"

(But yes, we need to rewrite those prompts from scratch!)

Comment on lines +51 to +53
<p className="mt-2 text-base-content/70">
AI-ready prompts for Ethereum build ideas. Copy a prompt into your AI agent and start building.
</p>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe in this sentence we could suggest to init your repo with create-eth and then copy the prompt into your AI agent.

The DX is much better if you start with a fresh SE-2 repo than if you start with an empty repo even if you prompt it to initialize before doing anything else. Like Rinat said, it starts googling and reading a lot of SE-2 docs/repo if you start with an empty repo.

We could add something like: "For best results, start from a fresh Scaffold-ETH 2 project: npx create-eth@latest. After setup, come back and run your prompt."

Maybe the last sentence could be skipped too

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is related to OP comment:

We might need to include the "SE-2" skill so it'd install SE-2 and do the thing (link to scaffoldeth.io/SKILL.md?)

and

scaffold-eth/create-eth-extensions#117 (comment)

I think for builds & extension it'd be great if we dont' need to require a working SE-2 instance.

Copy link
Member

@Pabl0cks Pabl0cks left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love this! Added a comment in line with Rinat's feedback about starting from an empty repo.

During my tests, with opus 4.6 the short prompt worked pretty well. Even better than more detailed and "hand-holding" prompts. Maybe with dumber models the result may change and they may prefer a more constrained prompt, but with latest models it’s probably not worth adding extra complexity.

I tried also those prompts for the multisig (with probably worse results):

More detailed prompt
Build a Meta-Transaction Multisig Wallet dApp using Scaffold-ETH 2.

Core concept: An offchain-signature-based multisig wallet where signatures are
collected offchain (gasless for signers) and only the final execution transaction
goes on-chain. This is more gas-efficient than on-chain voting and teaches
ECDSA signature verification, meta-transactions, and the self-call pattern.

Smart contract (MetaMultiSigWallet.sol):
- Stores owners (mapping + events), signaturesRequired threshold, nonce, chainId
- Constructor takes chainId, initial owners array, and signaturesRequired
- onlySelf modifier: addSigner, removeSigner, updateSignaturesRequired can only
  be called by the contract itself (through executeTransaction), so owner changes
  must go through the multisig approval process
- getTransactionHash(nonce, to, value, data) → keccak256 packed hash including
  contract address and chainId for replay protection
- executeTransaction(to, value, data, signatures[]): verifies each signature via
  ECDSA.recover(), enforces ascending signer order to prevent duplicates,
  requires validSignatures >= signaturesRequired, then calls to.call{value}(data)
- receive() to accept ETH deposits
- Use OpenZeppelin's ECDSA and MessageHashUtils libraries

Offchain signature pool (backend server):
- Simple Express server (can run with ts-node) storing pending transactions
  in memory, keyed by contractAddress_chainId
- POST / → stores {hash, to, value, data, nonce, signatures[], signers[], ...}
- GET /:key → returns all pending transactions for that contract
- For local development, run on port 49832

Frontend (4 pages):
1. /multisig — Wallet overview: shows contract balance, QR code for receiving
   funds, address, and history of executed transactions (from ExecuteTransaction
   events)
2. /create — Propose a new transaction: select method (transferFunds, addSigner,
   removeSigner), fill parameters. For owner management, use encodeFunctionData
   to build calldata targeting the contract itself. Signs the transaction hash
   with the connected wallet and POSTs to the pool server
3. /pool — View pending transactions from the pool server. Each transaction
   shows: hash, nonce, to, value, data, number of valid signatures vs required.
   Signers can sign (adds signature to pool) or execute (calls executeTransaction
   on-chain with collected signatures)
4. /owners — View current owners (from Owner events) and signatures required.
   Provides a form to propose addSigner/removeSigner transactions that
   pre-populates the /create page with the correct calldata

Signing flow:
1. Proposer calls contract.getTransactionHash(nonce, to, value, data)
2. Signs the hash with walletClient.signMessage({ message: { raw: hash } })
3. Contract.recover(hash, signature) verifies the signer is an owner
4. Transaction + signature are POSTed to the pool server
5. Other signers fetch from pool, verify, and add their signatures
6. Once enough signatures are collected, any owner can call executeTransaction
   on-chain with the sorted signatures array

Extensions to try:
- ERC-20 token transfers (add as a method option with encodeFunctionData)
- Persistent backend (replace in-memory store with a database)
- Off-chain EIP-712 typed signatures for better wallet UX
- Custom signer roles (proposer-only, signer-only, admin with veto)
Another detailed prompt
Build a MetaMultiSig Wallet dApp using Scaffold-ETH 2.

**Core architecture:** An off-chain signature-based multisig where owners sign transactions locally (no gas) and signatures are aggregated in a pool server. Only the final `executeTransaction()` call goes on-chain.

**Smart contract — `MetaMultiSigWallet.sol`:**
- State: `mapping(address => bool) isOwner`, `uint signaturesRequired`, `uint nonce`, `uint chainId`
- Transaction hash: `keccak256(abi.encodePacked(address(this), chainId, nonce, to, value, data))` — includes contract address and chainId to prevent cross-contract and cross-chain replay
- `executeTransaction(to, value, data, bytes[] signatures)`: verifies signatures using `ECDSA.recover()`, requires signatures sorted ascending by recovered signer address (enables duplicate detection), executes `to.call{value}(data)` if threshold met
- `addSigner` / `removeSigner` / `updateSignaturesRequired` all use an `onlySelf` modifier — they can only be called by the contract itself via `executeTransaction`, meaning owner management goes through the same voting flow as any transaction
- Events: `Deposit`, `ExecuteTransaction`, `Owner`

**Pool server (`backend-local/`):** A minimal Express server with in-memory storage. `POST /` stores transactions keyed by `contractAddress_chainId` with sub-key `txHash`. `GET /:key` returns all pending transactions for that contract. Each POST overwrites the previous entry for that hash, so signature accumulation works by re-posting the transaction with an updated `signatures[]` array.

**Frontend — 4 pages:**
- `/multisig`: Shows contract ETH balance, QR code for funding, and executed transaction history via `ExecuteTransaction` events
- `/create`: Owner proposes a transaction — calls `getTransactionHash()` on-chain, signs with `walletClient.signMessage({ message: { raw: hash } })`, verifies via `recover()` + `isOwner()`, POSTs to pool server. Reads `predefinedTxData` from `localStorage` to support pre-encoded owner management calldata from the Owners page
- `/pool`: Polls pool server every ~4s. For each pending tx, validates signatures by calling `recover()` and `isOwner()`. **Sign button**: signs locally, calls `getSortedSigList()` to sort all signatures by recovered signer address ascending, re-posts to pool. **Exec button** (enabled when `signatures.length >= signaturesRequired`): calls `contract.write.executeTransaction([to, value, data, sortedSigs])`
- `/owners`: Shows current owners from `Owner` event history. Uses viem's `encodeFunctionData({ abi, functionName: 'addSigner'/'removeSigner', args: [address, newThreshold] })` to encode calldata, stores it in `localStorage`, and redirects to `/create` — the contract's self-call pattern in action

**Key implementation details:**
- Signatures must be sorted by recovered signer address (ascending) before `executeTransaction` — the contract uses `require(recovered > duplicateGuard)` to detect duplicates
- `getPoolServerUrl(chainId)`: returns `http://localhost:49832/` for Hardhat, `https://multisigs.buidlguidl.com:49832/` for public chains
- Serialize `BigInt` values as strings when POSTing to the pool server
- Deploy with `args: [chainId, [ownerAddress], signaturesRequired]` — start with 1-of-1 for local testing

**Verify by:** Running the full flow — fund the contract, propose a transfer, sign it from a second wallet in a second browser window, execute it, confirm the balance decreases and the tx appears in the `/multisig` event history.

@Pabl0cks
Copy link
Member

nit: there's an images of build ideas in the /start and profile page, but no images in /build-prompts. I think it we need to decide, do we need to generate image for every idea or not. And then add or remove images everywhere.

My reasoning was: since we already have those images, let's use them to make the "CTAs" better (in /start page and in portfolio page), but once in the build prompt page... remove them (It'd be a pain to create an image for each one). But open.

I agree that having images would make the build prompts page more visually compelling, i could see the cards with a copy button and a expand button, in case you just want to copy&paste and tweak in your agent.

I'd only add images if we can automate the image creation, or 95% of it, if not I'd start with text-only probably. I've been playing with some prompts with nano banana pro, will send some examples to see how we feel about them.

We can probably achieve a coherent aesthetic this way between all the different build prompts we create, but we probably need to create 3-4 variations in some cases because sometimes it generates weird or low effort stuff.

AI generated build ideas images image image image image image

@carletex
Copy link
Member Author

Regarding images:

I'd love to have a page with 100s of build ideas under a bunch of categories, where we keep adding as new ERC or patterns come out. I don't think having images for those makes sense in this case.

But, if we want to have a more "curated" page (like having 10/15 build prompts), then the images might make sense.

@rin-st
Copy link
Member

rin-st commented Feb 19, 2026

My reasoning was: since we already have those images, let's use them to make the "CTAs" better (in /start page and in portfolio page), but once in the build prompt page... remove them (It'd be a pain to create an image for each one). But open.

I'd only add images if we can automate the image creation, or 95% of it, if not I'd start with text-only probably.

I'd love to have a page with 100s of build ideas under a bunch of categories, where we keep adding as new ERC or patterns come out. I don't think having images for those makes sense in this case.

Agree, now I think that it's not worth it to add images for now, so voting for leaving it as is, and maybe removing current build ideas images later

@Pabl0cks
Copy link
Member

In order to create builds with the prompt in an non-scaffolded folder, I created a PR to tweak the SKILL.md a bit to fix some issues with Windows-Foundry and it trying to create the scaffolded instance in an existing folder.

To test you can try this prompt:

# Build a Multisig Wallet dApp using Scaffold-ETH 2

If the current folder isn't scaffolded yet (no `packages/nextjs/scaffold.config.ts`), follow the instructions at https://scaffold-eth-2-docs-git-skill-tinkering-buidlguidldao.vercel.app/SKILL.md to scaffold it.

If already scaffolded, continue directly with building.

## What to Build: Multisig Wallet dApp

**Core idea:** A smart contract wallet that requires multiple owners to approve transactions before execution. Users can submit, approve, and execute transactions with a configurable threshold.

### Key Features

- Multi-owner wallet with configurable approval threshold (e.g., 2-of-3)
- Submit, approve, and execute ETH/token transfer transactions
- Owner management (add/remove owners, change threshold)
- Transaction history and status tracking in the UI
- Events for all wallet actions

### Extensions to Consider

- Support for ERC-20 token transfers
- Time-locked transactions (execution delay after approval)
- Batch transaction execution
- Off-chain signature collection (EIP-712)
- Recovery mechanism if an owner loses access

I've replaced the SKILL.md from SE-2 main url to my preview instance url to test. Please let me know how it works on your setups 🙏

@Pabl0cks
Copy link
Member

Experimentation with SVG NFT

I've been playing a bit with the SVG nft. With the generic prompt we have right now it had a creative 1shot here:

generic-prompt

Then I crafted a prompt based on the old loogie repo, with more constraints and focused on the old repo features:

Loogie prompt
# Build a Fully On-Chain SVG NFT dApp using Scaffold-ETH 2

If the current folder isn't scaffolded yet (no `packages/nextjs/scaffold.config.ts`), scaffold it first:

sh
npx create-eth@latest
cd <your-project-name>


Then add `"base64-sol": "^1.1.0"` to `packages/hardhat/package.json` devDependencies and run `yarn install`. This library handles Base64 encoding in-contract, which is needed for the `tokenURI` pipeline.

If already scaffolded, continue directly with building.

---

## What to Build: Fully On-Chain SVG NFT

**Core idea:** An ERC721 NFT collection where both the artwork and metadata live entirely on the blockchain — no IPFS, no external APIs, no server. Each token's image is a dynamic SVG built and encoded in Solidity at read time, using traits that are generated deterministically at mint time.

The reference implementation (Loogies) mints cartoon faces with three traits — color, body size, and mouth length — but the same architecture applies to any generative SVG art you can describe with math and SVG primitives.

---

## Smart Contract

**`YourCollectible.sol`** — inherit from `ERC721Enumerable` (not just `ERC721`). The `Enumerable` extension adds `tokenByIndex` and `tokenOfOwnerByIndex`, which the frontend needs to enumerate tokens without an indexer.

**Trait storage** — store each token's traits as on-chain state, keyed by token ID. Use the smallest type that fits (e.g. `bytes3` for an RGB color, `uint256` for numeric traits). Three parallel mappings is a simple and readable pattern.

**Mint function** — a `payable` function that:
1. Enforces a supply cap
2. Applies a pricing model (flat fee, bonding curve, etc. — your choice)
3. Generates traits deterministically from `keccak256(tokenId, blockhash(block.number - 1), msg.sender, address(this))` — this produces unique-looking results per mint without an oracle
4. Stores the traits in your mappings
5. Calls `_mint` to assign the token

**SVG generation** — two functions, one internal and one `public`:
- The internal one wraps the SVG elements in a root `<svg>` tag
- The `public` one (`renderTokenById`) returns just the inner elements — making it `public` is deliberate, so other contracts can compose on top of your art (e.g. a "hat" contract that layers its own elements over yours)

Build the SVG string using `abi.encodePacked` concatenation, interpolating your trait values as strings. Use helper libraries for any type conversions you need (e.g. `bytes3` → hex color string, `uint256` → address string). OpenZeppelin's `Strings.sol` covers `uint256.toString()`.

**`tokenURI`** — the full pipeline for returning a fully self-contained token:
1. Generate the SVG string
2. `Base64.encode(bytes(svgString))` → encoded image
3. Assemble a JSON string: `{"name":..., "description":..., "attributes":[...], "image":"data:image/svg+xml;base64,<encoded>"}`
4. `Base64.encode(bytes(jsonString))` → encoded metadata
5. Return `"data:application/json;base64,"` + encoded metadata

The result is a `data:` URI that any NFT marketplace or wallet can display with zero external dependencies.

---

## Frontend

Two pages, both using Scaffold-ETH 2's `useScaffoldReadContract`, `useScaffoldWriteContract`, and `useScaffoldContract` hooks.

**Gallery page (`/your-collection`)** — shows all minted tokens, paginated. Load tokens by iterating `tokenByIndex` backwards (newest first), call `tokenURI` for each, and decode with `atob(uri.split(',')[1])` → `JSON.parse`. Render the returned `image` field directly as a `<img src>` — the browser handles `data:image/svg+xml;base64,...` natively. Include a mint button that calls your mint function with the current price.

**Personal page (`/my-tokens`)** — same as the gallery but filtered to the connected wallet using `balanceOf` + `tokenOfOwnerByIndex`. Useful for users to see what they own.

Add both pages as nav links in the Header.

---

## Validation

At each stage, use the SE-2 debug UI at `/debug` to call contract functions directly without the frontend.

- After deploying: confirm the contract appears in the debug UI with all public functions and mappings visible
- After minting: call `tokenURI(1)`, copy the returned string, strip the `data:application/json;base64,` prefix, decode with `atob()` in the browser console, and `JSON.parse` — verify name, description, attributes, and image are all present
- For the image: paste just the `image` field value (the `data:image/svg+xml;base64,...` part) into a browser address bar and verify the SVG renders correctly
- On the frontend: mint a second token and confirm the price has updated on the button, and the new card appears in the gallery

---

## Extensions to Consider

- **Richer SVG** — more SVG elements, gradients, animations (`<animate>`), layered groups. Complexity is only limited by gas limits on `eth_call`
- **Composability** — deploy a second contract that calls `renderTokenById` on yours and wraps it with additional SVG layers (accessories, backgrounds, overlays)
- **Dutch auction pricing** — price decreases over a time window, then settles
- **Allowlist / phases** — discount or early access for an allowlisted set of addresses using a Merkle proof
- **Withdraw pattern** — instead of forwarding ETH in the mint transaction, accumulate it in the contract and add a `withdraw()` owner function (simpler, but funds sit in the contract until pulled)
- **Chainlink VRF** — replace the `keccak256` pseudorandomness with a verifiable random source for high-value trait generation where miner influence matters
- **Reveal mechanic** — mint with a placeholder image, then reveal traits after a cutoff block using a committed random seed

And it created a loogie-like output:

image

Personal thoughts

I think we could start with the simple build prompts we have right now, (adding extra context to scaffold the project) so the LLM can be more creative. This would allow us to develop a few build prompts more quickly.

In future iterations, we could consider having the LLM ask the user for different variations or attributes related to each specific project. That way, the build process would have some rails, but they would be defined by the user needs.

@technophile-04
Copy link
Member

Thanks @Pabl0cks! This is great!

I think we could start with the simple build prompts we have right now, (adding extra context to scaffold the project) so the LLM can be more creative. This would allow us to develop a few build prompts more quickly.

In future iterations, we could consider having the LLM ask the user for different variations or attributes related to each specific project. That way, the build process would have some rails, but they would be defined by the user needs.

💯💯 agreee!

So just to summarize everthing:

  1. Add a line at top of the prompt guardrailling the AI not to look into subdirectories while looking for scaffold.config, mentioned here by rinnat. Just tweaked what he suggested and maybe we could add:
Check if ./packages/nextjs/scaffold.config.ts exists directly in the current working directory (do not search subdirectories). If it doesn't exist, this is not a Scaffold-ETH 2 project. Follow the instructions at https://docs.scaffoldeth.io/SKILL.md to scaffold it first. If it exists, continue directly with building.
  1. Start with the simple build prompts we have right now. I think the prompt Build prompts page and shift from repo links to AI prompts #356 (comment) was too much detailed, I mean it created very nice result but we can give AI some free space?

I had this philosophy in my meta prompt builder when migrating extension from skills:

philosohpy of meta prompt builder
## Philosophy: The 7/10 Rule

On a scale of 1 to 10:

- **1** = Rigid step-by-step with exact code to copy (the old extension system)
- **10** = "Just read the docs and figure it out" with zero guidance

**We aim for 7.** That means:

- **Give examples as syntax references**, not as code to copy verbatim. Label them clearly — "Syntax example", "Reference implementation", "for reference". The AI should understand the pattern, not paste the code.
- **Don't dictate every decision.** Let the AI choose icons, decide page placement, pick component structure, design the UI. It knows the project context better than a static template.
- **Don't over-specify what the AI already knows.** If SE-2 has an `AGENTS.md` or the AI has access to project files, don't repeat that info in detail. A brief mention ("SE-2 uses DaisyUI + Tailwind") is enough.
- **Do provide the hard-to-discover knowledge.** Integration patterns between SE-2 and the technology, the correct import paths for virtual modules, SE-2-specific config bridges — this is what the AI genuinely needs and can't easily figure out on its own.
- **Do link to official docs** and encourage the AI to search the web or check docs for anything not covered. The skill isn't a complete reference for the technology — it's the SE-2 integration knowledge.
- **Don't hardcode dependency versions.** Use `latest` or minimum version ranges and point to npm/GitHub releases. Hardcoded versions go stale. The exception: if a specific version is known to break, note that.
- **Frame things as "here's how it works" not "do this".** Say "The config reads SE-2's deployed contracts" not "Create a file called `ponder.config.ts` with the following contents".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants