Skip to main content

Chain Info

ClawWallet is deployed on Abstract Mainnet, a zkSync ERA-based L2 chain.

Network Details

PropertyValue
Network NameAbstract Mainnet
Chain ID2741
CurrencyETH
VMzkSync ERA (zkEVM)
ConsensuszkRollup on Ethereum L1
Block Time~1-2 seconds
FinalitySoft finality on L2, hard finality after L1 proof

RPC Endpoints

ProviderURL
Official RPChttps://api.mainnet.abs.xyz

Block Explorer

ExplorerURL
AbsScanhttps://abscan.org

Bridge

BridgeURL
Abstract Portalhttps://portal.abs.xyz/bridge

Adding Abstract to MetaMask

Manual Setup

  1. Open MetaMask → Settings → Networks → Add Network
  2. Fill in:
FieldValue
Network NameAbstract Mainnet
RPC URLhttps://api.mainnet.abs.xyz
Chain ID2741
Currency SymbolETH
Block Explorerhttps://abscan.org

Programmatic (ethers.js v6)

import { ethers } from 'ethers';

const provider = new ethers.JsonRpcProvider('https://api.mainnet.abs.xyz');

// Verify connection
const network = await provider.getNetwork();
console.log('Chain ID:', network.chainId); // 2741n
console.log('Name:', network.name);

const blockNumber = await provider.getBlockNumber();
console.log('Latest block:', blockNumber);

Programmatic (viem)

import { createPublicClient, http, defineChain } from 'viem';

export const abstractMainnet = defineChain({
id: 2741,
name: 'Abstract Mainnet',
nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
rpcUrls: {
default: { http: ['https://api.mainnet.abs.xyz'] },
},
blockExplorers: {
default: { name: 'AbsScan', url: 'https://abscan.org' },
},
});

const client = createPublicClient({
chain: abstractMainnet,
transport: http(),
});

const blockNumber = await client.getBlockNumber();
console.log('Latest block:', blockNumber);

Wagmi / RainbowKit

import { defineChain } from 'viem';

export const abstractMainnet = defineChain({
id: 2741,
name: 'Abstract Mainnet',
nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
rpcUrls: {
default: { http: ['https://api.mainnet.abs.xyz'] },
},
blockExplorers: {
default: { name: 'AbsScan', url: 'https://abscan.org' },
},
});

// Use in wagmi config
import { createConfig, http } from 'wagmi';

const config = createConfig({
chains: [abstractMainnet],
transports: {
[abstractMainnet.id]: http(),
},
});

zkSync ERA Compatibility

Abstract Chain is built on zkSync ERA, which has some differences from standard EVM chains:

Key Differences

FeatureEVMzkSync ERA (Abstract)
Account ModelEOA + Smart ContractsAll accounts are smart contracts
PaymastersERC-4337 bundlersNative protocol support
Contract DeploymentCREATE / CREATE2ContractDeployer system contract
BytecodeEVM bytecodezkEVM bytecode (compiled via zksolc)
Gasgasleft() works normallyDifferent gas model
PrecompilesStandard EVMDifferent set of precompiles

What This Means for ClawWallet

  • ClawWalletFactory uses DEPLOYER_SYSTEM_CONTRACT.create2Account() instead of CREATE2
  • Wallet bytecode must be compiled with zksolc (not standard solc)
  • The factory stores a walletBytecodeHash (from zksolc artifact) for deployment
  • All wallets are natively AA-compatible (AccountAbstractionVersion.Version1)
  • Paymasters work at the protocol level — no bundler infrastructure needed

Compiling for zkSync ERA

# hardhat.config.ts must include:
zksolc: {
version: "1.5.x",
settings: {
enableEraVMExtensions: true, // Required for system contract calls
},
}

Gas & Fees

Abstract Chain uses zkSync ERA's gas model:

  • Gas token: ETH
  • Gas pricing: L2 gas + L1 data posting costs
  • Paymaster support: Native (ClawPaymaster leverages this)
  • Typical costs: Significantly cheaper than Ethereum L1

Estimating Gas

// Standard ethers.js estimation works
const gasEstimate = await provider.estimateGas({
from: walletAddress,
to: targetAddress,
data: calldata,
value: 0n,
});

console.log('Estimated gas:', gasEstimate.toString());
ResourceURL
Abstract Chain Websitehttps://abs.xyz
Abstract Portalhttps://portal.abs.xyz
AbsScan Explorerhttps://abscan.org
Abstract Bridgehttps://portal.abs.xyz/bridge
zkSync ERA Docshttps://docs.zksync.io
ClawWallet GitHubhttps://github.com/0xChitlin/clawwallet