Remix IDE Cheatsheet
Interacting with Contracts
Use this Remix IDE reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.
The Deployed Contracts Panel
After deploying (or loading via At Address), the contract card sits under Deployed Contracts in the Deploy & Run panel.
- Expand with the chevron
▶. - Each public/external function and public state variable appears as a button or input row.
- Click the contract address to copy it to clipboard.
🗑trashcan removes the instance from the panel (does NOT destroy the on-chain contract).
Calling a View Function
function balanceOf(address owner) external view returns (uint256) { ... }
- Expand the contract card.
- Find
balanceOf(blue button). - Enter the address in the input field next to the button.
- Click
balanceOf— result appears inline below the button immediately.
Sending a Transaction (Write)
function transfer(address to, uint256 amount) external returns (bool) { ... }
- Expand inputs:
to=0xRecipient...,amount=1000000000000000000(1 ETH in wei, or use the value field). - Click the orange transfer button.
- Terminal logs the transaction hash, gas used, and return value.
Sending ETH with a Call
function deposit() external payable { ... }
- Set Value at the top of the Deploy & Run panel (e.g.,
0.5ether). - Click the red deposit button.
msg.valueinside the function = 0.5 ETH in wei.
Tuples and Structs as Input
Remix accepts struct/tuple arguments as a comma-separated list in brackets:
struct Order { address buyer; uint256 amount; bool active; } function placeOrder(Order calldata o) external { ... }
Input field value: ["0xAb8...", 500, true]
Passing Arrays
function batchMint(address[] calldata recipients, uint256[] calldata amounts) external { ... }
Input: ["0xAb8...", "0xDef..."] and [100, 200] in separate fields.
Reading Events from Terminal
Every state-changing call prints event logs:
logs: [
{
"event": "Transfer",
"args": {
"from": "0x0000...0000",
"to": "0xAb8...",
"value": "1000000000000000000"
}
}
]Click Debug on any transaction row to step through execution.
ABI Encoding / Decoding
The Remix terminal is a JavaScript console with ethers (v6) and web3 available, so you can encode and decode ABI data without leaving the IDE — paste these lines into the terminal or a script:
// ethers v6 ABI coder const coder = ethers.AbiCoder.defaultAbiCoder(); // Encode constructor / function arguments coder.encode(["uint256", "address"], [42n, "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2"]); // Decode return data or calldata (minus the 4-byte selector) coder.decode(["uint256", "address"], "0x000000000000000000000000000000000000000000000000000000000000002a…"); // 4-byte function selector ethers.id("transfer(address,uint256)").slice(0, 10); // "0xa9059cbb"
The compiler's Compilation Details panel also lists every function's 4-byte selector under Function Hashes.
Interacting via Script
Remix's script runner bundles ethers v6 — note BrowserProvider and top-level parseEther (the v5 ethers.providers.Web3Provider / ethers.utils.parseEther forms no longer exist):
// scripts/interact.js — run with File Explorer → right-click → Run const { ethers } = require("ethers"); // bundled ethers v6 (async () => { // web3Provider is injected by Remix and targets the active environment const provider = new ethers.BrowserProvider(web3Provider); const signer = await provider.getSigner(); const address = "0xDeployedAddress..."; const abi = [/* paste ABI here */]; const contract = new ethers.Contract(address, abi, signer); const tx = await contract.transfer("0xRecipient...", ethers.parseEther("1")); await tx.wait(); console.log("Transfer complete:", tx.hash); })();
Right-click the script in the File Explorer → Run to execute against the active environment.
Low-Level Calls
To call a contract you have no source for, write a minimal interface with just the functions you need, compile it, and load the address with At Address:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface IERC20Minimal { function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); }
- Compile the interface.
- In Deploy & Run, select
IERC20Minimalin the Contract dropdown. - Paste the deployed address into At Address — a full contract card appears with buttons for each interface function.
For raw calldata, every deployed contract card has a Low level interactions box at the bottom: paste hex into CALLDATA and click Transact to hit the fallback(), or leave it empty and set Value to test receive().