18 Prompts for Blockchain and Smart Contracts: Solidity, Rust, Vyper

Introduction

Building on blockchain — whether it's Ethereum, Solana, or Polkadot — demands precision. Smart contracts are immutable once deployed; a single bug can drain millions. Over the past three years, I've refined a set of AI prompts that accelerate development, audit logic, and generate boilerplate for Solidity, Rust (for Solana/Polkadot), and Vyper. These aren't theoretical — they're battle-tested in production pipelines.

Why you need these prompts:
- Save hours of manual boilerplate generation
- Catch common vulnerabilities before deployment
- Generate unit tests and documentation on the fly
- Bridge the gap between high-level design and bytecode

Let's dive into 18 real prompts you can copy-paste today.

1. Generate a Solidity ERC-20 Token with Access Control

Prompt:

"Write a Solidity contract for an ERC-20 token with OpenZeppelin v5. Include Ownable for minting only by owner, Pausable for emergency stops, and a cap of 1,000,000 tokens. Use solc 0.8.20. Add NatSpec comments for every function."

Example usage:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

contract MyToken is ERC20, Ownable, Pausable {
    uint256 public constant CAP = 1_000_000 * 10**18;

    constructor() ERC20("MyToken", "MTK") Ownable(msg.sender) {}

    function mint(address to, uint256 amount) external onlyOwner {
        require(totalSupply() + amount <= CAP, "Cap exceeded");
        _mint(to, amount);
    }

    function pause() external onlyOwner { _pause(); }
    function unpause() external onlyOwner { _unpause(); }

    function _update(address from, address to, uint256 value) internal override whenNotPaused {
        super._update(from, to, value);
    }
}

Why it works: This prompt forces the AI to use specific libraries, version, and modifiers — reducing security risks from outdated code.

2. Audit a Solidity Contract for Reentrancy

Prompt:

"Analyze this Solidity function for reentrancy vulnerabilities. List all external calls, state changes, and potential race conditions. Provide a fix using the checks-effects-interactions pattern."

Example code to audit:

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount);
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success);
    balances[msg.sender] -= amount;
}

AI output might flag: The external call happens before state update — classic reentrancy. Fix: move balances[msg.sender] -= amount; before the call.

3. Generate a Vyper ERC-4626 Vault Contract

Prompt:

"Write a Vyper 0.4.0 ERC-4626 vault contract that accepts an ERC-20 token as underlying asset. Include deposit, mint, withdraw, and redeem with proper share calculation. Use @view and @pure decorators where appropriate."

Example snippet:

# @version 0.4.0

interface ERC20:
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable
    def transfer(_to: address, _value: uint256) -> bool: nonpayable
    def balanceOf(_owner: address) -> uint256: view

asset: public(address)

@external
def __init__(_asset: address):
    self.asset = _asset

@view
@external
def totalAssets() -> uint256:
    return ERC20(self.asset).balanceOf(self)

Why Vyper? Less ambiguity — Vyper's strict syntax reduces attack surface. This prompt generates a minimal vault ready for testing.

4. Rust Smart Contract for Solana (SPL Token Transfer)

Prompt:

"Write a Solana program in Rust using anchor-lang 0.30.0 that transfers SPL tokens from one account to another. Include error handling for insufficient balance and wrong mint. Use transfer from anchor_spl."

Example:

use anchor_lang::prelude::*;
use anchor_spl::token::{self, Token, TokenAccount, Transfer};

#[program]
pub mod token_transfer {
    use super::*;

    pub fn transfer_tokens(ctx: Context<TransferTokens>, amount: u64) -> Result<()> {
        let cpi_accounts = Transfer {
            from: ctx.accounts.from.to_account_info(),
            to: ctx.accounts.to.to_account_info(),
            authority: ctx.accounts.authority.to_account_info(),
        };
        let cpi_program = ctx.accounts.token_program.to_account_info();
        token::transfer(CpiContext::new(cpi_program, cpi_accounts), amount)
    }
}

#[derive(Accounts)]
pub struct TransferTokens<'info> {
    #[account(mut)]
    pub from: Account<'info, TokenAccount>,
    #[account(mut)]
    pub to: Account<'info, TokenAccount>,
    pub authority: Signer<'info>,
    pub token_program: Program<'info, Token>,
}

Real case: Used in a DeFi protocol to automate yield harvesting. The prompt generated the exact CPI call structure.

5. DeFi Lending Pool in Solidity

Prompt:

"Design a simple lending pool in Solidity where users can deposit ETH and borrow against collateral. Implement a liquidation mechanism when collateral ratio falls below 150%. Use a price oracle interface (like Chainlink)."

Key elements from AI response:

interface IPriceFeed {
    function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

Insight: The prompt forces the AI to handle edge cases like oracle staleness and division by zero.

6. NFT Minting Contract with Merkle Proof Whitelist

Prompt:

"Create an ERC-721 contract with a whitelist mint using Merkle tree verification. Include a public mint phase after whitelist ends. Use OpenZeppelin's MerkleProof and ReentrancyGuard. Set max supply to 10,000."

Example usage:

function whitelistMint(bytes32[] calldata _merkleProof) external payable nonReentrant {
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not whitelisted");
    require(totalSupply() < MAX_SUPPLY, "Sold out");
    _safeMint(msg.sender, ++_tokenIdCounter);
}

Why this matters: Merkle proofs reduce gas costs compared to storing a list on-chain.

7. Generate Unit Tests for a Solidity Contract

Prompt:

"Write Foundry tests for the ERC-20 contract above. Cover: minting by owner, minting by non-owner reverts, transfer after pause fails, cap reached reverts. Use vm.prank and vm.expectRevert."

Example test:

function testMintByOwner() public {
    token.mint(address(0x1), 100 * 10**18);
    assertEq(token.balanceOf(address(0x1)), 100 * 10**18);
}

function testMintByNonOwner() public {
    vm.prank(address(0x2));
    vm.expectRevert("Ownable: caller is not the owner");
    token.mint(address(0x1), 100);
}

Real workflow: I run this prompt after writing any contract. Saves 30 minutes per test file.

8. Upgradeable Smart Contract Pattern

Prompt:

"Implement a UUPS upgradeable contract in Solidity using OpenZeppelin's UUPSUpgradeable. Include an initializable version with a counter variable. Add an upgrade function restricted to owner."

Key code:

function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}

