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 the latest versions of the forge and cast binaries:

foundryup-zksync

A successful installation will output the following message:

foundryup-zksync: installed - forge 0.0.2
foundryup-zksync: installed - cast 0.0.2
foundryup-zksync: done!
2

Verify installation

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

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

If successful, it will output 20 lines of the available options included in the foundry-zksync fork.

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 isSystem flag as true
mode = "3"

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

Get testnet funds

Deploying smart contracts requires testnet ETH.

Claim testnet funds via a faucet, or bridge ETH from Sepolia to the Abstract testnet.

Add your private key

Create a new wallet keystore.

cast wallet import myKeystore --interactive

Enter your wallet’s private key when prompted & 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.

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 zksync \
    --verifier-url https://api-explorer-verify.testnet.abs.xyz/contract_verification

Ensure myKeystore is the name of the keystore file you created in the previous step.

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

Deployer: 0x8e729E23CDc8bC21c37a73DA4bA9ebdddA3C8B6d
Deployed to: 0x1590522E5758a7A8DD00f212fe487AE94fE69dcf
Transaction hash: 0xa7e2ecf1611fc01221678ac2c8919fe9c338b2aad9ac1ff4ae6f0d1711a62cf0
[...]
Verification was successful.

Verify an existing smart contract

In the above step, we verified the smart contract immediately after deployment.

To verify an existing smart contract on the block explorer, run the following command:

forge verify-contract 0x1590522E5758a7A8DD00f212fe487AE94fE69dcf \
    src/Counter.sol:Counter \
    --verifier zksync \
    --verifier-url https://api-explorer-verify.testnet.abs.xyz/contract_verification \
    --zksync

Note: Replace the contract path and address with your own.