Getting Started
EVMcrispr is a DSL for encoding and executing batched EVM transactions. You can use it in the web terminal or programmatically.
Web Terminal
Section titled “Web Terminal”Visit evmcrispr.com to open the web terminal. Connect your wallet, write a script, and click Execute.
Active Chain
Section titled “Active Chain”Every script starts on Ethereum mainnet by default — independent of
the chain your wallet is connected to. Use switch <chainName> (or a
chain id) at the top of the script to run it on a different chain:
switch gnosis
exec @token(WXDAI) "transfer(address,uint256)" 0x4F2083f5fBede34C2714aFfb3105539775f7FE64 1e18Before execution the terminal scans every switch in your script and
asks the wallet to add (and switch to) each referenced chain up front,
so chain prompts don’t interrupt a running script. Wallets that are
pinned to a single chain — for example a Safe App or some
WalletConnect-compatible wallets — will refuse to switch; in that case
the terminal returns one of these errors before any transaction is
submitted:
The script should start with \switch`.` — the script defaults to mainnet but the wallet only supports a different chain. Wallet only supports <chainName>.— the script references multiple chains; rewrite it to target only the wallet’s chain.
Your First Script
Section titled “Your First Script”A simple script that transfers tokens:
# Transfer 100 DAI to an addressexec @token(DAI) "transfer(address,uint256)" 0x4F2083f5fBede34C2714aFfb3105539775f7FE64 @token.amount(DAI 100)Breaking this down:
exec— the command that calls a contract function@token(DAI)— resolves the DAI token symbol to its contract address"transfer(address,uint256)"— the function signature0x4F2083f5fBede34C2714aFfb3105539775f7FE64— the recipient address@token.amount(DAI 100)— converts 100 DAI to base units (100 * 10^18)
Reading Contract State
Section titled “Reading Contract State”Use @get to read data from contracts:
# Check your DAI balanceset $balance @get(@token(DAI) "balanceOf(address)(uint256)" @me)print "Balance:" $balanceBatching Transactions
Section titled “Batching Transactions”Wrap multiple commands in batch to execute them as a single transaction:
set $router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
batch ( exec @token(DAI) "approve(address,uint256)" $router @token.amount(DAI 1000) exec $router "swap(address,uint256)" @token(DAI) @token.amount(DAI 1000))Working with Variables
Section titled “Working with Variables”set $router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488Dset $amount @token.amount(DAI 100)
exec @token(DAI) "approve(address,uint256)" $router $amountexec $router "swapExactTokensForTokens(uint256,uint256,address[],address,uint256)" $amount 0 [@token(DAI) @token(WETH)] @me @date("2025-12-31")Simulation
Section titled “Simulation”Test your scripts without spending gas by loading the sim module:
load sim
set $recipient 0x4F2083f5fBede34C2714aFfb3105539775f7FE64
sim:fork ( sim:set-balance @me 100e18 exec @token(DAI) "transfer(address,uint256)" $recipient @token.amount(DAI 50) sim:expect @bool(@get(@token(DAI) "balanceOf(address)(uint256)" $recipient) > 0))Working with Aragon DAOs
Section titled “Working with Aragon DAOs”load aragonos
aragonos:connect my-dao.aragonid.eth ( grant @me @app(voting) CREATE_VOTES_ROLE install $agent agent:new-app)Loading Modules
Section titled “Loading Modules”The std module is always available. Load others as needed:
load aragonos # Aragon DAO operationsload sim # Chain simulationload ens # ENS domainsload giveth # Giveth protocolload http # HTTP + JSONNext Steps
Section titled “Next Steps”- Language Basics — full syntax reference
- Module Reference — all commands and helpers