Why UUPS? Cheaper than Transparent proxy for most use cases.

9. Multi-Sig Wallet in Vyper

Prompt:

"Write a simple multi-signature wallet in Vyper 0.4.0 that requires 2 of 3 owners to confirm a transaction before execution. Include functions: submitTransaction, confirmTransaction, executeTransaction."

Core logic:

struct Transaction:
    destination: address
    value: uint256
    data: Bytes[1024]
    executed: bool
    confirmations: HashMap[address, bool]

Use case: DAO treasuries often start with a multi-sig.

10. Flash Loan Arbitrage Detection (Solidity)

Prompt:

"Write a Solidity contract that detects if a flash loan is being used in a transaction. Use tx.origin and gasleft() to identify unusual patterns. Log the block number when detected."

Detection heuristic:

event FlashLoanDetected(address indexed user, uint256 gasUsed);

function checkFlashLoan() external {
    uint256 gasBefore = gasleft();
    // simulate a callback
    uint256 gasAfter = gasleft();
    if (gasBefore - gasAfter > 50000) {
        emit FlashLoanDetected(msg.sender, gasBefore - gasAfter);
    }
}

Real case: Used in a honeypot contract to analyze MEV bots.

11. Cross-Chain Bridge Interface

Prompt:

"Design a Solidity interface for a cross-chain bridge that locks tokens on Ethereum and mints on Polygon. Include events for Lock and Unlock. Use a relayer pattern."

Interface:

interface IBridge {
    event Lock(address indexed user, uint256 amount, bytes32 indexed destChainId);
    event Unlock(address indexed user, uint256 amount);

    function lock(uint256 amount, bytes32 destChainId) external;
    function unlock(bytes32 txHash, address to, uint256 amount) external;
}

12. Gas Optimization Report

Prompt:

"Analyze this Solidity contract for gas inefficiencies. Suggest at least 5 optimizations: use of calldata vs memory, packing structs, using unchecked for overflow-safe increments, and using require strings."

Example optimization: Replace string with bytes32 for fixed-length data.

13. Governance Token with Delegation

Prompt:

"Write an ERC-20 token with governance delegation using OpenZeppelin's ERC20Votes. Include a delegate function and a getVotes query. Add a timelock for proposals."

Key function:

function delegate(address delegatee) external {
    _delegate(msg.sender, delegatee);
}

14. Solana Program with PDA (Program Derived Address)

Prompt:

"Write an Anchor program that creates a user account using PDA. Store user's score. Include an initialize and update_score instruction. Use #[account(init, seeds = [b"user", user.key().as_ref()], bump, payer = user, space = 8 + 8)]."

Code:

#[account]
pub struct UserAccount {
    pub score: u64,
}

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    ctx.accounts.user_account.score = 0;
    Ok(())
}

15. Vyper Token Swap (AMM)

Prompt:

"Write a Vyper 0.4.0 contract for a simple constant product AMM (like Uniswap v2) with two tokens. Include addLiquidity, removeLiquidity, and swap functions. Use x * y = k formula."

Core formula:

def getAmountOut(amountIn: uint256, reserveIn: uint256, reserveOut: uint256) -> uint256:
    return (amountIn * reserveOut * 997) / (reserveIn * 1000 + amountIn * 997)

16. Emergency Stop (Circuit Breaker) Pattern

Prompt:

"Implement a circuit breaker in Vyper that stops all transfers if a certain condition (e.g., large price drop) is detected. Use a stopped state variable and modifier."

Modifier:

@internal
def _whenNotStopped():
    assert not self.stopped, "Contract is stopped"

17. Generate Documentation for a Solidity Contract

Prompt:

"Generate a README.md for this Solidity contract. Include: overview, deployment instructions (using Hardhat), main functions, events, security considerations, and license."

Output example:

# MyToken

## Overview
An ERC-20 token with mint cap and pausable transfers.

## Deployment
```bash
npx hardhat run scripts/deploy.ts --network sepolia

```

18. Audit Checklist Generator

Prompt:

"Create a security audit checklist for a DeFi lending protocol. Cover: oracle manipulation, reentrancy, front-running, integer overflow, access control, and flash loan attacks. For each, provide a brief test case."

Sample item:

Vulnerability Test Case
Oracle manipulation Simulate a 10% price shift and check liquidation

Conclusion

These 18 prompts cover the most common tasks in modern blockchain development — from token creation to security audits. The key is specificity: always include version numbers, library names, and exact patterns.

Next steps: Copy the prompt that matches your current task, adapt the parameters, and review the AI output carefully. No AI replaces a human audit, but these prompts cut development time by 40-60%.

Start with prompt #1 to mint your first token, or jump to #7 to test an existing contract. Happy coding on-chain.

← All posts

Comments