Skip to main content
This page documents the runnable gates that validate ProofForge today and separates them from gates that are planned but not yet implemented. It mirrors actual scripts, root justfile recipes, and .github/workflows/ci.yml; it does not add or edit CI jobs.

Current gates

GateCommandPrerequisitesWhat it provesWhat it does not prove
Unified testkit scenariosjust testkitRust/Cargo; Lean toolchain from lean-toolchain; solc for the EVM bytecode branch; Foundry cast for Contract SDK selector hydration on the ValueVault EVM branch; optional sbpf plus solana-keygen for the Solana/Mollusk branchRFC 0007 testkit discovers testkit/scenarios/counter.toml and testkit/scenarios/value-vault.toml, emits WAT fixtures through Lean and runs them on the deterministic runtime/offline-host wasmtime NEAR host, emits EVM runtime bytecode plus artifact metadata and runs the covered scenarios in-process on revm when required EVM tools are available, emits Solana sBPF assembly/manifest/artifact metadata, builds sBPF ELF programs, runs stateful scenarios through mollusk-svm when optional Solana tools are available, validates scenario-declared artifact expectations including Counter golden source equality for Wasm/NEAR WAT, EVM Yul, and Solana assembly/manifest, ValueVault golden equality for Wasm/NEAR WAT, EVM Yul, and Solana sBPF assembly/manifest, structured JSON/TOML metadata/manifest path assertions including presence, absence, type, non-empty, and array/object/table/string length checks, EVM deploy manifest schema checks, JSON metadata file-reference checks for generated artifact path/byte-size/SHA-256 entries, cross-artifact JSON equality for embedded Solana IDL metadata, and ValueVault IDL/client shape checks, validates every target’s return expectations, asserts normalized observable trace parity across executed targets, and (per RFC 0010) reports per-step resource budgets: Solana CU from Mollusk, EVM gas from revm, and wasmtime fuel as an info-only NEAR gas proxy; counter.toml locks Solana CU and EVM gas baselines with tolerance bands and fails the run on regressionLive NEAR sandbox deployment, live EVM RPC/deployment behavior, Surfpool/Web3 Solana deployment behavior, replacement of all legacy per-target smoke scripts, event/log parity, protocol-fee or transaction-pricing modeling, exact NEAR gas equivalence
Lean package buildlake buildLean toolchain from lean-toolchainLibrary roots typecheck and proof-forge linksGenerated Yul/bytecode validity, external tools, runtime behavior
Target registry smokelake env lean --run Tests/TargetRegistry.leanLean toolchain from lean-toolchainThe target registry exposes evm as a compiler target while EVM-compatible chain profiles such as robinhood-chain-testnet and anvil-local stay lookup-only deployment profilesDeployment broadcast, live RPC or explorer reachability, wallet integration
EVM semantic plan smokejust evm-planLean toolchain from lean-toolchainThe EVM semantic plan builds from the target-resolved CapabilityPlan, rejects non-EVM target plans, and validates storage layout, scalar storage slots, map value slots, nested map value slots, map presence slots, map assign-op helper requirements, and planned helper requirements before Yul generationFull ModulePlan ownership of ABI dispatch, events, crosscalls, constructor metadata, artifact metadata, solc acceptance, bytecode, runtime behavior, broader aggregate storage planning
Solana light gatesjust solana-lightLean toolchain from lean-toolchain; python3; optional cast for the portable ValueVault EVM selector-hydration/Yul branch; optional solc plus cast for its strict-assembly and EVM bytecode metadata branches; optional sbpf and solana-keygen for Solana SDK build branchesSolana target diagnostics, SDK metadata, SDK manifest, generated Solana IDL and TypeScript client artifacts, Contract Source Syntax v1 routing/render checks for Counter and portable ValueVault, Learn source lowering equivalence plus Learn reference diagnostics for CPI/PDA/state helper mistakes, typed account declaration metadata, CPI packing, log lowering, target routing, portable ValueVault Learn-source CLI emission to EVM Yul and Solana sBPF assembly/manifest/IDL/client artifact metadata, token spec, return-data/compute-units SDK helpers, Counter sBPF golden assembly/manifest diff, control-flow/assertion assembly emission, SDK extension artifact metadata, the CI-safe Pinocchio System/SPL Token reference-equivalence suite, and canned sBPF emission when sbpf is availableFull Mollusk runtime coverage, Surfpool/Web3 deployment smoke, public validator deployment, Solana transaction UX, live Pinocchio dual-deploy equivalence
Token SDK plan smokejust learn-token-smokeLean toolchain from lean-toolchain; python3; optional solc for EVM bytecode; optional Node and npm for Web3.js validationValidates the legacy .learn token path into the Lean TokenSpec boundary, emits ERC-20 Yul/bytecode metadata when solc is available, emits structured Solana SPL Token and Token-2022 plan JSON, checks mint/ATA/mint_to/transfer_checked/approve/burn/revoke/authority-change plan entries, checks Token-2022 transfer-fee extension routing and withheld-fee collection plan entries, and validates the Solana plan offline with @solana/spl-token / @solana/web3.js instruction builders when Node/npm are availableLive Surfpool execution of all token plan variants, actual token balances, public validator deployment, wallet UX, generated wrapper/transfer-hook programs
Solana token plan Surfpool/Web3.js smokejust solana-token-plan-web3Lean toolchain from lean-toolchain; python3; surfpool; Solana CLI and solana-keygen; Node; npmEmits the structured SPL Token plan, starts Surfpool, creates the mint and associated token accounts through @solana/spl-token, mints initial supply, executes the planned mint_to, transfer_checked, approve, burn, revoke, and mint-authority set_authority operations, then verifies token balances, supply, delegate state, and authority revocation through Web3.js readsToken-2022 extension behavior, generated wrapper/transfer-hook programs, public validator deployment, wallet UX
Solana Token-2022 transfer-fee Surfpool/Web3.js smokejust solana-token-2022-transfer-fee-web3Lean toolchain from lean-toolchain; python3; surfpool; Solana CLI and solana-keygen; Node; npmEmits the structured Token-2022 transfer-fee plan, starts Surfpool, initializes a mint with TransferFeeConfig, creates Token-2022 associated token accounts, mints initial supply, executes TransferCheckedWithFee, verifies source balance, recipient net balance, and recipient withheld fee, directly withdraws withheld fees from a token account, then runs a second transfer, harvests withheld fees to the mint, withdraws them from the mint, and verifies the fee receiver balance plus cleared withheld amounts through Web3.js readsConfidential transfer setup, transfer-hook routing, generated wrapper/transfer-hook programs, public validator deployment, wallet UX
Solana Token-2022 non-transferable Surfpool/Web3.js smokejust solana-token-2022-non-transferable-web3Lean toolchain from lean-toolchain; python3; surfpool; Solana CLI and solana-keygen; Node; npmEmits a structured Token-2022 plan from the Lean .lean token fixture, starts Surfpool, initializes a mint with NonTransferable, creates Token-2022 associated token accounts, mints initial supply, verifies mint/account extensions, proves TransferChecked is rejected with Transfer is disabled for this mint, then burns the token and verifies balances and supplyConfidential transfer setup, transfer-hook routing, generated wrapper/transfer-hook programs, public validator deployment, wallet UX
Solana PDA Web3.js derivation smokejust solana-pda-web3Lean toolchain from lean-toolchain; Node; npmEmits the Solana SDK Vault artifact, reads PDA typedSeeds, and verifies literal/account/bump descriptor semantics against @solana/web3.js PublicKey.findProgramAddressSync and PublicKey.createProgramAddressSync; also covers the local resolver for UTF-8 and instruction-parameter seed descriptorsLive deployment or transaction execution; SPL Token CPI behavior
Solana System CPI Surfpool/Web3.js smokejust solana-system-cpi-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated System Program transfer CPI ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes the program through @solana/web3.js, verifies recipient lamports increased by the requested amount, and verifies the program-owned state account recorded the same lamports valueSystem create-account CPI, SPL Token CPI behavior, public validator deployment, Rust/Pinocchio equivalence
Solana Pinocchio reference-equivalence suitejust solana-pinocchio-reference-equivalenceLean toolchain from lean-toolchain; python3; optional cargo when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1Runs the five CI-safe Pinocchio reference-equivalence smokes below and is included in just solana-light / the default CI build-test jobLive dual-deploy equivalence, Pinocchio reference ELF builds
Solana Pinocchio System transfer reference-equivalence smokejust solana-pinocchio-system-transfer-equivalenceLean toolchain from lean-toolchain; python3; optional cargo when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1Emits the generated System Program transfer CPI source/artifact metadata and compares its instruction ABI, account order, signer/writable requirements, CPI metadata, and lamports state write contract against the checked-in Pinocchio reference manifest/source under references/solana/pinocchio/system-transferBuild/deploy the Pinocchio reference ELF and run ProofForge/reference programs through the same Web3.js harness
Solana Pinocchio System create_account reference-equivalence smokejust solana-pinocchio-system-create-account-equivalenceLean toolchain from lean-toolchain; python3; optional cargo when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1Emits the generated System Program create_account CPI source/artifact metadata and compares its instruction ABI, account order, signer/writable requirements, CPI metadata, lamports/space/owner layout, and two-field state-write contract against the checked-in Pinocchio reference manifest/source under references/solana/pinocchio/system-create-account; the optional Cargo check typechecks the Pinocchio reference against pinocchio-systemBuild/deploy the Pinocchio create_account reference ELF and run ProofForge/reference programs through the same Web3.js harness
Solana Pinocchio SPL Token transfer reference-equivalence smokejust solana-pinocchio-spl-token-transfer-equivalenceLean toolchain from lean-toolchain; python3; optional cargo when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1Emits the generated SPL Token transfer_checked CPI source/artifact metadata and compares its instruction ABI, account order, signer/writable requirements, CPI metadata, decimals/amount layout, and amount state-write contract against the checked-in Pinocchio reference manifest/source under references/solana/pinocchio/spl-token-transfer; the optional Cargo check typechecks the Pinocchio reference against pinocchio-tokenBuild/deploy the Pinocchio SPL Token reference ELF and run ProofForge/reference programs through the same Web3.js harness
Solana Pinocchio SPL Token ops reference-equivalence smokejust solana-pinocchio-spl-token-ops-equivalenceLean toolchain from lean-toolchain; python3; optional cargo when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1Emits the generated SPL Token mint_to/burn/approve/revoke CPI source/artifact metadata and compares its four instruction ABIs, shared account order, signer/writable requirements, CPI metadata, SPL Token instruction layouts, and state-write contract against the checked-in Pinocchio reference manifest/source under references/solana/pinocchio/spl-token-ops; the optional Cargo check typechecks the Pinocchio reference against pinocchio-tokenBuild/deploy the Pinocchio SPL Token ops reference ELF and run ProofForge/reference programs through the same Web3.js harness
Solana Pinocchio SPL Token authority reference-equivalence smokejust solana-pinocchio-spl-token-authority-equivalenceLean toolchain from lean-toolchain; python3; optional cargo when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1Emits the generated SPL Token set_authority CPI source/artifact metadata and compares its instruction ABI, account order, signer/writable requirements, CPI metadata, SetAuthority instruction layout, and marker state-write contract against the checked-in Pinocchio reference manifest/source under references/solana/pinocchio/spl-token-authority; the optional Cargo check typechecks the Pinocchio reference against pinocchio-tokenBuild/deploy the Pinocchio SPL Token authority reference ELF and run ProofForge/reference programs through the same Web3.js harness
Solana Pinocchio System transfer live-equivalence smokejust solana-pinocchio-system-transfer-live-equivalenceLean toolchain from lean-toolchain; cargo-build-sbf with Solana rustc/platform-tools; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds the ProofForge System transfer CPI ELF and the checked-in Pinocchio reference ELF, deploys both programs to the same Surfpool instance, invokes the same Web3.js transfer scenario for each, and compares recipient lamport delta plus recorded state valueMove live equivalence into CI once Solana rustc is installed reliably; extend Pinocchio comparisons to Token-2022 and broader SPL helper coverage; just solana-pinocchio-install-sbf-tools repairs missing/corrupted platform-tools
Solana Pinocchio System create_account live-equivalence smokejust solana-pinocchio-system-create-account-live-equivalenceLean toolchain from lean-toolchain; cargo-build-sbf with Solana rustc/platform-tools; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds the ProofForge System create_account CPI ELF and the checked-in Pinocchio reference ELF, deploys both programs to the same Surfpool instance, invokes the same Web3.js create-account scenario for each, and compares lamports/space plus recorded state valuesMove live equivalence into CI once Solana rustc is installed reliably; extend Pinocchio comparisons to Token-2022 and broader SPL helper coverage; just solana-pinocchio-install-sbf-tools repairs missing/corrupted platform-tools
Solana Pinocchio SPL Token transfer live-equivalence smokejust solana-pinocchio-spl-token-transfer-live-equivalenceLean toolchain from lean-toolchain; cargo-build-sbf with Solana rustc/platform-tools; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds the ProofForge SPL Token transfer_checked CPI ELF and the checked-in Pinocchio reference ELF, deploys both programs to the same Surfpool instance, invokes the same Web3.js token-transfer scenario for each, and compares token balance deltas plus recorded state valuesMove live equivalence into CI once Solana rustc is installed reliably; extend Pinocchio comparisons to Token-2022 and broader SPL helper coverage; just solana-pinocchio-install-sbf-tools repairs missing/corrupted platform-tools
Solana Pinocchio SPL Token ops live-equivalence smokejust solana-pinocchio-spl-token-ops-live-equivalenceLean toolchain from lean-toolchain; cargo-build-sbf with Solana rustc/platform-tools; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds the ProofForge SPL Token mint_to/burn/approve/revoke CPI ELF and the checked-in Pinocchio reference ELF, deploys both programs to the same Surfpool instance, invokes the same Web3.js token-ops scenario for each, and compares mint/burn/approve/revoke token effects plus recorded state valuesMove live equivalence into CI once Solana rustc is installed reliably; extend Pinocchio comparisons to Token-2022 and remaining SPL helper coverage; just solana-pinocchio-install-sbf-tools repairs missing/corrupted platform-tools
Solana Pinocchio SPL Token authority live-equivalence smokejust solana-pinocchio-spl-token-authority-live-equivalenceLean toolchain from lean-toolchain; cargo-build-sbf with Solana rustc/platform-tools; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds the ProofForge SPL Token set_authority CPI ELF and the checked-in Pinocchio reference ELF, deploys both programs to the same Surfpool instance, invokes the same Web3.js mint-authority transfer scenario for each, and compares mint authority plus recorded state markerMove live equivalence into CI once Solana rustc is installed reliably; extend Pinocchio comparisons to Token-2022 and remaining SPL helper coverage; just solana-pinocchio-install-sbf-tools repairs missing/corrupted platform-tools
Solana System create_account CPI Surfpool/Web3.js smokejust solana-system-create-account-cpi-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated System Program create_account CPI ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes it through @solana/web3.js, verifies the newly created account owner/space/lamports, and verifies the program-owned state account recorded the requested lamports and spaceSPL Token CPI behavior, public validator deployment, live Rust/Pinocchio equivalence
Solana SPL Token transfer_checked CPI Surfpool/Web3.js smokejust solana-spl-token-transfer-cpi-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated SPL Token transfer_checked CPI ELF, starts Surfpool, deploys with solana program deploy --use-rpc, creates a mint and token accounts through @solana/spl-token, invokes the generated program through @solana/web3.js, verifies source/destination token balances, and verifies the program-owned state account recorded the requested amountBroader SPL Token/Token-2022 coverage, public validator deployment, live Rust/Pinocchio equivalence
Solana SPL Token ops CPI Surfpool/Web3.js smokejust solana-spl-token-ops-cpi-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated SPL Token mint_to/burn/approve/revoke CPI ELF, starts Surfpool, deploys with solana program deploy --use-rpc, creates a mint and token accounts through @solana/spl-token, invokes the generated program through @solana/web3.js, verifies mint supply and token balance changes, verifies delegate allowance then revoke clearing, and verifies the program-owned state account recorded all requested valuesToken-2022 extension behavior, public validator deployment
Solana SPL Token authority CPI Surfpool/Web3.js smokejust solana-spl-token-authority-cpi-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated SPL Token set_authority CPI ELF, starts Surfpool, deploys with solana program deploy --use-rpc, creates a mint through @solana/spl-token, invokes the generated program through @solana/web3.js, verifies the mint authority moved to the requested new authority, and verifies the program-owned state account recorded the markerToken-2022 extension behavior, public validator deployment
Solana log/event Surfpool/Web3.js smokejust solana-log-event-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated events.emit/Solana log-extension ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes the generated program through @solana/web3.js, verifies sol_log_64_ transaction logs contain the stable event tag and scalar field value, verifies the program-owned state account recorded the same value, verifies sol_log_pubkey logs the state account’s base58 pubkey, and verifies sol_log_data emits a base64 Program data: payload for state bytesAnchor-compatible discriminator/Borsh event serialization, indexed events, sol_log_ payloads, historical indexing guarantees
Solana Clock sysvar Surfpool/Web3.js smokejust solana-clock-sysvar-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated contextRead checkpointId ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes the generated program through @solana/web3.js, verifies sol_get_clock_sysvar records Clock.slot into program-owned state, and compares it with transaction slot metadataRicher Clock fields, public validator deployment
Solana Rent sysvar Surfpool/Web3.js smokejust solana-rent-sysvar-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated Solana-only sysvar target-extension ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes the generated program through @solana/web3.js, verifies sol_get_rent_sysvar records Rent.lamports_per_byte_year into program-owned state, and compares it with the Rent sysvar account dataAdditional Rent fields, public validator deployment
Solana EpochSchedule sysvar Surfpool/Web3.js smokejust solana-epoch-schedule-sysvar-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated Solana-only sysvar target-extension ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes the generated program through @solana/web3.js, verifies sol_get_epoch_schedule_sysvar records all five current RPC-exposed EpochSchedule fields into program-owned state, and compares them with RPC getEpochSchedule()Additional Clock/Rent fields, generic account-passed sysvar reads, public validator deployment
Solana EpochRewards sysvar Surfpool/Web3.js smokejust solana-epoch-rewards-sysvar-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated Solana-only sysvar target-extension ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes the generated program through @solana/web3.js, verifies sol_get_epoch_rewards_sysvar records all current EpochRewards scalar/word-view fields into program-owned state, and compares them with the EpochRewards sysvar account dataAdditional Clock/Rent fields, generic account-passed sysvar reads, public validator deployment
Solana LastRestartSlot sysvar Surfpool/Web3.js smokejust solana-last-restart-slot-sysvar-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated Solana-only sysvar target-extension ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes the generated program through @solana/web3.js, verifies the feature-gated LastRestartSlot.last_restart_slot read lowered through sol_get_sysvar, and compares the recorded value with the LastRestartSlot sysvar account dataAdditional sysvars, public validator deployment, cluster feature-activation variance
Solana memory syscall Surfpool/Web3.js smokejust solana-memory-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated runtime.memory ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes set_source plus copy_compare_fill through @solana/web3.js, and verifies program-owned account bytes prove sol_memcpy_, sol_memmove_, sol_memcmp_, and sol_memset_ executedBroader account/data packing helpers, Rust/Pinocchio equivalence
Solana return-data/compute Surfpool/Web3.js smokejust solana-return-data-compute-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated runtime.return_data/runtime.compute_units ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes it through @solana/web3.js, verifies sol_set_return_data through simulation returnData, verifies sol_get_return_data through empty reads and same-instruction set/get roundtrips, verifies sol_remaining_compute_units writes a nonzero state value, and verifies sol_log_compute_units_ emits compute-unit logsCPI return-value handling, typed return payloads beyond u64, public-validator feature variance
Solana SHA-256/Keccak-256/Blake3 syscall Surfpool/Web3.js smokejust solana-crypto-hash-web3Lean toolchain from lean-toolchain; surfpool; Solana CLI and solana-keygen; sbpf; Node; npmBuilds a generated Solana-only crypto.hash ELF, starts Surfpool, deploys with solana program deploy --use-rpc, invokes set_preimage, hash_preimage, keccak_preimage, and blake3_preimage through @solana/web3.js, and verifies account-stored digests against Node SHA-256 plus @noble/hashes Keccak-256/Blake3 for the same preimage bytesPortable Expr.hash routing, Rust/Pinocchio equivalence
Yul generation smokelake env proof-forge --root . -o build/counter.yul Examples/Evm/Contracts/Counter.leanBuilt proof-forgeLean frontend/LCNF lowers a simple contract to Yulsolc acceptance, ABI dispatch, EVM runtime behavior
Yul-to-bytecode smokesolc --strict-assembly build/counter.yul --binsolc on PATHGenerated Yul is accepted by solcRuntime semantics or method dispatch
Single EVM bytecode compilelake env proof-forge --evm-bytecode --root . --module contract --artifact-output build/evm/Counter.proof-forge-artifact.json -o build/evm/Counter.bin Examples/Evm/Contracts/Counter.leansolc, cast, python3, and Examples/Evm/Contracts/Counter.evm-methodsLean -> Yul -> solc -> runtime bytecode with selector generation, deployable .init.bin creation bytecode, proof-forge-artifact.json metadata, and a proof-forge-deploy.json initcode manifest whose header copies and returns the referenced runtime bytecode; --evm-chain-profile <id> additionally records a known EVM chain profile in the deploy manifest without broadcasting; --evm-constructor-param <name:type> records static-word constructor ABI schema; --evm-constructor-arg <name=value> ABI-encodes supported static-word typed values; --evm-constructor-args-hex <hex> records and appends an ABI-encoded constructor-argument tailRuntime behavior, gas, exhaustive ABI correctness, dynamic constructor ABI types, signed/raw transaction generation, real transaction broadcast
EVM examples compilescripts/evm/build-examples.shcast, solc, python3, lake env proof-forge; optional PROOF_FORGE_BIN, CONTRACTS_DIR, EVM_OUT_DIREvery .lean contract with a sibling .evm-methods compiles to reproducible Yul, .bin, and .init.bin, diffs generated Yul against the tracked SDK example golden fixtures, and validates EVM metadata hashes, initcode hashes/header/runtime linkage, deploy-manifest hashes, source/module info, solc info, SDK method selectors/functions, and required Solidity method signaturesRuntime behavior; contracts without .evm-methods are skipped by the script
Learn token ERC-20 VM smokejust learn-token-evm-vmLean toolchain from lean-toolchain; solc; Node; npmParses Examples/Learn/ProofToken.learn, emits ERC-20 Yul/creation bytecode/artifact metadata through proof-forge --learn-token --target evm, deploys the generated creation bytecode in an EthereumJS VM, then verifies totalSupply, decimals, balanceOf, transfer, approve, allowance, transferFrom, optional burn, optional mint, Transfer/Approval topics, and insufficient-balance revert behaviorLive RPC deployment, gas accounting, wallet UX, stronger mint access-control policy
EVM runtime smokescripts/evm/foundry-smoke.shforge, cast, solc; optional EVM_OUT_DIR, EVM_FORGE_DIRFoundry executes generated runtime bytecode for Counter, ArrayExample, SimpleToken, and VerifiedVault, executes the generated Counter .init.bin through EVM create, and includes revert checksFormal proof coverage, cross-target equivalence, live RPC deployment, exhaustive edge coverage
EVM Anvil deploy smokescripts/evm/anvil-deploy-smoke.shanvil, cast, solc, python3; optional EVM_ANVIL_CHAIN_ID, EVM_ANVIL_CHAIN_PROFILE, EVM_ANVIL_PORT, EVM_ANVIL_RUN_DIR, EVM_ANVIL_CONSTRUCTOR_ARG, EVM_ANVIL_CONSTRUCTOR_ARGS_HEX, EVM_ANVIL_CONSTRUCTOR_PARAMStarts a local Anvil chain, regenerates Counter initcode with deterministic typed initial=123 constructor input, initial:uint256 constructor ABI schema, and the anvil-local chain profile by default for chain id 31337, validates signature-bearing Counter method metadata and profile-aware deploy metadata, deploys generated Counter .init.bin through cast send --create, records constructor ABI schema, constructor args, creation receipt, creation transaction JSON, chain profile, and deployed address in Counter.proof-forge-deploy-run.json, validates that the creation transaction input equals the generated initcode, validates that the profile chain id matches the actual local chain, validates that the deployed runtime code equals Counter.bin, runs Counter get/set/increment/decrement through JSON-RPC, and validates the deploy-run artifact with scripts/evm/validate-deploy-run.pyLive public RPC deployment, explorer verification, wallet UX, dynamic constructor ABI types, long-running chain state
EVM ABI ScalarProbe IR smokescripts/evm/abi-scalar-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR U64, U32, and Bool ABI parameters lower to Yul function parameters and dispatcher calldata loads, match the golden Yul fixture, compile to runtime bytecode with solc --strict-assembly, validate EVM metadata including selector entrypoints and Yul/bytecode hashes, validate a chain-profile-aware deploy manifest for robinhood-chain-testnet with chain id 46630, return expected values through Foundry calls, and reject short calldata, out-of-range uint32, and invalid bool encodingsAggregate ABI parameters/returns, storage behavior, live RPC deployment
EVM AssertProbe IR smokescripts/evm/assert-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR assert and assert_eq statements lower to Yul revert guards, match the golden Yul fixture, compile to runtime bytecode with solc --strict-assembly, validate EVM metadata including assertions.check, return the expected value through Foundry calls, and revert when the assertion failsRich revert data, expression type checking
EVM AssignmentProbe IR smokescripts/evm/assignment-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR mutable scalar locals and local assignment lower to Yul let declarations and := assignments, match the golden Yul fixture, compile to runtime bytecode with solc --strict-assembly, validate EVM metadata including selector entrypoints and artifact hashes, return the assigned value through Foundry calls, and revert when the assigned bool guard is falseAggregate assignment paths, storage path assignment paths
EVM AssignOpProbe IR smokescripts/evm/assign-op-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR compound assignment lowers for mutable U32/U64 locals and U64 scalar storage, matches the golden Yul fixture, compiles to runtime bytecode with solc --strict-assembly, validates EVM metadata including storage.scalar, returns expected U64/U32 values through Foundry calls, verifies raw scalar storage with vm.load, and rejects unknown selectorsAggregate assignment targets, checked overflow semantics beyond raw EVM word operations
EVM ConditionalProbe IR smokescripts/evm/conditional-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR statement-level if/else lowers to Yul switch blocks, matches the golden Yul fixture, compiles to runtime bytecode with solc --strict-assembly, validates EVM metadata including storage.scalar, control.conditional, assertions.check, returns the expected then/else storage result through Foundry calls, and rejects unknown selectors; branch-local early returns are covered by EvmLoopProbeRicher control-flow analysis
EVM LoopProbe IR smokescripts/evm/loop-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR boundedFor lowers to Yul for loops with static bounds, branch-local and loop-local early returns lower to return-value assignments followed by Yul leave, generated Yul matches the golden fixture, bytecode compiles with solc --strict-assembly, metadata includes storage.scalar, control.conditional, and control.bounded_loop, Foundry validates loop-updated storage, raw storage slots, early-return values/effects, and unknown-selector revertsDynamic loop bounds, break/continue, richer control-flow analysis
EVM ContextProbe IR smokescripts/evm/context-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR context reads lower to Yul caller(), address(), and number(), nativeValue lowers to Yul callvalue(), match the golden Yul fixture, compile to runtime bytecode with solc --strict-assembly, validate EVM metadata including caller.sender, account.explicit, env.block, value.native, return expected Foundry vm.prank/vm.roll context values, return expected value from probe.call{value: ...}, and reject unknown selectorsContext fields beyond the current portable userId/contractId/checkpointId set, typed address-width validation
EVM EventProbe IR smokescripts/evm/event-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR eventEmit lowers to Yul log1 and eventEmitIndexed lowers to Yul log2/log3/log4, with topic0 = keccak256(Solidity-style event signature), U64/Bool/U32/Hash indexed scalar fields in topics, U64/Bool/U32/Hash scalar non-indexed fields in 32-byte word data, flat struct / scalar fixed-array / fixed-array-of-flat-struct non-indexed fields flattened into ABI-style data words from local values and storage reads, and supported aggregate indexed fields hashed into topics with keccak256 over flattened ABI-style words; generated Yul matches the golden fixture, compiles to runtime bytecode with solc --strict-assembly, validates EVM metadata including events.emit plus abi.events signatures, topic0, indexed/data fields, flattened word types, and topic/data encodings, verifies Foundry recorded logs for emitter/topic/data including TypedScalarEvent(bool,uint32,bytes32), PairEvent((uint64,uint64)), StoragePairEvent((uint64,uint64)), StorageArrayEvent(uint64[2]), ArrayEvent(uint64[2]), PairArrayEvent((uint64,uint64)[2]), StoragePairArrayEvent((uint64,uint64)[2]), IndexedTypedScalar(bool,uint32,bytes32,uint64), IndexedPair((uint64,uint64),uint64), IndexedStoragePair((uint64,uint64),uint64), IndexedTwoValues(uint64,uint64,uint64), IndexedThreeValues(uint64,uint64,uint64,uint64), IndexedStorageArray(uint64[2],uint64), IndexedArray(uint64[2],uint64), IndexedStoragePairArray((uint64,uint64)[2],uint64), and IndexedPairArray((uint64,uint64)[2],uint64), rejects malformed Bool/U32 calldata, and rejects unknown selectorsRicher event declarations, unsupported nested aggregate indexed shapes, indexed fields beyond 3 topics
EVM CrosscallProbe IR smokescripts/evm/crosscall-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR crosscallInvoke, crosscallInvokeTyped, crosscallInvokeValueTyped, crosscallInvokeStaticTyped, crosscallInvokeDelegateTyped, crosscallCreate, and crosscallCreate2 lower to arity-, return-type-, value-mode-, static-mode-, delegate-mode-, and creation-specific Yul helpers that pack selector/scalar-word, flat aggregate, and nested fixed-array arguments whose leaves are scalar words or flat structs, execute synchronous EVM call, staticcall, delegatecall, create, or create2, optionally forward U64 call value, revert on failed calls, too-short return data, or zero-address creation results, decode scalar and direct entrypoint aggregate return words, guard Bool/U32 return ranges across scalar and aggregate returns, match the golden Yul fixture, compile to runtime bytecode with solc --strict-assembly, validate EVM metadata including crosscall.invoke and all CrosscallProbe entrypoints, and verify Foundry U64 zero/one/two-argument calls, Bool/U32/Hash typed calls, flat struct/scalar fixed-array/fixed-array-of-flat-struct/nested fixed-array typed-call arguments with scalar or flat-struct leaves, flat struct/scalar fixed-array/fixed-array-of-flat-struct/nested fixed-array aggregate typed returns with scalar or flat-struct leaves in normal/value/static/delegate modes, aggregate Bool/U32 malformed-return guards in normal/value/static/delegate modes, native-value forwarding to a payable callee, value-bearing flat and nested scalar/flat-struct aggregate arguments, U64 read-only staticcall return behavior, Bool/U32/Hash static typed returns, static flat and nested scalar/flat-struct aggregate arguments, invalid static Bool/U32 return guards, static-context state-write failure, caller-storage delegatecall read/write behavior, Bool/U32/Hash delegate typed returns, delegate flat and nested scalar/flat-struct aggregate arguments, invalid delegate Bool/U32 return guards, fixed init-code create deployment, deterministic create2 address validation, deployed-runtime calls, invalid typed returns, and revert pathsArtifact-linked creation code, dynamic constructor arguments, non-flat nested aggregate leaves, variable-length return data
EVM ExpressionProbe IR smokescripts/evm/expression-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR scalar expressions lower directly to Yul for U64/U32 arithmetic, U64 exponentiation, U64/U32 bitwise operations and shifts, predicates, boolean operators, scalar literals, immutable local reads, supported casts, one-word returns, and assertion guards; generated Yul matches the golden fixture, bytecode compiles with solc --strict-assembly, metadata includes assertions.check, and Foundry validates runtime return values, U32/Bool calldata guards, malformed calldata reverts, and unknown-selector revertChecked overflow semantics beyond raw EVM word operations, aggregate expressions covered by array/struct/ABI probes
EVM HashProbe IR smokescripts/evm/hash-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR Hash values lower to one-word EVM bytes32 ABI/storage values, hash4 and hashValue pack four limbs into one word, hash and hash_two_to_one lower to Yul keccak256 helpers, the generated Yul matches the golden fixture, bytecode compiles with solc --strict-assembly, metadata includes crypto.hash and storage.scalar, Foundry verifies ABI bytes32 parameters/returns plus raw scalar storage slots, and unknown selectors revertAggregate hashing inputs, typed address-width validation
EVM MapProbe IR smokescripts/evm/map-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR Map<U64, U64, N> storage lowers through Solidity-style keccak256(key, slot) value mapping slots plus ProofForge-managed presence slots for contains, matches the golden Yul fixture, compiles to runtime bytecode with solc --strict-assembly, validates EVM metadata including storage.scalar, storage.map, assertions.check, returns expected get/set/insert/contains values through Foundry calls, validates zero-valued present keys, validates single-segment and nested consecutive mapKey storage path reads, writes, and compound assignment, verifies raw value and presence slots with vm.load, and rejects unknown selectorsTyped word maps covered by EvmTypedMapProbe, array/struct storage paths, mixed map/aggregate storage paths
EVM TypedMapProbe IR smokescripts/evm/typed-map-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR Map<K, V, N> storage lowers for word key/value types (U32, Bool, Hash, and the existing U64) through Solidity-style keccak256(key, slot) value mapping slots plus ProofForge-managed presence slots for contains; generated Yul matches the golden fixture, bytecode compiles with solc --strict-assembly, metadata includes storage.scalar, storage.map, and assertions.check, Foundry validates U32/Bool/Hash map reads and writes, typed contains, previous-value returns, raw value and presence mapping slots, U32/Bool calldata guards, single-segment mapKey storage-path reads/writes, U32 map-path compound assignment, U32 nested mapKey path read/write/compound assignment with dispatcher range guards, and unknown-selector revertNon-word or aggregate map key/value shapes, mixed map/aggregate storage paths
EVM StorageArrayProbe IR smokescripts/evm/storage-array-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR U64 fixed storage arrays lower to contiguous EVM storage slots with runtime index bounds checks, single-segment index storage paths lower to the same slot helper for read/write/compound assignment, fixed-array ABI returns can be assembled from storage element reads, match the golden Yul fixture, compile to runtime bytecode with solc --strict-assembly, validate EVM metadata including storage.scalar, storage.array, data.fixed_array, return expected lifecycle/read/write/path/aggregate values through Foundry calls, verify raw slot layout with vm.load, and reject out-of-bounds indexes and unknown selectorsU32/Bool/Hash storage arrays covered by EvmTypedStorageProbe, local fixed-array values and broader aggregate ABI behavior covered by EvmAbiAggregateProbe, nested index storage paths, structs
EVM TypedStorageProbe IR smokescripts/evm/typed-storage-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR Bool scalar storage and U32/Bool/Hash fixed storage arrays lower to contiguous EVM word slots with runtime index bounds checks, generated Yul matches the golden fixture, bytecode compiles with solc --strict-assembly, metadata includes storage.scalar, storage.array, data.fixed_array, and assertions.check, Foundry validates raw slot layout, ABI Bool/Hash returns, U32 calldata range guards, typed storage-path reads/writes, U32 storage-path compound assignment, out-of-bounds reverts, and unknown selectorsNon-word storage elements, nested index storage paths, struct arrays covered by EvmStorageStructProbe, typed maps covered by EvmTypedMapProbe
EVM StorageStructProbe IR smokescripts/evm/storage-struct-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR flat scalar storage structs lower to one EVM slot per field, whole scalar storage struct reads/writes expand over those field slots with RHS snapshotting for writes, fixed storage arrays of flat structs lower to contiguous field-expanded slots with runtime index bounds checks, scalar field and array index+field storage paths lower to the same slot formula for read/write/compound assignment, fixed-array-of-flat-struct ABI returns can be assembled from storage field reads, generated Yul matches the golden fixture, bytecode compiles with solc --strict-assembly, metadata includes storage.scalar, storage.array, data.fixed_array, and data.struct, Foundry validates U64/Bool/U32/Hash field behavior, whole storage struct read/write, ABI struct returns from storage, fixed-array-of-struct returns from storage, raw slot layout, out-of-bounds reverts, and unknown selectorsNested struct fields, non-flat struct storage
EVM ArrayValueProbe IR smokescripts/evm/array-value-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR immutable and mutable local fixed-array values lower to per-element Yul locals, fixed-array literals plus static/dynamic index reads lower deterministically, static/dynamic local element assignment and numeric compound assignment update the expanded local, static and dynamic nested scalar local fixed-array reads lower through deterministic leaf locals and nested getter helpers, static and dynamic nested scalar leaf assignment/compound assignment lower through direct assignments or nested switch blocks, whole-local and whole-nested fixed-array assignment snapshots RHS elements before writing back, generated Yul matches the golden fixture, runtime bytecode compiles with solc --strict-assembly, EVM metadata includes data.fixed_array and assertions.check, Foundry returns expected U64/U32/Bool/Hash values, validates mutable element writes, validates nested dynamic read/write out-of-bounds reverts, and rejects unknown selectorsABI aggregate behavior covered by EvmAbiAggregateProbe, nested arrays with non-scalar leaves
EVM StructArrayValueProbe IR smokescripts/evm/struct-array-value-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR local fixed arrays of flat structs lower to one Yul local per element field, field(arrayGet(localArray, index), name) supports static and dynamic field reads, mutable struct-array field assignment and numeric compound assignment update the expanded locals through static assignments or dynamic switch blocks, whole local assignment from another local struct array or a struct-array literal snapshots RHS fields before writing target fields, generated Yul matches the golden fixture, runtime bytecode compiles with solc --strict-assembly, EVM metadata includes data.fixed_array, data.struct, and assertions.check, Foundry returns expected U64/U32/Bool/Hash-backed values, validates self-referential RHS snapshot behavior, rejects dynamic out-of-bounds indexes, and rejects unknown selectorsNested arrays, nested structs, aggregate ABI behavior covered by EvmAbiAggregateProbe
EVM StructValueProbe IR smokescripts/evm/struct-value-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR flat immutable and mutable local struct values lower to per-field Yul locals, struct literals and field access lower deterministically for U64/U32/Bool/Hash fields, static local field assignment and numeric compound assignment update the expanded local, whole-local struct assignment snapshots RHS fields before writing back, generated Yul matches the golden fixture, runtime bytecode compiles with solc --strict-assembly, EVM metadata includes data.struct and assertions.check, Foundry returns expected U64/U32/Bool/Hash values, validates mutable field writes, and rejects unknown selectorsNested structs, storage struct behavior covered by EvmStorageStructProbe, ABI aggregate behavior covered by EvmAbiAggregateProbe, struct arrays
EVM AbiAggregateProbe IR smokescripts/evm/abi-aggregate-ir-smoke.shforge, solc, python3, Lean toolchain from lean-toolchainPortable IR flat static struct, fixed-array, and nested scalar fixed-array ABI parameters flatten to contiguous calldata words, fixed arrays of flat structs flatten as tuple-array ABI words, U32 and Bool aggregate words get dispatcher range guards, Hash aggregate leaves lower as Solidity bytes32 words inside flat structs and fixed arrays, flat struct/fixed-array returns including nested scalar fixed arrays, fixed arrays of flat structs, HashPair structs, and Hash fixed arrays encode as multi-word ABI return data, generated Yul matches the golden fixture, bytecode compiles with solc --strict-assembly, metadata includes data.fixed_array, data.struct, and structured abi.entrypoints selector signatures plus calldata/return word layouts checked with cast sig and --expect-entrypoint-abi, Foundry validates aggregate calls/returns, malformed calldata reverts including short bytes32[2] calldata, and unknown selectors revertDynamic aggregate ABI values, storage-backed aggregate ABI returns beyond the fixed word-array and flat struct-array cases covered by EvmStorageArrayProbe and EvmStorageStructProbe, rich ABI tuples beyond flat word aggregates; typed crosscall aggregate behavior is covered by EvmCrosscallProbe
EVM diagnostic smokescripts/evm/diagnostic-smoke.shLean toolchain from lean-toolchainUnsupported or malformed EVM IR shapes fail before Yul generation with explicit diagnostics for missing selectors, unsupported ABI values such as Unit/zero-length arrays and non-flat struct fields, missing returns on incomplete control-flow paths, Hash/U64 type mismatches, unsupported array/struct/event surfaces, invalid bounded-loop ranges, malformed crosscall target/method/argument types, unsupported typed crosscall nested fixed-array non-flat struct leaves in arguments/returns, malformed value-bearing crosscall call value/return types and unsupported nested fixed-array non-flat struct leaves, unsupported static/delegate nested fixed-array non-flat struct leaves, malformed create/create2 value, salt, and init-code hex, unsupported map shapes, statement-position contains, malformed assignment/compound-assignment types and targets, storage-path compound assignment expression/nested-path misuse, and expression/statement effect misuse including statement-position context reads. It also checks EVM constructor CLI diagnostics for unsupported dynamic ABI types, missing or duplicate typed values, mixed typed/raw constructor argument sources, integer overflow, and malformed static-word values such as short addresses.Exhaustive unsupported-surface coverage, solc behavior, Foundry runtime behavior, artifact metadata
EVM IR coverage manifestscripts/evm/check-ir-coverage-manifest.pypython3Tests/EvmCoverage.tsv has one status/evidence row for every portable IR constructor in ProofForge/IR/Contract.lean, so new IR nodes cannot be added without recording whether EVM lowers, validates, or rejects themBehavioral correctness, solc behavior, Foundry runtime behavior, artifact generation
Psy Counter IR smokescripts/psy/counter-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Counter portable IR lowers to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON with dargo compile, returns result_vm: [2] through dargo execute, emits non-empty ABI JSON, writes proof-forge-deploy.json, records it in proof-forge-artifact.json, and validates metadata/deploy-manifest hashes/capabilities/resultsUpstream compressed genesis deploy JSON, live Psy node/prover behavior, broader IR coverage
Psy ExpressionPredicateProbe IR smokescripts/psy/expression-predicate-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers equality, inequality, ordering comparisons, boolean not/and/or, and assertion predicates to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [16] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsStatement-level control flow, division/modulo/exponentiation, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy GenericEntrypointProbe IR smokescripts/psy/generic-entrypoint-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64A valid non-whitelisted Psy IR module lowers through the generic generated test fallback instead of a fixture-specific testBody branch, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [42] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsFixture-specific semantic assertions, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy ArithmeticProbe IR smokescripts/psy/arithmetic-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers subtraction, multiplication, and nested arithmetic precedence to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [60] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsDivision, modulo, exponentiation, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy U32ArithmeticProbe IR smokescripts/psy/u32-arithmetic-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers u32 ABI parameters, Nu32 literals, +, -, *, /, %, **, mutable assignment, arithmetic compound assignments, u32 as bool, and bool as Felt casts to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [1] through dargo execute --parameters 2,3, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsU32 storage behavior, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy BitwiseProbe IR smokescripts/psy/bitwise-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers Felt and u32 bitwise &, `, ^, <<, and >>expressions plus=, &=, ^=, <<=, and >>=compound assignments to.psy, matches the golden fixture, passes dargo test —file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [16]throughdargo execute, writes proof-forge-deploy.jsonandproof-forge-artifact.json`, and validates deploy-manifest/metadata hashes/capabilities/resultsu32 storage probes, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy U32HashPackingProbe IR smokescripts/psy/u32-hash-packing-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers [u32; 8] literal limbs, U32 ABI parameters, casts to Felt, and dynamic Hash value construction to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns deterministic four-Felt Hash outputs for pack_literal and pack_params, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsStorage-specific U32 behavior, map storage paths, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy U32StorageScalarProbe IR smokescripts/psy/u32-storage-scalar-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers native u32 scalar storage read/write and scalar += assignment to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [12] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsWider U32 storage assignment matrix, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy BoolStorageScalarProbe IR smokescripts/psy/bool-storage-scalar-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers native bool scalar storage read/write and bool as Felt return casts to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [1] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsUpstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy BoolStorageArrayProbe IR smokescripts/psy/bool-storage-array-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers [bool; N] fixed-array literals/indexes, native bool storage arrays, indexed storage read/write, generic storage-path read/write, and bool as Felt casts to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [2] for both local_flags_sum and storage_lifecycle through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsUpstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy U32StorageArrayProbe IR smokescripts/psy/u32-storage-array-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers portable U32 storage arrays to Felt-backed Psy storage arrays with explicit u32 as Felt writes, .get() as u32 reads, and storage-path compound assignments rewritten as typed read/update/write casts, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [28] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsDirect native [u32; N] Psy contract storage arrays, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy ConditionalProbe IR smokescripts/psy/conditional-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers statement-level if/else branches with Bool conditions, branch-local bindings, scalar storage reads/writes, assertions, and returns to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [10] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsElse-if sugar, conditionals that are the sole return terminator, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy ContextProbe IR smokescripts/psy/context-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Non-Counter Psy IR lowers parameters and context reads to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [15] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsMaps, arrays, hashes, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy EventProbe IR smokescripts/psy/event-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers eventEmit to __emit([fields]) with an event-name comment, matches the golden fixture, passes dargo test --file, emits a PsyUserEventRecord with data: [42], produces non-empty DPN JSON and ABI JSON, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsEvent struct definitions, multi-field events, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy CrosscallProbe IR smokescripts/psy/crosscall-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers crosscallInvoke to __invoke_sync#&lt;Felt&gt;(target, method_id, [args]), matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsActual cross-contract execution (Psy 0.1.0 panics on the unimplemented cross-contract circuit gadget), upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy HashProbe IR smokescripts/psy/hash-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers Hash, typed hash let-bindings, hash, and hash_two_to_one to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns the expected four-Felt hash outputs through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsMaps, storage maps, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy HashStorageProbe IR smokescripts/psy/hash-storage-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers native scalar Hash storage, native [Hash; N] storage arrays, indexed storage read/write, and generic storage-path read/write to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [5, 6, 7, 8] and result_vm: [55, 66, 77, 88] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsUpstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy MapProbe IR smokescripts/psy/map-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers fixed-capacity Map&lt;Hash, Hash, N&gt; storage, contains/get/insert/set effects, expression-position set return values, and generic map storage paths to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [55, 66, 77, 88], result_vm: [77, 88, 99, 111], result_vm: [31, 32, 33, 34], and result_vm: [5, 6, 7, 8] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsBounded loops, arrays, structs, assertions, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy AssertProbe IR smokescripts/psy/assert-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers statement-level assert and assert_eq into generated method bodies, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [12] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsBounded loops, arrays, structs, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy LoopProbe IR smokescripts/psy/loop-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers static bounded for loops into generated method bodies, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [3] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsArrays, structs, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy ArrayProbe IR smokescripts/psy/array-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers fixed-array value types, array literals, index reads, fixed-array equality/inequality/assert_eq, and fixed storage array index read/write effects to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [60], result_vm: [31], and result_vm: [1] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsStruct arrays, nested arrays, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy StructProbe IR smokescripts/psy/struct-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers struct declarations, struct literals, field access, scalar storage struct assignment, and scalar storage struct field read/write effects to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [30] and result_vm: [26] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsStruct arrays, nested structs, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy StructArrayProbe IR smokescripts/psy/struct-array-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers fixed arrays of structs, storage arrays of structs, whole struct element writes, and indexed struct field read/write effects to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [100] and result_vm: [102] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsDeeply nested mixed aggregate updates, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy AbiAggregateProbe IR smokescripts/psy/abi-aggregate-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers ABI-facing struct parameters, fixed-array parameters, and struct returns to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [15], result_vm: [6], and result_vm: [9, 4] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsDeeply nested mixed aggregate updates, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy NestedAggregateProbe IR smokescripts/psy/nested-aggregate-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers mutable local aggregate bindings and nested assignment paths such as families[1].children[0].age = 31, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [51] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsStorage-backed nested aggregate updates, upstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy StorageNestedAggregateProbe IR smokescripts/psy/storage-nested-aggregate-smoke.shdargo on PATH; python3; psyup install 0.1.0 is known-good on macOS arm64Psy IR lowers generic storage paths across scalar storage structs, nested #[ref] fields, storage arrays, scalar storage compound assignment, storage-path compound assignment, and native U32 storage struct field paths to .psy, matches the golden fixture, passes dargo test --file, produces non-empty DPN JSON and ABI JSON, returns result_vm: [252] through dargo execute, writes proof-forge-deploy.json and proof-forge-artifact.json, and validates deploy-manifest/metadata hashes/capabilities/resultsUpstream compressed genesis deploy JSON, live Psy node/prover behavior
Psy diagnostic smokescripts/psy/diagnostic-smoke.shLean toolchain from lean-toolchainUnsupported or malformed Psy IR shapes fail before source generation with explicit diagnostics for invalid Psy identifiers, duplicate declarations, reserved local names, empty contract state, Unit parameters, zero-length ABI arrays, unknown ABI structs, unsupported map shapes, unsupported Unit storage arrays, non-storage structs, empty structs, invalid bounded loops, effect expression/statement misuse, invalid assignment targets, invalid storage paths, expression/body type mismatches, immutable assignment, missing returns, malformed equality, malformed comparison, malformed Hash value construction, malformed arithmetic, unsupported casts, malformed bitwise/shift expressions, malformed compound assignment statements, malformed storage compound assignment effects, malformed boolean operators, malformed if conditions, and branch-local escapeExhaustive unsupported-surface coverage, Dargo behavior, ProofForge deploy manifests, upstream compressed genesis deploy JSON
Psy IR coverage manifestscripts/psy/check-ir-coverage-manifest.pypython3Tests/PsyCoverage.tsv has one status/evidence row for every portable IR constructor in ProofForge/IR/Contract.lean, so new IR nodes cannot be added without recording whether Psy lowers, validates, or rejects themBehavioral correctness, Dargo behavior, artifact generation
CI baseline.github/workflows/ci.yml build-test jobGitHub Actions Ubuntu, just 1.48.0, elan, Foundry stable, solc 0.8.30Clean-environment just build, just target-registry, just evm-plan, just solana-light, just docs-check, Wasm-NEAR diagnostic smoke, Wasm-NEAR/EmitWat IR coverage manifests, IR ownership rules, Wasm-NEAR formal semantics anchors, EmitWat offline host smoke, just psy-golden-sources, Psy diagnostic smoke, Psy IR coverage manifest, EVM diagnostic smoke, EVM IR coverage manifest, EVM ABI scalar IR smoke, EVM AssertProbe IR smoke, EVM AssignmentProbe IR smoke, EVM AssignOpProbe IR smoke, EVM ConditionalProbe IR smoke, EVM LoopProbe IR smoke, EVM ContextProbe IR smoke, EVM EventProbe IR smoke, EVM CrosscallProbe IR smoke, EVM ExpressionProbe IR smoke, EVM HashProbe IR smoke, EVM MapProbe IR smoke, EVM TypedMapProbe IR smoke, EVM StorageArrayProbe IR smoke, EVM StorageStructProbe IR smoke, EVM TypedStorageProbe IR smoke, EVM ArrayValueProbe IR smoke, EVM StructArrayValueProbe IR smoke, EVM StructValueProbe IR smoke, EVM AbiAggregateProbe IR smoke, EVM metadata/deploy-manifest validation, EVM compile, Foundry smoke, and Anvil deploy smoke. CI keeps separate GitHub Actions steps for failure localization, but each common gate is invoked through the root justfile recipe.Optional Dargo target smokes, non-Ubuntu behavior
Aleo Counter IR smokescripts/aleo/counter-smoke.shleo CLI (4.0.2 tested) on PATH; python3; Lean toolchain from lean-toolchainPortable IR Counter lowers to a Leo 4.0 program with @noupgrade constructor and fn ... -&gt; Final entry points, matches Examples/Aleo/Counter.golden.leo, leo build produces main.aleo and abi.json, leo test passes, and proof-forge-artifact.json schema validation passesPrivate records, transitions, proofs, direct Aleo Instructions, devnet deployment, cross-target equivalence, standalone .avm file
Aleo PureMath IR smokescripts/aleo/pure-math-smoke.shleo CLI (4.0.2 tested) on PATH; python3; Lean toolchain from lean-toolchainPortable IR pure functions with params, if/else, boundedFor, assign, assignOp, and assert lower to a Leo 4.0 program, match Examples/Aleo/PureMath.golden.leo, leo build produces main.aleo and abi.json, leo test passes, and proof-forge-artifact.json schema validation passesStateful parameterized entrypoints, non-local assignment targets, dynamic loop bounds, standalone .avm file

