rust · patrickjs — Cursor rule: what it does, how to install
Guides Solana smart contract engineering with the Anchor framework and Rust SDK. Targets account safety, compute efficiency, and TypeScript testing.
.cursor/rules/rust.mdcWhat rust does
This rule aligns the AI assistant with Anchor conventions for Solana programs. Program logic starts in lib.rs, instructions split into separate handler modules, and IDs rely on declare_id!(). All account structs require #[derive(Accounts)] alongside constraint attributes like mut, seeds, and bump to prevent missing verification checks.
On-chain calculations avoid floating-point math entirely, enforcing u64, u128, or fixed-point arithmetic instead. For large data structs, the instructions recommend #[account(zero_copy)] and Borsh serialization to keep compute unit usage low. Tests execute against a local validator via Mocha, Chai, and anchor test.
Local builds and CI pipelines require both solana-cli and anchor-cli installed in the development environment.
What it helps with
- scaffold Anchor smart contracts with modular handler structures in lib.rs
- enforce account constraints and signer verification on Solana instructions
- write TypeScript test suites with local test validators and airdrops
- minimize compute unit consumption with zero-copy deserialization
Example prompts for the agent
- Create an Anchor program structure in
programs/escrow/src/lib.rswith an initialize handler - Write a TypeScript test in
tests/escrow.tsthat simulates transaction execution - Add account validation attributes with seeds and bump constraints for a PDA
How to install rust
Manually: put the files in place
.cursor/rules/rust.mdcFrontmatter: description, globs, alwaysApply
Manually: put the files in place
.claude/rules/rust.mdThe paths frontmatter field limits the files: move globs from the source into paths
AGENTS.md
Codex reads AGENTS.md: paste the rule text there
Manually: put the files in place
.github/instructions/rust.instructions.mdThe applyTo field sets which files it applies to: move globs from the source into applyTo
Manually: put the files in place
.devin/rules/rust.mdManually: put the files in place
.clinerules/rust.mdStep by step, with commands for each platform: Cursor rules: .mdc files, four modes and what replaced .cursorrules
Questions about rust
How do I install rust in Cursor?
Place the rule file at .cursor/rules/rust.mdc in your repository root.
What files does this rule target?
It targets Rust sources in programs/**/*.rs and src/**/*.rs, plus TypeScript files in tests/**/*.ts.
What serialization approach does the rule enforce?
It requires Borsh or Anchor serialization for on-chain structs, specifically advising against Serde.
Source text
rust.mdc · CC0-1.0
--- description: "Rust best practices for Solana smart contract development using Anchor framework and Solana SDK" globs: programs/**/*.rs, src/**/*.rs, tests/**/*.ts alwaysApply: false --- # Rust + Solana (Anchor) Best Practices ## Program Structure - Structure Solana programs using `Anchor` framework standards - Place program entrypoint logic in `lib.rs`, not `main.rs` - Organize handlers into modules (e.g., `initialize`, `update`, `close`) - Separate state definitions, errors, instructions, and utils - Group reusable logic under a `utils` module (e.g., account validation) - Use `declare_id!()` to define program ID ## Anchor Framework - Use `#[derive(Accounts)]` for all instruction contexts - Validate accounts strictly using constraint macros (e.g., `#[account(mut)]`, `seeds`, `bump]`) - Define all state structs with `#[account]` and `#[derive(AnchorSerialize, AnchorDeserialize)]` - Prefer `Init`, `Close`, `Realloc`, `Mut`, and constraint macros to avoid manual deserialization - Use `ctx.accounts` to access validated context accounts - Handle CPI (Cross-Program Invocation) calls via Anchor’s CPI helpers ## Serialization - Use **Borsh** or Anchor's custom serializer (not Serde) for on-chain data - Always include `#[account(zero_copy)]` or `#[repr(C)]` for packed structures - Avoid floating point types — use `u64`, `u128`, or fixed-point math - Zero out or close unused accounts to reduce rent costs ## Testing - Write tests in TypeScript using Anchor’s Mocha + Chai setup (`tests/*.ts`) - Use `anchor.workspace.MyProgram` to load deployed contracts - Use `provider.simulate()` to inspect failed txs - Spin up a local validator (`anchor test`) and reset between tests - Airdrop SOL to wallets with `provider.connection.requestAirdrop(...)` - Validate program logs using `tx.confirmation.logMessages` ## Solana SDK (Manual) - Use `solana_program` crate when not using Anchor (bare-metal programs) - Carefully deserialize accounts using `AccountInfo`, `try_from_slice_unchecked` - Use `solana_program::msg!` for lightweight debugging logs - Verify accounts via `is_signer`, `is_writable`, `key == expected` - Never panic! Use `ProgramError::Custom(u32)` or `ErrorCode` enums ## Security Patterns - Always validate `msg.sender`/signer with `account_info.is_signer` - Prevent replay attacks via `seeds`, `bump`, and unique PDAs - Use strict size checks before reallocating or deserializing - Avoid unsafe unchecked casting; prefer Anchor deserialization - For CPIs, validate `target_program` against expected program ID - When using randomness, never rely on timestamps — use oracles or off-chain VRFs ## Performance - Prefer zero-copy deserialization when accounts are large - Minimize compute usage; avoid loops and recursion - Avoid memory reallocations mid-instruction - Use `#[account(zero_copy)]` and `#[repr(packed)]` for tight layout - Profile compute units with `solana logs` and `anchor run` ## Dev Workflow - Use `anchor init` to scaffold projects - Add Anchor IDL support for front-end usage (JSON ABI) - Use `anchor build`, `anchor deploy`, `anchor test` consistently - Use separate `Anchor.toml` environments for devnet/mainnet/localnet - Format all Rust code with `cargo fmt`, lint with `cargo clippy` - Keep `Cargo.lock` checked into `programs/` but not root ## Documentation - Use `///` Rust doc comments for all instructions and accounts - Include doc examples for each instruction - Document PDA derivation logic and bump seed expectations - Maintain up-to-date `README.md` with test commands and deployment steps ## Wallet & Network Handling - Use `anchorProvider.wallet.publicKey` for signer verification in tests - Do not hardcode keypairs — use env-based loading (`process.env.ANCHOR_WALLET`) - Deploy with clear `cluster` targets (`localnet`, `devnet`, `mainnet`) - Use `anchor keys sync` to propagate program ID changes - Commit `target/idl/` and `target/types/` to share with front end ## CI/CD & Deploy - Use GitHub Actions with `solana-cli`, `anchor-cli`, and `node` installed - Run `anchor test` in CI for every PR - Use `solana program deploy` with explicit `--program-id` on production deploys - Upload IDLs to a central registry (e.g., GitHub, IPFS, or `anchor.cloud`)
© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules
Similar IDE rules
All IDE rules for Programming languages →rust by other authors comes first.