To use Foundry to build smart contracts on Abstract, use the foundry-zksync fork.

YouTube Tutorial: Get Started with Foundry

Watch a step-by-step tutorial on how to get started with Foundry.

1. Install the foundry-zksync fork

This installation overrides any existing forge and cast binaries in ~/.foundry. To revert to the standard foundry installation, follow the Foundry installation guide. You can swap between the two installations at any time.

1

Install foundry-zksync

Install the foundryup-zksync fork:

curl -L https://raw.githubusercontent.com/matter-labs/foundry-zksync/main/install-foundry-zksync | bash

Run foundryup-zksync to install forge, cast, and anvil:

foundryup-zksync

You may need to restart your terminal session after installation to continue.

2

Verify installation

A helpful command to check if the installation was successful is:

forge build --help | grep -A 20 "ZKSync configuration:"

If installed successfully, 20 lines of --zksync options will be displayed.

2. Create a new project

Create a new project with forge and change directory into the project.

forge init my-abstract-project && cd my-abstract-project

3. Modify Foundry configuration

Update your foundry.toml file to include the following options:

[profile.default]
src = 'src'
libs = ['lib']
fallback_oz = true
is_system = false # Note: NonceHolder and the ContractDeployer system contracts can only be called with a special is_system flag as true
mode = "3"

[etherscan]
abstractTestnet = { chain = "11124", url = "", key = ""} # You can replace these values or leave them blank to override via CLI
abstractMainnet = { chain = "2741", url = "", key = ""} # You can replace these values or leave them blank to override via CLI

To use system contracts, set the is_system flag to true.

4. Write a smart contract

Modify the src/Counter.sol file to include the following smart contract:

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

contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
        number = newNumber;
    }

    function increment() public {
        number++;
    }
}

5. Compile the smart contract

Use the zksolc compiler (installed in the above steps) to compile smart contracts for Abstract:

forge build --zksync

You should now see the compiled smart contracts in the generated zkout directory.

6. Deploy the smart contract

Add your private key

Create a new wallet keystore.

cast wallet import myKeystore --interactive

Enter your wallet’s private key when prompted and provide a password to encrypt it.

We recommend not to use a private key associated with real funds. Create a new wallet for this step.
2

Get ETH in the deployer account

The deployer account requires ETH to deploy a smart contract.

  • Testnet: Claim ETH via a faucet, or bridge ETH from Sepolia.
  • Mainnet: Use a bridge to transfer ETH to Abstract mainnet.
3

Get an Abscan API key

Follow the Abscan documentation to get an API key to verify your smart contracts on the block explorer.

Deploy your smart contract

Run the following command to deploy your smart contracts:

forge create src/Counter.sol:Counter \
    --account myKeystore \
    --rpc-url https://api.testnet.abs.xyz \
    --chain 11124 \
    --zksync \
    --verify \
    --verifier etherscan \
    --verifier-url https://api-sepolia.abscan.org/api \
    --etherscan-api-key TACK2D1RGYX9U7MC31SZWWQ7FCWRYQ96AD

Note: Replace the contract path, address, and Abscan API key with your own.

If successful, the output should look similar to the following:

Deployer: 0x9C073184e74Af6D10DF575e724DC4712D98976aC
Deployed to: 0x85717893A18F255285AB48d7bE245ddcD047dEAE
Transaction hash: 0x2a4c7c32f26b078d080836b247db3e6c7d0216458a834cfb8362a2ac84e68d9f

Contract successfully verified