Planned gates that are not runnable yet

The following gates are Planned and do not exist in CI or as scripts:
  • proof-forge build --target <id> — unified target-oriented build command.
  • proof-forge test --target <id> — unified target-oriented test command.
  • Non-EVM, non-Psy proof-forge-artifact.json validation — artifact metadata schema validation for targets that do not yet write metadata.
  • Golden Yul/output snapshots — regression detection via snapshot diffing.
  • CosmWasm smoke — cosmwasm-check or cw-multi-test validation.
  • Solana sBPF assembly gates (target solana-sbpf-asm, D-026). These become runnable as Workstreams 6–7 land; the sbpf toolchain is validated locally (build + disassemble round-trip + sbpf test on the counter example):
    • V-GATE-SOLANA-01--emit-sbpf-asm produces valid .s accepted by sbpf build (no assembly errors). Script: scripts/solana/emit-asm-smoke.sh (runnable, Phase 0 complete).
    • V-GATE-SOLANA-02sbpf build produces a valid ELF that sbpf disassemble round-trips. Script: scripts/solana/emit-asm-smoke.sh (runnable, Phase 0 complete).
    • V-GATE-SOLANA-03 — Counter scenario (initialize, increment, get) passes sbpf test (Mollusk). Script: scripts/solana/counter-smoke.sh (Phase 1 complete; 4 Mollusk assertions: initialize→0, increment 0→1, increment 5→6, get→return_data). The emitted .s now includes the account-validation prologue (writable + owner checks) and is accompanied by manifest.toml; the tracked Examples/Solana/Counter.golden.s / Counter.manifest.toml are kept in sync by scripts/solana/build-examples.sh.
    • V-GATE-SOLANA-04 — Counter scenario passes a Surfpool local simnet deployment and Web3.js behavior smoke. Script: scripts/solana/surfpool-web3-smoke.sh (optional, gated on surfpool, Solana CLI, sbpf, Node, and npm). The script builds the Counter ELF, starts Surfpool, deploys with solana program deploy --use-rpc, creates a program-owned counter account through @solana/web3.js, invokes initialize/increment/get, validates account data 0→1→2, and checks get return data.
    • V-GATE-SOLANA-05 — Capability checker rejects IR modules using unsupported capabilities with a clear diagnostic citing target id and capability id. Script: scripts/solana/diagnostic-smoke.sh runs Tests/SolanaDiagnostics.lean and asserts 8 crosscall rejection cases (the generic crosscall.invoke family) all produce the expected message target \solana-sbpf-asm` does not support capability `crosscall.invoke`: …`. (Phase 1 complete.)
    • V-GATE-SOLANA-06proof-forge-artifact.json includes target: "solana-sbpf-asm", irVersion, and entrypoint list.
    • V-GATE-SOLANA-07sbpf debug --elf --input works interactively (developer ergonomics gate — not CI).
    • V-GATE-SOLANA-08 — Control-flow + assertion IR coverage. Two halves:
      • Emission half (runnable, no sbpf required) — scripts/solana/emit-control-smoke.sh runs --emit-control-ir-sbpf, greps the emitted .s for the control.conditional / control.assert / control.assert_eq markers, the assert_fail (exit 2) and assert_eq_fail (exit 3) global labels, the dispatch lines for the three entrypoints, the comparison instructions jeq/jlt driving r3 vs r2, asserts the asm is bit-for-bit reproducible across re-emissions, and validates the artifact metadata records target: "solana-sbpf-asm", fixture: "control-ir-sbpf", sourceModule: "ControlFlowAssertProbe", and the storage.scalar / control.conditional / assertions.check / account.explicit capabilities. (Emission half complete.)
      • Runtime half (gated on sbpf + cargo + solana-keygen) — scripts/solana/control-smoke.sh assembles the emitted .s via sbpf build and runs the Mollusk test crate rendered from Tests/solana/control_mollusk.rs.tpl. Six Mollusk checks cover lifecycle from a zero and from a large pre-state (both land on 10u64 and return 10), guarded_increment from 3 (assert passes, count→4) and from 9 (assert reverts via assert_fail exit 2), and equality_guard from 7 (assertEq passes, count→7 and return 7) and from 42 (assertEq reverts via assert_eq_fail exit 3). The Mollusk fixtures disable account_data_direct_mapping / direct_account_pointers_in_program_input / virtual_address_space_adjustments so the Phase 1 lowering’s legacy embedded account-data layout is exercised. (Phase 1 complete.)
    • V-GATE-SOLANA-09 — PDA typed seed descriptor compatibility with Solana Web3.js. Script: scripts/solana/pda-web3-smoke.sh emits the SDK Vault artifact, installs @solana/web3.js in an isolated temp project, reads solanaExtensions.pdas[].typedSeeds, and checks that literal/account/bump descriptors reproduce the same PDA through PublicKey.findProgramAddressSync and PublicKey.createProgramAddressSync. The harness also covers UTF-8 and instruction-parameter seed resolver behavior. This is an offline derivation gate; it does not deploy or execute a transaction.
    • V-GATE-SOLANA-10 — System Program transfer CPI live behavior through Surfpool and Web3.js. Script: scripts/solana/system-cpi-web3-smoke.sh builds the generated --solana-system-cpi-elf fixture, validates its artifact schema, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes the generated transfer entrypoint with a standard @solana/web3.js transaction, and checks both the recipient lamport delta and the program-owned state account’s recorded lamports value.
    • V-GATE-SOLANA-10R — System Program transfer Pinocchio reference-equivalence contract. Script: scripts/solana/pinocchio-system-transfer-equivalence.sh emits the same --solana-system-cpi-elf fixture and compares its generated artifact against references/solana/pinocchio/system-transfer/reference-manifest.json plus source constants. This pins the reference account order, signer/writable constraints, instruction data shape, CPI protocol/data layout, and state-write contract before the later dual-deploy runtime harness.
    • V-GATE-SOLANA-10L — System Program transfer Pinocchio live equivalence. Script: scripts/solana/pinocchio-system-transfer-live-equivalence.sh builds the ProofForge ELF and the checked-in Pinocchio reference ELF, starts Surfpool, deploys both programs with separate program ids, invokes the same @solana/web3.js System transfer scenario against each, and compares the recipient lamport delta and program-owned state write. This gate skips when cargo-build-sbf cannot find Solana rustc/platform-tools; run just solana-pinocchio-install-sbf-tools to repair that toolchain.
    • V-GATE-SOLANA-11 — System Program create_account CPI live behavior through Surfpool and Web3.js. Script: scripts/solana/system-create-account-cpi-web3-smoke.sh builds the generated --solana-system-create-account-cpi-elf fixture, validates its artifact schema, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes the generated create entrypoint with payer and new-account signers, and checks the new account owner, data length, lamports, plus the state account’s recorded lamports and space values.
    • V-GATE-SOLANA-11R — System Program create_account Pinocchio reference equivalence. Script: scripts/solana/pinocchio-system-create-account-equivalence.sh emits the generated --solana-system-create-account-cpi-elf artifact, compares the instruction ABI, account order, signer/writable constraints, CPI protocol/data layout, lamports/space/owner contract, and two-field state-write contract against references/solana/pinocchio/system-create-account, and can additionally typecheck that reference with pinocchio-system when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1.
    • V-GATE-SOLANA-11L — System Program create_account Pinocchio live equivalence. Script: scripts/solana/pinocchio-system-create-account-live-equivalence.sh builds the ProofForge ELF and the checked-in Pinocchio reference ELF, starts Surfpool, deploys both programs with separate program ids, invokes the same @solana/web3.js create-account scenario against each, and compares the lamports/space inputs plus the two program-owned state writes. This gate skips when cargo-build-sbf cannot find Solana rustc/platform-tools; run just solana-pinocchio-install-sbf-tools to repair that toolchain.
    • V-GATE-SOLANA-12 — SPL Token transfer_checked CPI live behavior through Surfpool and Web3.js. Script: scripts/solana/spl-token-transfer-cpi-web3-smoke.sh builds the generated --solana-spl-token-transfer-cpi-elf fixture, validates its artifact schema, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, creates a mint plus source/destination token accounts through @solana/spl-token, invokes the generated transfer entrypoint with the source authority signer, and checks token balance deltas plus the state account’s recorded amount.
    • V-GATE-SOLANA-12R — SPL Token transfer_checked Pinocchio reference equivalence. Script: scripts/solana/pinocchio-spl-token-transfer-equivalence.sh emits the generated --solana-spl-token-transfer-cpi-elf artifact, compares the instruction ABI, account order, signer/writable constraints, CPI protocol/data layout, decimals/amount contract, and state-write contract against references/solana/pinocchio/spl-token-transfer, and can additionally typecheck that reference with pinocchio-token when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1.
    • V-GATE-SOLANA-12L — SPL Token transfer_checked Pinocchio live equivalence. Script: scripts/solana/pinocchio-spl-token-transfer-live-equivalence.sh builds the ProofForge ELF and the checked-in Pinocchio Token reference ELF, starts Surfpool, deploys both programs with separate program ids, invokes the same @solana/web3.js + @solana/spl-token transfer_checked scenario against each, and compares source/destination token balance deltas plus the program-owned amount state write. This gate skips when cargo-build-sbf cannot find Solana rustc/platform-tools; run just solana-pinocchio-install-sbf-tools to repair that toolchain.
    • V-GATE-SOLANA-13 — SPL Token mint_to/burn/approve/revoke CPI live behavior through Surfpool and Web3.js. Script: scripts/solana/spl-token-ops-cpi-web3-smoke.sh builds the generated --solana-spl-token-ops-cpi-elf fixture, validates artifact instruction schemas for four entrypoints, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, creates a mint plus source/destination token accounts through @solana/spl-token, invokes the generated mint, burn, approve, and revoke entrypoints with the source/mint authority signer, and checks supply/balance/delegate changes plus the state account’s recorded mint, burn, approve, and revoke values.
    • V-GATE-SOLANA-13R — SPL Token mint_to/burn/approve/revoke Pinocchio reference equivalence. Script: scripts/solana/pinocchio-spl-token-ops-equivalence.sh emits the generated --solana-spl-token-ops-cpi-elf artifact, compares the four instruction ABIs, shared account order, signer/writable constraints, CPI protocol/data layout, SPL Token instruction tags, and state-write contract against references/solana/pinocchio/spl-token-ops, and can additionally typecheck that reference with pinocchio-token when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1.
    • V-GATE-SOLANA-13L — SPL Token mint_to/burn/approve/revoke Pinocchio live equivalence. Script: scripts/solana/pinocchio-spl-token-ops-live-equivalence.sh builds the ProofForge ELF and the checked-in Pinocchio Token ops reference ELF, starts Surfpool, deploys both programs with separate program ids, invokes the same @solana/web3.js + @solana/spl-token mint/burn/approve/revoke scenario against each, and compares token effects plus the program-owned state writes. This gate skips when cargo-build-sbf cannot find Solana rustc/platform-tools; run just solana-pinocchio-install-sbf-tools to repair that toolchain.
    • V-GATE-SOLANA-13A — SPL Token set_authority CPI live behavior through Surfpool and Web3.js. Script: scripts/solana/spl-token-authority-cpi-web3-smoke.sh builds the generated --solana-spl-token-authority-cpi-elf fixture, validates the artifact’s single-entrypoint ABI, starts Surfpool, deploys the ELF, creates an SPL Token mint through @solana/spl-token, invokes the generated program to transfer mint authority to a new authority pubkey read from the instruction accounts, and checks the mint authority plus state marker.
    • V-GATE-SOLANA-13AR — SPL Token set_authority Pinocchio reference equivalence. Script: scripts/solana/pinocchio-spl-token-authority-equivalence.sh emits the generated --solana-spl-token-authority-cpi-elf artifact, compares the instruction ABI, account order, signer/writable constraints, CPI metadata, SetAuthority instruction data contract, and marker state-write contract against references/solana/pinocchio/spl-token-authority, and can additionally typecheck that reference with pinocchio-token when PROOF_FORGE_PINOCCHIO_CARGO_CHECK=1.
    • V-GATE-SOLANA-13AL — SPL Token set_authority Pinocchio live equivalence. Script: scripts/solana/pinocchio-spl-token-authority-live-equivalence.sh builds the ProofForge ELF and the checked-in Pinocchio Token authority reference ELF, starts Surfpool, deploys both programs with separate program ids, invokes the same @solana/web3.js + @solana/spl-token mint-authority transfer scenario against each, and compares mint authority plus state marker. This gate skips when cargo-build-sbf cannot find Solana rustc/ platform-tools; run just solana-pinocchio-install-sbf-tools to repair that toolchain.
    • V-GATE-SOLANA-14 — Solana events.emit scalar log plus sol_log_pubkey and sol_log_data live behavior through Surfpool and Web3.js. Script: scripts/solana/log-event-web3-smoke.sh builds the generated --solana-log-event-elf fixture, validates artifact instruction schema, events.emit capability metadata, Solana-only pubkeyLogActions, and Solana-only dataLogActions, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes the generated emit entrypoint with a scalar amount instruction parameter, checks the program-owned state account’s recorded amount, checks transaction logMessages for the sol_log_64_ output containing the stable AmountEvent tag and scalar value, invokes log_state_pubkey, checks transaction logMessages for the state account’s base58 pubkey from sol_log_pubkey, invokes log_state_data, and checks transaction logMessages for the base64 Program data: payload from sol_log_data.
    • V-GATE-SOLANA-15 — Solana Clock sysvar live behavior through Surfpool and Web3.js. Script: scripts/solana/clock-sysvar-web3-smoke.sh builds the generated --solana-clock-sysvar-elf fixture, validates artifact instruction schema and env.block capability metadata, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes the generated record entrypoint, checks that sol_get_clock_sysvar wrote Clock.slot into the program-owned state account, and compares that value with the transaction slot from Web3.js metadata.
    • V-GATE-SOLANA-16 — Solana memory syscall live behavior through Surfpool and Web3.js. Script: scripts/solana/memory-web3-smoke.sh builds the generated --solana-memory-elf fixture, validates runtime.memory artifact metadata, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes set_source and copy_compare_fill, and checks copied value, moved value, memcmp result, and memset byte pattern in the program-owned state account.
    • V-GATE-SOLANA-17 — Solana SHA-256/Keccak-256/Blake3 syscall live behavior through Surfpool and Web3.js. Script: scripts/solana/crypto-hash-web3-smoke.sh builds the generated --solana-crypto-hash-elf fixture, validates crypto.hash artifact metadata, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes set_preimage, hash_preimage, keccak_preimage, and blake3_preimage, and compares the program-owned account’s 32-byte digests against Node crypto.createHash("sha256") and @noble/hashes Keccak-256/Blake3 for the same preimage bytes.
    • V-GATE-SOLANA-18 — Solana Rent sysvar live behavior through Surfpool and Web3.js. Script: scripts/solana/rent-sysvar-web3-smoke.sh builds the generated --solana-rent-sysvar-elf fixture, validates sysvar target extension artifact metadata, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes record_rent, and compares the program-owned account’s recorded Rent.lamports_per_byte_year with the Rent sysvar account’s first u64 word.
    • V-GATE-SOLANA-19 — Solana EpochSchedule sysvar live behavior through Surfpool and Web3.js. Script: scripts/solana/epoch-schedule-sysvar-web3-smoke.sh builds the generated --solana-epoch-schedule-sysvar-elf fixture, validates sysvar target extension artifact metadata, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes record_epoch_schedule, and compares the program-owned account’s recorded EpochSchedule.slots_per_epoch, EpochSchedule.leader_schedule_slot_offset, EpochSchedule.warmup, EpochSchedule.first_normal_epoch, and EpochSchedule.first_normal_slot fields with RPC getEpochSchedule().
    • V-GATE-SOLANA-20 — Solana LastRestartSlot sysvar live behavior through Surfpool and Web3.js. Script: scripts/solana/last-restart-slot-sysvar-web3-smoke.sh builds the generated --solana-last-restart-slot-sysvar-elf fixture, validates feature-gated sysvar target-extension artifact metadata, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes record_last_restart_slot, and compares the program-owned account’s recorded LastRestartSlot.last_restart_slot with the LastRestartSlot sysvar account’s first u64 word. The generated assembly uses sol_get_sysvar with SysvarLastRestartS1ot1111111111111111111111 to stay compatible with the current sbpf assembler while preserving the Solana SDK-level LastRestartSlot capability.
    • V-GATE-SOLANA-21 — Solana EpochRewards sysvar live behavior through Surfpool and Web3.js. Script: scripts/solana/epoch-rewards-sysvar-web3-smoke.sh builds the generated --solana-epoch-rewards-sysvar-elf fixture, validates sysvar target extension artifact metadata for all current EpochRewards fields, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, invokes record_epoch_rewards, and compares the program-owned account’s recorded EpochRewards.distribution_starting_block_height, EpochRewards.num_partitions, EpochRewards.parent_blockhash_word0..3, EpochRewards.total_points_low/high, EpochRewards.total_rewards, EpochRewards.distributed_rewards, and EpochRewards.active with the EpochRewards sysvar account data.
    • V-GATE-SOLANA-22 — Solana return-data and compute-unit syscall live behavior through Surfpool and Web3.js. Script: scripts/solana/return-data-compute-web3-smoke.sh builds the generated --solana-return-data-compute-elf fixture, validates runtime.return_data and runtime.compute_units target-extension artifact metadata, starts Surfpool, deploys the ELF with solana program deploy --use-rpc, confirms sol_set_return_data via simulation returnData, checks empty sol_get_return_data reads, checks a same-instruction set/get roundtrip including the returned program id words, records a nonzero sol_remaining_compute_units value, and verifies sol_log_compute_units_ emits compute-unit logs.
  • Move smoke — aptos move compile/test or Sui Move validation.
  • Cross-target capability rejection matrix — compile-time diagnostics for unsupported capability/target combinations beyond the target-specific Psy and EVM diagnostic smokes.

Upfront validation rule for new target work

Before a target exits Research, docs must name:
  1. The external tools required.
  2. The minimal artifact the target produces.
  3. A local command or script that builds or validates the artifact.
  4. The expected artifact path.
  5. One observable success criterion.
If no runnable local command exists, the target remains Research.

Optional external tools

Current CI installs just 1.48.0, Foundry stable, and solc 0.8.30. Local machines may not have just, solc, cast, forge, psyup, dargo, sbpf, surfpool, Solana CLI, Node, or npm. Missing just blocks the local command catalog but not direct script execution. Missing EVM tools block EVM toolchain gates but not lake build. Missing Psy tools block only the Psy smoke Dargo portions; source generation and golden diff still run before each script exits. Missing Solana tools block Solana assembly/runtime smokes but not Lean builds or target-registry checks. All Dargo-backed Psy smoke scripts also record the generated Dargo package source copy at src/main.psy and the generated Dargo.toml package manifest in proof-forge-artifact.json. The metadata validator checks the package source path, byte size, SHA-256 hash, and hash parity with the generated source file. It also checks the manifest path, byte size, SHA-256 hash, [package] section, type = "bin", and [dependencies] section. Package generation is shared through scripts/psy/write-dargo-package.py so every smoke uses the same source-copy and manifest layout.